From 00f73cc15cbb47dafea2acb15668f3fc63e661f2 Mon Sep 17 00:00:00 2001 From: Carlisle Wishard Date: Mon, 9 Aug 2021 14:44:42 -0400 Subject: [PATCH 001/154] Edited io_write_frame_body to accommodate NetCDF output format this does all the writing to a previously existing NetCDF file --- src/io/io.f90 | 101 +++++++++++++++++++++++++++++++++++++------------- 1 file changed, 75 insertions(+), 26 deletions(-) diff --git a/src/io/io.f90 b/src/io/io.f90 index ebfe2b1ef..055d238a6 100644 --- a/src/io/io.f90 +++ b/src/io/io.f90 @@ -1318,52 +1318,101 @@ module subroutine io_write_frame_body(self, iu, param) !! !! Adapted from David E. Kaufmann's Swifter routine io_write_frame.f90 !! Adapted from Hal Levison's Swift routine io_write_frame.F + use netcdf implicit none ! Arguments class(swiftest_body), intent(in) :: self !! Swiftest particle 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 + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + + integer(I4B) :: ncid !! NetCDF ID for the output file + integer(I4B) :: dimids(2) !! Dimensions of the NetCDF file + integer(I4B) :: time_dimid !! NetCDF ID for the time dimension + integer(I4B) :: name_dimid !! NetCDF ID for the particle name dimension + integer(I4B) :: noutput !! Number of output events covering the total simulation time + integer(I4B) :: a_varid !! NetCDF ID for the semimajor axis variable + integer(I4B) :: e_varid !! NetCDF ID for the eccentricity variable + integer(I4B) :: inc_varid !! NetCDF ID for the inclination variable + integer(I4B) :: capom_varid !! NetCDF ID for the long. asc. node variable + integer(I4B) :: omega_varid !! NetCDF ID for the arg. periapsis variable + integer(I4B) :: capm_varid !! NetCDF ID for the mean anomaly variable + integer(I4B) :: xhx_varid !! NetCDF ID for the heliocentric position x variable + integer(I4B) :: xhy_varid !! NetCDF ID for the heliocentric position y variable + integer(I4B) :: xhz_varid !! NetCDF ID for the heliocentric position z variable + integer(I4B) :: vhx_varid !! NetCDF ID for the heliocentric velocity x variable + integer(I4B) :: vhy_varid !! NetCDF ID for the heliocentric velocity y variable + integer(I4B) :: vhz_varid !! NetCDF ID for the heliocentric velocity z variable + integer(I4B) :: Gmass_varid !! NetCDF ID for the mass variable + integer(I4B) :: rhill_varid !! NetCDF ID for the hill radius variable + integer(I4B) :: radius_varid !! NetCDF ID for the radius variable + integer(I4B) :: Ip1_varid !! NetCDF ID for the axis 1 principal moment of inertial variable + integer(I4B) :: Ip2_varid !! NetCDF ID for the axis 2 principal moment of inertial variable + integer(I4B) :: Ip3_varid !! NetCDF ID for the axis 3 principal moment of inertial variable + integer(I4B) :: rotx_varid !! NetCDF ID for the rotation x variable + integer(I4B) :: roty_varid !! NetCDF ID for the rotation y variable + integer(I4B) :: rotz_varid !! NetCDF ID for the rotation z variable + integer(I4B) :: k2_varid !! NetCDF ID for the Love number variable + integer(I4B) :: Q_varid !! NetCDF ID for the energy dissipation variable + + !! Open the netCDF file + call check( nf90_open(param%outfile, nf90_write, ncid) ) associate(n => self%nbody) if (n == 0) return - write(iu) self%id(1:n) - !write(iu) self%name(1:n) + select case (param%out_form) case (EL) - write(iu) self%a(1:n) - write(iu) self%e(1:n) - write(iu) self%inc(1:n) - write(iu) self%capom(1:n) - write(iu) self%omega(1:n) - write(iu) self%capm(1:n) + do i = 1, npl + call check( nf90_put_var(ncid, a_varid, self%a(self%id = i), start=(/self%id, param%t/)) ) + call check( nf90_put_var(ncid, e_varid, self%e(self%id = i), start=(/self%id, param%t/)) ) + call check( nf90_put_var(ncid, inc_varid, self%inc(self%id = i), start=(/self%id, param%t/)) ) + call check( nf90_put_var(ncid, capom_varid, self%capom(self%id = i), start=(/self%id, param%t/)) ) + call check( nf90_put_var(ncid, omega_varid, self%omega(self%id = i), start=(/self%id, param%t/)) ) + call check( nf90_put_var(ncid, capm_varid, self%capm(self%id = i), start=(/self%id, param%t/)) ) + end do case (XV) - write(iu) self%xh(1, 1:n) - write(iu) self%xh(2, 1:n) - write(iu) self%xh(3, 1:n) - write(iu) self%vh(1, 1:n) - write(iu) self%vh(2, 1:n) - write(iu) self%vh(3, 1:n) + call check( nf90_put_var(ncid, xhx_varid, self%xh(1, self%id = i), start=(/self%id, param%t/)) ) + call check( nf90_put_var(ncid, xhy_varid, self%xh(2, self%id = i), start=(/self%id, param%t/)) ) + call check( nf90_put_var(ncid, xhz_varid, self%xh(3, self%id = i), start=(/self%id, param%t/)) ) + call check( nf90_put_var(ncid, vhx_varid, self%vh(1, self%id = i), start=(/self%id, param%t/)) ) + call check( nf90_put_var(ncid, vhy_varid, self%vh(2, self%id = i), start=(/self%id, param%t/)) ) + call check( nf90_put_var(ncid, vhz_varid, self%vh(3, self%id = i), start=(/self%id, param%t/)) ) end select 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) - if (param%lrhill_present) write(iu) pl%rhill(1:n) - if (param%lclose) write(iu) pl%radius(1:n) + call check( nf90_put_var(ncid, Gmass_varid, pl%Gmass(self%id = i), start=(/self%id, param%t/)) ) + if (param%lrhill_present) call check( nf90_put_var(ncid, rhill_varid, pl%rhill(self%id = i), start=(/self%id, param%t/)) ) + if (param%lclose) call check( nf90_put_var(ncid, radius_varid, pl%radius(self%id = i), start=(/self%id, param%t/)) ) if (param%lrotation) then - write(iu) pl%Ip(1, 1:n) - write(iu) pl%Ip(2, 1:n) - write(iu) pl%Ip(3, 1:n) - write(iu) pl%rot(1, 1:n) - write(iu) pl%rot(2, 1:n) - write(iu) pl%rot(3, 1:n) + call check( nf90_put_var(ncid, Ip1_varid, pl%Ip(1, self%id = i), start=(/self%id, param%t/)) ) + call check( nf90_put_var(ncid, Ip2_varid, pl%Ip(2, self%id = i), start=(/self%id, param%t/)) ) + call check( nf90_put_var(ncid, Ip3_varid, pl%Ip(3, self%id = i), start=(/self%id, param%t/)) ) + call check( nf90_put_var(ncid, rotx_varid, pl%rot(1, self%id = i), start=(/self%id, param%t/)) ) + call check( nf90_put_var(ncid, roty_varid, pl%rot(2, self%id = i), start=(/self%id, param%t/)) ) + call check( nf90_put_var(ncid, rotz_varid, pl%rot(3, self%id = i), start=(/self%id, param%t/)) ) end if if (param%ltides) then - write(iu) pl%k2(1:n) - write(iu) pl%Q(1:n) + call check( nf90_put_var(ncid, k2_varid, pl%k2(self%id = i), start=(/self%id, param%t/)) ) + call check( nf90_put_var(ncid, Q_varid, pl%Q(self%id = i), start=(/self%id, param%t/)) ) end if end select end associate + !! Close the netCDF file + call check( nf90_close(ncid) ) + + contains + + !! Checks the status of all NetCDF operations to catch errors + subroutine check(status) + integer, intent ( in) :: status + + if(status /= nf90_noerr) then + print *, trim(nf90_strerror(status)) + stop "NetCDF Error: Stopped" + end if + end subroutine check + return end subroutine io_write_frame_body From 2ae5828f5ffb3228f707f26a49c953ac82878711 Mon Sep 17 00:00:00 2001 From: Carlisle Wishard Date: Mon, 9 Aug 2021 14:45:29 -0400 Subject: [PATCH 002/154] Edited io_write_frame_system to accommodate NetCDF output format creates a new NetCDF file if necessary and then calls to io_write_frame_body --- src/io/io.f90 | 167 ++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 128 insertions(+), 39 deletions(-) diff --git a/src/io/io.f90 b/src/io/io.f90 index 055d238a6..bfef5de24 100644 --- a/src/io/io.f90 +++ b/src/io/io.f90 @@ -1465,67 +1465,156 @@ module subroutine io_write_frame_system(self, iu, param) !! Adapted from Hal Levison's Swift routine io_write_frame.F implicit none ! Arguments - class(swiftest_nbody_system), intent(in) :: self !! Swiftest system 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 + class(swiftest_nbody_system), intent(in) :: self !! Swiftest system 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 ! Internals - logical, save :: lfirst = .true. !! Flag to determine if this is the first call of this method - integer(I4B) :: ierr !! I/O error code + logical, save :: lfirst = .true. !! Flag to determine if this is the first call of this method + integer(I4B) :: ierr !! I/O error code - class(swiftest_cb), allocatable :: cb !! Temporary local version of pl structure used for non-destructive conversions - class(swiftest_pl), allocatable :: pl !! Temporary local version of pl structure used for non-destructive conversions - class(swiftest_tp), allocatable :: tp !! Temporary local version of pl structure used for non-destructive conversions + class(swiftest_cb), allocatable :: cb !! Temporary local version of pl structure used for non-destructive conversions + class(swiftest_pl), allocatable :: pl !! Temporary local version of pl structure used for non-destructive conversions + class(swiftest_tp), allocatable :: tp !! Temporary local version of pl structure used for non-destructive conversions + + integer(I4B) :: ncid !! NetCDF ID for the output file + integer(I4B) :: dimids(2) !! Dimensions of the NetCDF file + integer(I4B) :: time_dimid !! NetCDF ID for the time dimension + integer(I4B) :: name_dimid !! NetCDF ID for the particle name dimension + integer(I4B) :: noutput !! Number of output events covering the total simulation time + integer(I4B) :: a_varid !! NetCDF ID for the semimajor axis variable + integer(I4B) :: e_varid !! NetCDF ID for the eccentricity variable + integer(I4B) :: inc_varid !! NetCDF ID for the inclination variable + integer(I4B) :: capom_varid !! NetCDF ID for the long. asc. node variable + integer(I4B) :: omega_varid !! NetCDF ID for the arg. periapsis variable + integer(I4B) :: capm_varid !! NetCDF ID for the mean anomaly variable + integer(I4B) :: xhx_varid !! NetCDF ID for the heliocentric position x variable + integer(I4B) :: xhy_varid !! NetCDF ID for the heliocentric position y variable + integer(I4B) :: xhz_varid !! NetCDF ID for the heliocentric position z variable + integer(I4B) :: vhx_varid !! NetCDF ID for the heliocentric velocity x variable + integer(I4B) :: vhy_varid !! NetCDF ID for the heliocentric velocity y variable + integer(I4B) :: vhz_varid !! NetCDF ID for the heliocentric velocity z variable + integer(I4B) :: Gmass_varid !! NetCDF ID for the mass variable + integer(I4B) :: rhill_varid !! NetCDF ID for the hill radius variable + integer(I4B) :: radius_varid !! NetCDF ID for the radius variable + integer(I4B) :: Ip1_varid !! NetCDF ID for the axis 1 principal moment of inertial variable + integer(I4B) :: Ip2_varid !! NetCDF ID for the axis 2 principal moment of inertial variable + integer(I4B) :: Ip3_varid !! NetCDF ID for the axis 3 principal moment of inertial variable + integer(I4B) :: rotx_varid !! NetCDF ID for the rotation x variable + integer(I4B) :: roty_varid !! NetCDF ID for the rotation y variable + integer(I4B) :: rotz_varid !! NetCDF ID for the rotation z variable + integer(I4B) :: k2_varid !! NetCDF ID for the Love number variable + integer(I4B) :: Q_varid !! NetCDF ID for the energy dissipation variable allocate(cb, source = self%cb) allocate(pl, source = self%pl) allocate(tp, source = self%tp) iu = BINUNIT + if (param%lgr) then + call pl%pv2v(param) + call tp%pv2v(param) + end if + + if (param%out_form == EL) then ! Do an orbital element conversion prior to writing out the frame, as we have access to the central body here + call pl%xv2el(cb) + call tp%xv2el(cb) + end if + if (lfirst) then select case(param%out_stat) case('APPEND') - open(unit = iu, file = param%outfile, status = 'OLD', position = 'APPEND', form = 'UNFORMATTED', iostat = ierr) + !open(unit = iu, file = param%outfile, status = 'OLD', position = 'APPEND', form = 'UNFORMATTED', iostat = ierr) + + call cb%write_frame(iu, param) + call pl%write_frame(iu, param) + call tp%write_frame(iu, param) case('NEW', 'REPLACE', 'UNKNOWN') - open(unit = iu, file = param%outfile, status = param%out_stat, form = 'UNFORMATTED', iostat = ierr) + !open(unit = iu, file = param%outfile, status = param%out_stat, form = 'UNFORMATTED', iostat = ierr) + + !! Create the new output file, deleting any previously existing output file of the same name + call check( nf90_create(param%outfile, NF90_CLOBBER, ncid) ) + + !! Calculate the number of outputs needed to cover the entire simulation time + noutput = (param%tstop / param%dt) / param%istep_out + + !! Define the NetCDF dimensions with particle name as the record dimension + call check( nf90_def_dim(ncid, "Time", noutput, time_dimid) ) + call check( nf90_def_dim(ncid, "Particle Name", NF90_UNLIMITED, name_dimid) ) + dimids = (/ name_dimid, time_dimid /) + + !! Define the variables + select case (param%out_form) + case (EL) + call check( nf90_def_var(ncid, "a", NF90_FLOAT, dimids, a_varid) ) + call check( nf90_def_var(ncid, "e", NF90_FLOAT, dimids, e_varid) ) + call check( nf90_def_var(ncid, "inc", NF90_FLOAT, dimids, inc_varid) ) + call check( nf90_def_var(ncid, "capom", NF90_FLOAT, dimids, capom_varid) ) + call check( nf90_def_var(ncid, "omega", NF90_FLOAT, dimids, omega_varid) ) + call check( nf90_def_var(ncid, "capm", NF90_FLOAT, dimids, capm_varid) ) + case (XV) + call check( nf90_def_var(ncid, "xhx", NF90_FLOAT, dimids, xhx_varid) ) + call check( nf90_def_var(ncid, "xhy", NF90_FLOAT, dimids, xhy_varid) ) + call check( nf90_def_var(ncid, "xhz", NF90_FLOAT, dimids, xhz_varid) ) + call check( nf90_def_var(ncid, "vhx", NF90_FLOAT, dimids, vhx_varid) ) + call check( nf90_def_var(ncid, "vhy", NF90_FLOAT, dimids, vhy_varid) ) + call check( nf90_def_var(ncid, "vhz", NF90_FLOAT, dimids, vhz_varid) ) + end select + select type(pl => self) + class is (swiftest_pl) + call check( nf90_def_var(ncid, "Gmass", NF90_FLOAT, dimids, Gmass_varid) ) + if (param%lrhill_present) call check( nf90_def_var(ncid, "rhill", NF90_FLOAT, dimids, rhill_varid) ) + if (param%lclose) call check( nf90_def_var(ncid, "radius", NF90_FLOAT, dimids, radius_varid) ) + if (param%lrotation) then + call check( nf90_def_var(ncid, "Ip1", NF90_FLOAT, dimids, Ip1_varid) ) + call check( nf90_def_var(ncid, "Ip2", NF90_FLOAT, dimids, Ip3_varid) ) + call check( nf90_def_var(ncid, "Ip3", NF90_FLOAT, dimids, Ip3_varid) ) + call check( nf90_def_var(ncid, "rotx", NF90_FLOAT, dimids, rotx_varid) ) + call check( nf90_def_var(ncid, "roty", NF90_FLOAT, dimids, roty_varid) ) + call check( nf90_def_var(ncid, "rotz", NF90_FLOAT, dimids, rotz_varid) ) + end if + if (param%ltides) then + call check( nf90_def_var(ncid, "k2", NF90_FLOAT, dimids, k2_varid) ) + call check( nf90_def_var(ncid, "Q", NF90_FLOAT, dimids, Q_varid) ) + end if + end select + + !! Exit define mode + call check( nf90_enddef(ncid) ) + + !! Close the netCDF file + call check( nf90_close(ncid) ) + + !! Write the first frame of the output + call cb%write_frame(iu, param) + call pl%write_frame(iu, param) + call tp%write_frame(iu, param) + case default write(*,*) 'Invalid status code for OUT_STAT: ',trim(adjustl(param%out_stat)) call util_exit(FAILURE) end select - if (ierr /= 0) then - write(*, *) "Swiftest error: io_write_frame_system - first", ierr - write(*, *) " Binary output file " // trim(adjustl(param%outfile)) // " already exists or cannot be accessed" - write(*, *) " OUT_STAT: " // trim(adjustl(param%out_stat)) - call util_exit(FAILURE) - end if + lfirst = .false. + else - open(unit = iu, file = param%outfile, status = 'OLD', position = 'APPEND', form = 'UNFORMATTED', iostat = ierr) - if (ierr /= 0) then - write(*, *) "Swiftest error: io_write_frame_system" - write(*, *) " Unable to open binary output file for APPEND" - call util_exit(FAILURE) - end if - end if - call io_write_hdr(iu, param%t, pl%nbody, tp%nbody, param%out_form, param%out_type) - - if (param%lgr) then - call pl%pv2v(param) - call tp%pv2v(param) - end if - - if (param%out_form == EL) then ! Do an orbital element conversion prior to writing out the frame, as we have access to the central body here - call pl%xv2el(cb) - call tp%xv2el(cb) + call cb%write_frame(iu, param) + call pl%write_frame(iu, param) + call tp%write_frame(iu, param) end if - ! Write out each data type frame - call cb%write_frame(iu, param) - call pl%write_frame(iu, param) - call tp%write_frame(iu, param) - deallocate(cb, pl, tp) - close(iu) + contains + + !! Checks the status of all NetCDF operations to catch errors + subroutine check(status) + integer, intent ( in) :: status + + if(status /= nf90_noerr) then + print *, trim(nf90_strerror(status)) + stop "NetCDF Error: Stopped" + end if + end subroutine check return end subroutine io_write_frame_system From 115d5cec036a3df7dca73edc6f1f00802289befc Mon Sep 17 00:00:00 2001 From: Carlisle Wishard Date: Mon, 9 Aug 2021 15:18:03 -0400 Subject: [PATCH 003/154] bug fixes to io_write_frame_body switched from npl->n, added do loops in places I forgot them, commented out return statements --- src/io/io.f90 | 65 +++++++++++++++++++++++++++------------------------ 1 file changed, 35 insertions(+), 30 deletions(-) diff --git a/src/io/io.f90 b/src/io/io.f90 index bfef5de24..c00607c94 100644 --- a/src/io/io.f90 +++ b/src/io/io.f90 @@ -1325,6 +1325,7 @@ module subroutine io_write_frame_body(self, iu, param) 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) :: i integer(I4B) :: ncid !! NetCDF ID for the output file integer(I4B) :: dimids(2) !! Dimensions of the NetCDF file integer(I4B) :: time_dimid !! NetCDF ID for the time dimension @@ -1362,39 +1363,43 @@ module subroutine io_write_frame_body(self, iu, param) select case (param%out_form) case (EL) - do i = 1, npl - call check( nf90_put_var(ncid, a_varid, self%a(self%id = i), start=(/self%id, param%t/)) ) - call check( nf90_put_var(ncid, e_varid, self%e(self%id = i), start=(/self%id, param%t/)) ) - call check( nf90_put_var(ncid, inc_varid, self%inc(self%id = i), start=(/self%id, param%t/)) ) - call check( nf90_put_var(ncid, capom_varid, self%capom(self%id = i), start=(/self%id, param%t/)) ) - call check( nf90_put_var(ncid, omega_varid, self%omega(self%id = i), start=(/self%id, param%t/)) ) - call check( nf90_put_var(ncid, capm_varid, self%capm(self%id = i), start=(/self%id, param%t/)) ) + do i = 1, n + call check( nf90_put_var(ncid, a_varid, self%a(self%id == i), start=(/self%id, param%t/)) ) + call check( nf90_put_var(ncid, e_varid, self%e(self%id == i), start=(/self%id, param%t/)) ) + call check( nf90_put_var(ncid, inc_varid, self%inc(self%id == i), start=(/self%id, param%t/)) ) + call check( nf90_put_var(ncid, capom_varid, self%capom(self%id == i), start=(/self%id, param%t/)) ) + call check( nf90_put_var(ncid, omega_varid, self%omega(self%id == i), start=(/self%id, param%t/)) ) + call check( nf90_put_var(ncid, capm_varid, self%capm(self%id == i), start=(/self%id, param%t/)) ) end do case (XV) - call check( nf90_put_var(ncid, xhx_varid, self%xh(1, self%id = i), start=(/self%id, param%t/)) ) - call check( nf90_put_var(ncid, xhy_varid, self%xh(2, self%id = i), start=(/self%id, param%t/)) ) - call check( nf90_put_var(ncid, xhz_varid, self%xh(3, self%id = i), start=(/self%id, param%t/)) ) - call check( nf90_put_var(ncid, vhx_varid, self%vh(1, self%id = i), start=(/self%id, param%t/)) ) - call check( nf90_put_var(ncid, vhy_varid, self%vh(2, self%id = i), start=(/self%id, param%t/)) ) - call check( nf90_put_var(ncid, vhz_varid, self%vh(3, self%id = i), start=(/self%id, param%t/)) ) + do i = 1, n + call check( nf90_put_var(ncid, xhx_varid, self%xh(1, self%id == i), start=(/self%id, param%t/)) ) + call check( nf90_put_var(ncid, xhy_varid, self%xh(2, self%id == i), start=(/self%id, param%t/)) ) + call check( nf90_put_var(ncid, xhz_varid, self%xh(3, self%id == i), start=(/self%id, param%t/)) ) + call check( nf90_put_var(ncid, vhx_varid, self%vh(1, self%id == i), start=(/self%id, param%t/)) ) + call check( nf90_put_var(ncid, vhy_varid, self%vh(2, self%id == i), start=(/self%id, param%t/)) ) + call check( nf90_put_var(ncid, vhz_varid, self%vh(3, self%id == i), start=(/self%id, param%t/)) ) + end do end select select type(pl => self) class is (swiftest_pl) ! Additional output if the passed polymorphic object is a massive body - call check( nf90_put_var(ncid, Gmass_varid, pl%Gmass(self%id = i), start=(/self%id, param%t/)) ) - if (param%lrhill_present) call check( nf90_put_var(ncid, rhill_varid, pl%rhill(self%id = i), start=(/self%id, param%t/)) ) - if (param%lclose) call check( nf90_put_var(ncid, radius_varid, pl%radius(self%id = i), start=(/self%id, param%t/)) ) - if (param%lrotation) then - call check( nf90_put_var(ncid, Ip1_varid, pl%Ip(1, self%id = i), start=(/self%id, param%t/)) ) - call check( nf90_put_var(ncid, Ip2_varid, pl%Ip(2, self%id = i), start=(/self%id, param%t/)) ) - call check( nf90_put_var(ncid, Ip3_varid, pl%Ip(3, self%id = i), start=(/self%id, param%t/)) ) - call check( nf90_put_var(ncid, rotx_varid, pl%rot(1, self%id = i), start=(/self%id, param%t/)) ) - call check( nf90_put_var(ncid, roty_varid, pl%rot(2, self%id = i), start=(/self%id, param%t/)) ) - call check( nf90_put_var(ncid, rotz_varid, pl%rot(3, self%id = i), start=(/self%id, param%t/)) ) - end if - if (param%ltides) then - call check( nf90_put_var(ncid, k2_varid, pl%k2(self%id = i), start=(/self%id, param%t/)) ) - call check( nf90_put_var(ncid, Q_varid, pl%Q(self%id = i), start=(/self%id, param%t/)) ) - end if + do i = 1, n + call check( nf90_put_var(ncid, Gmass_varid, pl%Gmass(self%id == i), start=(/self%id, param%t/)) ) + if (param%lrhill_present) call check( nf90_put_var(ncid, rhill_varid, pl%rhill(self%id == i), start=(/self%id, param%t/)) ) + if (param%lclose) call check( nf90_put_var(ncid, radius_varid, pl%radius(self%id == i), start=(/self%id, param%t/)) ) + if (param%lrotation) then + call check( nf90_put_var(ncid, Ip1_varid, pl%Ip(1, self%id == i), start=(/self%id, param%t/)) ) + call check( nf90_put_var(ncid, Ip2_varid, pl%Ip(2, self%id == i), start=(/self%id, param%t/)) ) + call check( nf90_put_var(ncid, Ip3_varid, pl%Ip(3, self%id == i), start=(/self%id, param%t/)) ) + call check( nf90_put_var(ncid, rotx_varid, pl%rot(1, self%id == i), start=(/self%id, param%t/)) ) + call check( nf90_put_var(ncid, roty_varid, pl%rot(2, self%id == i), start=(/self%id, param%t/)) ) + call check( nf90_put_var(ncid, rotz_varid, pl%rot(3, self%id == i), start=(/self%id, param%t/)) ) + end if + if (param%ltides) then + call check( nf90_put_var(ncid, k2_varid, pl%k2(self%id == i), start=(/self%id, param%t/)) ) + call check( nf90_put_var(ncid, Q_varid, pl%Q(self%id == i), start=(/self%id, param%t/)) ) + end if + end do end select end associate @@ -1413,7 +1418,7 @@ subroutine check(status) end if end subroutine check - return + !return end subroutine io_write_frame_body @@ -1616,7 +1621,7 @@ subroutine check(status) end if end subroutine check - return + !return end subroutine io_write_frame_system From d532a58140bbd92efed516363fe3dc5586f9471d Mon Sep 17 00:00:00 2001 From: Carlisle Wishard Date: Wed, 11 Aug 2021 12:42:58 -0400 Subject: [PATCH 004/154] Included NetCDF libraries in the Makefile --- Makefile | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Makefile b/Makefile index 94dfbceeb..d9350cb39 100644 --- a/Makefile +++ b/Makefile @@ -57,13 +57,13 @@ SWIFTEST_MODULES = swiftest_globals.f90 \ include Makefile.Defines -MODULES = $(SWIFTEST_MODULES) $(USER_MODULES) +MODULES = $(SWIFTEST_MODULES) $(USER_MODULES) .PHONY : all mod lib libdir drivers bin clean force % : %.f90 force - $(FORTRAN) $(FFLAGS) -I$(SWIFTEST_HOME)/include $< -o $@ \ - -L$(SWIFTEST_HOME)/lib -lswiftest + $(FORTRAN) $(FFLAGS) -I$(SWIFTEST_HOME)/include -I$(NETCDF_FORTRAN_HOME)/include $< -o $@ \ + -L$(SWIFTEST_HOME)/lib -lswiftest -L$(NETCDF_FORTRAN_HOME)/lib -lnetcdf -lnetcdff $(INSTALL_PROGRAM) $@ $(SWIFTEST_HOME)/bin rm -f $@ @@ -75,7 +75,7 @@ all: mod: cd $(SWIFTEST_HOME)/src/modules/; \ - $(FORTRAN) $(FFLAGS) -I$(SWIFTEST_HOME)/include -c $(MODULES); \ + $(FORTRAN) $(FFLAGS) -I$(SWIFTEST_HOME)/include -I$(NETCDF_FORTRAN_HOME)/include -c $(MODULES); \ $(AR) rv $(SWIFTEST_HOME)/lib/libswiftest.a *.o; \ $(INSTALL_DATA) *.mod *.smod $(SWIFTEST_HOME)/include; \ rm -f *.o *.mod *.smod @@ -173,7 +173,7 @@ lib: make libdir libdir: - $(FORTRAN) $(FFLAGS) -I$(SWIFTEST_HOME)/include -c *.f90; \ + $(FORTRAN) $(FFLAGS) -I$(SWIFTEST_HOME)/include -I$(NETCDF_FORTRAN_HOME)/include -c *.f90; \ $(AR) rv $(SWIFTEST_HOME)/lib/libswiftest.a *.o *.smod; \ $(INSTALL_DATA) *.smod $(SWIFTEST_HOME)/include; \ rm -f *.o *.smod From f40afa4f17258cd606ee6bd28a5e59a3f4d7b189 Mon Sep 17 00:00:00 2001 From: Carlisle Wishard Date: Wed, 11 Aug 2021 13:08:06 -0400 Subject: [PATCH 005/154] fixed the indexing of the netcdf array --- src/io/io.f90 | 51 +++++++++++++++++++++++++++------------------------ 1 file changed, 27 insertions(+), 24 deletions(-) diff --git a/src/io/io.f90 b/src/io/io.f90 index c00607c94..5f9ea78fd 100644 --- a/src/io/io.f90 +++ b/src/io/io.f90 @@ -1330,7 +1330,7 @@ module subroutine io_write_frame_body(self, iu, param) integer(I4B) :: dimids(2) !! Dimensions of the NetCDF file integer(I4B) :: time_dimid !! NetCDF ID for the time dimension integer(I4B) :: name_dimid !! NetCDF ID for the particle name dimension - integer(I4B) :: noutput !! Number of output events covering the total simulation time + integer(I4B) :: ioutput !! The current output number integer(I4B) :: a_varid !! NetCDF ID for the semimajor axis variable integer(I4B) :: e_varid !! NetCDF ID for the eccentricity variable integer(I4B) :: inc_varid !! NetCDF ID for the inclination variable @@ -1361,43 +1361,46 @@ module subroutine io_write_frame_body(self, iu, param) associate(n => self%nbody) if (n == 0) return + !! Calculate the output number that we are currently on + ioutput = (param%t / param%dt) / param%istep_out + select case (param%out_form) case (EL) do i = 1, n - call check( nf90_put_var(ncid, a_varid, self%a(self%id == i), start=(/self%id, param%t/)) ) - call check( nf90_put_var(ncid, e_varid, self%e(self%id == i), start=(/self%id, param%t/)) ) - call check( nf90_put_var(ncid, inc_varid, self%inc(self%id == i), start=(/self%id, param%t/)) ) - call check( nf90_put_var(ncid, capom_varid, self%capom(self%id == i), start=(/self%id, param%t/)) ) - call check( nf90_put_var(ncid, omega_varid, self%omega(self%id == i), start=(/self%id, param%t/)) ) - call check( nf90_put_var(ncid, capm_varid, self%capm(self%id == i), start=(/self%id, param%t/)) ) + call check( nf90_put_var(ncid, a_varid, self%a(self%id == i), start=(/self%id, ioutput/)) ) + call check( nf90_put_var(ncid, e_varid, self%e(self%id == i), start=(/self%id, ioutput/)) ) + call check( nf90_put_var(ncid, inc_varid, self%inc(self%id == i), start=(/self%id, ioutput/)) ) + call check( nf90_put_var(ncid, capom_varid, self%capom(self%id == i), start=(/self%id, ioutput/)) ) + call check( nf90_put_var(ncid, omega_varid, self%omega(self%id == i), start=(/self%id, ioutput/)) ) + call check( nf90_put_var(ncid, capm_varid, self%capm(self%id == i), start=(/self%id, ioutput/)) ) end do case (XV) do i = 1, n - call check( nf90_put_var(ncid, xhx_varid, self%xh(1, self%id == i), start=(/self%id, param%t/)) ) - call check( nf90_put_var(ncid, xhy_varid, self%xh(2, self%id == i), start=(/self%id, param%t/)) ) - call check( nf90_put_var(ncid, xhz_varid, self%xh(3, self%id == i), start=(/self%id, param%t/)) ) - call check( nf90_put_var(ncid, vhx_varid, self%vh(1, self%id == i), start=(/self%id, param%t/)) ) - call check( nf90_put_var(ncid, vhy_varid, self%vh(2, self%id == i), start=(/self%id, param%t/)) ) - call check( nf90_put_var(ncid, vhz_varid, self%vh(3, self%id == i), start=(/self%id, param%t/)) ) + call check( nf90_put_var(ncid, xhx_varid, self%xh(1, self%id == i), start=(/self%id, ioutput/)) ) + call check( nf90_put_var(ncid, xhy_varid, self%xh(2, self%id == i), start=(/self%id, ioutput/)) ) + call check( nf90_put_var(ncid, xhz_varid, self%xh(3, self%id == i), start=(/self%id, ioutput/)) ) + call check( nf90_put_var(ncid, vhx_varid, self%vh(1, self%id == i), start=(/self%id, ioutput/)) ) + call check( nf90_put_var(ncid, vhy_varid, self%vh(2, self%id == i), start=(/self%id, ioutput/)) ) + call check( nf90_put_var(ncid, vhz_varid, self%vh(3, self%id == i), start=(/self%id, ioutput/)) ) end do end select select type(pl => self) class is (swiftest_pl) ! Additional output if the passed polymorphic object is a massive body do i = 1, n - call check( nf90_put_var(ncid, Gmass_varid, pl%Gmass(self%id == i), start=(/self%id, param%t/)) ) - if (param%lrhill_present) call check( nf90_put_var(ncid, rhill_varid, pl%rhill(self%id == i), start=(/self%id, param%t/)) ) - if (param%lclose) call check( nf90_put_var(ncid, radius_varid, pl%radius(self%id == i), start=(/self%id, param%t/)) ) + call check( nf90_put_var(ncid, Gmass_varid, pl%Gmass(self%id == i), start=(/self%id, ioutput/)) ) + if (param%lrhill_present) call check( nf90_put_var(ncid, rhill_varid, pl%rhill(self%id == i), start=(/self%id, ioutput/)) ) + if (param%lclose) call check( nf90_put_var(ncid, radius_varid, pl%radius(self%id == i), start=(/self%id, ioutput/)) ) if (param%lrotation) then - call check( nf90_put_var(ncid, Ip1_varid, pl%Ip(1, self%id == i), start=(/self%id, param%t/)) ) - call check( nf90_put_var(ncid, Ip2_varid, pl%Ip(2, self%id == i), start=(/self%id, param%t/)) ) - call check( nf90_put_var(ncid, Ip3_varid, pl%Ip(3, self%id == i), start=(/self%id, param%t/)) ) - call check( nf90_put_var(ncid, rotx_varid, pl%rot(1, self%id == i), start=(/self%id, param%t/)) ) - call check( nf90_put_var(ncid, roty_varid, pl%rot(2, self%id == i), start=(/self%id, param%t/)) ) - call check( nf90_put_var(ncid, rotz_varid, pl%rot(3, self%id == i), start=(/self%id, param%t/)) ) + call check( nf90_put_var(ncid, Ip1_varid, pl%Ip(1, self%id == i), start=(/self%id, ioutput/)) ) + call check( nf90_put_var(ncid, Ip2_varid, pl%Ip(2, self%id == i), start=(/self%id, ioutput/)) ) + call check( nf90_put_var(ncid, Ip3_varid, pl%Ip(3, self%id == i), start=(/self%id, ioutput/)) ) + call check( nf90_put_var(ncid, rotx_varid, pl%rot(1, self%id == i), start=(/self%id, ioutput/)) ) + call check( nf90_put_var(ncid, roty_varid, pl%rot(2, self%id == i), start=(/self%id, ioutput/)) ) + call check( nf90_put_var(ncid, rotz_varid, pl%rot(3, self%id == i), start=(/self%id, ioutput/)) ) end if if (param%ltides) then - call check( nf90_put_var(ncid, k2_varid, pl%k2(self%id == i), start=(/self%id, param%t/)) ) - call check( nf90_put_var(ncid, Q_varid, pl%Q(self%id == i), start=(/self%id, param%t/)) ) + call check( nf90_put_var(ncid, k2_varid, pl%k2(self%id == i), start=(/self%id, ioutput/)) ) + call check( nf90_put_var(ncid, Q_varid, pl%Q(self%id == i), start=(/self%id, ioutput/)) ) end if end do end select From 68c2a87136101fde3506fffb0b3adce13513b002 Mon Sep 17 00:00:00 2001 From: Carlisle Wishard Date: Wed, 11 Aug 2021 13:12:39 -0400 Subject: [PATCH 006/154] added in use netcdf to io_write_frame_system --- src/io/io.f90 | 1 + 1 file changed, 1 insertion(+) diff --git a/src/io/io.f90 b/src/io/io.f90 index 5f9ea78fd..75657e161 100644 --- a/src/io/io.f90 +++ b/src/io/io.f90 @@ -1471,6 +1471,7 @@ module subroutine io_write_frame_system(self, iu, param) !! !! Adapted from David E. Kaufmann's Swifter routine io_write_frame.f90 !! Adapted from Hal Levison's Swift routine io_write_frame.F + use netcdf implicit none ! Arguments class(swiftest_nbody_system), intent(in) :: self !! Swiftest system object From bd5b0ce8fa035877354756ccd1a7ceea593f1572 Mon Sep 17 00:00:00 2001 From: Carlisle Wishard Date: Wed, 11 Aug 2021 13:28:47 -0400 Subject: [PATCH 007/154] rearranging in io_write_frame_system --- src/io/io.f90 | 45 +++++++++++++++++++++++++++++++++------------ 1 file changed, 33 insertions(+), 12 deletions(-) diff --git a/src/io/io.f90 b/src/io/io.f90 index 75657e161..9a5f8ed89 100644 --- a/src/io/io.f90 +++ b/src/io/io.f90 @@ -1519,21 +1519,21 @@ module subroutine io_write_frame_system(self, iu, param) allocate(tp, source = self%tp) iu = BINUNIT - if (param%lgr) then - call pl%pv2v(param) - call tp%pv2v(param) - end if - - if (param%out_form == EL) then ! Do an orbital element conversion prior to writing out the frame, as we have access to the central body here - call pl%xv2el(cb) - call tp%xv2el(cb) - end if - if (lfirst) then select case(param%out_stat) case('APPEND') !open(unit = iu, file = param%outfile, status = 'OLD', position = 'APPEND', form = 'UNFORMATTED', iostat = ierr) + if (param%lgr) then + call pl%pv2v(param) + call tp%pv2v(param) + end if + + if (param%out_form == EL) then ! Do an orbital element conversion prior to writing out the frame, as we have access to the central body here + call pl%xv2el(cb) + call tp%xv2el(cb) + end if + call cb%write_frame(iu, param) call pl%write_frame(iu, param) call tp%write_frame(iu, param) @@ -1568,8 +1568,8 @@ module subroutine io_write_frame_system(self, iu, param) call check( nf90_def_var(ncid, "vhy", NF90_FLOAT, dimids, vhy_varid) ) call check( nf90_def_var(ncid, "vhz", NF90_FLOAT, dimids, vhz_varid) ) end select - select type(pl => self) - class is (swiftest_pl) + !select type(pl => self) + !class is (swiftest_pl) call check( nf90_def_var(ncid, "Gmass", NF90_FLOAT, dimids, Gmass_varid) ) if (param%lrhill_present) call check( nf90_def_var(ncid, "rhill", NF90_FLOAT, dimids, rhill_varid) ) if (param%lclose) call check( nf90_def_var(ncid, "radius", NF90_FLOAT, dimids, radius_varid) ) @@ -1593,6 +1593,16 @@ module subroutine io_write_frame_system(self, iu, param) !! Close the netCDF file call check( nf90_close(ncid) ) + if (param%lgr) then + call pl%pv2v(param) + call tp%pv2v(param) + end if + + if (param%out_form == EL) then ! Do an orbital element conversion prior to writing out the frame, as we have access to the central body here + call pl%xv2el(cb) + call tp%xv2el(cb) + end if + !! Write the first frame of the output call cb%write_frame(iu, param) call pl%write_frame(iu, param) @@ -1606,6 +1616,17 @@ module subroutine io_write_frame_system(self, iu, param) lfirst = .false. else + + if (param%lgr) then + call pl%pv2v(param) + call tp%pv2v(param) + end if + + if (param%out_form == EL) then ! Do an orbital element conversion prior to writing out the frame, as we have access to the central body here + call pl%xv2el(cb) + call tp%xv2el(cb) + end if + call cb%write_frame(iu, param) call pl%write_frame(iu, param) call tp%write_frame(iu, param) From 7a3de2fb355185e8c92c53dd6dbc07dbbf7af388 Mon Sep 17 00:00:00 2001 From: Carlisle Wishard Date: Wed, 11 Aug 2021 13:31:49 -0400 Subject: [PATCH 008/154] more rearranging of io_write_frame_system --- src/io/io.f90 | 75 +++++++++++++++++++-------------------------------- 1 file changed, 27 insertions(+), 48 deletions(-) diff --git a/src/io/io.f90 b/src/io/io.f90 index 9a5f8ed89..d42713b6f 100644 --- a/src/io/io.f90 +++ b/src/io/io.f90 @@ -1519,21 +1519,21 @@ module subroutine io_write_frame_system(self, iu, param) allocate(tp, source = self%tp) iu = BINUNIT + if (param%lgr) then + call pl%pv2v(param) + call tp%pv2v(param) + end if + + if (param%out_form == EL) then ! Do an orbital element conversion prior to writing out the frame, as we have access to the central body here + call pl%xv2el(cb) + call tp%xv2el(cb) + end if + if (lfirst) then select case(param%out_stat) case('APPEND') !open(unit = iu, file = param%outfile, status = 'OLD', position = 'APPEND', form = 'UNFORMATTED', iostat = ierr) - if (param%lgr) then - call pl%pv2v(param) - call tp%pv2v(param) - end if - - if (param%out_form == EL) then ! Do an orbital element conversion prior to writing out the frame, as we have access to the central body here - call pl%xv2el(cb) - call tp%xv2el(cb) - end if - call cb%write_frame(iu, param) call pl%write_frame(iu, param) call tp%write_frame(iu, param) @@ -1568,24 +1568,22 @@ module subroutine io_write_frame_system(self, iu, param) call check( nf90_def_var(ncid, "vhy", NF90_FLOAT, dimids, vhy_varid) ) call check( nf90_def_var(ncid, "vhz", NF90_FLOAT, dimids, vhz_varid) ) end select - !select type(pl => self) - !class is (swiftest_pl) - call check( nf90_def_var(ncid, "Gmass", NF90_FLOAT, dimids, Gmass_varid) ) - if (param%lrhill_present) call check( nf90_def_var(ncid, "rhill", NF90_FLOAT, dimids, rhill_varid) ) - if (param%lclose) call check( nf90_def_var(ncid, "radius", NF90_FLOAT, dimids, radius_varid) ) - if (param%lrotation) then - call check( nf90_def_var(ncid, "Ip1", NF90_FLOAT, dimids, Ip1_varid) ) - call check( nf90_def_var(ncid, "Ip2", NF90_FLOAT, dimids, Ip3_varid) ) - call check( nf90_def_var(ncid, "Ip3", NF90_FLOAT, dimids, Ip3_varid) ) - call check( nf90_def_var(ncid, "rotx", NF90_FLOAT, dimids, rotx_varid) ) - call check( nf90_def_var(ncid, "roty", NF90_FLOAT, dimids, roty_varid) ) - call check( nf90_def_var(ncid, "rotz", NF90_FLOAT, dimids, rotz_varid) ) - end if - if (param%ltides) then - call check( nf90_def_var(ncid, "k2", NF90_FLOAT, dimids, k2_varid) ) - call check( nf90_def_var(ncid, "Q", NF90_FLOAT, dimids, Q_varid) ) - end if - end select + + call check( nf90_def_var(ncid, "Gmass", NF90_FLOAT, dimids, Gmass_varid) ) + if (param%lrhill_present) call check( nf90_def_var(ncid, "rhill", NF90_FLOAT, dimids, rhill_varid) ) + if (param%lclose) call check( nf90_def_var(ncid, "radius", NF90_FLOAT, dimids, radius_varid) ) + if (param%lrotation) then + call check( nf90_def_var(ncid, "Ip1", NF90_FLOAT, dimids, Ip1_varid) ) + call check( nf90_def_var(ncid, "Ip2", NF90_FLOAT, dimids, Ip3_varid) ) + call check( nf90_def_var(ncid, "Ip3", NF90_FLOAT, dimids, Ip3_varid) ) + call check( nf90_def_var(ncid, "rotx", NF90_FLOAT, dimids, rotx_varid) ) + call check( nf90_def_var(ncid, "roty", NF90_FLOAT, dimids, roty_varid) ) + call check( nf90_def_var(ncid, "rotz", NF90_FLOAT, dimids, rotz_varid) ) + end if + if (param%ltides) then + call check( nf90_def_var(ncid, "k2", NF90_FLOAT, dimids, k2_varid) ) + call check( nf90_def_var(ncid, "Q", NF90_FLOAT, dimids, Q_varid) ) + end if !! Exit define mode call check( nf90_enddef(ncid) ) @@ -1593,16 +1591,6 @@ module subroutine io_write_frame_system(self, iu, param) !! Close the netCDF file call check( nf90_close(ncid) ) - if (param%lgr) then - call pl%pv2v(param) - call tp%pv2v(param) - end if - - if (param%out_form == EL) then ! Do an orbital element conversion prior to writing out the frame, as we have access to the central body here - call pl%xv2el(cb) - call tp%xv2el(cb) - end if - !! Write the first frame of the output call cb%write_frame(iu, param) call pl%write_frame(iu, param) @@ -1617,19 +1605,10 @@ module subroutine io_write_frame_system(self, iu, param) else - if (param%lgr) then - call pl%pv2v(param) - call tp%pv2v(param) - end if - - if (param%out_form == EL) then ! Do an orbital element conversion prior to writing out the frame, as we have access to the central body here - call pl%xv2el(cb) - call tp%xv2el(cb) - end if - call cb%write_frame(iu, param) call pl%write_frame(iu, param) call tp%write_frame(iu, param) + end if deallocate(cb, pl, tp) From 4daec878c54d6a98c80d8b276458da506824691b Mon Sep 17 00:00:00 2001 From: Carlisle Wishard Date: Wed, 11 Aug 2021 13:41:02 -0400 Subject: [PATCH 009/154] reordered dimensions of file so time is 'y' and id is 'x' --- src/io/io.f90 | 52 +++++++++++++++++++++++++-------------------------- 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/src/io/io.f90 b/src/io/io.f90 index d42713b6f..69c38248b 100644 --- a/src/io/io.f90 +++ b/src/io/io.f90 @@ -1367,40 +1367,40 @@ module subroutine io_write_frame_body(self, iu, param) select case (param%out_form) case (EL) do i = 1, n - call check( nf90_put_var(ncid, a_varid, self%a(self%id == i), start=(/self%id, ioutput/)) ) - call check( nf90_put_var(ncid, e_varid, self%e(self%id == i), start=(/self%id, ioutput/)) ) - call check( nf90_put_var(ncid, inc_varid, self%inc(self%id == i), start=(/self%id, ioutput/)) ) - call check( nf90_put_var(ncid, capom_varid, self%capom(self%id == i), start=(/self%id, ioutput/)) ) - call check( nf90_put_var(ncid, omega_varid, self%omega(self%id == i), start=(/self%id, ioutput/)) ) - call check( nf90_put_var(ncid, capm_varid, self%capm(self%id == i), start=(/self%id, ioutput/)) ) + call check( nf90_put_var(ncid, a_varid, self%a(self%id == i), start=(/ioutput, self%id/)) ) + call check( nf90_put_var(ncid, e_varid, self%e(self%id == i), start=(/ioutput, self%id/)) ) + call check( nf90_put_var(ncid, inc_varid, self%inc(self%id == i), start=(/ioutput, self%id/)) ) + call check( nf90_put_var(ncid, capom_varid, self%capom(self%id == i), start=(/ioutput, self%id/)) ) + call check( nf90_put_var(ncid, omega_varid, self%omega(self%id == i), start=(/ioutput, self%id/)) ) + call check( nf90_put_var(ncid, capm_varid, self%capm(self%id == i), start=(/ioutput, self%id/)) ) end do case (XV) do i = 1, n - call check( nf90_put_var(ncid, xhx_varid, self%xh(1, self%id == i), start=(/self%id, ioutput/)) ) - call check( nf90_put_var(ncid, xhy_varid, self%xh(2, self%id == i), start=(/self%id, ioutput/)) ) - call check( nf90_put_var(ncid, xhz_varid, self%xh(3, self%id == i), start=(/self%id, ioutput/)) ) - call check( nf90_put_var(ncid, vhx_varid, self%vh(1, self%id == i), start=(/self%id, ioutput/)) ) - call check( nf90_put_var(ncid, vhy_varid, self%vh(2, self%id == i), start=(/self%id, ioutput/)) ) - call check( nf90_put_var(ncid, vhz_varid, self%vh(3, self%id == i), start=(/self%id, ioutput/)) ) + call check( nf90_put_var(ncid, xhx_varid, self%xh(1, self%id == i), start=(/ioutput, self%id/)) ) + call check( nf90_put_var(ncid, xhy_varid, self%xh(2, self%id == i), start=(/ioutput, self%id/)) ) + call check( nf90_put_var(ncid, xhz_varid, self%xh(3, self%id == i), start=(/ioutput, self%id/)) ) + call check( nf90_put_var(ncid, vhx_varid, self%vh(1, self%id == i), start=(/ioutput, self%id/)) ) + call check( nf90_put_var(ncid, vhy_varid, self%vh(2, self%id == i), start=(/ioutput, self%id/)) ) + call check( nf90_put_var(ncid, vhz_varid, self%vh(3, self%id == i), start=(/ioutput, self%id/)) ) end do end select select type(pl => self) class is (swiftest_pl) ! Additional output if the passed polymorphic object is a massive body do i = 1, n - call check( nf90_put_var(ncid, Gmass_varid, pl%Gmass(self%id == i), start=(/self%id, ioutput/)) ) - if (param%lrhill_present) call check( nf90_put_var(ncid, rhill_varid, pl%rhill(self%id == i), start=(/self%id, ioutput/)) ) - if (param%lclose) call check( nf90_put_var(ncid, radius_varid, pl%radius(self%id == i), start=(/self%id, ioutput/)) ) + call check( nf90_put_var(ncid, Gmass_varid, pl%Gmass(self%id == i), start=(/ioutput, self%id/)) ) + if (param%lrhill_present) call check( nf90_put_var(ncid, rhill_varid, pl%rhill(self%id == i), start=(/ioutput, self%id/)) ) + if (param%lclose) call check( nf90_put_var(ncid, radius_varid, pl%radius(self%id == i), start=(/ioutput, self%id/)) ) if (param%lrotation) then - call check( nf90_put_var(ncid, Ip1_varid, pl%Ip(1, self%id == i), start=(/self%id, ioutput/)) ) - call check( nf90_put_var(ncid, Ip2_varid, pl%Ip(2, self%id == i), start=(/self%id, ioutput/)) ) - call check( nf90_put_var(ncid, Ip3_varid, pl%Ip(3, self%id == i), start=(/self%id, ioutput/)) ) - call check( nf90_put_var(ncid, rotx_varid, pl%rot(1, self%id == i), start=(/self%id, ioutput/)) ) - call check( nf90_put_var(ncid, roty_varid, pl%rot(2, self%id == i), start=(/self%id, ioutput/)) ) - call check( nf90_put_var(ncid, rotz_varid, pl%rot(3, self%id == i), start=(/self%id, ioutput/)) ) + call check( nf90_put_var(ncid, Ip1_varid, pl%Ip(1, self%id == i), start=(/ioutput, self%id/)) ) + call check( nf90_put_var(ncid, Ip2_varid, pl%Ip(2, self%id == i), start=(/ioutput, self%id/)) ) + call check( nf90_put_var(ncid, Ip3_varid, pl%Ip(3, self%id == i), start=(/ioutput, self%id/)) ) + call check( nf90_put_var(ncid, rotx_varid, pl%rot(1, self%id == i), start=(/ioutput, self%id/)) ) + call check( nf90_put_var(ncid, roty_varid, pl%rot(2, self%id == i), start=(/ioutput, self%id/)) ) + call check( nf90_put_var(ncid, rotz_varid, pl%rot(3, self%id == i), start=(/ioutput, self%id/)) ) end if if (param%ltides) then - call check( nf90_put_var(ncid, k2_varid, pl%k2(self%id == i), start=(/self%id, ioutput/)) ) - call check( nf90_put_var(ncid, Q_varid, pl%Q(self%id == i), start=(/self%id, ioutput/)) ) + call check( nf90_put_var(ncid, k2_varid, pl%k2(self%id == i), start=(/ioutput, self%id/)) ) + call check( nf90_put_var(ncid, Q_varid, pl%Q(self%id == i), start=(/ioutput, self%id/)) ) end if end do end select @@ -1547,9 +1547,9 @@ module subroutine io_write_frame_system(self, iu, param) noutput = (param%tstop / param%dt) / param%istep_out !! Define the NetCDF dimensions with particle name as the record dimension - call check( nf90_def_dim(ncid, "Time", noutput, time_dimid) ) - call check( nf90_def_dim(ncid, "Particle Name", NF90_UNLIMITED, name_dimid) ) - dimids = (/ name_dimid, time_dimid /) + call check( nf90_def_dim(ncid, "Particle Name", NF90_UNLIMITED, name_dimid) ) !! x dimension + call check( nf90_def_dim(ncid, "Time", noutput, time_dimid) ) !! y dimension + dimids = (/ time_dimid, name_dimid /) !! Define the variables select case (param%out_form) From e01a0b4d928fff705d5c882c472b2605ccafd437 Mon Sep 17 00:00:00 2001 From: Carlisle Wishard Date: Wed, 11 Aug 2021 14:10:02 -0400 Subject: [PATCH 010/154] fixed indexing of body ID in io_write_frame_body --- src/io/io.f90 | 68 ++++++++++++++++++++++++++++----------------------- 1 file changed, 37 insertions(+), 31 deletions(-) diff --git a/src/io/io.f90 b/src/io/io.f90 index 69c38248b..e0a5d9849 100644 --- a/src/io/io.f90 +++ b/src/io/io.f90 @@ -1325,7 +1325,7 @@ module subroutine io_write_frame_body(self, iu, param) 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) :: i + integer(I4B) :: i, j integer(I4B) :: ncid !! NetCDF ID for the output file integer(I4B) :: dimids(2) !! Dimensions of the NetCDF file integer(I4B) :: time_dimid !! NetCDF ID for the time dimension @@ -1366,42 +1366,48 @@ module subroutine io_write_frame_body(self, iu, param) select case (param%out_form) case (EL) - do i = 1, n - call check( nf90_put_var(ncid, a_varid, self%a(self%id == i), start=(/ioutput, self%id/)) ) - call check( nf90_put_var(ncid, e_varid, self%e(self%id == i), start=(/ioutput, self%id/)) ) - call check( nf90_put_var(ncid, inc_varid, self%inc(self%id == i), start=(/ioutput, self%id/)) ) - call check( nf90_put_var(ncid, capom_varid, self%capom(self%id == i), start=(/ioutput, self%id/)) ) - call check( nf90_put_var(ncid, omega_varid, self%omega(self%id == i), start=(/ioutput, self%id/)) ) - call check( nf90_put_var(ncid, capm_varid, self%capm(self%id == i), start=(/ioutput, self%id/)) ) + do j = 1, n + do i = 1, n + call check( nf90_put_var(ncid, a_varid, self%a(self%id(i) == j), start=(/ioutput, j/)) ) + call check( nf90_put_var(ncid, e_varid, self%e(self%id(i) == j), start=(/ioutput, j/)) ) + call check( nf90_put_var(ncid, inc_varid, self%inc(self%id(i) == j), start=(/ioutput, j/)) ) + call check( nf90_put_var(ncid, capom_varid, self%capom(self%id(i) == j), start=(/ioutput, j/)) ) + call check( nf90_put_var(ncid, omega_varid, self%omega(self%id(i) == j), start=(/ioutput, j/)) ) + call check( nf90_put_var(ncid, capm_varid, self%capm(self%id(i) == j), start=(/ioutput, j/)) ) + end do end do case (XV) - do i = 1, n - call check( nf90_put_var(ncid, xhx_varid, self%xh(1, self%id == i), start=(/ioutput, self%id/)) ) - call check( nf90_put_var(ncid, xhy_varid, self%xh(2, self%id == i), start=(/ioutput, self%id/)) ) - call check( nf90_put_var(ncid, xhz_varid, self%xh(3, self%id == i), start=(/ioutput, self%id/)) ) - call check( nf90_put_var(ncid, vhx_varid, self%vh(1, self%id == i), start=(/ioutput, self%id/)) ) - call check( nf90_put_var(ncid, vhy_varid, self%vh(2, self%id == i), start=(/ioutput, self%id/)) ) - call check( nf90_put_var(ncid, vhz_varid, self%vh(3, self%id == i), start=(/ioutput, self%id/)) ) + do j = 1, n + do i = 1, n + call check( nf90_put_var(ncid, xhx_varid, self%xh(1, self%id(i) == j), start=(/ioutput, j/)) ) + call check( nf90_put_var(ncid, xhy_varid, self%xh(2, self%id(i) == j), start=(/ioutput, j/)) ) + call check( nf90_put_var(ncid, xhz_varid, self%xh(3, self%id(i) == j), start=(/ioutput, j/)) ) + call check( nf90_put_var(ncid, vhx_varid, self%vh(1, self%id(i) == j), start=(/ioutput, j/)) ) + call check( nf90_put_var(ncid, vhy_varid, self%vh(2, self%id(i) == j), start=(/ioutput, j/)) ) + call check( nf90_put_var(ncid, vhz_varid, self%vh(3, self%id(i) == j), start=(/ioutput, j/)) ) + end do end do end select select type(pl => self) class is (swiftest_pl) ! Additional output if the passed polymorphic object is a massive body - do i = 1, n - call check( nf90_put_var(ncid, Gmass_varid, pl%Gmass(self%id == i), start=(/ioutput, self%id/)) ) - if (param%lrhill_present) call check( nf90_put_var(ncid, rhill_varid, pl%rhill(self%id == i), start=(/ioutput, self%id/)) ) - if (param%lclose) call check( nf90_put_var(ncid, radius_varid, pl%radius(self%id == i), start=(/ioutput, self%id/)) ) - if (param%lrotation) then - call check( nf90_put_var(ncid, Ip1_varid, pl%Ip(1, self%id == i), start=(/ioutput, self%id/)) ) - call check( nf90_put_var(ncid, Ip2_varid, pl%Ip(2, self%id == i), start=(/ioutput, self%id/)) ) - call check( nf90_put_var(ncid, Ip3_varid, pl%Ip(3, self%id == i), start=(/ioutput, self%id/)) ) - call check( nf90_put_var(ncid, rotx_varid, pl%rot(1, self%id == i), start=(/ioutput, self%id/)) ) - call check( nf90_put_var(ncid, roty_varid, pl%rot(2, self%id == i), start=(/ioutput, self%id/)) ) - call check( nf90_put_var(ncid, rotz_varid, pl%rot(3, self%id == i), start=(/ioutput, self%id/)) ) - end if - if (param%ltides) then - call check( nf90_put_var(ncid, k2_varid, pl%k2(self%id == i), start=(/ioutput, self%id/)) ) - call check( nf90_put_var(ncid, Q_varid, pl%Q(self%id == i), start=(/ioutput, self%id/)) ) - end if + do j = 1, n + do i = 1, n + call check( nf90_put_var(ncid, Gmass_varid, pl%Gmass(self%id(i) == j), start=(/ioutput, j/)) ) + if (param%lrhill_present) call check( nf90_put_var(ncid, rhill_varid, pl%rhill(self%id(i) == j), start=(/ioutput, j/)) ) + if (param%lclose) call check( nf90_put_var(ncid, radius_varid, pl%radius(self%id(i) == j), start=(/ioutput, j/)) ) + if (param%lrotation) then + call check( nf90_put_var(ncid, Ip1_varid, pl%Ip(1, self%id(i) == j), start=(/ioutput, j/)) ) + call check( nf90_put_var(ncid, Ip2_varid, pl%Ip(2, self%id(i) == j), start=(/ioutput, j/)) ) + call check( nf90_put_var(ncid, Ip3_varid, pl%Ip(3, self%id(i) == j), start=(/ioutput, j/)) ) + call check( nf90_put_var(ncid, rotx_varid, pl%rot(1, self%id(i) == j), start=(/ioutput, j/)) ) + call check( nf90_put_var(ncid, roty_varid, pl%rot(2, self%id(i) == j), start=(/ioutput, j/)) ) + call check( nf90_put_var(ncid, rotz_varid, pl%rot(3, self%id(i) == j), start=(/ioutput, j/)) ) + end if + if (param%ltides) then + call check( nf90_put_var(ncid, k2_varid, pl%k2(self%id(i) == j), start=(/ioutput, j/)) ) + call check( nf90_put_var(ncid, Q_varid, pl%Q(self%id(i) == j), start=(/ioutput, j/)) ) + end if + end do end do end select end associate From 4426c6b070c140fbd200a47d0d6cb0d473b21323 Mon Sep 17 00:00:00 2001 From: Carlisle Wishard Date: Wed, 11 Aug 2021 14:21:51 -0400 Subject: [PATCH 011/154] added if statement to check if ID matches particle number --- src/io/io.f90 | 58 ++++++++++++++++++++++++++++----------------------- 1 file changed, 32 insertions(+), 26 deletions(-) diff --git a/src/io/io.f90 b/src/io/io.f90 index e0a5d9849..87ddd570d 100644 --- a/src/io/io.f90 +++ b/src/io/io.f90 @@ -1368,23 +1368,27 @@ module subroutine io_write_frame_body(self, iu, param) case (EL) do j = 1, n do i = 1, n - call check( nf90_put_var(ncid, a_varid, self%a(self%id(i) == j), start=(/ioutput, j/)) ) - call check( nf90_put_var(ncid, e_varid, self%e(self%id(i) == j), start=(/ioutput, j/)) ) - call check( nf90_put_var(ncid, inc_varid, self%inc(self%id(i) == j), start=(/ioutput, j/)) ) - call check( nf90_put_var(ncid, capom_varid, self%capom(self%id(i) == j), start=(/ioutput, j/)) ) - call check( nf90_put_var(ncid, omega_varid, self%omega(self%id(i) == j), start=(/ioutput, j/)) ) - call check( nf90_put_var(ncid, capm_varid, self%capm(self%id(i) == j), start=(/ioutput, j/)) ) + if (self%id(i) == j) then + call check( nf90_put_var(ncid, a_varid, self%a(j), start=(/ioutput, j/)) ) + call check( nf90_put_var(ncid, e_varid, self%e(j), start=(/ioutput, j/)) ) + call check( nf90_put_var(ncid, inc_varid, self%inc(j), start=(/ioutput, j/)) ) + call check( nf90_put_var(ncid, capom_varid, self%capom(j), start=(/ioutput, j/)) ) + call check( nf90_put_var(ncid, omega_varid, self%omega(j), start=(/ioutput, j/)) ) + call check( nf90_put_var(ncid, capm_varid, self%capm(j), start=(/ioutput, j/)) ) + end if end do end do case (XV) do j = 1, n do i = 1, n - call check( nf90_put_var(ncid, xhx_varid, self%xh(1, self%id(i) == j), start=(/ioutput, j/)) ) - call check( nf90_put_var(ncid, xhy_varid, self%xh(2, self%id(i) == j), start=(/ioutput, j/)) ) - call check( nf90_put_var(ncid, xhz_varid, self%xh(3, self%id(i) == j), start=(/ioutput, j/)) ) - call check( nf90_put_var(ncid, vhx_varid, self%vh(1, self%id(i) == j), start=(/ioutput, j/)) ) - call check( nf90_put_var(ncid, vhy_varid, self%vh(2, self%id(i) == j), start=(/ioutput, j/)) ) - call check( nf90_put_var(ncid, vhz_varid, self%vh(3, self%id(i) == j), start=(/ioutput, j/)) ) + if (self%id(i) == j) then + call check( nf90_put_var(ncid, xhx_varid, self%xh(1, j), start=(/ioutput, j/)) ) + call check( nf90_put_var(ncid, xhy_varid, self%xh(2, j), start=(/ioutput, j/)) ) + call check( nf90_put_var(ncid, xhz_varid, self%xh(3, j), start=(/ioutput, j/)) ) + call check( nf90_put_var(ncid, vhx_varid, self%vh(1, j), start=(/ioutput, j/)) ) + call check( nf90_put_var(ncid, vhy_varid, self%vh(2, j), start=(/ioutput, j/)) ) + call check( nf90_put_var(ncid, vhz_varid, self%vh(3, j), start=(/ioutput, j/)) ) + end if end do end do end select @@ -1392,20 +1396,22 @@ module subroutine io_write_frame_body(self, iu, param) class is (swiftest_pl) ! Additional output if the passed polymorphic object is a massive body do j = 1, n do i = 1, n - call check( nf90_put_var(ncid, Gmass_varid, pl%Gmass(self%id(i) == j), start=(/ioutput, j/)) ) - if (param%lrhill_present) call check( nf90_put_var(ncid, rhill_varid, pl%rhill(self%id(i) == j), start=(/ioutput, j/)) ) - if (param%lclose) call check( nf90_put_var(ncid, radius_varid, pl%radius(self%id(i) == j), start=(/ioutput, j/)) ) - if (param%lrotation) then - call check( nf90_put_var(ncid, Ip1_varid, pl%Ip(1, self%id(i) == j), start=(/ioutput, j/)) ) - call check( nf90_put_var(ncid, Ip2_varid, pl%Ip(2, self%id(i) == j), start=(/ioutput, j/)) ) - call check( nf90_put_var(ncid, Ip3_varid, pl%Ip(3, self%id(i) == j), start=(/ioutput, j/)) ) - call check( nf90_put_var(ncid, rotx_varid, pl%rot(1, self%id(i) == j), start=(/ioutput, j/)) ) - call check( nf90_put_var(ncid, roty_varid, pl%rot(2, self%id(i) == j), start=(/ioutput, j/)) ) - call check( nf90_put_var(ncid, rotz_varid, pl%rot(3, self%id(i) == j), start=(/ioutput, j/)) ) - end if - if (param%ltides) then - call check( nf90_put_var(ncid, k2_varid, pl%k2(self%id(i) == j), start=(/ioutput, j/)) ) - call check( nf90_put_var(ncid, Q_varid, pl%Q(self%id(i) == j), start=(/ioutput, j/)) ) + if (self%id(i) == j) then + call check( nf90_put_var(ncid, Gmass_varid, pl%Gmass(j), start=(/ioutput, j/)) ) + if (param%lrhill_present) call check( nf90_put_var(ncid, rhill_varid, pl%rhill(j), start=(/ioutput, j/)) ) + if (param%lclose) call check( nf90_put_var(ncid, radius_varid, pl%radius(j), start=(/ioutput, j/)) ) + if (param%lrotation) then + call check( nf90_put_var(ncid, Ip1_varid, pl%Ip(1, j), start=(/ioutput, j/)) ) + call check( nf90_put_var(ncid, Ip2_varid, pl%Ip(2, j), start=(/ioutput, j/)) ) + call check( nf90_put_var(ncid, Ip3_varid, pl%Ip(3, j), start=(/ioutput, j/)) ) + call check( nf90_put_var(ncid, rotx_varid, pl%rot(1, j), start=(/ioutput, j/)) ) + call check( nf90_put_var(ncid, roty_varid, pl%rot(2, j), start=(/ioutput, j/)) ) + call check( nf90_put_var(ncid, rotz_varid, pl%rot(3, j), start=(/ioutput, j/)) ) + end if + if (param%ltides) then + call check( nf90_put_var(ncid, k2_varid, pl%k2(j), start=(/ioutput, j/)) ) + call check( nf90_put_var(ncid, Q_varid, pl%Q(j), start=(/ioutput, j/)) ) + end if end if end do end do From 713f9e05721fc4fc2a7163d25b29723ea9d5eb6c Mon Sep 17 00:00:00 2001 From: Carlisle Wishard Date: Wed, 11 Aug 2021 14:26:30 -0400 Subject: [PATCH 012/154] added status message to netcdf error reporting --- src/io/io.f90 | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/io/io.f90 b/src/io/io.f90 index 87ddd570d..95af2e6f0 100644 --- a/src/io/io.f90 +++ b/src/io/io.f90 @@ -1428,6 +1428,7 @@ subroutine check(status) integer, intent ( in) :: status if(status /= nf90_noerr) then + print *, status print *, trim(nf90_strerror(status)) stop "NetCDF Error: Stopped" end if @@ -1632,6 +1633,7 @@ subroutine check(status) integer, intent ( in) :: status if(status /= nf90_noerr) then + print *, status print *, trim(nf90_strerror(status)) stop "NetCDF Error: Stopped" end if From 5cfab3f00a535994ad8fed6c3a4dcfbf3b9d7b1e Mon Sep 17 00:00:00 2001 From: Carlisle Wishard Date: Wed, 11 Aug 2021 14:40:41 -0400 Subject: [PATCH 013/154] reassigned all variable IDs in io_write_frame_body --- src/io/io.f90 | 49 +++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 45 insertions(+), 4 deletions(-) diff --git a/src/io/io.f90 b/src/io/io.f90 index 95af2e6f0..5a56e0ea8 100644 --- a/src/io/io.f90 +++ b/src/io/io.f90 @@ -1369,6 +1369,15 @@ module subroutine io_write_frame_body(self, iu, param) do j = 1, n do i = 1, n if (self%id(i) == j) then + + !! Reassign all variable IDs + call check( nf90_inq_varid(ncid, "a", a_varid)) + call check( nf90_inq_varid(ncid, "e", e_varid)) + call check( nf90_inq_varid(ncid, "inc", inc_varid)) + call check( nf90_inq_varid(ncid, "capom", capom_varid)) + call check( nf90_inq_varid(ncid, "omega", omega_varid)) + call check( nf90_inq_varid(ncid, "capm", capm_varid)) + call check( nf90_put_var(ncid, a_varid, self%a(j), start=(/ioutput, j/)) ) call check( nf90_put_var(ncid, e_varid, self%e(j), start=(/ioutput, j/)) ) call check( nf90_put_var(ncid, inc_varid, self%inc(j), start=(/ioutput, j/)) ) @@ -1382,6 +1391,15 @@ module subroutine io_write_frame_body(self, iu, param) do j = 1, n do i = 1, n if (self%id(i) == j) then + + !! Reassign all variable IDs + call check( nf90_inq_varid(ncid, "xhx", xhx_varid)) + call check( nf90_inq_varid(ncid, "xhy", xhy_varid)) + call check( nf90_inq_varid(ncid, "xhz", xhz_varid)) + call check( nf90_inq_varid(ncid, "vhx", vhx_varid)) + call check( nf90_inq_varid(ncid, "vhy", vhy_varid)) + call check( nf90_inq_varid(ncid, "vhz", vhz_varid)) + call check( nf90_put_var(ncid, xhx_varid, self%xh(1, j), start=(/ioutput, j/)) ) call check( nf90_put_var(ncid, xhy_varid, self%xh(2, j), start=(/ioutput, j/)) ) call check( nf90_put_var(ncid, xhz_varid, self%xh(3, j), start=(/ioutput, j/)) ) @@ -1397,10 +1415,30 @@ module subroutine io_write_frame_body(self, iu, param) do j = 1, n do i = 1, n if (self%id(i) == j) then + + !! Reassign all variable IDs + call check( nf90_inq_varid(ncid, "Gmass", Gmass_varid)) call check( nf90_put_var(ncid, Gmass_varid, pl%Gmass(j), start=(/ioutput, j/)) ) - if (param%lrhill_present) call check( nf90_put_var(ncid, rhill_varid, pl%rhill(j), start=(/ioutput, j/)) ) - if (param%lclose) call check( nf90_put_var(ncid, radius_varid, pl%radius(j), start=(/ioutput, j/)) ) + if (param%lrhill_present) then + !! Reassign all variable IDs + call check( nf90_inq_varid(ncid, "rhill", rhill_varid)) + call check( nf90_put_var(ncid, rhill_varid, pl%rhill(j), start=(/ioutput, j/)) ) + end if + if (param%lclose) then + !! Reassign all variable IDs + call check( nf90_inq_varid(ncid, "radius", radius_varid)) + call check( nf90_put_var(ncid, radius_varid, pl%radius(j), start=(/ioutput, j/)) ) + end if if (param%lrotation) then + + !! Reassign all variable IDs + call check( nf90_inq_varid(ncid, "Ip1", Ip1_varid)) + call check( nf90_inq_varid(ncid, "Ip2", Ip2_varid)) + call check( nf90_inq_varid(ncid, "Ip3", Ip3_varid)) + call check( nf90_inq_varid(ncid, "rotx", rotx_varid)) + call check( nf90_inq_varid(ncid, "roty", roty_varid)) + call check( nf90_inq_varid(ncid, "rotz", rotz_varid)) + call check( nf90_put_var(ncid, Ip1_varid, pl%Ip(1, j), start=(/ioutput, j/)) ) call check( nf90_put_var(ncid, Ip2_varid, pl%Ip(2, j), start=(/ioutput, j/)) ) call check( nf90_put_var(ncid, Ip3_varid, pl%Ip(3, j), start=(/ioutput, j/)) ) @@ -1409,6 +1447,11 @@ module subroutine io_write_frame_body(self, iu, param) call check( nf90_put_var(ncid, rotz_varid, pl%rot(3, j), start=(/ioutput, j/)) ) end if if (param%ltides) then + + !! Reassign all variable IDs + call check( nf90_inq_varid(ncid, "k2", k2_varid)) + call check( nf90_inq_varid(ncid, "Q", Q_varid)) + call check( nf90_put_var(ncid, k2_varid, pl%k2(j), start=(/ioutput, j/)) ) call check( nf90_put_var(ncid, Q_varid, pl%Q(j), start=(/ioutput, j/)) ) end if @@ -1428,7 +1471,6 @@ subroutine check(status) integer, intent ( in) :: status if(status /= nf90_noerr) then - print *, status print *, trim(nf90_strerror(status)) stop "NetCDF Error: Stopped" end if @@ -1633,7 +1675,6 @@ subroutine check(status) integer, intent ( in) :: status if(status /= nf90_noerr) then - print *, status print *, trim(nf90_strerror(status)) stop "NetCDF Error: Stopped" end if From c4603379607fdd3f24130a9d2be9672ce272be5a Mon Sep 17 00:00:00 2001 From: Carlisle Wishard Date: Wed, 11 Aug 2021 14:45:48 -0400 Subject: [PATCH 014/154] debug write statements in io.f90 --- src/io/io.f90 | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/io/io.f90 b/src/io/io.f90 index 5a56e0ea8..9cc1f79f5 100644 --- a/src/io/io.f90 +++ b/src/io/io.f90 @@ -1400,6 +1400,9 @@ module subroutine io_write_frame_body(self, iu, param) call check( nf90_inq_varid(ncid, "vhy", vhy_varid)) call check( nf90_inq_varid(ncid, "vhz", vhz_varid)) + write(*,*) "ioutput", ioutput + write(*,*) "j", j + call check( nf90_put_var(ncid, xhx_varid, self%xh(1, j), start=(/ioutput, j/)) ) call check( nf90_put_var(ncid, xhy_varid, self%xh(2, j), start=(/ioutput, j/)) ) call check( nf90_put_var(ncid, xhz_varid, self%xh(3, j), start=(/ioutput, j/)) ) @@ -1600,6 +1603,7 @@ module subroutine io_write_frame_system(self, iu, param) !! Calculate the number of outputs needed to cover the entire simulation time noutput = (param%tstop / param%dt) / param%istep_out + write(*,*) "noutput", noutput !! Define the NetCDF dimensions with particle name as the record dimension call check( nf90_def_dim(ncid, "Particle Name", NF90_UNLIMITED, name_dimid) ) !! x dimension From dd38b159350f2661adbdbe44f29ee3398346263b Mon Sep 17 00:00:00 2001 From: Carlisle Wishard Date: Wed, 11 Aug 2021 14:50:30 -0400 Subject: [PATCH 015/154] fixed indexing of output file to account for t=0 --- src/io/io.f90 | 52 ++++++++++++++++++++++++--------------------------- 1 file changed, 24 insertions(+), 28 deletions(-) diff --git a/src/io/io.f90 b/src/io/io.f90 index 9cc1f79f5..c0f9c33f5 100644 --- a/src/io/io.f90 +++ b/src/io/io.f90 @@ -1378,12 +1378,12 @@ module subroutine io_write_frame_body(self, iu, param) call check( nf90_inq_varid(ncid, "omega", omega_varid)) call check( nf90_inq_varid(ncid, "capm", capm_varid)) - call check( nf90_put_var(ncid, a_varid, self%a(j), start=(/ioutput, j/)) ) - call check( nf90_put_var(ncid, e_varid, self%e(j), start=(/ioutput, j/)) ) - call check( nf90_put_var(ncid, inc_varid, self%inc(j), start=(/ioutput, j/)) ) - call check( nf90_put_var(ncid, capom_varid, self%capom(j), start=(/ioutput, j/)) ) - call check( nf90_put_var(ncid, omega_varid, self%omega(j), start=(/ioutput, j/)) ) - call check( nf90_put_var(ncid, capm_varid, self%capm(j), start=(/ioutput, j/)) ) + call check( nf90_put_var(ncid, a_varid, self%a(j), start=(/ioutput + 1, j/)) ) + call check( nf90_put_var(ncid, e_varid, self%e(j), start=(/ioutput + 1, j/)) ) + call check( nf90_put_var(ncid, inc_varid, self%inc(j), start=(/ioutput + 1, j/)) ) + call check( nf90_put_var(ncid, capom_varid, self%capom(j), start=(/ioutput + 1, j/)) ) + call check( nf90_put_var(ncid, omega_varid, self%omega(j), start=(/ioutput + 1, j/)) ) + call check( nf90_put_var(ncid, capm_varid, self%capm(j), start=(/ioutput + 1, j/)) ) end if end do end do @@ -1400,15 +1400,12 @@ module subroutine io_write_frame_body(self, iu, param) call check( nf90_inq_varid(ncid, "vhy", vhy_varid)) call check( nf90_inq_varid(ncid, "vhz", vhz_varid)) - write(*,*) "ioutput", ioutput - write(*,*) "j", j - - call check( nf90_put_var(ncid, xhx_varid, self%xh(1, j), start=(/ioutput, j/)) ) - call check( nf90_put_var(ncid, xhy_varid, self%xh(2, j), start=(/ioutput, j/)) ) - call check( nf90_put_var(ncid, xhz_varid, self%xh(3, j), start=(/ioutput, j/)) ) - call check( nf90_put_var(ncid, vhx_varid, self%vh(1, j), start=(/ioutput, j/)) ) - call check( nf90_put_var(ncid, vhy_varid, self%vh(2, j), start=(/ioutput, j/)) ) - call check( nf90_put_var(ncid, vhz_varid, self%vh(3, j), start=(/ioutput, j/)) ) + call check( nf90_put_var(ncid, xhx_varid, self%xh(1, j), start=(/ioutput + 1, j/)) ) + call check( nf90_put_var(ncid, xhy_varid, self%xh(2, j), start=(/ioutput + 1, j/)) ) + call check( nf90_put_var(ncid, xhz_varid, self%xh(3, j), start=(/ioutput + 1, j/)) ) + call check( nf90_put_var(ncid, vhx_varid, self%vh(1, j), start=(/ioutput + 1, j/)) ) + call check( nf90_put_var(ncid, vhy_varid, self%vh(2, j), start=(/ioutput + 1, j/)) ) + call check( nf90_put_var(ncid, vhz_varid, self%vh(3, j), start=(/ioutput + 1, j/)) ) end if end do end do @@ -1421,16 +1418,16 @@ module subroutine io_write_frame_body(self, iu, param) !! Reassign all variable IDs call check( nf90_inq_varid(ncid, "Gmass", Gmass_varid)) - call check( nf90_put_var(ncid, Gmass_varid, pl%Gmass(j), start=(/ioutput, j/)) ) + call check( nf90_put_var(ncid, Gmass_varid, pl%Gmass(j), start=(/ioutput + 1, j/)) ) if (param%lrhill_present) then !! Reassign all variable IDs call check( nf90_inq_varid(ncid, "rhill", rhill_varid)) - call check( nf90_put_var(ncid, rhill_varid, pl%rhill(j), start=(/ioutput, j/)) ) + call check( nf90_put_var(ncid, rhill_varid, pl%rhill(j), start=(/ioutput + 1, j/)) ) end if if (param%lclose) then !! Reassign all variable IDs call check( nf90_inq_varid(ncid, "radius", radius_varid)) - call check( nf90_put_var(ncid, radius_varid, pl%radius(j), start=(/ioutput, j/)) ) + call check( nf90_put_var(ncid, radius_varid, pl%radius(j), start=(/ioutput + 1, j/)) ) end if if (param%lrotation) then @@ -1442,12 +1439,12 @@ module subroutine io_write_frame_body(self, iu, param) call check( nf90_inq_varid(ncid, "roty", roty_varid)) call check( nf90_inq_varid(ncid, "rotz", rotz_varid)) - call check( nf90_put_var(ncid, Ip1_varid, pl%Ip(1, j), start=(/ioutput, j/)) ) - call check( nf90_put_var(ncid, Ip2_varid, pl%Ip(2, j), start=(/ioutput, j/)) ) - call check( nf90_put_var(ncid, Ip3_varid, pl%Ip(3, j), start=(/ioutput, j/)) ) - call check( nf90_put_var(ncid, rotx_varid, pl%rot(1, j), start=(/ioutput, j/)) ) - call check( nf90_put_var(ncid, roty_varid, pl%rot(2, j), start=(/ioutput, j/)) ) - call check( nf90_put_var(ncid, rotz_varid, pl%rot(3, j), start=(/ioutput, j/)) ) + call check( nf90_put_var(ncid, Ip1_varid, pl%Ip(1, j), start=(/ioutput + 1, j/)) ) + call check( nf90_put_var(ncid, Ip2_varid, pl%Ip(2, j), start=(/ioutput + 1, j/)) ) + call check( nf90_put_var(ncid, Ip3_varid, pl%Ip(3, j), start=(/ioutput + 1, j/)) ) + call check( nf90_put_var(ncid, rotx_varid, pl%rot(1, j), start=(/ioutput + 1, j/)) ) + call check( nf90_put_var(ncid, roty_varid, pl%rot(2, j), start=(/ioutput + 1, j/)) ) + call check( nf90_put_var(ncid, rotz_varid, pl%rot(3, j), start=(/ioutput + 1, j/)) ) end if if (param%ltides) then @@ -1455,8 +1452,8 @@ module subroutine io_write_frame_body(self, iu, param) call check( nf90_inq_varid(ncid, "k2", k2_varid)) call check( nf90_inq_varid(ncid, "Q", Q_varid)) - call check( nf90_put_var(ncid, k2_varid, pl%k2(j), start=(/ioutput, j/)) ) - call check( nf90_put_var(ncid, Q_varid, pl%Q(j), start=(/ioutput, j/)) ) + call check( nf90_put_var(ncid, k2_varid, pl%k2(j), start=(/ioutput + 1, j/)) ) + call check( nf90_put_var(ncid, Q_varid, pl%Q(j), start=(/ioutput + 1, j/)) ) end if end if end do @@ -1602,8 +1599,7 @@ module subroutine io_write_frame_system(self, iu, param) call check( nf90_create(param%outfile, NF90_CLOBBER, ncid) ) !! Calculate the number of outputs needed to cover the entire simulation time - noutput = (param%tstop / param%dt) / param%istep_out - write(*,*) "noutput", noutput + noutput = ((param%tstop / param%dt) / param%istep_out) + 1 !! Define the NetCDF dimensions with particle name as the record dimension call check( nf90_def_dim(ncid, "Particle Name", NF90_UNLIMITED, name_dimid) ) !! x dimension From beacca8c8ec39afedad38b80edaac626608307bf Mon Sep 17 00:00:00 2001 From: Carlisle Wishard Date: Thu, 12 Aug 2021 08:26:40 -0400 Subject: [PATCH 016/154] extended time dimension by 1 --- src/io/io.f90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/io/io.f90 b/src/io/io.f90 index 514ada968..2468c9b5f 100644 --- a/src/io/io.f90 +++ b/src/io/io.f90 @@ -1669,7 +1669,7 @@ module subroutine io_write_frame_system(self, iu, param) call check( nf90_create(param%outfile, NF90_CLOBBER, ncid) ) !! Calculate the number of outputs needed to cover the entire simulation time - noutput = ((param%tstop / param%dt) / param%istep_out) + 1 + noutput = ((param%tstop / param%dt) / param%istep_out) + 2 !! +2 because t=0 gets put in spot 1 and need a stop for the final output !! Define the NetCDF dimensions with particle name as the record dimension call check( nf90_def_dim(ncid, "Particle Name", NF90_UNLIMITED, name_dimid) ) !! x dimension From 3e06d5d4c6d3dea69d66319f15cb33300a037f55 Mon Sep 17 00:00:00 2001 From: Carlisle Wishard Date: Thu, 12 Aug 2021 09:10:29 -0400 Subject: [PATCH 017/154] changed name of dimension from "Particle Name" to "Name" --- src/io/io.f90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/io/io.f90 b/src/io/io.f90 index 2468c9b5f..928782033 100644 --- a/src/io/io.f90 +++ b/src/io/io.f90 @@ -1672,7 +1672,7 @@ module subroutine io_write_frame_system(self, iu, param) noutput = ((param%tstop / param%dt) / param%istep_out) + 2 !! +2 because t=0 gets put in spot 1 and need a stop for the final output !! Define the NetCDF dimensions with particle name as the record dimension - call check( nf90_def_dim(ncid, "Particle Name", NF90_UNLIMITED, name_dimid) ) !! x dimension + call check( nf90_def_dim(ncid, "Name", NF90_UNLIMITED, name_dimid) ) !! x dimension call check( nf90_def_dim(ncid, "Time", noutput, time_dimid) ) !! y dimension dimids = (/ time_dimid, name_dimid /) From 3180e5587466aca8ab38235051100a68918d9479 Mon Sep 17 00:00:00 2001 From: Carlisle Wishard Date: Fri, 13 Aug 2021 07:59:46 -0400 Subject: [PATCH 018/154] added io_netcdf_write_frame_body module to swiftest_classes --- src/modules/swiftest_classes.f90 | 44 +++++++++++++++++++------------- 1 file changed, 26 insertions(+), 18 deletions(-) diff --git a/src/modules/swiftest_classes.f90 b/src/modules/swiftest_classes.f90 index 96c35675b..9fc1fcb9a 100644 --- a/src/modules/swiftest_classes.f90 +++ b/src/modules/swiftest_classes.f90 @@ -171,24 +171,25 @@ 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 :: append => util_append_body !! Appends 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 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_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 :: write_frame => io_netcdf_write_frame_body !! I/O routine for writing out a single frame of time-series data for all bodies in the system in NetCDF format + 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 :: append => util_append_body !! Appends 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 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_spill_body !! "Spills" bodies from one object to another depending on the results of a mask (uses the PACK intrinsic) end type swiftest_body !******************************************************************************************************************************** @@ -673,6 +674,13 @@ module subroutine io_write_frame_body(self, iu, param) class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters end subroutine io_write_frame_body + module subroutine io_netcdf_write_frame_body(self, iu, param) + implicit none + class(swiftest_body), intent(in) :: self !! Swiftest body object + integer(I4B), intent(inout) :: iu !! Unit number for the output file to write frame to + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + end subroutine io_netcdf_write_frame_body + module subroutine io_write_frame_cb(self, iu, param) implicit none class(swiftest_cb), intent(in) :: self !! Swiftest central body object From 5635ef04d6d37393d0f3d08ed638f4d04339b78b Mon Sep 17 00:00:00 2001 From: Carlisle Wishard Date: Fri, 13 Aug 2021 08:00:09 -0400 Subject: [PATCH 019/154] added io_netcdf_write_frame_system module to swiftest_classes --- src/modules/swiftest_classes.f90 | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/modules/swiftest_classes.f90 b/src/modules/swiftest_classes.f90 index 9fc1fcb9a..f34273dd7 100644 --- a/src/modules/swiftest_classes.f90 +++ b/src/modules/swiftest_classes.f90 @@ -303,7 +303,8 @@ module swiftest_classes 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 :: write_frame => io_write_frame_system !! Append a frame of output data to file + procedure :: write_frame => io_netcdf_write_frame_system !! Append a frame of output data to file in NetCDF format 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. @@ -706,6 +707,13 @@ 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 io_netcdf_write_frame_system(self, iu, param) + implicit none + class(swiftest_nbody_system), intent(in) :: self !! Swiftest system object + integer(I4B), intent(inout) :: iu !! Unit number for the output file to write frame to + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + end subroutine io_netcdf_write_frame_system + module pure subroutine kick_getacch_int_pl(self) implicit none class(swiftest_pl), intent(inout) :: self From e669145e9a7e5d63893595451032ea74f83dfbcb Mon Sep 17 00:00:00 2001 From: Carlisle Wishard Date: Fri, 13 Aug 2021 08:00:46 -0400 Subject: [PATCH 020/154] changed the names of routines to reflect netcdf output type --- src/io/io.f90 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/io/io.f90 b/src/io/io.f90 index 928782033..887c39d12 100644 --- a/src/io/io.f90 +++ b/src/io/io.f90 @@ -1347,7 +1347,7 @@ module subroutine io_write_encounter(self, pl, encbody, param) end subroutine io_write_encounter - module subroutine io_write_frame_body(self, iu, param) + module subroutine io_netcdf_write_frame_body(self, iu, param) !! author: David A. Minton !! !! Write a frame of output of either test particle or massive body data to the binary output file @@ -1588,7 +1588,7 @@ module subroutine io_write_frame_encounter(iu, t, id1, id2, Gmass1, Gmass2, radi end subroutine - module subroutine io_write_frame_system(self, iu, param) + module subroutine io_netcdf_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 !! !! Write a frame (header plus records for each massive body and active test particle) to output binary file From db86609d5285be8c3f935f67cc6cf639f156701d Mon Sep 17 00:00:00 2001 From: Carlisle Wishard Date: Fri, 13 Aug 2021 08:04:16 -0400 Subject: [PATCH 021/154] added original io_write_frame_body back into io.f90 --- src/io/io.f90 | 61 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) diff --git a/src/io/io.f90 b/src/io/io.f90 index 887c39d12..247a6e4c3 100644 --- a/src/io/io.f90 +++ b/src/io/io.f90 @@ -1346,6 +1346,67 @@ module subroutine io_write_encounter(self, pl, encbody, param) return end subroutine io_write_encounter + module subroutine io_write_frame_body(self, iu, param) + !! author: David A. Minton + !! + !! Write a frame of output of either test particle or massive body data to the binary output file + !! Note: If outputting to orbital elements, but sure that the conversion is done prior to calling this method + !! + !! Adapted from David E. Kaufmann's Swifter routine io_write_frame.f90 + !! Adapted from Hal Levison's Swift routine io_write_frame.F + implicit none + ! Arguments + class(swiftest_body), intent(in) :: self !! Swiftest particle 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 + ! Internals + character(len=STRMAX) :: errmsg + + associate(n => self%nbody) + if (n == 0) return + write(iu, err = 667, iomsg = errmsg) self%id(1:n) + !write(iu, err = 667, iomsg = errmsg) self%name(1:n) + select case (param%out_form) + case (EL) + write(iu, err = 667, iomsg = errmsg) self%a(1:n) + write(iu, err = 667, iomsg = errmsg) self%e(1:n) + write(iu, err = 667, iomsg = errmsg) self%inc(1:n) + write(iu, err = 667, iomsg = errmsg) self%capom(1:n) + write(iu, err = 667, iomsg = errmsg) self%omega(1:n) + write(iu, err = 667, iomsg = errmsg) self%capm(1:n) + case (XV) + write(iu, err = 667, iomsg = errmsg) self%xh(1, 1:n) + write(iu, err = 667, iomsg = errmsg) self%xh(2, 1:n) + write(iu, err = 667, iomsg = errmsg) self%xh(3, 1:n) + write(iu, err = 667, iomsg = errmsg) self%vh(1, 1:n) + write(iu, err = 667, iomsg = errmsg) self%vh(2, 1:n) + write(iu, err = 667, iomsg = errmsg) 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 + write(iu, err = 667, iomsg = errmsg) pl%Gmass(1:n) + if (param%lrhill_present) write(iu, err = 667, iomsg = errmsg) pl%rhill(1:n) + if (param%lclose) write(iu, err = 667, iomsg = errmsg) pl%radius(1:n) + if (param%lrotation) then + write(iu, err = 667, iomsg = errmsg) pl%Ip(1, 1:n) + write(iu, err = 667, iomsg = errmsg) pl%Ip(2, 1:n) + write(iu, err = 667, iomsg = errmsg) pl%Ip(3, 1:n) + write(iu, err = 667, iomsg = errmsg) pl%rot(1, 1:n) + write(iu, err = 667, iomsg = errmsg) pl%rot(2, 1:n) + write(iu, err = 667, iomsg = errmsg) pl%rot(3, 1:n) + end if + if (param%ltides) then + write(iu, err = 667, iomsg = errmsg) pl%k2(1:n) + write(iu, err = 667, iomsg = errmsg) pl%Q(1:n) + end if + end select + end associate + + return + 667 continue + write(*,*) "Error writing body frame: " // trim(adjustl(errmsg)) + call util_exit(FAILURE) + end subroutine io_write_frame_body module subroutine io_netcdf_write_frame_body(self, iu, param) !! author: David A. Minton From 5deae8f7a9a3815ec7b74a4c96a7f16dd3e6d39f Mon Sep 17 00:00:00 2001 From: Carlisle Wishard Date: Fri, 13 Aug 2021 08:04:34 -0400 Subject: [PATCH 022/154] added original io_write_frame_system back into io.f90 --- src/io/io.f90 | 65 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) diff --git a/src/io/io.f90 b/src/io/io.f90 index 247a6e4c3..007a30380 100644 --- a/src/io/io.f90 +++ b/src/io/io.f90 @@ -1648,6 +1648,71 @@ module subroutine io_write_frame_encounter(iu, t, id1, id2, Gmass1, Gmass2, radi return end subroutine + 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 + !! + !! Write a frame (header plus records for each massive body and active test particle) to output binary file + !! There is no direct file output from this subroutine + !! + !! Adapted from David E. Kaufmann's Swifter routine io_write_frame.f90 + !! Adapted from Hal Levison's Swift routine io_write_frame.F + implicit none + ! Arguments + class(swiftest_nbody_system), intent(in) :: self !! Swiftest system 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 + ! Internals + logical, save :: lfirst = .true. !! Flag to determine if this is the first call of this method + class(swiftest_cb), allocatable :: cb !! Temporary local version of pl structure used for non-destructive conversions + class(swiftest_pl), allocatable :: pl !! Temporary local version of pl structure used for non-destructive conversions + class(swiftest_tp), allocatable :: tp !! Temporary local version of pl structure used for non-destructive conversions + character(len=STRMAX) :: errmsg + + allocate(cb, source = self%cb) + allocate(pl, source = self%pl) + allocate(tp, source = self%tp) + iu = BINUNIT + + if (lfirst) then + select case(param%out_stat) + case('APPEND') + open(unit = iu, file = param%outfile, status = 'OLD', position = 'APPEND', form = 'UNFORMATTED', err = 667, iomsg = errmsg) + case('NEW', 'REPLACE', 'UNKNOWN') + open(unit = iu, file = param%outfile, status = param%out_stat, form = 'UNFORMATTED', err = 667, iomsg = errmsg) + case default + write(*,*) 'Invalid status code for OUT_STAT: ',trim(adjustl(param%out_stat)) + call util_exit(FAILURE) + end select + lfirst = .false. + else + open(unit = iu, file = param%outfile, status = 'OLD', position = 'APPEND', form = 'UNFORMATTED', err = 667, iomsg = errmsg) + end if + call io_write_hdr(iu, param%t, pl%nbody, tp%nbody, param%out_form, param%out_type) + + if (param%lgr) then + call pl%pv2v(param) + call tp%pv2v(param) + end if + + if (param%out_form == EL) then ! Do an orbital element conversion prior to writing out the frame, as we have access to the central body here + call pl%xv2el(cb) + call tp%xv2el(cb) + end if + + ! Write out each data type frame + call cb%write_frame(iu, param) + call pl%write_frame(iu, param) + call tp%write_frame(iu, param) + + deallocate(cb, pl, tp) + + close(iu, err = 667, iomsg = errmsg) + + return + 667 continue + write(*,*) "Error writing system frame: " // trim(adjustl(errmsg)) + call util_exit(FAILURE) + end subroutine io_write_frame_system module subroutine io_netcdf_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 From 93b433adcff552ce449ae9a6468c31cef421924e Mon Sep 17 00:00:00 2001 From: Carlisle Wishard Date: Fri, 13 Aug 2021 08:07:10 -0400 Subject: [PATCH 023/154] fixed end subroutine names to reflect netcdf output type --- src/io/io.f90 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/io/io.f90 b/src/io/io.f90 index 007a30380..8502288d9 100644 --- a/src/io/io.f90 +++ b/src/io/io.f90 @@ -1575,7 +1575,7 @@ subroutine check(status) end subroutine check !return - end subroutine io_write_frame_body + end subroutine io_netcdf_write_frame_body module subroutine io_write_frame_cb(self, iu, param) @@ -1877,7 +1877,7 @@ subroutine check(status) end subroutine check !return - end subroutine io_write_frame_system + end subroutine io_netcdf_write_frame_system subroutine io_write_hdr(iu, t, npl, ntp, out_form, out_type) From 3ee3f1d05e528e87390ff66227c25a8fd04d0ac8 Mon Sep 17 00:00:00 2001 From: Carlisle Wishard Date: Fri, 13 Aug 2021 08:27:59 -0400 Subject: [PATCH 024/154] changeed calculation of length of time dimension --- src/io/io.f90 | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/io/io.f90 b/src/io/io.f90 index 8502288d9..a47249212 100644 --- a/src/io/io.f90 +++ b/src/io/io.f90 @@ -1460,7 +1460,9 @@ module subroutine io_netcdf_write_frame_body(self, iu, param) if (n == 0) return !! Calculate the output number that we are currently on - ioutput = (param%t / param%dt) / param%istep_out + !ioutput = (param%t / param%dt) / param%istep_out + call check( nf90_inq_varid(ncid, "Time", time_dimid)) + call check( nf90_inquire_dimension(ncid, time_dimid, len=ioutput)) select case (param%out_form) case (EL) From cf09279ff1fdcb8a51140d3710e5ff595851bec0 Mon Sep 17 00:00:00 2001 From: Carlisle Wishard Date: Fri, 13 Aug 2021 08:29:08 -0400 Subject: [PATCH 025/154] commented out calculation of total length of time dimension switching to unlimited dimension --- src/io/io.f90 | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/io/io.f90 b/src/io/io.f90 index a47249212..a43104f46 100644 --- a/src/io/io.f90 +++ b/src/io/io.f90 @@ -1785,19 +1785,18 @@ module subroutine io_netcdf_write_frame_system(self, iu, param) if (lfirst) then select case(param%out_stat) case('APPEND') - !open(unit = iu, file = param%outfile, status = 'OLD', position = 'APPEND', form = 'UNFORMATTED', iostat = ierr) call cb%write_frame(iu, param) call pl%write_frame(iu, param) call tp%write_frame(iu, param) + case('NEW', 'REPLACE', 'UNKNOWN') - !open(unit = iu, file = param%outfile, status = param%out_stat, form = 'UNFORMATTED', iostat = ierr) !! Create the new output file, deleting any previously existing output file of the same name call check( nf90_create(param%outfile, NF90_CLOBBER, ncid) ) !! Calculate the number of outputs needed to cover the entire simulation time - noutput = ((param%tstop / param%dt) / param%istep_out) + 2 !! +2 because t=0 gets put in spot 1 and need a stop for the final output + !noutput = ((param%tstop / param%dt) / param%istep_out) + 2 !! +2 because t=0 gets put in spot 1 and need a stop for the final output !! Define the NetCDF dimensions with particle name as the record dimension call check( nf90_def_dim(ncid, "Name", NF90_UNLIMITED, name_dimid) ) !! x dimension From 18315640ac4435c9bc69d1faeff9f3213503c0cc Mon Sep 17 00:00:00 2001 From: Carlisle Wishard Date: Fri, 13 Aug 2021 08:29:59 -0400 Subject: [PATCH 026/154] changed time dimension to be unlimited --- src/io/io.f90 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/io/io.f90 b/src/io/io.f90 index a43104f46..df9f33fd6 100644 --- a/src/io/io.f90 +++ b/src/io/io.f90 @@ -1799,8 +1799,8 @@ module subroutine io_netcdf_write_frame_system(self, iu, param) !noutput = ((param%tstop / param%dt) / param%istep_out) + 2 !! +2 because t=0 gets put in spot 1 and need a stop for the final output !! Define the NetCDF dimensions with particle name as the record dimension - call check( nf90_def_dim(ncid, "Name", NF90_UNLIMITED, name_dimid) ) !! x dimension - call check( nf90_def_dim(ncid, "Time", noutput, time_dimid) ) !! y dimension + call check( nf90_def_dim(ncid, "Name", NF90_UNLIMITED, name_dimid) ) !! 'x' dimension + call check( nf90_def_dim(ncid, "Time", NF90_UNLIMITED, time_dimid) ) !! 'y' dimension dimids = (/ time_dimid, name_dimid /) !! Define the variables From 78f7958374ce72c971c1082df126949a19edd8c5 Mon Sep 17 00:00:00 2001 From: Carlisle Wishard Date: Fri, 13 Aug 2021 08:56:07 -0400 Subject: [PATCH 027/154] switched back to the time dimension being limited Runtime error "NetCDF: NC_UNLIMITED size already in use" --- src/io/io.f90 | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/io/io.f90 b/src/io/io.f90 index df9f33fd6..1f7d44a7b 100644 --- a/src/io/io.f90 +++ b/src/io/io.f90 @@ -1460,7 +1460,6 @@ module subroutine io_netcdf_write_frame_body(self, iu, param) if (n == 0) return !! Calculate the output number that we are currently on - !ioutput = (param%t / param%dt) / param%istep_out call check( nf90_inq_varid(ncid, "Time", time_dimid)) call check( nf90_inquire_dimension(ncid, time_dimid, len=ioutput)) @@ -1789,18 +1788,18 @@ module subroutine io_netcdf_write_frame_system(self, iu, param) call cb%write_frame(iu, param) call pl%write_frame(iu, param) call tp%write_frame(iu, param) - + case('NEW', 'REPLACE', 'UNKNOWN') !! Create the new output file, deleting any previously existing output file of the same name call check( nf90_create(param%outfile, NF90_CLOBBER, ncid) ) !! Calculate the number of outputs needed to cover the entire simulation time - !noutput = ((param%tstop / param%dt) / param%istep_out) + 2 !! +2 because t=0 gets put in spot 1 and need a stop for the final output + noutput = ((param%tstop / param%dt) / param%istep_out) + 2 !! +2 because t=0 gets put in spot 1 and need a stop for the final output !! Define the NetCDF dimensions with particle name as the record dimension call check( nf90_def_dim(ncid, "Name", NF90_UNLIMITED, name_dimid) ) !! 'x' dimension - call check( nf90_def_dim(ncid, "Time", NF90_UNLIMITED, time_dimid) ) !! 'y' dimension + call check( nf90_def_dim(ncid, "Time", noutput, time_dimid) ) !! 'y' dimension dimids = (/ time_dimid, name_dimid /) !! Define the variables From accd981deb7eac37089def7aeb9beb2f4ebacd86 Mon Sep 17 00:00:00 2001 From: Carlisle Wishard Date: Fri, 13 Aug 2021 13:57:33 -0400 Subject: [PATCH 028/154] redid how we calculate ioutput --- 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 1f7d44a7b..8c78080c8 100644 --- a/src/io/io.f90 +++ b/src/io/io.f90 @@ -1460,8 +1460,9 @@ module subroutine io_netcdf_write_frame_body(self, iu, param) if (n == 0) return !! Calculate the output number that we are currently on - call check( nf90_inq_varid(ncid, "Time", time_dimid)) - call check( nf90_inquire_dimension(ncid, time_dimid, len=ioutput)) + ioutput = (param%t / param%dt) / param%istep_out + !call check( nf90_inq_varid(ncid, "Time", ioutput)) + !call check( nf90_inquire_dimension(ncid, time_dimid, len=ioutput)) select case (param%out_form) case (EL) From d0e84bff67456a5990ba6125b89ac9343aeb5c56 Mon Sep 17 00:00:00 2001 From: Dana Date: Sun, 15 Aug 2021 15:40:08 -0400 Subject: [PATCH 029/154] Changed NF90_CLOBBER to NF90_HDF5 Changed NF90_CLOBBER to NF90_HDF5 to get file in NetCDF4/HDF5 format to read multiple unlimited dimensions --- src/io/io.f90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/io/io.f90 b/src/io/io.f90 index 8c78080c8..56b998a8e 100644 --- a/src/io/io.f90 +++ b/src/io/io.f90 @@ -1793,7 +1793,7 @@ module subroutine io_netcdf_write_frame_system(self, iu, param) case('NEW', 'REPLACE', 'UNKNOWN') !! Create the new output file, deleting any previously existing output file of the same name - call check( nf90_create(param%outfile, NF90_CLOBBER, ncid) ) + call check( nf90_create(param%outfile, NF90_HDF5, ncid) ) !! Calculate the number of outputs needed to cover the entire simulation time noutput = ((param%tstop / param%dt) / param%istep_out) + 2 !! +2 because t=0 gets put in spot 1 and need a stop for the final output From 0a968b1ec68fd2cfbb59e0ba3fc82c57ccd8b1cb Mon Sep 17 00:00:00 2001 From: Dana Date: Mon, 16 Aug 2021 10:17:03 -0400 Subject: [PATCH 030/154] Change the Time dimension back to unlimited --- src/io/io.f90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/io/io.f90 b/src/io/io.f90 index 56b998a8e..6bcbc0dcb 100644 --- a/src/io/io.f90 +++ b/src/io/io.f90 @@ -1800,7 +1800,7 @@ module subroutine io_netcdf_write_frame_system(self, iu, param) !! Define the NetCDF dimensions with particle name as the record dimension call check( nf90_def_dim(ncid, "Name", NF90_UNLIMITED, name_dimid) ) !! 'x' dimension - call check( nf90_def_dim(ncid, "Time", noutput, time_dimid) ) !! 'y' dimension + call check( nf90_def_dim(ncid, "Time", NF90_UNLIMITED, time_dimid) ) !! 'y' dimension dimids = (/ time_dimid, name_dimid /) !! Define the variables From 285cebfd6d854f9cf6ef7cb6b25de044b65a8a98 Mon Sep 17 00:00:00 2001 From: Dana Date: Thu, 19 Aug 2021 10:07:10 -0400 Subject: [PATCH 031/154] Changed NF90_HDF5 to NF90_NETCDF4 (HDF5 cmode flag is depreciated) --- src/io/io.f90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/io/io.f90 b/src/io/io.f90 index 6cd4c7d3e..a91097c88 100644 --- a/src/io/io.f90 +++ b/src/io/io.f90 @@ -1804,7 +1804,7 @@ module subroutine io_netcdf_write_frame_system(self, iu, param) case('NEW', 'REPLACE', 'UNKNOWN') !! Create the new output file, deleting any previously existing output file of the same name - call check( nf90_create(param%outfile, NF90_HDF5, ncid) ) + call check( nf90_create(param%outfile, NF90_NETCDF4, ncid) ) !! Calculate the number of outputs needed to cover the entire simulation time noutput = ((param%tstop / param%dt) / param%istep_out) + 2 !! +2 because t=0 gets put in spot 1 and need a stop for the final output From c38f4dc4667ea343bca23f2f0efac5efc0e25cd1 Mon Sep 17 00:00:00 2001 From: Carlisle Wishard Date: Tue, 24 Aug 2021 10:49:09 -0400 Subject: [PATCH 032/154] removed -init=snan,arrays flag to accomodate netcdf output --- Makefile.Defines | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Makefile.Defines b/Makefile.Defines index 862e4bb0d..83f1df3f3 100644 --- a/Makefile.Defines +++ b/Makefile.Defines @@ -51,13 +51,13 @@ ADVIXE_FLAGS = -g -O2 -qopt-report=5 -vec -vecabi=cmdtarget -simd -shared-intel VTUNE_FLAGS = -g -O2 -vec -simd -shared-intel -qopenmp -debug inline-debug-info -parallel-source-info=2 -parallel -DTBB_DEBUG -DTBB_USE_THREADING_TOOLS -qopenmp -fp-model no-except -mp1 -xhost -traceback #Be sure to set the environment variable KMP_FORKJOIN_FRAMES=1 for OpenMP debuging in vtune -IDEBUG = -O0 -nogen-interfaces -no-pie -no-ftz -fpe-all=0 -g -traceback -mp1 -fp-model strict -fpe0 -debug all -align all -pad -ip -prec-div -prec-sqrt -assume protect-parens -CB -no-wrap-margin -init=snan,arrays +IDEBUG = -O0 -nogen-interfaces -no-pie -no-ftz -fpe-all=0 -g -traceback -mp1 -fp-model strict -fpe0 -debug all -align all -pad -ip -prec-div -prec-sqrt -assume protect-parens -CB -no-wrap-margin STRICTREAL = -fp-model strict -fp-model no-except -prec-div -prec-sqrt -assume protect-parens SIMDVEC = -simd -xhost -align all -assume contiguous_assumed_shape -vecabi=cmdtarget -prec-div -prec-sqrt -assume protect-parens PAR = -qopenmp #-parallel #Something goes wrong in SyMBA at the moment with auto-paralellization enabled HEAPARR = -heap-arrays 1048576 OPTREPORT = -qopt-report=5 -IPRODUCTION = -init=snan,arrays -no-wrap-margin -O3 $(STRICTREAL) $(PAR) $(SIMDVEC) $(HEAPARR) +IPRODUCTION = -no-wrap-margin -O3 $(STRICTREAL) $(PAR) $(SIMDVEC) $(HEAPARR) #gfortran flags GDEBUG = -g -Og -fbacktrace -fbounds-check -ffree-line-length-none From 37ba668bf770832bc58ae19e22d52d2381257817 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Tue, 24 Aug 2021 20:30:23 -0400 Subject: [PATCH 033/154] Changed dumps to be just straight Fortran binary, not NetCDF --- src/io/io.f90 | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/io/io.f90 b/src/io/io.f90 index 1ce6871bd..30ea64cfa 100644 --- a/src/io/io.f90 +++ b/src/io/io.f90 @@ -141,8 +141,10 @@ module subroutine io_dump_swiftest(self, param) select type(self) class is (swiftest_body) write(iu, err = 667, iomsg = errmsg) self%nbody + call io_write_frame_body(self,iu, param) + class is (swiftest_cb) + call io_write_frame_cb(self,iu, param) end select - call self%write_frame(iu, param) close(iu, err = 667, iomsg = errmsg) return @@ -1773,6 +1775,7 @@ module subroutine io_write_frame_encounter(iu, t, id1, id2, Gmass1, Gmass2, radi call util_exit(FAILURE) end subroutine + 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 !! @@ -1837,6 +1840,7 @@ module subroutine io_write_frame_system(self, iu, param) call util_exit(FAILURE) end subroutine io_write_frame_system + module subroutine io_netcdf_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 !! From 96337083f8fb974d587422d9132608911834bd8c Mon Sep 17 00:00:00 2001 From: Carlisle Wishard Date: Wed, 25 Aug 2021 12:26:34 -0400 Subject: [PATCH 034/154] fixed sorting in io_netcdf_write_frame_body --- src/io/io.f90 | 75 ++++++++++++++++++++++++--------------------------- 1 file changed, 35 insertions(+), 40 deletions(-) diff --git a/src/io/io.f90 b/src/io/io.f90 index 30ea64cfa..adf97fadb 100644 --- a/src/io/io.f90 +++ b/src/io/io.f90 @@ -1575,6 +1575,7 @@ module subroutine io_netcdf_write_frame_body(self, iu, param) integer(I4B) :: rotz_varid !! NetCDF ID for the rotation z variable integer(I4B) :: k2_varid !! NetCDF ID for the Love number variable integer(I4B) :: Q_varid !! NetCDF ID for the energy dissipation variable + integer(14B), dimension(self%body) :: ind !! Open the netCDF file call check( nf90_open(param%outfile, nf90_write, ncid) ) @@ -1589,48 +1590,42 @@ module subroutine io_netcdf_write_frame_body(self, iu, param) select case (param%out_form) case (EL) - do j = 1, n - do i = 1, n - if (self%id(i) == j) then - - !! Reassign all variable IDs - call check( nf90_inq_varid(ncid, "a", a_varid)) - call check( nf90_inq_varid(ncid, "e", e_varid)) - call check( nf90_inq_varid(ncid, "inc", inc_varid)) - call check( nf90_inq_varid(ncid, "capom", capom_varid)) - call check( nf90_inq_varid(ncid, "omega", omega_varid)) - call check( nf90_inq_varid(ncid, "capm", capm_varid)) - - call check( nf90_put_var(ncid, a_varid, self%a(j), start=(/ioutput + 1, j/)) ) - call check( nf90_put_var(ncid, e_varid, self%e(j), start=(/ioutput + 1, j/)) ) - call check( nf90_put_var(ncid, inc_varid, self%inc(j), start=(/ioutput + 1, j/)) ) - call check( nf90_put_var(ncid, capom_varid, self%capom(j), start=(/ioutput + 1, j/)) ) - call check( nf90_put_var(ncid, omega_varid, self%omega(j), start=(/ioutput + 1, j/)) ) - call check( nf90_put_var(ncid, capm_varid, self%capm(j), start=(/ioutput + 1, j/)) ) - end if - end do + call util_sort(self%id(1:n), ind(1:n)) + do i = 1, n + j = ind(i) + !! Reassign all variable IDs + call check( nf90_inq_varid(ncid, "a", a_varid)) + call check( nf90_inq_varid(ncid, "e", e_varid)) + call check( nf90_inq_varid(ncid, "inc", inc_varid)) + call check( nf90_inq_varid(ncid, "capom", capom_varid)) + call check( nf90_inq_varid(ncid, "omega", omega_varid)) + call check( nf90_inq_varid(ncid, "capm", capm_varid)) + + call check( nf90_put_var(ncid, a_varid, self%a(j), start=(/ioutput + 1, j/)) ) + call check( nf90_put_var(ncid, e_varid, self%e(j), start=(/ioutput + 1, j/)) ) + call check( nf90_put_var(ncid, inc_varid, self%inc(j), start=(/ioutput + 1, j/)) ) + call check( nf90_put_var(ncid, capom_varid, self%capom(j), start=(/ioutput + 1, j/)) ) + call check( nf90_put_var(ncid, omega_varid, self%omega(j), start=(/ioutput + 1, j/)) ) + call check( nf90_put_var(ncid, capm_varid, self%capm(j), start=(/ioutput + 1, j/)) ) end do case (XV) - do j = 1, n - do i = 1, n - if (self%id(i) == j) then - - !! Reassign all variable IDs - call check( nf90_inq_varid(ncid, "xhx", xhx_varid)) - call check( nf90_inq_varid(ncid, "xhy", xhy_varid)) - call check( nf90_inq_varid(ncid, "xhz", xhz_varid)) - call check( nf90_inq_varid(ncid, "vhx", vhx_varid)) - call check( nf90_inq_varid(ncid, "vhy", vhy_varid)) - call check( nf90_inq_varid(ncid, "vhz", vhz_varid)) - - call check( nf90_put_var(ncid, xhx_varid, self%xh(1, j), start=(/ioutput + 1, j/)) ) - call check( nf90_put_var(ncid, xhy_varid, self%xh(2, j), start=(/ioutput + 1, j/)) ) - call check( nf90_put_var(ncid, xhz_varid, self%xh(3, j), start=(/ioutput + 1, j/)) ) - call check( nf90_put_var(ncid, vhx_varid, self%vh(1, j), start=(/ioutput + 1, j/)) ) - call check( nf90_put_var(ncid, vhy_varid, self%vh(2, j), start=(/ioutput + 1, j/)) ) - call check( nf90_put_var(ncid, vhz_varid, self%vh(3, j), start=(/ioutput + 1, j/)) ) - end if - end do + call util_sort(self%id(1:n), ind(1:n)) + do i = 1, n + j = ind(i) + !! Reassign all variable IDs + call check( nf90_inq_varid(ncid, "xhx", xhx_varid)) + call check( nf90_inq_varid(ncid, "xhy", xhy_varid)) + call check( nf90_inq_varid(ncid, "xhz", xhz_varid)) + call check( nf90_inq_varid(ncid, "vhx", vhx_varid)) + call check( nf90_inq_varid(ncid, "vhy", vhy_varid)) + call check( nf90_inq_varid(ncid, "vhz", vhz_varid)) + + call check( nf90_put_var(ncid, xhx_varid, self%xh(1, j), start=(/ioutput + 1, j/)) ) + call check( nf90_put_var(ncid, xhy_varid, self%xh(2, j), start=(/ioutput + 1, j/)) ) + call check( nf90_put_var(ncid, xhz_varid, self%xh(3, j), start=(/ioutput + 1, j/)) ) + call check( nf90_put_var(ncid, vhx_varid, self%vh(1, j), start=(/ioutput + 1, j/)) ) + call check( nf90_put_var(ncid, vhy_varid, self%vh(2, j), start=(/ioutput + 1, j/)) ) + call check( nf90_put_var(ncid, vhz_varid, self%vh(3, j), start=(/ioutput + 1, j/)) ) end do end select select type(pl => self) From 71080a932d48cdd926285325ba5919cd295ba28a Mon Sep 17 00:00:00 2001 From: Carlisle Wishard Date: Wed, 25 Aug 2021 12:28:34 -0400 Subject: [PATCH 035/154] changed NF90_FLOAT to NF90_DOUBLE in io_netcdf_write_frame_system --- src/io/io.f90 | 46 +++++++++++++++++++++++----------------------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/src/io/io.f90 b/src/io/io.f90 index adf97fadb..553dcf7f9 100644 --- a/src/io/io.f90 +++ b/src/io/io.f90 @@ -1926,35 +1926,35 @@ module subroutine io_netcdf_write_frame_system(self, iu, param) !! Define the variables select case (param%out_form) case (EL) - call check( nf90_def_var(ncid, "a", NF90_FLOAT, dimids, a_varid) ) - call check( nf90_def_var(ncid, "e", NF90_FLOAT, dimids, e_varid) ) - call check( nf90_def_var(ncid, "inc", NF90_FLOAT, dimids, inc_varid) ) - call check( nf90_def_var(ncid, "capom", NF90_FLOAT, dimids, capom_varid) ) - call check( nf90_def_var(ncid, "omega", NF90_FLOAT, dimids, omega_varid) ) - call check( nf90_def_var(ncid, "capm", NF90_FLOAT, dimids, capm_varid) ) + call check( nf90_def_var(ncid, "a", NF90_DOUBLE, dimids, a_varid) ) + call check( nf90_def_var(ncid, "e", NF90_DOUBLE, dimids, e_varid) ) + call check( nf90_def_var(ncid, "inc", NF90_DOUBLE, dimids, inc_varid) ) + call check( nf90_def_var(ncid, "capom", NF90_DOUBLE, dimids, capom_varid) ) + call check( nf90_def_var(ncid, "omega", NF90_DOUBLE, dimids, omega_varid) ) + call check( nf90_def_var(ncid, "capm", NF90_DOUBLE, dimids, capm_varid) ) case (XV) - call check( nf90_def_var(ncid, "xhx", NF90_FLOAT, dimids, xhx_varid) ) - call check( nf90_def_var(ncid, "xhy", NF90_FLOAT, dimids, xhy_varid) ) - call check( nf90_def_var(ncid, "xhz", NF90_FLOAT, dimids, xhz_varid) ) - call check( nf90_def_var(ncid, "vhx", NF90_FLOAT, dimids, vhx_varid) ) - call check( nf90_def_var(ncid, "vhy", NF90_FLOAT, dimids, vhy_varid) ) - call check( nf90_def_var(ncid, "vhz", NF90_FLOAT, dimids, vhz_varid) ) + call check( nf90_def_var(ncid, "xhx", NF90_DOUBLE, dimids, xhx_varid) ) + call check( nf90_def_var(ncid, "xhy", NF90_DOUBLE, dimids, xhy_varid) ) + call check( nf90_def_var(ncid, "xhz", NF90_DOUBLE, dimids, xhz_varid) ) + call check( nf90_def_var(ncid, "vhx", NF90_DOUBLE, dimids, vhx_varid) ) + call check( nf90_def_var(ncid, "vhy", NF90_DOUBLE, dimids, vhy_varid) ) + call check( nf90_def_var(ncid, "vhz", NF90_DOUBLE, dimids, vhz_varid) ) end select - call check( nf90_def_var(ncid, "Gmass", NF90_FLOAT, dimids, Gmass_varid) ) - if (param%lrhill_present) call check( nf90_def_var(ncid, "rhill", NF90_FLOAT, dimids, rhill_varid) ) - if (param%lclose) call check( nf90_def_var(ncid, "radius", NF90_FLOAT, dimids, radius_varid) ) + call check( nf90_def_var(ncid, "Gmass", NF90_DOUBLE, dimids, Gmass_varid) ) + if (param%lrhill_present) call check( nf90_def_var(ncid, "rhill", NF90_DOUBLE, dimids, rhill_varid) ) + if (param%lclose) call check( nf90_def_var(ncid, "radius", NF90_DOUBLE, dimids, radius_varid) ) if (param%lrotation) then - call check( nf90_def_var(ncid, "Ip1", NF90_FLOAT, dimids, Ip1_varid) ) - call check( nf90_def_var(ncid, "Ip2", NF90_FLOAT, dimids, Ip3_varid) ) - call check( nf90_def_var(ncid, "Ip3", NF90_FLOAT, dimids, Ip3_varid) ) - call check( nf90_def_var(ncid, "rotx", NF90_FLOAT, dimids, rotx_varid) ) - call check( nf90_def_var(ncid, "roty", NF90_FLOAT, dimids, roty_varid) ) - call check( nf90_def_var(ncid, "rotz", NF90_FLOAT, dimids, rotz_varid) ) + call check( nf90_def_var(ncid, "Ip1", NF90_DOUBLE, dimids, Ip1_varid) ) + call check( nf90_def_var(ncid, "Ip2", NF90_DOUBLE, dimids, Ip3_varid) ) + call check( nf90_def_var(ncid, "Ip3", NF90_DOUBLE, dimids, Ip3_varid) ) + call check( nf90_def_var(ncid, "rotx", NF90_DOUBLE, dimids, rotx_varid) ) + call check( nf90_def_var(ncid, "roty", NF90_DOUBLE, dimids, roty_varid) ) + call check( nf90_def_var(ncid, "rotz", NF90_DOUBLE, dimids, rotz_varid) ) end if if (param%ltides) then - call check( nf90_def_var(ncid, "k2", NF90_FLOAT, dimids, k2_varid) ) - call check( nf90_def_var(ncid, "Q", NF90_FLOAT, dimids, Q_varid) ) + call check( nf90_def_var(ncid, "k2", NF90_DOUBLE, dimids, k2_varid) ) + call check( nf90_def_var(ncid, "Q", NF90_DOUBLE, dimids, Q_varid) ) end if !! Exit define mode From 1a0dd8081b361a992a6d04d2cb477d2d3e9228a5 Mon Sep 17 00:00:00 2001 From: Carlisle Wishard Date: Wed, 25 Aug 2021 12:35:21 -0400 Subject: [PATCH 036/154] fixed typo self%body -> self%nbody --- src/io/io.f90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/io/io.f90 b/src/io/io.f90 index 553dcf7f9..e4a358029 100644 --- a/src/io/io.f90 +++ b/src/io/io.f90 @@ -1575,7 +1575,7 @@ module subroutine io_netcdf_write_frame_body(self, iu, param) integer(I4B) :: rotz_varid !! NetCDF ID for the rotation z variable integer(I4B) :: k2_varid !! NetCDF ID for the Love number variable integer(I4B) :: Q_varid !! NetCDF ID for the energy dissipation variable - integer(14B), dimension(self%body) :: ind + integer(14B), dimension(self%nbody) :: ind !! Open the netCDF file call check( nf90_open(param%outfile, nf90_write, ncid) ) From 43541712ddfc95152d20d1ab8b0e0631fd466708 Mon Sep 17 00:00:00 2001 From: Carlisle Wishard Date: Wed, 25 Aug 2021 12:36:58 -0400 Subject: [PATCH 037/154] fixed typo 14B -> I4B --- src/io/io.f90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/io/io.f90 b/src/io/io.f90 index e4a358029..f7001cefa 100644 --- a/src/io/io.f90 +++ b/src/io/io.f90 @@ -1575,7 +1575,7 @@ module subroutine io_netcdf_write_frame_body(self, iu, param) integer(I4B) :: rotz_varid !! NetCDF ID for the rotation z variable integer(I4B) :: k2_varid !! NetCDF ID for the Love number variable integer(I4B) :: Q_varid !! NetCDF ID for the energy dissipation variable - integer(14B), dimension(self%nbody) :: ind + integer(I4B), dimension(self%nbody) :: ind !! Open the netCDF file call check( nf90_open(param%outfile, nf90_write, ncid) ) From ecc38660df7bd78aa8bb3d38ac609b9212f687ed Mon Sep 17 00:00:00 2001 From: David A Minton Date: Wed, 25 Aug 2021 13:51:43 -0400 Subject: [PATCH 038/154] Refactored all of the Python code so that the variables names match the NetCDF variable names --- .../1pl_1tp_encounter/init_cond.py | 6 +- .../8pl_16tp_encounters/init_cond.py | 16 +- .../swiftest_rmvs_vs_swifter_rmvs.ipynb | 6 +- .../mars_ejecta/pl.swifter.in | 2 +- .../symba_chambers_2013/aescattermovie.py | 12 +- examples/symba_chambers_2013/init_cond.py | 6 +- .../symba_clement_2018/ConvertRhill.ipynb | 4 +- examples/symba_clement_2018/aescattermovie.py | 12 +- .../symba_energy_momentum/collision_movie.py | 102 +- examples/symba_mars_disk/Untitled.ipynb | 6 + examples/symba_mars_disk/aescattermovie.py | 12 +- examples/symba_mars_disk/mars.in | 3000 ++++++++--------- examples/symba_mars_disk/param.in | 8 +- examples/symba_mars_disk/testnetcdf.ipynb | 79 + .../1pl_1pl_encounter/init_cond.py | 10 +- .../1pl_1tp_encounter/init_cond.py | 6 +- .../8pl_16tp_encounters/init_cond.py | 14 +- .../mars_disk/pl.swifter.in | 3000 ++++++++--------- .../mars_disk/pl.swiftest.in | 3000 ++++++++--------- .../mars_disk/swiftest_vs_swifter.ipynb | 6 +- .../mtiny_test/pl.swifter.in | 3000 ++++++++--------- .../mtiny_test/pl.swiftest.in | 3000 ++++++++--------- python/swiftest/swiftest/init_cond.py | 102 +- python/swiftest/swiftest/io.py | 232 +- python/swiftest/swiftest/simulation_class.py | 16 +- python/swiftest/swiftest/tool.py | 4 +- src/io/io.f90 | 4 + 27 files changed, 7877 insertions(+), 7788 deletions(-) create mode 100644 examples/symba_mars_disk/Untitled.ipynb create mode 100644 examples/symba_mars_disk/testnetcdf.ipynb diff --git a/examples/rmvs_swifter_comparison/1pl_1tp_encounter/init_cond.py b/examples/rmvs_swifter_comparison/1pl_1tp_encounter/init_cond.py index a700466b1..f17e000fa 100755 --- a/examples/rmvs_swifter_comparison/1pl_1tp_encounter/init_cond.py +++ b/examples/rmvs_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 = np.double(apl * 0.0100447248332378922085) +rhill = np.double(apl * 0.0100447248332378922085) #Make Swifter files plfile = open(swifter_pl, 'w') @@ -63,7 +63,7 @@ print(1,GMSun,file=plfile) print('0.0 0.0 0.0',file=plfile) print('0.0 0.0 0.0',file=plfile) -print(plid,"{:.23g}".format(Gmass),Rhill, file=plfile) +print(plid,"{:.23g}".format(Gmass),rhill, file=plfile) print(radius, file=plfile) print(*p_pl, file=plfile) print(*v_pl, file=plfile) @@ -126,7 +126,7 @@ plfile.write_record(v_pl[1]) plfile.write_record(v_pl[2]) plfile.write_record(Gmass) -plfile.write_record(Rhill) +plfile.write_record(rhill) plfile.write_record(radius) plfile.close() tpfile = FortranFile(swiftest_tp, 'w') 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 5ce3cec71..5fc0ef7d0 100755 --- a/examples/rmvs_swifter_comparison/8pl_16tp_encounters/init_cond.py +++ b/examples/rmvs_swifter_comparison/8pl_16tp_encounters/init_cond.py @@ -84,16 +84,16 @@ 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['GMass']) / rstart) # Start the test particle velocities at a multiple of the escape speed + 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['Gmass']) / 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'])]) + plvec = np.array([np.double(pli['xhx']), + np.double(pli['xhy']), + np.double(pli['xhz']), + np.double(pli['vhx']), + np.double(pli['vhy']), + np.double(pli['vhz'])]) tpxv1 = plvec + xvstart tpxv2 = plvec - xvstart p1.append(tpxv1[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 382459e3b..720db909b 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 @@ -593,7 +593,7 @@ " * id (id) int64 101 102 103 104 105 106 107 ... 111 112 113 114 115 116\n", " time float64 500.0\n", "Data variables:\n", - " GMass (id) float64 nan nan nan nan nan nan ... nan nan nan nan nan nan\n", + " Gmass (id) float64 nan nan nan nan nan nan ... nan nan nan nan nan nan\n", " Radius (id) float64 nan nan nan nan nan nan ... nan nan nan nan nan nan\n", " px (id) float64 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.0 0.0 0.0 0.0 0.0 0.0\n", " py (id) float64 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.0 0.0 0.0 0.0 0.0 0.0\n", @@ -603,7 +603,7 @@ " vz (id) float64 0.0 0.0 -1.084e-19 ... -4.066e-20 -1.355e-20\n", " rmag (id) float64 0.0 0.0 0.0 0.0 1.775e-18 ... 0.0 1.388e-17 0.0 0.0\n", " vmag (id) float64 0.0 0.0 1.084e-19 0.0 ... 4.4e-19 2.206e-19 3.469e-18" + " * id (id) float64 0.0 2.0 3.0 4.0 ... 1.499e+03 1.5e+03 1.501e+03\n", + " * time (time) float64 0.0\n", + "Data variables: (12/25)\n", + " Gmass (time, id) float64 4.284e+13 9.907e+04 ... 7.986e+05 7.541e+04\n", + " radius (time, id) float64 3.39e+06 7.076e+03 ... 9.628e+03 4.385e+03\n", + " J_2 (time, id) float64 0.0 nan nan nan nan ... nan nan nan nan nan\n", + " J_4 (time, id) float64 0.0 nan nan nan nan ... nan nan nan nan nan\n", + " Ip1 (time, id) float64 0.4 0.4 0.4 0.4 0.4 ... 0.4 0.4 0.4 0.4 0.4\n", + " Ip2 (time, id) float64 0.4 0.4 0.4 0.4 0.4 ... 0.4 0.4 0.4 0.4 0.4\n", + " ... ...\n", + " py_origin (id) float64 0.0 8.604e+06 -6.936e+06 ... 1.495e+07 7.918e+06\n", + " pz_origin (id) float64 0.0 1.252e+04 1.515e+04 ... 7.336e+04 2.602e+04\n", + " vhx_origin (id) float64 0.0 -2.134e+03 1.312e+03 ... -1.299e+03 -1.742e+03\n", + " vhy_origin (id) float64 0.0 -591.2 -1.533e+03 ... 92.04 -827.7 -1.185e+03\n", + " vhz_origin (id) float64 0.0 -1.465 -0.1413 0.2818 ... 9.685 -3.166 2.274\n", + " origin_type (id) <U32 'Central body' ... 'Initial conditions'" ], "text/plain": [ "\n", - "Dimensions: ()\n", - "Coordinates:\n", - " id float64 1.13e+03\n", - " time float64 600.0\n", - "Data variables:\n", - " Gmass float64 0.0\n", - " Radius float64 0.0\n", - " px float64 0.0\n", - " py float64 0.0\n", - " pz float64 2.547e-11\n", - " vx float64 -3.286e-11\n", - " vy float64 8.617e-11\n", - " vz float64 -2.795e-11" - ] - }, - "execution_count": 23, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "badval.sel(id=1130)" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "
<xarray.DataArray 'px' (time: 8)>\n",
-       "array([ 0.00000000e+00, -4.65661287e-10, -4.09223139e-06, -1.73607841e-05,\n",
-       "       -4.62410972e-05,  3.44669074e-03, -3.59948692e-01,  2.63233909e+00])\n",
-       "Coordinates:\n",
-       "    id       float64 2.0\n",
-       "  * time     (time) float64 0.0 600.0 1.2e+03 1.8e+03 ... 3e+03 3.6e+03 4.2e+03
" - ], - "text/plain": [ - "\n", - "array([ 0.00000000e+00, -4.65661287e-10, -4.09223139e-06, -1.73607841e-05,\n", - " -4.62410972e-05, 3.44669074e-03, -3.59948692e-01, 2.63233909e+00])\n", + "Dimensions: (id: 1501, time: 1)\n", "Coordinates:\n", - " id float64 2.0\n", - " * time (time) float64 0.0 600.0 1.2e+03 1.8e+03 ... 3e+03 3.6e+03 4.2e+03" + " * id (id) float64 0.0 2.0 3.0 4.0 ... 1.499e+03 1.5e+03 1.501e+03\n", + " * time (time) float64 0.0\n", + "Data variables: (12/25)\n", + " Gmass (time, id) float64 4.284e+13 9.907e+04 ... 7.986e+05 7.541e+04\n", + " radius (time, id) float64 3.39e+06 7.076e+03 ... 9.628e+03 4.385e+03\n", + " J_2 (time, id) float64 0.0 nan nan nan nan ... nan nan nan nan nan\n", + " J_4 (time, id) float64 0.0 nan nan nan nan ... nan nan nan nan nan\n", + " Ip1 (time, id) float64 0.4 0.4 0.4 0.4 0.4 ... 0.4 0.4 0.4 0.4 0.4\n", + " Ip2 (time, id) float64 0.4 0.4 0.4 0.4 0.4 ... 0.4 0.4 0.4 0.4 0.4\n", + " ... ...\n", + " py_origin (id) float64 0.0 8.604e+06 -6.936e+06 ... 1.495e+07 7.918e+06\n", + " pz_origin (id) float64 0.0 1.252e+04 1.515e+04 ... 7.336e+04 2.602e+04\n", + " vhx_origin (id) float64 0.0 -2.134e+03 1.312e+03 ... -1.299e+03 -1.742e+03\n", + " vhy_origin (id) float64 0.0 -591.2 -1.533e+03 ... 92.04 -827.7 -1.185e+03\n", + " vhz_origin (id) float64 0.0 -1.465 -0.1413 0.2818 ... 9.685 -3.166 2.274\n", + " origin_type (id) self%nbody) - if (n == 0) return - - !! Calculate the output number that we are currently on - ioutput = (param%t / param%dt) / param%istep_out - !call check( nf90_inq_varid(ncid, "Time", ioutput)) - !call check( nf90_inquire_dimension(ncid, time_dimid, len=ioutput)) - - select case (param%out_form) - case (EL) - call util_sort(self%id(1:n), ind(1:n)) - do i = 1, n - j = ind(i) - !! Reassign all variable IDs - call check( nf90_inq_varid(ncid, "a", a_varid)) - call check( nf90_inq_varid(ncid, "e", e_varid)) - call check( nf90_inq_varid(ncid, "inc", inc_varid)) - call check( nf90_inq_varid(ncid, "capom", capom_varid)) - call check( nf90_inq_varid(ncid, "omega", omega_varid)) - call check( nf90_inq_varid(ncid, "capm", capm_varid)) - - call check( nf90_put_var(ncid, a_varid, self%a(j), start=(/ioutput + 1, j/)) ) - call check( nf90_put_var(ncid, e_varid, self%e(j), start=(/ioutput + 1, j/)) ) - call check( nf90_put_var(ncid, inc_varid, self%inc(j), start=(/ioutput + 1, j/)) ) - call check( nf90_put_var(ncid, capom_varid, self%capom(j), start=(/ioutput + 1, j/)) ) - call check( nf90_put_var(ncid, omega_varid, self%omega(j), start=(/ioutput + 1, j/)) ) - call check( nf90_put_var(ncid, capm_varid, self%capm(j), start=(/ioutput + 1, j/)) ) - end do - case (XV) - call util_sort(self%id(1:n), ind(1:n)) - do i = 1, n - j = ind(i) - !! Reassign all variable IDs - call check( nf90_inq_varid(ncid, "xhx", xhx_varid)) - call check( nf90_inq_varid(ncid, "xhy", xhy_varid)) - call check( nf90_inq_varid(ncid, "xhz", xhz_varid)) - call check( nf90_inq_varid(ncid, "vhx", vhx_varid)) - call check( nf90_inq_varid(ncid, "vhy", vhy_varid)) - call check( nf90_inq_varid(ncid, "vhz", vhz_varid)) - - call check( nf90_put_var(ncid, xhx_varid, self%xh(1, j), start=(/ioutput + 1, j/)) ) - call check( nf90_put_var(ncid, xhy_varid, self%xh(2, j), start=(/ioutput + 1, j/)) ) - call check( nf90_put_var(ncid, xhz_varid, self%xh(3, j), start=(/ioutput + 1, j/)) ) - call check( nf90_put_var(ncid, vhx_varid, self%vh(1, j), start=(/ioutput + 1, j/)) ) - call check( nf90_put_var(ncid, vhy_varid, self%vh(2, j), start=(/ioutput + 1, j/)) ) - call check( nf90_put_var(ncid, vhz_varid, self%vh(3, j), start=(/ioutput + 1, j/)) ) - end do - end select - select type(pl => self) - class is (swiftest_pl) ! Additional output if the passed polymorphic object is a massive body - do j = 1, n - do i = 1, n - if (self%id(i) == j) then - - !! Reassign all variable IDs - call check( nf90_inq_varid(ncid, "Gmass", Gmass_varid)) - call check( nf90_put_var(ncid, Gmass_varid, pl%Gmass(j), start=(/ioutput + 1, j/)) ) - if (param%lrhill_present) then - !! Reassign all variable IDs - call check( nf90_inq_varid(ncid, "rhill", rhill_varid)) - call check( nf90_put_var(ncid, rhill_varid, pl%rhill(j), start=(/ioutput + 1, j/)) ) - end if - if (param%lclose) then - !! Reassign all variable IDs - call check( nf90_inq_varid(ncid, "radius", radius_varid)) - call check( nf90_put_var(ncid, radius_varid, pl%radius(j), start=(/ioutput + 1, j/)) ) - end if - if (param%lrotation) then - - !! Reassign all variable IDs - call check( nf90_inq_varid(ncid, "Ip1", Ip1_varid)) - call check( nf90_inq_varid(ncid, "Ip2", Ip2_varid)) - call check( nf90_inq_varid(ncid, "Ip3", Ip3_varid)) - call check( nf90_inq_varid(ncid, "rotx", rotx_varid)) - call check( nf90_inq_varid(ncid, "roty", roty_varid)) - call check( nf90_inq_varid(ncid, "rotz", rotz_varid)) - - call check( nf90_put_var(ncid, Ip1_varid, pl%Ip(1, j), start=(/ioutput + 1, j/)) ) - call check( nf90_put_var(ncid, Ip2_varid, pl%Ip(2, j), start=(/ioutput + 1, j/)) ) - call check( nf90_put_var(ncid, Ip3_varid, pl%Ip(3, j), start=(/ioutput + 1, j/)) ) - call check( nf90_put_var(ncid, rotx_varid, pl%rot(1, j), start=(/ioutput + 1, j/)) ) - call check( nf90_put_var(ncid, roty_varid, pl%rot(2, j), start=(/ioutput + 1, j/)) ) - call check( nf90_put_var(ncid, rotz_varid, pl%rot(3, j), start=(/ioutput + 1, j/)) ) - end if - if (param%ltides) then - - !! Reassign all variable IDs - call check( nf90_inq_varid(ncid, "k2", k2_varid)) - call check( nf90_inq_varid(ncid, "Q", Q_varid)) - - call check( nf90_put_var(ncid, k2_varid, pl%k2(j), start=(/ioutput + 1, j/)) ) - call check( nf90_put_var(ncid, Q_varid, pl%Q(j), start=(/ioutput + 1, j/)) ) - end if - end if - end do - end do - end select - end associate - - !! Close the netCDF file - call check( nf90_close(ncid) ) - - contains - - !! Checks the status of all NetCDF operations to catch errors - subroutine check(status) - integer, intent ( in) :: status - - if(status /= nf90_noerr) then - print *, trim(nf90_strerror(status)) - stop "NetCDF Error: Stopped" - end if - end subroutine check - - !return - end subroutine io_netcdf_write_frame_body - module subroutine io_write_frame_cb(self, iu, param) !! author: David A. Minton @@ -1773,7 +1605,7 @@ module subroutine io_write_frame_encounter(iu, t, id1, id2, Gmass1, Gmass2, radi end subroutine - module subroutine io_write_frame_system(self, iu, param) + module subroutine io_write_frame_system(self, param) !! author: The Purdue Swiftest Team - David A. Minton, Carlisle A. Wishard, Jennifer L.L. Pouplin, and Jacob R. Elliott !! !! Write a frame (header plus records for each massive body and active test particle) to output binary file @@ -1784,7 +1616,6 @@ module subroutine io_write_frame_system(self, iu, param) implicit none ! Arguments class(swiftest_nbody_system), intent(in) :: self !! Swiftest system 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 ! Internals logical, save :: lfirst = .true. !! Flag to determine if this is the first call of this method @@ -1792,223 +1623,91 @@ module subroutine io_write_frame_system(self, iu, param) class(swiftest_pl), allocatable :: pl !! Temporary local version of pl structure used for non-destructive conversions class(swiftest_tp), allocatable :: tp !! Temporary local version of pl structure used for non-destructive conversions character(len=STRMAX) :: errmsg + integer(I4B) :: iu = BINUNIT !! Unit number for the output file to write frame to + logical :: fileExists + type(netcdf_parameters) :: nciu allocate(cb, source = self%cb) allocate(pl, source = self%pl) allocate(tp, source = self%tp) iu = BINUNIT - if (lfirst) then - select case(param%out_stat) - case('APPEND') - open(unit = iu, file = param%outfile, status = 'OLD', position = 'APPEND', form = 'UNFORMATTED', err = 667, iomsg = errmsg) - case('NEW', 'REPLACE', 'UNKNOWN') - open(unit = iu, file = param%outfile, status = param%out_stat, form = 'UNFORMATTED', err = 667, iomsg = errmsg) - case default - write(*,*) 'Invalid status code for OUT_STAT: ',trim(adjustl(param%out_stat)) - call util_exit(FAILURE) - end select - lfirst = .false. - else - open(unit = iu, file = param%outfile, status = 'OLD', position = 'APPEND', form = 'UNFORMATTED', err = 667, iomsg = errmsg) + if ((param%out_type == REAL4_TYPE) .or. (param%out_type == REAL8_TYPE)) then + if (lfirst) then + select case(param%out_stat) + case('APPEND') + open(unit = iu, file = param%outfile, status = 'OLD', position = 'APPEND', form = 'UNFORMATTED', err = 667, iomsg = errmsg) + case('NEW', 'REPLACE', 'UNKNOWN') + open(unit = iu, file = param%outfile, status = param%out_stat, form = 'UNFORMATTED', err = 667, iomsg = errmsg) + case default + write(*,*) 'Invalid status code for OUT_STAT: ',trim(adjustl(param%out_stat)) + call util_exit(FAILURE) + end select + + lfirst = .false. + else + open(unit = iu, file = param%outfile, status = 'OLD', position = 'APPEND', form = 'UNFORMATTED', err = 667, iomsg = errmsg) + end if + call io_write_hdr(iu, param%t, pl%nbody, tp%nbody, param%out_form, param%out_type) + else if ((param%out_type == NETCDF_FLOAT_TYPE) .or. (param%out_type == NETCDF_DOUBLE_TYPE)) then + if (lfirst) then + inquire(file=param%outfile, exist=fileExists) + + select case(param%out_stat) + case('APPEND') + if (.not.fileExists) then + errmsg = param%outfile // " not found! You must specify OUT_STAT = NEW, REPLACE, or UNKNOWN" + goto 667 + end if + case('NEW') + if (fileExists) then + errmsg = param%outfile // " Alread Exists! You must specify OUT_STAT = OLD, REPLACE, or UNKNOWN" + goto 667 + end if + case('REPLACE', 'UNKNOWN') + if (fileExists) then + open(file=param%outfile, unit=iu, status='OLD') + close (unit=BINUNIT, status="delete") + end if + end select + + select case(param%out_stat) + case('NEW', 'REPLACE', 'UNKNOWN') + call nciu%initialize(param) + end select + lfirst = .false. + end if end if - call io_write_hdr(iu, param%t, pl%nbody, tp%nbody, param%out_form, param%out_type) if (param%lgr) then call pl%pv2v(param) call tp%pv2v(param) end if - if (param%out_form == EL) then ! Do an orbital element conversion prior to writing out the frame, as we have access to the central body here + if ((param%out_form == EL) .or. (param%out_form == XVEL)) then ! Do an orbital element conversion prior to writing out the frame, as we have access to the central body here call pl%xv2el(cb) call tp%xv2el(cb) end if ! Write out each data type frame - call cb%write_frame(iu, param) - call pl%write_frame(iu, param) - call tp%write_frame(iu, param) - - close(iu, err = 667, iomsg = errmsg) - - return - 667 continue - write(*,*) "Error writing system frame: " // trim(adjustl(errmsg)) - call util_exit(FAILURE) - end subroutine io_write_frame_system - - - module subroutine io_netcdf_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 - !! - !! Write a frame (header plus records for each massive body and active test particle) to output binary file - !! There is no direct file output from this subroutine - !! - !! Adapted from David E. Kaufmann's Swifter routine io_write_frame.f90 - !! Adapted from Hal Levison's Swift routine io_write_frame.F - use netcdf - implicit none - ! Arguments - class(swiftest_nbody_system), intent(in) :: self !! Swiftest system 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 - ! Internals - logical, save :: lfirst = .true. !! Flag to determine if this is the first call of this method - integer(I4B) :: ierr !! I/O error code - - class(swiftest_cb), allocatable :: cb !! Temporary local version of pl structure used for non-destructive conversions - class(swiftest_pl), allocatable :: pl !! Temporary local version of pl structure used for non-destructive conversions - class(swiftest_tp), allocatable :: tp !! Temporary local version of pl structure used for non-destructive conversions - - integer(I4B) :: ncid !! NetCDF ID for the output file - integer(I4B) :: dimids(2) !! Dimensions of the NetCDF file - integer(I4B) :: time_dimid !! NetCDF ID for the time dimension - integer(I4B) :: id_dimid !! NetCDF ID for the particle name dimension - integer(I4B) :: noutput !! Number of output events covering the total simulation time - integer(I4B) :: a_varid !! NetCDF ID for the semimajor axis variable - integer(I4B) :: e_varid !! NetCDF ID for the eccentricity variable - integer(I4B) :: inc_varid !! NetCDF ID for the inclination variable - integer(I4B) :: capom_varid !! NetCDF ID for the long. asc. node variable - integer(I4B) :: omega_varid !! NetCDF ID for the arg. periapsis variable - integer(I4B) :: capm_varid !! NetCDF ID for the mean anomaly variable - integer(I4B) :: xhx_varid !! NetCDF ID for the heliocentric position x variable - integer(I4B) :: xhy_varid !! NetCDF ID for the heliocentric position y variable - integer(I4B) :: xhz_varid !! NetCDF ID for the heliocentric position z variable - integer(I4B) :: vhx_varid !! NetCDF ID for the heliocentric velocity x variable - integer(I4B) :: vhy_varid !! NetCDF ID for the heliocentric velocity y variable - integer(I4B) :: vhz_varid !! NetCDF ID for the heliocentric velocity z variable - integer(I4B) :: Gmass_varid !! NetCDF ID for the mass variable - integer(I4B) :: rhill_varid !! NetCDF ID for the hill radius variable - integer(I4B) :: radius_varid !! NetCDF ID for the radius variable - integer(I4B) :: Ip1_varid !! NetCDF ID for the axis 1 principal moment of inertial variable - integer(I4B) :: Ip2_varid !! NetCDF ID for the axis 2 principal moment of inertial variable - integer(I4B) :: Ip3_varid !! NetCDF ID for the axis 3 principal moment of inertial variable - integer(I4B) :: rotx_varid !! NetCDF ID for the rotation x variable - integer(I4B) :: roty_varid !! NetCDF ID for the rotation y variable - integer(I4B) :: rotz_varid !! NetCDF ID for the rotation z variable - integer(I4B) :: k2_varid !! NetCDF ID for the Love number variable - integer(I4B) :: Q_varid !! NetCDF ID for the energy dissipation variable - integer(I4B) :: oldMode - logical :: fileExists - - allocate(cb, source = self%cb) - allocate(pl, source = self%pl) - allocate(tp, source = self%tp) - iu = BINUNIT - - if (param%lgr) then - call pl%pv2v(param) - call tp%pv2v(param) - end if - - if (param%out_form == EL) then ! Do an orbital element conversion prior to writing out the frame, as we have access to the central body here - call pl%xv2el(cb) - call tp%xv2el(cb) - end if - - if (lfirst) then - select case(param%out_stat) - case('APPEND') - - call cb%write_frame(iu, param) - call pl%write_frame(iu, param) - call tp%write_frame(iu, param) - - case('NEW', 'REPLACE', 'UNKNOWN') - - !! Create the new output file, deleting any previously existing output file of the same name - inquire(file=param%outfile, exist=fileExists) - if (fileExists) then - open(file=param%outfile, unit=BINUNIT, status='OLD') - close (unit=BINUNIT, status="delete") - end if - call check( nf90_create(param%outfile, NF90_HDF5, ncid) ) - !call check( nf90_set_fill(ncid, nf90_nofill, oldMode) ) - - !! Calculate the number of outputs needed to cover the entire simulation time - noutput = ((param%tstop / param%dt) / param%istep_out) + 2 !! +2 because t=0 gets put in spot 1 and need a stop for the final output - - !! Define the NetCDF dimensions with particle name as the record dimension - call check( nf90_def_dim(ncid, "id", NF90_UNLIMITED, id_dimid) ) !! 'x' dimension - call check( nf90_def_dim(ncid, "time", NF90_UNLIMITED, time_dimid) ) !! 'y' dimension - dimids = (/ time_dimid, id_dimid /) - - !! Define the variables - select case (param%out_form) - case (EL) - call check( nf90_def_var(ncid, "a", NF90_DOUBLE, dimids, a_varid) ) - call check( nf90_def_var(ncid, "e", NF90_DOUBLE, dimids, e_varid) ) - call check( nf90_def_var(ncid, "inc", NF90_DOUBLE, dimids, inc_varid) ) - call check( nf90_def_var(ncid, "capom", NF90_DOUBLE, dimids, capom_varid) ) - call check( nf90_def_var(ncid, "omega", NF90_DOUBLE, dimids, omega_varid) ) - call check( nf90_def_var(ncid, "capm", NF90_DOUBLE, dimids, capm_varid) ) - case (XV) - call check( nf90_def_var(ncid, "xhx", NF90_DOUBLE, dimids, xhx_varid) ) - call check( nf90_def_var(ncid, "xhy", NF90_DOUBLE, dimids, xhy_varid) ) - call check( nf90_def_var(ncid, "xhz", NF90_DOUBLE, dimids, xhz_varid) ) - call check( nf90_def_var(ncid, "vhx", NF90_DOUBLE, dimids, vhx_varid) ) - call check( nf90_def_var(ncid, "vhy", NF90_DOUBLE, dimids, vhy_varid) ) - call check( nf90_def_var(ncid, "vhz", NF90_DOUBLE, dimids, vhz_varid) ) - end select - - call check( nf90_def_var(ncid, "Gmass", NF90_DOUBLE, dimids, Gmass_varid) ) - if (param%lrhill_present) call check( nf90_def_var(ncid, "rhill", NF90_DOUBLE, dimids, rhill_varid) ) - if (param%lclose) call check( nf90_def_var(ncid, "radius", NF90_DOUBLE, dimids, radius_varid) ) - if (param%lrotation) then - call check( nf90_def_var(ncid, "Ip1", NF90_DOUBLE, dimids, Ip1_varid) ) - call check( nf90_def_var(ncid, "Ip2", NF90_DOUBLE, dimids, Ip3_varid) ) - call check( nf90_def_var(ncid, "Ip3", NF90_DOUBLE, dimids, Ip3_varid) ) - call check( nf90_def_var(ncid, "rotx", NF90_DOUBLE, dimids, rotx_varid) ) - call check( nf90_def_var(ncid, "roty", NF90_DOUBLE, dimids, roty_varid) ) - call check( nf90_def_var(ncid, "rotz", NF90_DOUBLE, dimids, rotz_varid) ) - end if - if (param%ltides) then - call check( nf90_def_var(ncid, "k2", NF90_DOUBLE, dimids, k2_varid) ) - call check( nf90_def_var(ncid, "Q", NF90_DOUBLE, dimids, Q_varid) ) - end if - - !! Exit define mode - call check( nf90_enddef(ncid) ) - - !! Close the netCDF file - call check( nf90_close(ncid) ) - - !! Write the first frame of the output - call cb%write_frame(iu, param) - call pl%write_frame(iu, param) - call tp%write_frame(iu, param) - - case default - write(*,*) 'Invalid status code for OUT_STAT: ',trim(adjustl(param%out_stat)) - call util_exit(FAILURE) - end select - - lfirst = .false. - - else - + if ((param%out_type == REAL4_TYPE) .or. (param%out_type == REAL8_TYPE)) then call cb%write_frame(iu, param) call pl%write_frame(iu, param) call tp%write_frame(iu, param) + close(iu, err = 667, iomsg = errmsg) + else if ((param%out_type == NETCDF_FLOAT_TYPE) .or. (param%out_type == NETCDF_DOUBLE_TYPE)) then + call cb%write_frame(nciu, param) + call pl%write_frame(nciu, param) + call tp%write_frame(nciu, param) end if - - deallocate(cb, pl, tp) - - contains - - !! Checks the status of all NetCDF operations to catch errors - subroutine check(status) - integer, intent ( in) :: status - if(status /= nf90_noerr) then - print *, trim(nf90_strerror(status)) - stop "NetCDF Error: Stopped" - end if - end subroutine check + return - !return - end subroutine io_netcdf_write_frame_system + 667 continue + write(*,*) "Error writing system frame: " // trim(adjustl(errmsg)) + call util_exit(FAILURE) + end subroutine io_write_frame_system subroutine io_write_hdr(iu, t, npl, ntp, out_form, out_type) @@ -2030,9 +1729,9 @@ subroutine io_write_hdr(iu, t, npl, ntp, out_form, out_type) character(len=STRMAX) :: errmsg select case (out_type) - case (REAL4_TYPE,SWIFTER_REAL4_TYPE) + case (REAL4_TYPE) write(iu, err = 667, iomsg = errmsg) real(t, kind=SP) - case (REAL8_TYPE,SWIFTER_REAL8_TYPE) + case (REAL8_TYPE) write(iu, err = 667, iomsg = errmsg) t end select write(iu, err = 667, iomsg = errmsg) npl diff --git a/src/main/swiftest_driver.f90 b/src/main/swiftest_driver.f90 index 3a274e596..d22663d40 100644 --- a/src/main/swiftest_driver.f90 +++ b/src/main/swiftest_driver.f90 @@ -18,7 +18,6 @@ program swiftest_driver integer(I8B) :: idump !! Dump cadence counter integer(I8B) :: iout !! Output cadence counter integer(I8B) :: nloops !! Number of steps to take in the simulation - integer(I4B) :: iu !! Unit number of binary file real(DP) :: old_t_final = 0.0_DP !! Output time at which writing should start, in order to prevent duplicate lines being written for restarts ierr = io_get_args(integrator, param_file_name) @@ -56,7 +55,7 @@ program swiftest_driver old_t_final = nbody_system%get_old_t_final(param) else old_t_final = t0 - if (istep_out > 0) call nbody_system%write_frame(iu, param) + if (istep_out > 0) call nbody_system%write_frame(param) call nbody_system%dump(param) end if @@ -81,7 +80,7 @@ program swiftest_driver if (istep_out > 0) then iout = iout - 1 if (iout == 0) then - if (t > old_t_final) call nbody_system%write_frame(iu, param) + if (t > old_t_final) call nbody_system%write_frame(param) iout = istep_out end if end if diff --git a/src/modules/swiftest_classes.f90 b/src/modules/swiftest_classes.f90 index 5fcc46aa5..d5642ab87 100644 --- a/src/modules/swiftest_classes.f90 +++ b/src/modules/swiftest_classes.f90 @@ -15,7 +15,7 @@ module swiftest_classes !> Each paramter is initialized to a default values. type :: swiftest_parameters integer(I4B) :: integrator = UNKNOWN_INTEGRATOR !! Symbolic name of the nbody integrator used - integer(I4B) :: maxid = -1 !! The current maximum particle id number + integer(I4B) :: maxid = -1 !! The current maximum particle id number real(DP) :: t0 = -1.0_DP !! Integration start time real(DP) :: t = -1.0_DP !! Integration current time real(DP) :: tstop = -1.0_DP !! Integration stop time @@ -26,9 +26,9 @@ module swiftest_classes character(STRMAX) :: in_type = ASCII_TYPE !! Data representation type of input data files character(STRMAX) :: in_form = XV !! Format of input data files (EL or XV) integer(I4B) :: istep_out = -1 !! Number of time steps between binary outputs - character(STRMAX) :: outfile = BIN_OUTFILE !! Name of output binary file - character(STRMAX) :: out_type = REAL8_TYPE !! Binary format of output file - character(STRMAX) :: out_form = XV !! Data to write to output file + character(STRMAX) :: outfile = NETCDF_OUTFILE !! Name of output binary file + character(STRMAX) :: out_type = NETCDF_DOUBLE_TYPE !! Binary format of output file + character(STRMAX) :: out_form = XVEL !! Data to write to output file character(STRMAX) :: out_stat = 'NEW' !! Open status for output binary file integer(I4B) :: istep_dump = -1 !! Number of time steps between dumps real(DP) :: rmin = -1.0_DP !! Minimum heliocentric radius for test particle @@ -82,6 +82,39 @@ module swiftest_classes procedure :: read_in => io_read_in_param end type swiftest_parameters + type :: netcdf_parameters + integer(I4B) :: ncid !! NetCDF ID for the output file + integer(I4B) :: dimids(2) !! Dimensions of the NetCDF file + integer(I4B) :: time_dimid !! NetCDF ID for the time dimension + integer(I4B) :: id_dimid !! NetCDF ID for the particle name dimension + integer(I4B) :: a_varid !! NetCDF ID for the semimajor axis variable + integer(I4B) :: e_varid !! NetCDF ID for the eccentricity variable + integer(I4B) :: inc_varid !! NetCDF ID for the inclination variable + integer(I4B) :: capom_varid !! NetCDF ID for the long. asc. node variable + integer(I4B) :: omega_varid !! NetCDF ID for the arg. periapsis variable + integer(I4B) :: capm_varid !! NetCDF ID for the mean anomaly variable + integer(I4B) :: xhx_varid !! NetCDF ID for the heliocentric position x variable + integer(I4B) :: xhy_varid !! NetCDF ID for the heliocentric position y variable + integer(I4B) :: xhz_varid !! NetCDF ID for the heliocentric position z variable + integer(I4B) :: vhx_varid !! NetCDF ID for the heliocentric velocity x variable + integer(I4B) :: vhy_varid !! NetCDF ID for the heliocentric velocity y variable + integer(I4B) :: vhz_varid !! NetCDF ID for the heliocentric velocity z variable + integer(I4B) :: Gmass_varid !! NetCDF ID for the mass variable + integer(I4B) :: rhill_varid !! NetCDF ID for the hill radius variable + integer(I4B) :: radius_varid !! NetCDF ID for the radius variable + integer(I4B) :: Ip1_varid !! NetCDF ID for the axis 1 principal moment of inertia variable + integer(I4B) :: Ip2_varid !! NetCDF ID for the axis 2 principal moment of inertia variable + integer(I4B) :: Ip3_varid !! NetCDF ID for the axis 3 principal moment of inertia variable + integer(I4B) :: rotx_varid !! NetCDF ID for the rotation x variable + integer(I4B) :: roty_varid !! NetCDF ID for the rotation y variable + integer(I4B) :: rotz_varid !! NetCDF ID for the rotation z variable + integer(I4B) :: k2_varid !! NetCDF ID for the Love number variable + integer(I4B) :: Q_varid !! NetCDF ID for the energy dissipation variable + integer(I4B) :: out_type !! NetCDF output type (will be assigned either NF90_DOUBLE or NF90_FLOAT, depending on the user parameter) + contains + procedure :: initialize => netcdf_initialize_output !! Initialize a set of parameters used to identify a NetCDF output object + end type netcdf_parameters + !******************************************************************************************************************************** ! swiftest_base class definitions and methods !******************************************************************************************************************************** @@ -90,9 +123,9 @@ 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(abstract_read_frame), deferred :: read_frame - procedure(abstract_write_frame), deferred :: write_frame + procedure :: dump => io_dump_swiftest + procedure :: write_frame_netcdf => netcdf_write_frame_base !! I/O routine for writing out a single frame of time-series data for all bodies in the system in NetCDF format + generic :: write_frame => write_frame_netcdf end type swiftest_base !******************************************************************************************************************************** @@ -127,7 +160,8 @@ module swiftest_classes contains procedure :: read_in => io_read_in_cb !! 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 + procedure :: write_frame_bin => io_write_frame_cb !! I/O routine for writing out a single frame of time-series data for the central body + generic :: write_frame => write_frame_bin end type swiftest_cb !******************************************************************************************************************************** @@ -173,8 +207,7 @@ module swiftest_classes procedure :: pv2v => gr_pv2vh_body !! Converts from psudeovelocity to velocity for GR calculations using symplectic integrators procedure :: read_in => io_read_in_body !! 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 :: write_frame => io_netcdf_write_frame_body !! I/O routine for writing out a single frame of time-series data for all bodies in the system in NetCDF format + procedure :: write_frame_bin => 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 @@ -187,6 +220,7 @@ module swiftest_classes 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) + generic :: write_frame => write_frame_bin end type swiftest_body !******************************************************************************************************************************** @@ -277,7 +311,7 @@ module swiftest_classes ! swiftest_nbody_system class definitions and methods !******************************************************************************************************************************** !> An abstract class for a basic Swiftest nbody system - type, abstract, extends(swiftest_base) :: swiftest_nbody_system + type, abstract :: 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 @@ -306,8 +340,7 @@ module swiftest_classes procedure :: get_old_t_final => io_get_old_t_final_system !! Validates the dump file to check whether the dump file initial conditions duplicate the last frame of the binary output. 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 :: write_frame => io_netcdf_write_frame_system !! Append a frame of output data to file in NetCDF format + 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. @@ -399,13 +432,6 @@ subroutine abstract_step_system(self, param, t, dt) real(DP), intent(in) :: t !! Simulation time real(DP), intent(in) :: dt !! Current stepsize end subroutine abstract_step_system - - subroutine abstract_write_frame(self, iu, param) - import DP, I4B, swiftest_base, swiftest_parameters - class(swiftest_base), intent(in) :: self !! Swiftest base object - integer(I4B), intent(inout) :: iu !! Unit number for the output file to write frame to - class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters - end subroutine abstract_write_frame end interface interface @@ -687,13 +713,6 @@ module subroutine io_write_frame_body(self, iu, param) class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters end subroutine io_write_frame_body - module subroutine io_netcdf_write_frame_body(self, iu, param) - implicit none - class(swiftest_body), intent(in) :: self !! Swiftest body object - integer(I4B), intent(inout) :: iu !! Unit number for the output file to write frame to - class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters - end subroutine io_netcdf_write_frame_body - module subroutine io_write_frame_cb(self, iu, param) implicit none class(swiftest_cb), intent(in) :: self !! Swiftest central body object @@ -712,19 +731,18 @@ module subroutine io_write_frame_encounter(iu, t, id1, id2, Gmass1, Gmass2, radi real(DP), dimension(:), intent(in) :: vh1, vh2 !! Swiftestcentric velocity vectors of the two encountering bodies end subroutine io_write_frame_encounter - module subroutine io_write_frame_system(self, iu, param) + module subroutine io_write_frame_system(self, param) implicit none class(swiftest_nbody_system), intent(in) :: self !! Swiftest system object - integer(I4B), intent(inout) :: iu !! Unit number for the output file to write frame to class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters end subroutine io_write_frame_system - module subroutine io_netcdf_write_frame_system(self, iu, param) + module subroutine netcdf_write_frame_system(self, iu, param) implicit none class(swiftest_nbody_system), intent(in) :: self !! Swiftest system object integer(I4B), intent(inout) :: iu !! Unit number for the output file to write frame to class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters - end subroutine io_netcdf_write_frame_system + end subroutine netcdf_write_frame_system module subroutine kick_getacch_int_all_pl(npl, nplpl, k_plpl, x, Gmass, radius, acc) implicit none @@ -770,6 +788,19 @@ 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 netcdf_initialize_output(self, param) + implicit none + class(netcdf_parameters), intent(inout) :: self !! Parameters used to identify a particular NetCDF dataset + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + end subroutine netcdf_initialize_output + + module subroutine netcdf_write_frame_base(self, iu, param) + implicit none + class(swiftest_base), intent(in) :: self !! Swiftest base object + class(netcdf_parameters), 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 netcdf_write_frame_base + module subroutine obl_acc_body(self, system) implicit none class(swiftest_body), intent(inout) :: self !! Swiftest body object diff --git a/src/modules/swiftest_globals.f90 b/src/modules/swiftest_globals.f90 index ad886e4f7..bb08c7ab5 100644 --- a/src/modules/swiftest_globals.f90 +++ b/src/modules/swiftest_globals.f90 @@ -47,11 +47,12 @@ module swiftest_globals character(*), parameter :: ASCII_TYPE = 'ASCII' !! Symbolic name for ASCII file type character(*), parameter :: REAL4_TYPE = 'REAL4' !! Symbolic name for binary file type REAL4 character(*), parameter :: REAL8_TYPE = 'REAL8' !! Symbolic name for binary file type REAL8 - character(*), parameter :: SWIFTER_REAL4_TYPE = 'SWIFTER4' !! Symbolic name for binary file type for the old style Swifter REAL4 - character(*), parameter :: SWIFTER_REAL8_TYPE = 'SWIFTER8' !! Symbolic name for binary file type for the old style Swifter REAL8 + character(*), parameter :: NETCDF_FLOAT_TYPE = 'NETCDF_FLOAT' !! Symbolic name for binary file type REAL8 + character(*), parameter :: NETCDF_DOUBLE_TYPE = 'NETCDF_DOUBLE' !! Symbolic name for binary file type REAL8 - character(*), parameter :: EL = 'EL' !! Symbolic name for binary output file contents for orbital element type - character(*), parameter :: XV = 'XV' !! Symbolic name for binary output file contents for cartesian position and velocity type + character(*), parameter :: EL = 'EL' !! Symbolic name for binary output file contents for orbital elements + character(*), parameter :: XV = 'XV' !! Symbolic name for binary output file contents for cartesian position and velocity vectors + character(*), parameter :: XVEL = 'XVEL' !! Symbolic name for binary output file contents for both cartesian position and velocity and orbital elements ! OpenMP Parameters integer(I4B) :: nthreads = 1 !! Number of OpenMP threads @@ -125,4 +126,32 @@ module swiftest_globals 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 + !> NetCDF variable names and constants + character(*), parameter :: NETCDF_OUTFILE = 'bin.nc' + character(*), parameter :: TIME_DIMNAME = "time"!! netcdf id for the time dimension + character(*), parameter :: ID_DIMNAME = "id"!! NetCDF ID for the particle name dimension + character(*), parameter :: A_VARNAME = "a"!! NetCDF ID for the semimajor axis variable + character(*), parameter :: E_VARNAME = "e"!! NetCDF ID for the eccentricity variable + character(*), parameter :: INC_VARNAME = "inc"!! NetCDF ID for the inclination variable + character(*), parameter :: CAPOM_VARNAME = "capom"!! NetCDF ID for the long. asc. node variable + character(*), parameter :: OMEGA_VARNAME = "omega"!! NetCDF ID for the arg. periapsis variable + character(*), parameter :: CAPM_VARNAME = "capm"!! NetCDF ID for the mean anomaly variable + character(*), parameter :: XHX_VARNAME = "xhx"!! NetCDF ID for the heliocentric position x variable + character(*), parameter :: XHY_VARNAME = "xhy"!! NetCDF ID for the heliocentric position y variable + character(*), parameter :: XHZ_VARNAME = "xhz"!! NetCDF ID for the heliocentric position z variable + character(*), parameter :: VHX_VARNAME = "vhx"!! NetCDF ID for the heliocentric velocity x variable + character(*), parameter :: VHY_VARNAME = "vhy"!! NetCDF ID for the heliocentric velocity y variable + character(*), parameter :: VHZ_VARNAME = "vhz"!! NetCDF ID for the heliocentric velocity z variable + character(*), parameter :: GMASS_VARNAME = "Gmass"!! NetCDF ID for the mass variable + character(*), parameter :: RHILL_VARNAME = "rhill"!! NetCDF ID for the hill radius variable + character(*), parameter :: RADIUS_VARNAME = "radius"!! NetCDF ID for the radius variable + character(*), parameter :: IP1_VARNAME = "Ip1"!! NetCDF ID for the axis 1 principal moment of inertial variable + character(*), parameter :: IP2_VARNAME = "Ip2"!! NetCDF ID for the axis 2 principal moment of inertial variable + character(*), parameter :: IP3_VARNAME = "Ip3"!! NetCDF ID for the axis 3 principal moment of inertial variable + character(*), parameter :: ROTX_VARNAME = "rotx"!! NetCDF ID for the rotation x variable + character(*), parameter :: ROTY_VARNAME = "roty"!! NetCDF ID for the rotation y variable + character(*), parameter :: ROTZ_VARNAME = "rotz"!! NetCDF ID for the rotation z variable + character(*), parameter :: K2_VARNAME = "k2"!! NetCDF ID for the Love number variable + character(*), parameter :: Q_VARNAME = "Q"!! NetCDF ID for the energy dissipation variable + end module swiftest_globals diff --git a/src/netcdf/netcdf.f90 b/src/netcdf/netcdf.f90 new file mode 100644 index 000000000..1f1b2149d --- /dev/null +++ b/src/netcdf/netcdf.f90 @@ -0,0 +1,232 @@ +submodule (swiftest_classes) s_netcdf + use swiftest + use netcdf +contains + + module subroutine netcdf_write_frame_base(self, iu, param) + !! author: Carlisle A. Wishard, Dana Singh, and David A. Minton + !! + !! Write a frame of output of either test particle or massive body data to the binary output file + !! Note: If outputting to orbital elements, but sure that the conversion is done prior to calling this method + !! + !! Adapted from David E. Kaufmann's Swifter routine io_write_frame.f90 + !! Adapted from Hal Levison's Swift routine io_write_frame.F + implicit none + ! Arguments + class(swiftest_base), intent(in) :: self !! Swiftest particle object + class(netcdf_parameters), intent(inout) :: iu !! Parameters used to identify a particular NetCDF dataset + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + ! Internals + integer(I4B) :: i, j, id, ioutput + integer(I4B), dimension(:), allocatable :: ind + + !! Open the netCDF file + call check( nf90_open(param%outfile, nf90_write, iu%ncid) ) + !call check( nf90_set_fill(iu%ncid, nf90_nofill, oldMode) ) + + + ! Calculate the output number that we are currently on + ioutput = (param%t / param%dt) / param%istep_out + + select type(self) + class is (swiftest_body) + associate(n => self%nbody) + if (n == 0) return + allocate(ind(n)) + call util_sort(self%id(1:n), ind(1:n)) + + do i = 1, n + j = ind(i) + id = self%id(j) + if ((param%out_form == XV) .or. (param%out_form == XVEL)) then + call check( nf90_inq_varid(iu%ncid, XHX_VARNAME, iu%xhx_varid)) + call check( nf90_inq_varid(iu%ncid, XHY_VARNAME, iu%xhy_varid)) + call check( nf90_inq_varid(iu%ncid, XHZ_VARNAME, iu%xhz_varid)) + call check( nf90_inq_varid(iu%ncid, VHX_VARNAME, iu%vhx_varid)) + call check( nf90_inq_varid(iu%ncid, VHY_VARNAME, iu%vhy_varid)) + call check( nf90_inq_varid(iu%ncid, VHZ_VARNAME, iu%vhz_varid)) + + call check( nf90_put_var(iu%ncid, iu%xhx_varid, self%xh(1, j), start=[ioutput + 1, id]) ) + call check( nf90_put_var(iu%ncid, iu%xhy_varid, self%xh(2, j), start=[ioutput + 1, id]) ) + call check( nf90_put_var(iu%ncid, iu%xhz_varid, self%xh(3, j), start=[ioutput + 1, id]) ) + call check( nf90_put_var(iu%ncid, iu%vhx_varid, self%vh(1, j), start=[ioutput + 1, id]) ) + call check( nf90_put_var(iu%ncid, iu%vhy_varid, self%vh(2, j), start=[ioutput + 1, id]) ) + call check( nf90_put_var(iu%ncid, iu%vhz_varid, self%vh(3, j), start=[ioutput + 1, id]) ) + end if + if ((param%out_form == EL) .or. (param%out_form == XVEL)) then + call check( nf90_inq_varid(iu%ncid, A_VARNAME, iu%a_varid)) + call check( nf90_inq_varid(iu%ncid, E_VARNAME, iu%e_varid)) + call check( nf90_inq_varid(iu%ncid, INC_VARNAME, iu%inc_varid)) + call check( nf90_inq_varid(iu%ncid, CAPOM_VARNAME, iu%capom_varid)) + call check( nf90_inq_varid(iu%ncid, OMEGA_VARNAME, iu%omega_varid)) + call check( nf90_inq_varid(iu%ncid, CAPM_VARNAME, iu%capm_varid)) + + call check( nf90_put_var(iu%ncid, iu%a_varid, self%a(j), start=[ioutput + 1, id]) ) + call check( nf90_put_var(iu%ncid, iu%e_varid, self%e(j), start=[ioutput + 1, id]) ) + call check( nf90_put_var(iu%ncid, iu%inc_varid, self%inc(j), start=[ioutput + 1, id]) ) + call check( nf90_put_var(iu%ncid, iu%capom_varid, self%capom(j), start=[ioutput + 1, id]) ) + call check( nf90_put_var(iu%ncid, iu%omega_varid, self%omega(j), start=[ioutput + 1, id]) ) + call check( nf90_put_var(iu%ncid, iu%capm_varid, self%capm(j), start=[ioutput + 1, id]) ) + end if + select type(pl => self) + class is (swiftest_pl) ! Additional output if the passed polymorphic object is a massive body + call check( nf90_inq_varid(iu%ncid, GMASS_VARNAME, iu%Gmass_varid)) + call check( nf90_put_var(iu%ncid, iu%Gmass_varid, pl%Gmass(j), start=[ioutput + 1, id]) ) + if (param%lrhill_present) then + call check( nf90_inq_varid(iu%ncid, RHILL_VARNAME, iu%rhill_varid)) + call check( nf90_put_var(iu%ncid, iu%rhill_varid, pl%rhill(j), start=[ioutput + 1, id]) ) + end if + if (param%lclose) then + call check( nf90_inq_varid(iu%ncid, RADIUS_VARNAME, iu%radius_varid)) + call check( nf90_put_var(iu%ncid, iu%radius_varid, pl%radius(j), start=[ioutput + 1, id]) ) + end if + if (param%lrotation) then + call check( nf90_inq_varid(iu%ncid, IP1_VARNAME, iu%Ip1_varid)) + call check( nf90_inq_varid(iu%ncid, IP2_VARNAME, iu%Ip2_varid)) + call check( nf90_inq_varid(iu%ncid, IP3_VARNAME, iu%Ip3_varid)) + call check( nf90_inq_varid(iu%ncid, ROTX_VARNAME, iu%rotx_varid)) + call check( nf90_inq_varid(iu%ncid, ROTY_VARNAME, iu%roty_varid)) + call check( nf90_inq_varid(iu%ncid, ROTZ_VARNAME, iu%rotz_varid)) + + call check( nf90_put_var(iu%ncid, iu%Ip1_varid, pl%Ip(1, j), start=[ioutput + 1, id]) ) + call check( nf90_put_var(iu%ncid, iu%Ip2_varid, pl%Ip(2, j), start=[ioutput + 1, id]) ) + call check( nf90_put_var(iu%ncid, iu%Ip3_varid, pl%Ip(3, j), start=[ioutput + 1, id]) ) + call check( nf90_put_var(iu%ncid, iu%rotx_varid, pl%rot(1, j), start=[ioutput + 1, id]) ) + call check( nf90_put_var(iu%ncid, iu%roty_varid, pl%rot(2, j), start=[ioutput + 1, id]) ) + call check( nf90_put_var(iu%ncid, iu%rotz_varid, pl%rot(3, j), start=[ioutput + 1, id]) ) + end if + if (param%ltides) then + call check( nf90_inq_varid(iu%ncid, K2_VARNAME, iu%k2_varid)) + call check( nf90_inq_varid(iu%ncid, Q_VARNAME, iu%Q_varid)) + + call check( nf90_put_var(iu%ncid, iu%k2_varid, pl%k2(j), start=[ioutput + 1, id]) ) + call check( nf90_put_var(iu%ncid, iu%Q_varid, pl%Q(j), start=[ioutput + 1, id]) ) + end if + end select + end do + end associate + class is (swiftest_cb) + id = self%id + call check( nf90_inq_varid(iu%ncid, GMASS_VARNAME, iu%Gmass_varid)) + call check( nf90_put_var(iu%ncid, iu%Gmass_varid, self%Gmass, start=[ioutput + 1, id]) ) + call check( nf90_inq_varid(iu%ncid, RADIUS_VARNAME, iu%radius_varid)) + call check( nf90_put_var(iu%ncid, iu%radius_varid, self%radius, start=[ioutput + 1, id]) ) + if (param%lrotation) then + call check( nf90_inq_varid(iu%ncid, IP1_VARNAME, iu%Ip1_varid)) + call check( nf90_inq_varid(iu%ncid, IP2_VARNAME, iu%Ip2_varid)) + call check( nf90_inq_varid(iu%ncid, IP3_VARNAME, iu%Ip3_varid)) + call check( nf90_inq_varid(iu%ncid, ROTX_VARNAME, iu%rotx_varid)) + call check( nf90_inq_varid(iu%ncid, ROTY_VARNAME, iu%roty_varid)) + call check( nf90_inq_varid(iu%ncid, ROTZ_VARNAME, iu%rotz_varid)) + + call check( nf90_put_var(iu%ncid, iu%Ip1_varid, self%Ip(1), start=[ioutput + 1, id]) ) + call check( nf90_put_var(iu%ncid, iu%Ip2_varid, self%Ip(2), start=[ioutput + 1, id]) ) + call check( nf90_put_var(iu%ncid, iu%Ip3_varid, self%Ip(3), start=[ioutput + 1, id]) ) + call check( nf90_put_var(iu%ncid, iu%rotx_varid, self%rot(1), start=[ioutput + 1, id]) ) + call check( nf90_put_var(iu%ncid, iu%roty_varid, self%rot(2), start=[ioutput + 1, id]) ) + call check( nf90_put_var(iu%ncid, iu%rotz_varid, self%rot(3), start=[ioutput + 1, id]) ) + end if + if (param%ltides) then + call check( nf90_inq_varid(iu%ncid, K2_VARNAME, iu%k2_varid)) + call check( nf90_inq_varid(iu%ncid, Q_VARNAME, iu%Q_varid)) + + call check( nf90_put_var(iu%ncid, iu%k2_varid, self%k2, start=[ioutput + 1, id]) ) + call check( nf90_put_var(iu%ncid, iu%Q_varid, self%Q, start=[ioutput + 1, id]) ) + end if + end select + + ! Close the netCDF file + call check( nf90_close(iu%ncid) ) + + return + end subroutine netcdf_write_frame_base + + + module subroutine netcdf_initialize_output(self, param) + !! author: Carlisle A. Wishard, Dana Singh, and David A. Mintont + !! + !! Initialize a NetCDF file system + !! There is no direct file output from this subroutine + !! + !! Adapted from David E. Kaufmann's Swifter routine io_write_frame.f90 + !! Adapted from Hal Levison's Swift routine io_write_frame.F + implicit none + ! Arguments + class(netcdf_parameters), intent(inout) :: self !! Parameters used to identify a particular NetCDF dataset + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + ! Internals + logical :: fileExists + + !! Create the new output file, deleting any previously existing output file of the same name + call check( nf90_create(param%outfile, NF90_HDF5, self%ncid) ) + !call check( nf90_set_fill(self%ncid, nf90_nofill, oldMode) ) + + ! Define the NetCDF dimensions with particle name as the record dimension + call check( nf90_def_dim(self%ncid, ID_DIMNAME, NF90_UNLIMITED, self%id_dimid) ) ! 'x' dimension + call check( nf90_def_dim(self%ncid, TIME_DIMNAME, NF90_UNLIMITED, self%time_dimid) ) ! 'y' dimension + self%dimids = [self%time_dimid, self%id_dimid ] + + select case (param%out_type) + case(NETCDF_FLOAT_TYPE) + self%out_type = NF90_FLOAT + case(NETCDF_DOUBLE_TYPE) + self%out_type = NF90_DOUBLE + end select + + !! Define the variables + if ((param%out_form == XV) .or. (param%out_form == XVEL)) then + call check( nf90_def_var(self%ncid, A_VARNAME, self%out_type, self%dimids, self%a_varid) ) + call check( nf90_def_var(self%ncid, E_VARNAME, self%out_type, self%dimids, self%e_varid) ) + call check( nf90_def_var(self%ncid, INC_VARNAME, self%out_type, self%dimids, self%inc_varid) ) + call check( nf90_def_var(self%ncid, CAPOM_VARNAME, self%out_type, self%dimids, self%capom_varid) ) + call check( nf90_def_var(self%ncid, OMEGA_VARNAME, self%out_type, self%dimids, self%omega_varid) ) + call check( nf90_def_var(self%ncid, CAPM_VARNAME, self%out_type, self%dimids, self%capm_varid) ) + end if + if ((param%out_form == EL) .or. (param%out_form == XVEL)) then + call check( nf90_def_var(self%ncid, XHX_VARNAME, self%out_type, self%dimids, self%xhx_varid) ) + call check( nf90_def_var(self%ncid, XHY_VARNAME, self%out_type, self%dimids, self%xhy_varid) ) + call check( nf90_def_var(self%ncid, XHZ_VARNAME, self%out_type, self%dimids, self%xhz_varid) ) + call check( nf90_def_var(self%ncid, VHX_VARNAME, self%out_type, self%dimids, self%vhx_varid) ) + call check( nf90_def_var(self%ncid, VHY_VARNAME, self%out_type, self%dimids, self%vhy_varid) ) + call check( nf90_def_var(self%ncid, VHZ_VARNAME, self%out_type, self%dimids, self%vhz_varid) ) + end if + + call check( nf90_def_var(self%ncid, GMASS_VARNAME, self%out_type, self%dimids, self%Gmass_varid) ) + if (param%lrhill_present) call check( nf90_def_var(self%ncid, RHILL_VARNAME, self%out_type, self%dimids, self%rhill_varid) ) + if (param%lclose) call check( nf90_def_var(self%ncid, RADIUS_VARNAME, self%out_type, self%dimids, self%radius_varid) ) + if (param%lrotation) then + call check( nf90_def_var(self%ncid, IP1_VARNAME, self%out_type, self%dimids, self%Ip1_varid) ) + call check( nf90_def_var(self%ncid, IP2_VARNAME, self%out_type, self%dimids, self%Ip3_varid) ) + call check( nf90_def_var(self%ncid, IP3_VARNAME, self%out_type, self%dimids, self%Ip3_varid) ) + call check( nf90_def_var(self%ncid, ROTX_VARNAME, self%out_type, self%dimids, self%rotx_varid) ) + call check( nf90_def_var(self%ncid, ROTY_VARNAME, self%out_type, self%dimids, self%roty_varid) ) + call check( nf90_def_var(self%ncid, ROTZ_VARNAME, self%out_type, self%dimids, self%rotz_varid) ) + end if + if (param%ltides) then + call check( nf90_def_var(self%ncid, K2_VARNAME, self%out_type, self%dimids, self%k2_varid) ) + call check( nf90_def_var(self%ncid, Q_VARNAME, self%out_type, self%dimids, self%Q_varid) ) + end if + + return + end subroutine netcdf_initialize_output + + + subroutine check(status) + !! author: Carlisle A. Wishard, Dana Singh, and David A. Minton + !! + !! Checks the status of all NetCDF operations to catch errors + implicit none + ! Arguments + integer, intent (in) :: status + + if(status /= nf90_noerr) then + write(*,*) trim(nf90_strerror(status)) + call util_exit(FAILURE) + end if + + return + end subroutine check + + + +end submodule s_netcdf \ No newline at end of file From 475b6dc6001fbfb9120758ec349bec36fc631b8b Mon Sep 17 00:00:00 2001 From: David A Minton Date: Wed, 25 Aug 2021 19:33:01 -0400 Subject: [PATCH 041/154] Made initialization of all bodies sequential in id, with the central body starting at id position 1. Also close the NetCDF file after initializing it, as it was getting a Variable not found error when trying to write to it after trying to open it again. --- src/io/io.f90 | 12 ++++++++---- src/netcdf/netcdf.f90 | 8 +++++--- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/src/io/io.f90 b/src/io/io.f90 index 748fa1891..ebd504474 100644 --- a/src/io/io.f90 +++ b/src/io/io.f90 @@ -877,6 +877,7 @@ module subroutine io_read_in_body(self, param) end if close(iu, err = 667, iomsg = errmsg) + if (ierr == 0) return 667 continue @@ -900,11 +901,13 @@ module subroutine io_read_in_cb(self, param) integer(I4B), parameter :: LUN = 7 !! Unit number of input file integer(I4B) :: iu = LUN character(len=STRMAX) :: errmsg - integer(I4B) :: ierr + integer(I4B) :: ierr, idold if (param%in_type == 'ASCII') then + self%id = 1 + param%maxid = 1 open(unit = iu, file = param%incbfile, status = 'old', form = 'FORMATTED', err = 667, iomsg = errmsg) - read(iu, *, err = 667, iomsg = errmsg) self%id + read(iu, *, err = 667, iomsg = errmsg) idold read(iu, *, err = 667, iomsg = errmsg) self%Gmass self%mass = real(self%Gmass / param%GU, kind=DP) read(iu, *, err = 667, iomsg = errmsg) self%radius @@ -922,6 +925,7 @@ module subroutine io_read_in_cb(self, param) close(iu, err = 667, iomsg = errmsg) if (ierr == 0) then + if (self%j2rp2 /= 0.0_DP) param%loblatecb = .true. if (param%rmin < 0.0) param%rmin = self%radius @@ -1073,7 +1077,6 @@ module function io_read_frame_body(self, iu, param) result(ierr) case (ASCII_TYPE) do i = 1, n - select type(self) class is (swiftest_pl) if (param%lrhill_present) then @@ -1108,7 +1111,8 @@ module function io_read_frame_body(self, iu, param) result(ierr) read(iu, *, err = 667, iomsg = errmsg) self%Q(i) end if end select - + param%maxid = param%maxid + 1 + self%id(i) = param%maxid end do end select diff --git a/src/netcdf/netcdf.f90 b/src/netcdf/netcdf.f90 index 1f1b2149d..1d62b2c94 100644 --- a/src/netcdf/netcdf.f90 +++ b/src/netcdf/netcdf.f90 @@ -152,8 +152,8 @@ module subroutine netcdf_initialize_output(self, param) !! Adapted from Hal Levison's Swift routine io_write_frame.F implicit none ! Arguments - class(netcdf_parameters), intent(inout) :: self !! Parameters used to identify a particular NetCDF dataset - class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + class(netcdf_parameters), intent(inout) :: self !! Parameters used to identify a particular NetCDF dataset + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters ! Internals logical :: fileExists @@ -196,7 +196,7 @@ module subroutine netcdf_initialize_output(self, param) if (param%lclose) call check( nf90_def_var(self%ncid, RADIUS_VARNAME, self%out_type, self%dimids, self%radius_varid) ) if (param%lrotation) then call check( nf90_def_var(self%ncid, IP1_VARNAME, self%out_type, self%dimids, self%Ip1_varid) ) - call check( nf90_def_var(self%ncid, IP2_VARNAME, self%out_type, self%dimids, self%Ip3_varid) ) + call check( nf90_def_var(self%ncid, IP2_VARNAME, self%out_type, self%dimids, self%Ip2_varid) ) call check( nf90_def_var(self%ncid, IP3_VARNAME, self%out_type, self%dimids, self%Ip3_varid) ) call check( nf90_def_var(self%ncid, ROTX_VARNAME, self%out_type, self%dimids, self%rotx_varid) ) call check( nf90_def_var(self%ncid, ROTY_VARNAME, self%out_type, self%dimids, self%roty_varid) ) @@ -207,6 +207,8 @@ module subroutine netcdf_initialize_output(self, param) call check( nf90_def_var(self%ncid, Q_VARNAME, self%out_type, self%dimids, self%Q_varid) ) end if + call check( nf90_close(self%ncid) ) + return end subroutine netcdf_initialize_output From 068d71dc1159ced86a39d34f09e953630ee90fac Mon Sep 17 00:00:00 2001 From: David A Minton Date: Wed, 25 Aug 2021 19:50:41 -0400 Subject: [PATCH 042/154] Began process of adding name variable to output rather than just integer id. --- examples/symba_mars_disk/cb.in | 2 +- examples/symba_mars_disk/testnetcdf.ipynb | 577 +--------------------- src/io/io.f90 | 9 +- src/modules/swiftest_classes.f90 | 1 + src/modules/swiftest_globals.f90 | 3 +- src/netcdf/netcdf.f90 | 22 +- 6 files changed, 29 insertions(+), 585 deletions(-) diff --git a/examples/symba_mars_disk/cb.in b/examples/symba_mars_disk/cb.in index c9dafacfd..796781819 100644 --- a/examples/symba_mars_disk/cb.in +++ b/examples/symba_mars_disk/cb.in @@ -1,4 +1,4 @@ -0 ! id +Mars ! id 4.28388662e+13 ! G*mass 3389500.0 ! radius 0.0 ! J2 diff --git a/examples/symba_mars_disk/testnetcdf.ipynb b/examples/symba_mars_disk/testnetcdf.ipynb index 66aca4f21..b3288e41b 100644 --- a/examples/symba_mars_disk/testnetcdf.ipynb +++ b/examples/symba_mars_disk/testnetcdf.ipynb @@ -11,7 +11,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 3, "metadata": {}, "outputs": [], "source": [ @@ -21,588 +21,23 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 8, "metadata": {}, "outputs": [ { "data": { - "text/html": [ - "
\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "
<xarray.Dataset>\n",
-       "Dimensions:  (id: 1518, time: 11)\n",
-       "Dimensions without coordinates: id, time\n",
-       "Data variables: (12/15)\n",
-       "    a        (id, time) float64 1.101e+07 1.101e+07 ... 9.724e+06 9.724e+06\n",
-       "    e        (id, time) float64 0.006412 0.006414 0.006414 ... 0.0155 0.0155\n",
-       "    inc      (id, time) float64 0.004313 0.004313 0.004313 ... 0.005999 0.005998\n",
-       "    capom    (id, time) float64 4.063 4.063 4.063 4.063 ... 3.939 3.939 3.939\n",
-       "    omega    (id, time) float64 1.099 1.098 1.097 1.097 ... 2.123 2.122 2.122\n",
-       "    capm     (id, time) float64 1.422 1.531 1.639 1.747 ... 1.296 1.426 1.556\n",
-       "    ...       ...\n",
-       "    Ip1      (id, time) float64 9.969e+36 9.969e+36 9.969e+36 ... 0.4 0.4 0.4\n",
-       "    Ip2      (id, time) float64 9.969e+36 9.969e+36 9.969e+36 ... 0.4 0.4 0.4\n",
-       "    Ip3      (id, time) float64 9.969e+36 9.969e+36 9.969e+36 ... 0.4 0.4 0.4\n",
-       "    rotx     (id, time) float64 9.969e+36 9.969e+36 9.969e+36 ... 0.0 0.0 0.0\n",
-       "    roty     (id, time) float64 9.969e+36 9.969e+36 9.969e+36 ... 0.0 0.0 0.0\n",
-       "    rotz     (id, time) float64 9.969e+36 9.969e+36 9.969e+36 ... 0.0 0.0 0.0
" - ], "text/plain": [ - "\n", - "Dimensions: (id: 1518, time: 11)\n", - "Dimensions without coordinates: id, time\n", - "Data variables: (12/15)\n", - " a (id, time) float64 ...\n", - " e (id, time) float64 ...\n", - " inc (id, time) float64 ...\n", - " capom (id, time) float64 ...\n", - " omega (id, time) float64 ...\n", - " capm (id, time) float64 ...\n", - " ... ...\n", - " Ip1 (id, time) float64 ...\n", - " Ip2 (id, time) float64 ...\n", - " Ip3 (id, time) float64 ...\n", - " rotx (id, time) float64 ...\n", - " roty (id, time) float64 ...\n", - " rotz (id, time) float64 ..." + "array([b'M', b'M', b'M', b'M', b'M', b'M', b'M', b'M', b'M', b'M', b'M',\n", + " b'a', b'r', b's', b'', b'', b''], dtype='|S1')" ] }, - "execution_count": 4, + "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "dsnew" + "dsnew['name'].sel(id=0).values" ] }, { diff --git a/src/io/io.f90 b/src/io/io.f90 index ebd504474..3cac0c376 100644 --- a/src/io/io.f90 +++ b/src/io/io.f90 @@ -907,7 +907,7 @@ module subroutine io_read_in_cb(self, param) self%id = 1 param%maxid = 1 open(unit = iu, file = param%incbfile, status = 'old', form = 'FORMATTED', err = 667, iomsg = errmsg) - read(iu, *, err = 667, iomsg = errmsg) idold + read(iu, *, err = 667, iomsg = errmsg) self%name read(iu, *, err = 667, iomsg = errmsg) self%Gmass self%mass = real(self%Gmass / param%GU, kind=DP) read(iu, *, err = 667, iomsg = errmsg) self%radius @@ -1037,6 +1037,7 @@ module function io_read_frame_body(self, iu, param) result(ierr) select case(param%in_type) case (REAL4_TYPE, REAL8_TYPE) read(iu, err = 667, iomsg = errmsg) self%id(:) + read(iu, err = 667, iomsg = errmsg) self%name(:) select case (param%in_form) case (XV) @@ -1080,9 +1081,9 @@ module function io_read_frame_body(self, iu, param) result(ierr) select type(self) class is (swiftest_pl) if (param%lrhill_present) then - read(iu, *, err = 667, iomsg = errmsg) self%id(i), val, self%rhill(i) + read(iu, *, err = 667, iomsg = errmsg) self%name(i), val, self%rhill(i) else - read(iu, *, err = 667, iomsg = errmsg) self%id(i), val + read(iu, *, err = 667, iomsg = errmsg) self%name(i), val end if self%Gmass(i) = real(val, kind=DP) self%mass(i) = real(val / param%GU, kind=DP) @@ -1157,8 +1158,8 @@ module function io_read_frame_cb(self, iu, param) result(ierr) ! Internals character(len=STRMAX) :: errmsg - !read(iu, err = 667, iomsg = errmsg) self%name read(iu, err = 667, iomsg = errmsg) self%id + read(iu, err = 667, iomsg = errmsg) self%name read(iu, err = 667, iomsg = errmsg) self%Gmass self%mass = self%Gmass / param%GU read(iu, err = 667, iomsg = errmsg) self%radius diff --git a/src/modules/swiftest_classes.f90 b/src/modules/swiftest_classes.f90 index d5642ab87..90c745a35 100644 --- a/src/modules/swiftest_classes.f90 +++ b/src/modules/swiftest_classes.f90 @@ -87,6 +87,7 @@ module swiftest_classes integer(I4B) :: dimids(2) !! Dimensions of the NetCDF file integer(I4B) :: time_dimid !! NetCDF ID for the time dimension integer(I4B) :: id_dimid !! NetCDF ID for the particle name dimension + integer(I4B) :: name_varid !! NetCDF ID for the semimajor axis variable integer(I4B) :: a_varid !! NetCDF ID for the semimajor axis variable integer(I4B) :: e_varid !! NetCDF ID for the eccentricity variable integer(I4B) :: inc_varid !! NetCDF ID for the inclination variable diff --git a/src/modules/swiftest_globals.f90 b/src/modules/swiftest_globals.f90 index bb08c7ab5..48aade302 100644 --- a/src/modules/swiftest_globals.f90 +++ b/src/modules/swiftest_globals.f90 @@ -129,7 +129,8 @@ module swiftest_globals !> NetCDF variable names and constants character(*), parameter :: NETCDF_OUTFILE = 'bin.nc' character(*), parameter :: TIME_DIMNAME = "time"!! netcdf id for the time dimension - character(*), parameter :: ID_DIMNAME = "id"!! NetCDF ID for the particle name dimension + character(*), parameter :: ID_DIMNAME = "id"!! NetCDF ID for the particle id dimension + character(*), parameter :: NAME_VARNAME = "name"!! NetCDF ID for the particle name variable character(*), parameter :: A_VARNAME = "a"!! NetCDF ID for the semimajor axis variable character(*), parameter :: E_VARNAME = "e"!! NetCDF ID for the eccentricity variable character(*), parameter :: INC_VARNAME = "inc"!! NetCDF ID for the inclination variable diff --git a/src/netcdf/netcdf.f90 b/src/netcdf/netcdf.f90 index 1d62b2c94..313becb9c 100644 --- a/src/netcdf/netcdf.f90 +++ b/src/netcdf/netcdf.f90 @@ -38,6 +38,8 @@ module subroutine netcdf_write_frame_base(self, iu, param) do i = 1, n j = ind(i) id = self%id(j) + call check( nf90_inq_varid(iu%ncid, NAME_VARNAME, iu%name_varid)) + call check( nf90_put_var(iu%ncid, iu%name_varid, trim(adjustl(self%name(j))), start=[ioutput + 1, id]) ) if ((param%out_form == XV) .or. (param%out_form == XVEL)) then call check( nf90_inq_varid(iu%ncid, XHX_VARNAME, iu%xhx_varid)) call check( nf90_inq_varid(iu%ncid, XHY_VARNAME, iu%xhy_varid)) @@ -107,6 +109,8 @@ module subroutine netcdf_write_frame_base(self, iu, param) end associate class is (swiftest_cb) id = self%id + call check( nf90_inq_varid(iu%ncid, NAME_VARNAME, iu%name_varid)) + call check( nf90_put_var(iu%ncid, iu%name_varid, trim(adjustl(self%name)), start=[ioutput + 1, id]) ) call check( nf90_inq_varid(iu%ncid, GMASS_VARNAME, iu%Gmass_varid)) call check( nf90_put_var(iu%ncid, iu%Gmass_varid, self%Gmass, start=[ioutput + 1, id]) ) call check( nf90_inq_varid(iu%ncid, RADIUS_VARNAME, iu%radius_varid)) @@ -174,15 +178,8 @@ module subroutine netcdf_initialize_output(self, param) end select !! Define the variables + call check( nf90_def_var(self%ncid, NAME_VARNAME, NF90_CHAR, self%dimids, self%name_varid) ) if ((param%out_form == XV) .or. (param%out_form == XVEL)) then - call check( nf90_def_var(self%ncid, A_VARNAME, self%out_type, self%dimids, self%a_varid) ) - call check( nf90_def_var(self%ncid, E_VARNAME, self%out_type, self%dimids, self%e_varid) ) - call check( nf90_def_var(self%ncid, INC_VARNAME, self%out_type, self%dimids, self%inc_varid) ) - call check( nf90_def_var(self%ncid, CAPOM_VARNAME, self%out_type, self%dimids, self%capom_varid) ) - call check( nf90_def_var(self%ncid, OMEGA_VARNAME, self%out_type, self%dimids, self%omega_varid) ) - call check( nf90_def_var(self%ncid, CAPM_VARNAME, self%out_type, self%dimids, self%capm_varid) ) - end if - if ((param%out_form == EL) .or. (param%out_form == XVEL)) then call check( nf90_def_var(self%ncid, XHX_VARNAME, self%out_type, self%dimids, self%xhx_varid) ) call check( nf90_def_var(self%ncid, XHY_VARNAME, self%out_type, self%dimids, self%xhy_varid) ) call check( nf90_def_var(self%ncid, XHZ_VARNAME, self%out_type, self%dimids, self%xhz_varid) ) @@ -190,6 +187,15 @@ module subroutine netcdf_initialize_output(self, param) call check( nf90_def_var(self%ncid, VHY_VARNAME, self%out_type, self%dimids, self%vhy_varid) ) call check( nf90_def_var(self%ncid, VHZ_VARNAME, self%out_type, self%dimids, self%vhz_varid) ) end if + + if ((param%out_form == EL) .or. (param%out_form == XVEL)) then + call check( nf90_def_var(self%ncid, A_VARNAME, self%out_type, self%dimids, self%a_varid) ) + call check( nf90_def_var(self%ncid, E_VARNAME, self%out_type, self%dimids, self%e_varid) ) + call check( nf90_def_var(self%ncid, INC_VARNAME, self%out_type, self%dimids, self%inc_varid) ) + call check( nf90_def_var(self%ncid, CAPOM_VARNAME, self%out_type, self%dimids, self%capom_varid) ) + call check( nf90_def_var(self%ncid, OMEGA_VARNAME, self%out_type, self%dimids, self%omega_varid) ) + call check( nf90_def_var(self%ncid, CAPM_VARNAME, self%out_type, self%dimids, self%capm_varid) ) + end if call check( nf90_def_var(self%ncid, GMASS_VARNAME, self%out_type, self%dimids, self%Gmass_varid) ) if (param%lrhill_present) call check( nf90_def_var(self%ncid, RHILL_VARNAME, self%out_type, self%dimids, self%rhill_varid) ) From ea6f245f27b0692f746b74fa2439e93350379f28 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Wed, 25 Aug 2021 23:16:37 -0400 Subject: [PATCH 043/154] Made time and id coordinates in an xarray simply by outputting variables of the same name. Cool. --- examples/symba_mars_disk/cb.in | 2 +- examples/symba_mars_disk/testnetcdf.ipynb | 1322 ++++++++++++++++++++- python/swiftest/swiftest/io.py | 42 +- src/io/io.f90 | 4 +- src/modules/swiftest_classes.f90 | 2 + src/netcdf/netcdf.f90 | 18 +- 6 files changed, 1368 insertions(+), 22 deletions(-) diff --git a/examples/symba_mars_disk/cb.in b/examples/symba_mars_disk/cb.in index 796781819..6185284ec 100644 --- a/examples/symba_mars_disk/cb.in +++ b/examples/symba_mars_disk/cb.in @@ -1,4 +1,4 @@ -Mars ! id +Mars ! name 4.28388662e+13 ! G*mass 3389500.0 ! radius 0.0 ! J2 diff --git a/examples/symba_mars_disk/testnetcdf.ipynb b/examples/symba_mars_disk/testnetcdf.ipynb index b3288e41b..73fb30eb9 100644 --- a/examples/symba_mars_disk/testnetcdf.ipynb +++ b/examples/symba_mars_disk/testnetcdf.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 1, + "execution_count": 22, "metadata": {}, "outputs": [], "source": [ @@ -11,7 +11,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 23, "metadata": {}, "outputs": [], "source": [ @@ -19,25 +19,1335 @@ "dsnew = xr.open_dataset(\"bin.nc\")" ] }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
<xarray.Dataset>\n",
+       "Dimensions:  (id: 1521, time: 11)\n",
+       "Coordinates:\n",
+       "  * time     (time) float64 0.0 600.0 1.2e+03 1.8e+03 ... 4.8e+03 5.4e+03 6e+03\n",
+       "  * id       (id) int32 1 2 3 4 5 6 7 8 ... 1515 1516 1517 1518 1519 1520 1521\n",
+       "Data variables: (12/21)\n",
+       "    xhx      (id, time) float64 9.969e+36 9.969e+36 ... 1.587e+06 2.838e+06\n",
+       "    xhy      (id, time) float64 9.969e+36 9.969e+36 ... -9.103e+06 -8.791e+06\n",
+       "    xhz      (id, time) float64 9.969e+36 9.969e+36 ... -3.433e+04 -3.905e+04\n",
+       "    vhx      (id, time) float64 9.969e+36 9.969e+36 ... 2.118e+03 2.045e+03\n",
+       "    vhy      (id, time) float64 9.969e+36 9.969e+36 9.969e+36 ... 374.7 666.8\n",
+       "    vhz      (id, time) float64 9.969e+36 9.969e+36 9.969e+36 ... -8.487 -7.226\n",
+       "    ...       ...\n",
+       "    Ip1      (id, time) float64 0.4 0.4 0.4 0.4 0.4 0.4 ... 0.4 0.4 0.4 0.4 0.4\n",
+       "    Ip2      (id, time) float64 0.4 0.4 0.4 0.4 0.4 0.4 ... 0.4 0.4 0.4 0.4 0.4\n",
+       "    Ip3      (id, time) float64 0.4 0.4 0.4 0.4 0.4 0.4 ... 0.4 0.4 0.4 0.4 0.4\n",
+       "    rotx     (id, time) float64 0.0 0.0 0.0 ... -0.0003328 -0.0003328 -0.0003328\n",
+       "    roty     (id, time) float64 0.0 0.0 0.0 ... -0.0003232 -0.0003232 -0.0003232\n",
+       "    rotz     (id, time) float64 0.0 0.0 0.0 ... -7.841e-05 -7.841e-05 -7.841e-05
" + ], + "text/plain": [ + "\n", + "Dimensions: (id: 1521, time: 11)\n", + "Coordinates:\n", + " * time (time) float64 0.0 600.0 1.2e+03 1.8e+03 ... 4.8e+03 5.4e+03 6e+03\n", + " * id (id) int32 1 2 3 4 5 6 7 8 ... 1515 1516 1517 1518 1519 1520 1521\n", + "Data variables: (12/21)\n", + " xhx (id, time) float64 ...\n", + " xhy (id, time) float64 ...\n", + " xhz (id, time) float64 ...\n", + " vhx (id, time) float64 ...\n", + " vhy (id, time) float64 ...\n", + " vhz (id, time) float64 ...\n", + " ... ...\n", + " Ip1 (id, time) float64 ...\n", + " Ip2 (id, time) float64 ...\n", + " Ip3 (id, time) float64 ...\n", + " rotx (id, time) float64 ...\n", + " roty (id, time) float64 ...\n", + " rotz (id, time) float64 ..." + ] + }, + "execution_count": 25, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "dsnew" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "import netCDF4 as nc" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Reading Swiftest file param.in\n" + ] + } + ], + "source": [ + "sim = swiftest.Simulation(param_file=\"param.in\")" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Reading in time 6.000e+03\n", + "Creating Dataset\n", + "Successfully converted 11 output frames.\n", + "\n", + "Adding particle info to Dataset\n", + "Swiftest simulation data stored as xarray DataSet .ds\n" + ] + } + ], + "source": [ + "sim.bin2xr()" + ] + }, { "cell_type": "code", "execution_count": 8, "metadata": {}, + "outputs": [], + "source": [ + "sim.ds.to_netcdf(\"bin.new.nc\")" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [], + "source": [ + "ds = nc.Dataset(\"bin.new.nc\")" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "\n", + "root group (NETCDF4 data model, file format HDF5):\n", + " dimensions(sizes): id(1521), time(11)\n", + " variables(dimensions): float64 id(id), float64 Gmass(time, id), float64 radius(time, id), float64 J_2(time, id), float64 J_4(time, id), float64 Ip1(time, id), float64 Ip2(time, id), float64 Ip3(time, id), float64 rotx(time, id), float64 roty(time, id), float64 rotz(time, id), float64 time(time), float64 a(time, id), float64 e(time, id), float64 inc(time, id), float64 capom(time, id), float64 omega(time, id), float64 capm(time, id), float64 rhill(time, id), float64 time_origin(id), float64 xhx_origin(id), float64 py_origin(id), float64 pz_origin(id), float64 vhx_origin(id), float64 vhy_origin(id), float64 vhz_origin(id), origin_type(id)\n", + " groups: " + ] + }, + "execution_count": 21, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "ds" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [], + "source": [ + "ds = xr.open_dataset(\"bin.new.nc\")" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, "outputs": [ { "data": { + "text/html": [ + "
\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
<xarray.Dataset>\n",
+       "Dimensions:      (id: 1521, time: 11)\n",
+       "Coordinates:\n",
+       "  * id           (id) float64 1.0 2.0 3.0 4.0 ... 1.519e+03 1.52e+03 1.521e+03\n",
+       "  * time         (time) float64 0.0 600.0 1.2e+03 ... 4.8e+03 5.4e+03 6e+03\n",
+       "Data variables: (12/25)\n",
+       "    Gmass        (time, id) float64 4.284e+13 1.71e+06 ... 1.168e+05 1.168e+05\n",
+       "    radius       (time, id) float64 3.39e+06 1.241e+04 ... 5.073e+03 5.073e+03\n",
+       "    J_2          (time, id) float64 0.0 nan nan nan nan ... nan nan nan nan nan\n",
+       "    J_4          (time, id) float64 0.0 nan nan nan nan ... nan nan nan nan nan\n",
+       "    Ip1          (time, id) float64 0.4 0.4 0.4 0.4 0.4 ... 0.4 0.4 0.4 0.4 0.4\n",
+       "    Ip2          (time, id) float64 0.4 0.4 0.4 0.4 0.4 ... 0.4 0.4 0.4 0.4 0.4\n",
+       "    ...           ...\n",
+       "    py_origin    (id) float64 0.0 -4.373e+06 ... -8.094e+06 -8.123e+06\n",
+       "    pz_origin    (id) float64 0.0 -9.627e+03 2.41e+04 ... 2.923e+03 -3.139e+03\n",
+       "    vhx_origin   (id) float64 0.0 988.0 1.016e+03 ... 1.881e+03 1.887e+03\n",
+       "    vhy_origin   (id) float64 0.0 -1.888e+03 ... -1.004e+03 -1.027e+03\n",
+       "    vhz_origin   (id) float64 0.0 10.69 -2.604 -1.465 ... 18.95 -9.448 -12.51\n",
+       "    origin_type  (id) object 'Central body' ... 'Supercatastrophic'
" + ], "text/plain": [ - "array([b'M', b'M', b'M', b'M', b'M', b'M', b'M', b'M', b'M', b'M', b'M',\n", - " b'a', b'r', b's', b'', b'', b''], dtype='|S1')" + "\n", + "Dimensions: (id: 1521, time: 11)\n", + "Coordinates:\n", + " * id (id) float64 1.0 2.0 3.0 4.0 ... 1.519e+03 1.52e+03 1.521e+03\n", + " * time (time) float64 0.0 600.0 1.2e+03 ... 4.8e+03 5.4e+03 6e+03\n", + "Data variables: (12/25)\n", + " Gmass (time, id) float64 ...\n", + " radius (time, id) float64 ...\n", + " J_2 (time, id) float64 ...\n", + " J_4 (time, id) float64 ...\n", + " Ip1 (time, id) float64 ...\n", + " Ip2 (time, id) float64 ...\n", + " ... ...\n", + " py_origin (id) float64 ...\n", + " pz_origin (id) float64 ...\n", + " vhx_origin (id) float64 ...\n", + " vhy_origin (id) float64 ...\n", + " vhz_origin (id) float64 ...\n", + " origin_type (id) object ..." ] }, - "execution_count": 8, + "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "dsnew['name'].sel(id=0).values" + "ds" ] }, { diff --git a/python/swiftest/swiftest/io.py b/python/swiftest/swiftest/io.py index cb21de074..5b4f45dd1 100644 --- a/python/swiftest/swiftest/io.py +++ b/python/swiftest/swiftest/io.py @@ -367,14 +367,14 @@ def swifter_stream(f, param): tvec[:, i] = record[1] tlab = [] - if param['OUT_FORM'] == 'XV': + if param['OUT_FORM'] == 'XV' or param['OUT_FORM'] == 'XVEL': tlab.append('xhx') tlab.append('xhy') tlab.append('xhz') tlab.append('vhx') tlab.append('vhy') tlab.append('vhz') - elif param['OUT_FORM'] == 'EL': + if param['OUT_FORM'] == 'EL' or param['OUT_FORM'] == 'XVEL': tlab.append('a') tlab.append('e') tlab.append('inc') @@ -392,14 +392,15 @@ def swifter_stream(f, param): def make_swiftest_labels(param): tlab = [] - if param['OUT_FORM'] == 'XV': + if param['OUT_FORM'] == 'XV' or param['OUT_FORM'] == 'XVEL': tlab.append('xhx') tlab.append('xhy') tlab.append('xhz') tlab.append('vhx') tlab.append('vhy') tlab.append('vhz') - elif param['OUT_FORM'] == 'EL': + + if param['OUT_FORM'] == 'EL' or param['OUT_FORM'] == 'XVEL': tlab.append('a') tlab.append('e') tlab.append('inc') @@ -499,6 +500,13 @@ def swiftest_stream(f, param): p4 = f.read_reals(np.float64) p5 = f.read_reals(np.float64) p6 = f.read_reals(np.float64) + if param['OUT_FORM'] == 'XVEL': + p7 = f.read_reals(np.float64) + p8 = f.read_reals(np.float64) + p9 = f.read_reals(np.float64) + p10 = f.read_reals(np.float64) + p11 = f.read_reals(np.float64) + p12 = f.read_reals(np.float64) GMpl = f.read_reals(np.float64) if param['RHILL_PRESENT'] == 'YES': rhill = f.read_reals(np.float64) @@ -521,18 +529,36 @@ def swiftest_stream(f, param): t4 = f.read_reals(np.float64) t5 = f.read_reals(np.float64) t6 = f.read_reals(np.float64) + if param['OUT_FORM'] == 'XVEL': + t7 = f.read_reals(np.float64) + t8 = f.read_reals(np.float64) + t9 = f.read_reals(np.float64) + t10 = f.read_reals(np.float64) + t11 = f.read_reals(np.float64) + t12 = f.read_reals(np.float64) clab, plab, tlab = make_swiftest_labels(param) - + if npl > 0: - pvec = np.vstack([p1, p2, p3, p4, p5, p6, GMpl, Rpl]) + pvec = np.vstack([p1, p2, p3, p4, p5, p6]) + if param['OUT_FORM'] == 'XVEL': + pvec = np.vstack([pvec, p7, p8, p9, p10, p11, p12]) + pvec = np.vstack([pvec, GMpl, Rpl]) else: - pvec = np.empty((8, 0)) + if param['OUT_FORM'] == 'XVEL': + pvec = np.empty((14, 0)) + else: + pvec = np.empty((8, 0)) plid = np.empty(0) if ntp > 0: tvec = np.vstack([t1, t2, t3, t4, t5, t6]) + if param['OUT_FORM'] == 'XVEL': + tvec = np.vstack([tvec, t7, t8, t9, t10, t11, t12]) else: - tvec = np.empty((6, 0)) + if param['OUT_FORM'] == 'XVEL': + tvec = np.empty((12, 0)) + else: + tvec = np.empty((6, 0)) tpid = np.empty(0) cvec = np.array([Mcb, Rcb, J2cb, J4cb]) if param['RHILL_PRESENT'] == 'YES': diff --git a/src/io/io.f90 b/src/io/io.f90 index 3cac0c376..e86b9d065 100644 --- a/src/io/io.f90 +++ b/src/io/io.f90 @@ -1037,7 +1037,7 @@ module function io_read_frame_body(self, iu, param) result(ierr) select case(param%in_type) case (REAL4_TYPE, REAL8_TYPE) read(iu, err = 667, iomsg = errmsg) self%id(:) - read(iu, err = 667, iomsg = errmsg) self%name(:) + !read(iu, err = 667, iomsg = errmsg) self%name(:) select case (param%in_form) case (XV) @@ -1159,7 +1159,7 @@ module function io_read_frame_cb(self, iu, param) result(ierr) character(len=STRMAX) :: errmsg read(iu, err = 667, iomsg = errmsg) self%id - read(iu, err = 667, iomsg = errmsg) self%name + !read(iu, err = 667, iomsg = errmsg) self%name read(iu, err = 667, iomsg = errmsg) self%Gmass self%mass = self%Gmass / param%GU read(iu, err = 667, iomsg = errmsg) self%radius diff --git a/src/modules/swiftest_classes.f90 b/src/modules/swiftest_classes.f90 index 90c745a35..9d0ce8ad2 100644 --- a/src/modules/swiftest_classes.f90 +++ b/src/modules/swiftest_classes.f90 @@ -86,7 +86,9 @@ module swiftest_classes integer(I4B) :: ncid !! NetCDF ID for the output file integer(I4B) :: dimids(2) !! Dimensions of the NetCDF file integer(I4B) :: time_dimid !! NetCDF ID for the time dimension + integer(I4B) :: time_varid !! NetCDF ID for the time dimension integer(I4B) :: id_dimid !! NetCDF ID for the particle name dimension + integer(I4B) :: id_varid !! NetCDF ID for the particle name dimension integer(I4B) :: name_varid !! NetCDF ID for the semimajor axis variable integer(I4B) :: a_varid !! NetCDF ID for the semimajor axis variable integer(I4B) :: e_varid !! NetCDF ID for the eccentricity variable diff --git a/src/netcdf/netcdf.f90 b/src/netcdf/netcdf.f90 index 313becb9c..00d48110a 100644 --- a/src/netcdf/netcdf.f90 +++ b/src/netcdf/netcdf.f90 @@ -38,8 +38,10 @@ module subroutine netcdf_write_frame_base(self, iu, param) do i = 1, n j = ind(i) id = self%id(j) - call check( nf90_inq_varid(iu%ncid, NAME_VARNAME, iu%name_varid)) - call check( nf90_put_var(iu%ncid, iu%name_varid, trim(adjustl(self%name(j))), start=[ioutput + 1, id]) ) + call check( nf90_inq_varid(iu%ncid, ID_DIMNAME, iu%id_varid)) + call check( nf90_put_var(iu%ncid, iu%id_varid, id, start=[id]) ) + !call check( nf90_inq_varid(iu%ncid, NAME_VARNAME, iu%name_varid)) + !call check( nf90_put_var(iu%ncid, iu%name_varid, trim(adjustl(self%name(j))), start=[ioutput + 1, id]) ) if ((param%out_form == XV) .or. (param%out_form == XVEL)) then call check( nf90_inq_varid(iu%ncid, XHX_VARNAME, iu%xhx_varid)) call check( nf90_inq_varid(iu%ncid, XHY_VARNAME, iu%xhy_varid)) @@ -109,8 +111,12 @@ module subroutine netcdf_write_frame_base(self, iu, param) end associate class is (swiftest_cb) id = self%id - call check( nf90_inq_varid(iu%ncid, NAME_VARNAME, iu%name_varid)) - call check( nf90_put_var(iu%ncid, iu%name_varid, trim(adjustl(self%name)), start=[ioutput + 1, id]) ) + call check( nf90_inq_varid(iu%ncid, TIME_DIMNAME, iu%time_varid)) + call check( nf90_put_var(iu%ncid, iu%time_varid, param%t, start=[ioutput + 1]) ) + call check( nf90_inq_varid(iu%ncid, ID_DIMNAME, iu%id_varid)) + call check( nf90_put_var(iu%ncid, iu%id_varid, id, start=[id]) ) + !call check( nf90_inq_varid(iu%ncid, NAME_VARNAME, iu%name_varid)) + !call check( nf90_put_var(iu%ncid, iu%name_varid, trim(adjustl(self%name)), start=[ioutput + 1, id]) ) call check( nf90_inq_varid(iu%ncid, GMASS_VARNAME, iu%Gmass_varid)) call check( nf90_put_var(iu%ncid, iu%Gmass_varid, self%Gmass, start=[ioutput + 1, id]) ) call check( nf90_inq_varid(iu%ncid, RADIUS_VARNAME, iu%radius_varid)) @@ -178,7 +184,9 @@ module subroutine netcdf_initialize_output(self, param) end select !! Define the variables - call check( nf90_def_var(self%ncid, NAME_VARNAME, NF90_CHAR, self%dimids, self%name_varid) ) + !call check( nf90_def_var(self%ncid, NAME_VARNAME, NF90_CHAR, self%dimids, self%name_varid) ) + call check( nf90_def_var(self%ncid, TIME_DIMNAME, self%out_type, self%dimids(1), self%time_varid) ) + call check( nf90_def_var(self%ncid, ID_DIMNAME, NF90_INT, self%dimids(2), self%id_varid) ) if ((param%out_form == XV) .or. (param%out_form == XVEL)) then call check( nf90_def_var(self%ncid, XHX_VARNAME, self%out_type, self%dimids, self%xhx_varid) ) call check( nf90_def_var(self%ncid, XHY_VARNAME, self%out_type, self%dimids, self%xhy_varid) ) From cac16ceab5b34100af01701d1ec7105227252930 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Thu, 26 Aug 2021 09:44:14 -0400 Subject: [PATCH 044/154] Added a bunch of new variables to the NetCDF, including active particle numbers and energy and momentum values. --- examples/symba_mars_disk/testnetcdf.ipynb | 305 +-------------------- src/io/io.f90 | 43 +-- src/main/swiftest_driver.f90 | 5 +- src/modules/swiftest_classes.f90 | 170 +++++++----- src/modules/swiftest_globals.f90 | 72 +++-- src/netcdf/netcdf.f90 | 315 +++++++++++++--------- 6 files changed, 379 insertions(+), 531 deletions(-) diff --git a/examples/symba_mars_disk/testnetcdf.ipynb b/examples/symba_mars_disk/testnetcdf.ipynb index 73fb30eb9..1df10fab4 100644 --- a/examples/symba_mars_disk/testnetcdf.ipynb +++ b/examples/symba_mars_disk/testnetcdf.ipynb @@ -21,7 +21,7 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": 26, "metadata": {}, "outputs": [ { @@ -378,308 +378,29 @@ " stroke: currentColor;\n", " fill: currentColor;\n", "}\n", - "
<xarray.Dataset>\n",
-       "Dimensions:  (id: 1521, time: 11)\n",
+       "
<xarray.DataArray 'time' (time: 11)>\n",
+       "array([   0.,  600., 1200., 1800., 2400., 3000., 3600., 4200., 4800., 5400.,\n",
+       "       6000.])\n",
        "Coordinates:\n",
-       "  * time     (time) float64 0.0 600.0 1.2e+03 1.8e+03 ... 4.8e+03 5.4e+03 6e+03\n",
-       "  * id       (id) int32 1 2 3 4 5 6 7 8 ... 1515 1516 1517 1518 1519 1520 1521\n",
-       "Data variables: (12/21)\n",
-       "    xhx      (id, time) float64 9.969e+36 9.969e+36 ... 1.587e+06 2.838e+06\n",
-       "    xhy      (id, time) float64 9.969e+36 9.969e+36 ... -9.103e+06 -8.791e+06\n",
-       "    xhz      (id, time) float64 9.969e+36 9.969e+36 ... -3.433e+04 -3.905e+04\n",
-       "    vhx      (id, time) float64 9.969e+36 9.969e+36 ... 2.118e+03 2.045e+03\n",
-       "    vhy      (id, time) float64 9.969e+36 9.969e+36 9.969e+36 ... 374.7 666.8\n",
-       "    vhz      (id, time) float64 9.969e+36 9.969e+36 9.969e+36 ... -8.487 -7.226\n",
-       "    ...       ...\n",
-       "    Ip1      (id, time) float64 0.4 0.4 0.4 0.4 0.4 0.4 ... 0.4 0.4 0.4 0.4 0.4\n",
-       "    Ip2      (id, time) float64 0.4 0.4 0.4 0.4 0.4 0.4 ... 0.4 0.4 0.4 0.4 0.4\n",
-       "    Ip3      (id, time) float64 0.4 0.4 0.4 0.4 0.4 0.4 ... 0.4 0.4 0.4 0.4 0.4\n",
-       "    rotx     (id, time) float64 0.0 0.0 0.0 ... -0.0003328 -0.0003328 -0.0003328\n",
-       "    roty     (id, time) float64 0.0 0.0 0.0 ... -0.0003232 -0.0003232 -0.0003232\n",
-       "    rotz     (id, time) float64 0.0 0.0 0.0 ... -7.841e-05 -7.841e-05 -7.841e-05
" + " * time (time) float64 0.0 600.0 1.2e+03 1.8e+03 ... 4.8e+03 5.4e+03 6e+03
" ], "text/plain": [ - "\n", - "Dimensions: (id: 1521, time: 11)\n", + "\n", + "array([ 0., 600., 1200., 1800., 2400., 3000., 3600., 4200., 4800., 5400.,\n", + " 6000.])\n", "Coordinates:\n", - " * time (time) float64 0.0 600.0 1.2e+03 1.8e+03 ... 4.8e+03 5.4e+03 6e+03\n", - " * id (id) int32 1 2 3 4 5 6 7 8 ... 1515 1516 1517 1518 1519 1520 1521\n", - "Data variables: (12/21)\n", - " xhx (id, time) float64 ...\n", - " xhy (id, time) float64 ...\n", - " xhz (id, time) float64 ...\n", - " vhx (id, time) float64 ...\n", - " vhy (id, time) float64 ...\n", - " vhz (id, time) float64 ...\n", - " ... ...\n", - " Ip1 (id, time) float64 ...\n", - " Ip2 (id, time) float64 ...\n", - " Ip3 (id, time) float64 ...\n", - " rotx (id, time) float64 ...\n", - " roty (id, time) float64 ...\n", - " rotz (id, time) float64 ..." + " * time (time) float64 0.0 600.0 1.2e+03 1.8e+03 ... 4.8e+03 5.4e+03 6e+03" ] }, - "execution_count": 25, + "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "dsnew" + "dsnew.time" ] }, { diff --git a/src/io/io.f90 b/src/io/io.f90 index e86b9d065..2b48586fa 100644 --- a/src/io/io.f90 +++ b/src/io/io.f90 @@ -27,7 +27,7 @@ module subroutine io_conservation_report(self, param, lterminal) "; DM/M0 = ", ES12.5)' associate(system => self, pl => self%pl, cb => self%cb, npl => self%pl%nbody) - if (param%energy_out /= "") then + if ((param%out_type == REAL4_TYPE) .or. (param%out_type == REAL8_TYPE) .and. (param%energy_out /= "")) then if (param%lfirstenergy .and. (param%out_stat /= "OLD")) then open(unit = EGYIU, file = param%energy_out, form = "formatted", status = "replace", action = "write", err = 667, iomsg = errmsg) write(EGYIU,EGYHEADER, err = 667, iomsg = errmsg) @@ -56,7 +56,7 @@ module subroutine io_conservation_report(self, param, lterminal) param%lfirstenergy = .false. end if - if (param%energy_out /= "") then + if ((param%out_type == REAL4_TYPE) .or. (param%out_type == REAL8_TYPE) .and. (param%energy_out /= "")) then write(EGYIU,EGYFMT, err = 667, iomsg = errmsg) param%t, Eorbit_now, param%Ecollisions, Ltot_now, GMtot_now close(EGYIU, err = 667, iomsg = errmsg) end if @@ -219,7 +219,6 @@ module subroutine io_dump_system(self, param) write(*, statusfmt) param%t, tfrac, pl%nbody, self%tp%nbody end select write(*, walltimefmt) finish - start, wallperstep - if (param%lenergy) call self%conservation_report(param, lterminal=.true.) end if return @@ -1620,8 +1619,8 @@ module subroutine io_write_frame_system(self, param) !! Adapted from Hal Levison's Swift routine io_write_frame.F implicit none ! Arguments - class(swiftest_nbody_system), intent(in) :: self !! Swiftest system object - class(swiftest_parameters), intent(in) :: 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 ! Internals logical, save :: lfirst = .true. !! Flag to determine if this is the first call of this method class(swiftest_cb), allocatable :: cb !! Temporary local version of pl structure used for non-destructive conversions @@ -1632,11 +1631,13 @@ module subroutine io_write_frame_system(self, param) logical :: fileExists type(netcdf_parameters) :: nciu + if (param%lenergy) call self%conservation_report(param, lterminal=.true.) + allocate(cb, source = self%cb) allocate(pl, source = self%pl) allocate(tp, source = self%tp) iu = BINUNIT - + if ((param%out_type == REAL4_TYPE) .or. (param%out_type == REAL8_TYPE)) then if (lfirst) then select case(param%out_stat) @@ -1653,7 +1654,7 @@ module subroutine io_write_frame_system(self, param) else open(unit = iu, file = param%outfile, status = 'OLD', position = 'APPEND', form = 'UNFORMATTED', err = 667, iomsg = errmsg) end if - call io_write_hdr(iu, param%t, pl%nbody, tp%nbody, param%out_form, param%out_type) + call self%write_hdr(iu, param) else if ((param%out_type == NETCDF_FLOAT_TYPE) .or. (param%out_type == NETCDF_DOUBLE_TYPE)) then if (lfirst) then inquire(file=param%outfile, exist=fileExists) @@ -1682,6 +1683,7 @@ module subroutine io_write_frame_system(self, param) end select lfirst = .false. end if + call self%write_hdr(nciu, param) end if if (param%lgr) then @@ -1707,6 +1709,8 @@ module subroutine io_write_frame_system(self, param) call tp%write_frame(nciu, param) end if + + return 667 continue @@ -1715,7 +1719,7 @@ module subroutine io_write_frame_system(self, param) end subroutine io_write_frame_system - subroutine io_write_hdr(iu, t, npl, ntp, out_form, out_type) + module subroutine io_write_hdr_system(self, iu, param) ! 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 !! !! Write frame header to output binary file @@ -1724,30 +1728,27 @@ subroutine io_write_hdr(iu, t, npl, ntp, out_form, out_type) !! Adapted from Hal Levison's Swift routine io_write_hdr.F implicit none ! Arguments - integer(I4B), intent(in) :: iu !! Output file unit number - real(DP), intent(in) :: t !! Current time of simulation - integer(I4B), intent(in) :: npl !! Number of massive bodies - integer(I4B), intent(in) :: ntp !! Number of test particles - character(*), intent(in) :: out_form !! Output format type ("EL" or "XV") - character(*), intent(in) :: out_type !! Output file format type (REAL4, REAL8 - see swiftest module for symbolic name definitions) + class(swiftest_nbody_system), intent(in) :: self !! Swiftest nbody system object + integer(I4B), intent(inout) :: iu !! Output file unit number + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters ! Internals character(len=STRMAX) :: errmsg - select case (out_type) + select case (param%out_type) case (REAL4_TYPE) - write(iu, err = 667, iomsg = errmsg) real(t, kind=SP) + write(iu, err = 667, iomsg = errmsg) real(param%t, kind=SP) case (REAL8_TYPE) - write(iu, err = 667, iomsg = errmsg) t + write(iu, err = 667, iomsg = errmsg) param%t end select - write(iu, err = 667, iomsg = errmsg) npl - write(iu, err = 667, iomsg = errmsg) ntp - write(iu, err = 667, iomsg = errmsg) out_form + write(iu, err = 667, iomsg = errmsg) self%pl%nbody + write(iu, err = 667, iomsg = errmsg) self%tp%nbody + write(iu, err = 667, iomsg = errmsg) param%out_form return 667 continue write(*,*) "Error writing header: " // trim(adjustl(errmsg)) call util_exit(FAILURE) - end subroutine io_write_hdr + end subroutine io_write_hdr_system end submodule s_io diff --git a/src/main/swiftest_driver.f90 b/src/main/swiftest_driver.f90 index d22663d40..3b7765347 100644 --- a/src/main/swiftest_driver.f90 +++ b/src/main/swiftest_driver.f90 @@ -42,7 +42,8 @@ program swiftest_driver dt => param%dt, & tstop => param%tstop, & istep_out => param%istep_out, & - istep_dump => param%istep_dump) + istep_dump => param%istep_dump, & + ioutput => param%ioutput) call nbody_system%initialize(param) t = t0 @@ -50,6 +51,7 @@ program swiftest_driver iout = istep_out idump = istep_dump nloops = ceiling(tstop / dt, kind=I8B) + ioutput = ceiling(t0/ dt, kind=I8B) / int(istep_out, kind=I8B) ! Prevent duplicate frames from being written if this is a restarted run if (param%lrestart) then old_t_final = nbody_system%get_old_t_final(param) @@ -80,6 +82,7 @@ program swiftest_driver if (istep_out > 0) then iout = iout - 1 if (iout == 0) then + ioutput = ceiling(t / dt, kind=I8B) / int(istep_out, kind=I8B) if (t > old_t_final) call nbody_system%write_frame(param) iout = istep_out end if diff --git a/src/modules/swiftest_classes.f90 b/src/modules/swiftest_classes.f90 index 9d0ce8ad2..d59934c47 100644 --- a/src/modules/swiftest_classes.f90 +++ b/src/modules/swiftest_classes.f90 @@ -20,6 +20,7 @@ module swiftest_classes real(DP) :: t = -1.0_DP !! Integration current time real(DP) :: tstop = -1.0_DP !! Integration stop time real(DP) :: dt = -1.0_DP !! Time step + integer(I8B) :: ioutput = 0_I8B !! Output counter character(STRMAX) :: incbfile = CB_INFILE !! Name of input file for the central body character(STRMAX) :: inplfile = PL_INFILE !! Name of input file for massive bodies character(STRMAX) :: intpfile = TP_INFILE !! Name of input file for test particles @@ -83,37 +84,54 @@ module swiftest_classes end type swiftest_parameters type :: netcdf_parameters - integer(I4B) :: ncid !! NetCDF ID for the output file - integer(I4B) :: dimids(2) !! Dimensions of the NetCDF file - integer(I4B) :: time_dimid !! NetCDF ID for the time dimension - integer(I4B) :: time_varid !! NetCDF ID for the time dimension - integer(I4B) :: id_dimid !! NetCDF ID for the particle name dimension - integer(I4B) :: id_varid !! NetCDF ID for the particle name dimension - integer(I4B) :: name_varid !! NetCDF ID for the semimajor axis variable - integer(I4B) :: a_varid !! NetCDF ID for the semimajor axis variable - integer(I4B) :: e_varid !! NetCDF ID for the eccentricity variable - integer(I4B) :: inc_varid !! NetCDF ID for the inclination variable - integer(I4B) :: capom_varid !! NetCDF ID for the long. asc. node variable - integer(I4B) :: omega_varid !! NetCDF ID for the arg. periapsis variable - integer(I4B) :: capm_varid !! NetCDF ID for the mean anomaly variable - integer(I4B) :: xhx_varid !! NetCDF ID for the heliocentric position x variable - integer(I4B) :: xhy_varid !! NetCDF ID for the heliocentric position y variable - integer(I4B) :: xhz_varid !! NetCDF ID for the heliocentric position z variable - integer(I4B) :: vhx_varid !! NetCDF ID for the heliocentric velocity x variable - integer(I4B) :: vhy_varid !! NetCDF ID for the heliocentric velocity y variable - integer(I4B) :: vhz_varid !! NetCDF ID for the heliocentric velocity z variable - integer(I4B) :: Gmass_varid !! NetCDF ID for the mass variable - integer(I4B) :: rhill_varid !! NetCDF ID for the hill radius variable - integer(I4B) :: radius_varid !! NetCDF ID for the radius variable - integer(I4B) :: Ip1_varid !! NetCDF ID for the axis 1 principal moment of inertia variable - integer(I4B) :: Ip2_varid !! NetCDF ID for the axis 2 principal moment of inertia variable - integer(I4B) :: Ip3_varid !! NetCDF ID for the axis 3 principal moment of inertia variable - integer(I4B) :: rotx_varid !! NetCDF ID for the rotation x variable - integer(I4B) :: roty_varid !! NetCDF ID for the rotation y variable - integer(I4B) :: rotz_varid !! NetCDF ID for the rotation z variable - integer(I4B) :: k2_varid !! NetCDF ID for the Love number variable - integer(I4B) :: Q_varid !! NetCDF ID for the energy dissipation variable - integer(I4B) :: out_type !! NetCDF output type (will be assigned either NF90_DOUBLE or NF90_FLOAT, depending on the user parameter) + integer(I4B) :: out_type !! NetCDF output type (will be assigned either NF90_DOUBLE or NF90_FLOAT, depending on the user parameter) + integer(I4B) :: ncid !! NetCDF ID for the output file + integer(I4B) :: dimids(2) !! Dimensions of the NetCDF file + integer(I4B) :: time_dimid !! NetCDF ID for the time dimension + integer(I4B) :: time_varid !! NetCDF ID for the time variable + integer(I4B) :: id_dimid !! NetCDF ID for the particle name dimension + integer(I4B) :: id_varid !! NetCDF ID for the particle name variable + integer(I4B) :: name_varid !! NetCDF ID for the semimajor axis variable + integer(I4B) :: npl_varid !! NetCDF ID for the number of active massive bodies variable + integer(I4B) :: ntp_varid !! NetCDF ID for the number of active test particles variable + integer(I4B) :: a_varid !! NetCDF ID for the semimajor axis variable + integer(I4B) :: e_varid !! NetCDF ID for the eccentricity variable + integer(I4B) :: inc_varid !! NetCDF ID for the inclination variable + integer(I4B) :: capom_varid !! NetCDF ID for the long. asc. node variable + integer(I4B) :: omega_varid !! NetCDF ID for the arg. periapsis variable + integer(I4B) :: capm_varid !! NetCDF ID for the mean anomaly variable + integer(I4B) :: xhx_varid !! NetCDF ID for the heliocentric position x variable + integer(I4B) :: xhy_varid !! NetCDF ID for the heliocentric position y variable + integer(I4B) :: xhz_varid !! NetCDF ID for the heliocentric position z variable + integer(I4B) :: vhx_varid !! NetCDF ID for the heliocentric velocity x variable + integer(I4B) :: vhy_varid !! NetCDF ID for the heliocentric velocity y variable + integer(I4B) :: vhz_varid !! NetCDF ID for the heliocentric velocity z variable + integer(I4B) :: Gmass_varid !! NetCDF ID for the mass variable + integer(I4B) :: rhill_varid !! NetCDF ID for the hill radius variable + integer(I4B) :: radius_varid !! NetCDF ID for the radius variable + integer(I4B) :: Ip1_varid !! NetCDF ID for the axis 1 principal moment of inertia variable + integer(I4B) :: Ip2_varid !! NetCDF ID for the axis 2 principal moment of inertia variable + integer(I4B) :: Ip3_varid !! NetCDF ID for the axis 3 principal moment of inertia variable + integer(I4B) :: rotx_varid !! NetCDF ID for the rotation x variable + integer(I4B) :: roty_varid !! NetCDF ID for the rotation y variable + integer(I4B) :: rotz_varid !! NetCDF ID for the rotation z variable + integer(I4B) :: k2_varid !! NetCDF ID for the Love number variable + integer(I4B) :: Q_varid !! NetCDF ID for the energy dissipation variable + integer(I4B) :: KE_orb_varid !! NetCDF ID for the system orbital kinetic energy variable + integer(I4B) :: KE_spin_varid !! NetCDF ID for the system spin kinetic energy variable + integer(I4B) :: PE_varid !! NetCDF ID for the system potential energy variable + integer(I4B) :: L_orbx_varid !! NetCDF ID for the system orbital angular momentum x variable + integer(I4B) :: L_orby_varid !! NetCDF ID for the system orbital angular momentum y variable + integer(I4B) :: L_orbz_varid !! NetCDF ID for the system orbital angular momentum z variable + integer(I4B) :: L_spinx_varid !! NetCDF ID for the system spin angular momentum x variable + integer(I4B) :: L_spiny_varid !! NetCDF ID for the system spin angular momentum y variable + integer(I4B) :: L_spinz_varid !! NetCDF ID for the system spin angular momentum z variable + integer(I4B) :: L_escapex_varid !! NetCDF ID for the escaped angular momentum x variable + integer(I4B) :: L_escapey_varid !! NetCDF ID for the escaped angular momentum x variable + integer(I4B) :: L_escapez_varid !! NetCDF ID for the escaped angular momentum x variable + integer(I4B) :: Ecollisions_varid !! NetCDF ID for the energy lost in collisions variable + integer(I4B) :: Euntracked_varid !! NetCDF ID for the energy that is untracked due to loss (untracked potential energy due to mergers and body energy for escaped bodies) + integer(I4B) :: GMescape_varid !! NetCDF ID for the G*Mass of bodies that escape the system contains procedure :: initialize => netcdf_initialize_output !! Initialize a set of parameters used to identify a NetCDF output object end type netcdf_parameters @@ -126,9 +144,9 @@ 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 !! Dump contents to file procedure :: write_frame_netcdf => netcdf_write_frame_base !! I/O routine for writing out a single frame of time-series data for all bodies in the system in NetCDF format - generic :: write_frame => write_frame_netcdf + generic :: write_frame => write_frame_netcdf !! Set up generic procedure that will switch between NetCDF or Fortran binary depending on arguments end type swiftest_base !******************************************************************************************************************************** @@ -161,10 +179,10 @@ 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 - procedure :: read_in => io_read_in_cb !! 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_bin => io_write_frame_cb !! I/O routine for writing out a single frame of time-series data for the central body - generic :: write_frame => write_frame_bin + procedure :: read_in => io_read_in_cb !! 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_bin => io_write_frame_cb !! I/O routine for writing out a single frame of time-series data for the central body + generic :: write_frame => write_frame_bin !! Write a frame (either binary or NetCDF, using generic procedures) end type swiftest_cb !******************************************************************************************************************************** @@ -205,25 +223,25 @@ 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 :: read_in => io_read_in_body !! 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_bin => 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 :: append => util_append_body !! Appends 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 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_spill_body !! "Spills" bodies from one object to another depending on the results of a mask (uses the PACK intrinsic) - generic :: write_frame => write_frame_bin + 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 :: read_in => io_read_in_body !! 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_bin => 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 :: append => util_append_body !! Appends 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 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_spill_body !! "Spills" bodies from one object to another depending on the results of a mask (uses the PACK intrinsic) + generic :: write_frame => write_frame_bin !! Add the generic write frame for Fortran binary files end type swiftest_body !******************************************************************************************************************************** @@ -300,7 +318,6 @@ module swiftest_classes procedure :: vb2vh => util_coord_vb2vh_tp !! Convert test particles from barycentric to heliocentric coordinates (velocity only) procedure :: vh2vb => util_coord_vh2vb_tp !! Convert test particles from heliocentric to barycentric coordinates (velocity only) procedure :: xh2xb => util_coord_xh2xb_tp !! Convert test particles from heliocentric to barycentric coordinates (position only) - !procedure :: index => util_index_eucl_pltp !! Sets up the (i, j) -> k indexing used for the single-loop blocking Euclidean distance matrix 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. @@ -328,7 +345,7 @@ module swiftest_classes real(DP) :: te = 0.0_DP !! System total energy 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) :: Ltot = 0.0_DP !! System angular momentum vector + real(DP), dimension(NDIM) :: Ltot = 0.0_DP !! System angular momentum vector 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 @@ -344,12 +361,15 @@ module swiftest_classes 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 :: write_hdr_bin => io_write_hdr_system !! Write a header for an output frame in Fortran binary format + procedure :: write_hdr_netcdf => netcdf_write_hdr_system !! Write a header for an output frame in NetCDF format 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 procedure :: rescale => util_rescale_system !! Rescales the system into a new set of units procedure :: validate_ids => util_valid_id_system !! Validate the numerical ids passed to the system and save the maximum value + generic :: write_hdr => write_hdr_bin, write_hdr_netcdf !! Generic method call for writing headers end type swiftest_nbody_system type :: swiftest_encounter @@ -736,16 +756,16 @@ end subroutine io_write_frame_encounter module subroutine io_write_frame_system(self, param) implicit none - class(swiftest_nbody_system), intent(in) :: self !! Swiftest system object - class(swiftest_parameters), intent(in) :: 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 io_write_frame_system - module subroutine netcdf_write_frame_system(self, iu, param) + module subroutine io_write_hdr_system(self, iu, param) implicit none - class(swiftest_nbody_system), intent(in) :: self !! Swiftest system object - integer(I4B), intent(inout) :: iu !! Unit number for the output file to write frame to - class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters - end subroutine netcdf_write_frame_system + class(swiftest_nbody_system), intent(in) :: self !! Swiftest nbody system object + integer(I4B), intent(inout) :: iu !! Output file unit number + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + end subroutine io_write_hdr_system module subroutine kick_getacch_int_all_pl(npl, nplpl, k_plpl, x, Gmass, radius, acc) implicit none @@ -793,17 +813,31 @@ end subroutine kick_getacch_int_tp module subroutine netcdf_initialize_output(self, param) implicit none - class(netcdf_parameters), intent(inout) :: self !! Parameters used to identify a particular NetCDF dataset - class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + class(netcdf_parameters), intent(inout) :: self !! Parameters used to for writing a NetCDF dataset to file + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters end subroutine netcdf_initialize_output module subroutine netcdf_write_frame_base(self, iu, param) implicit none class(swiftest_base), intent(in) :: self !! Swiftest base object - class(netcdf_parameters), intent(inout) :: iu !! Unit number for the output file to write frame to + class(netcdf_parameters), intent(inout) :: iu !! Parameters used to for writing a NetCDF dataset to file class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters end subroutine netcdf_write_frame_base + module subroutine netcdf_write_frame_system(self, iu, param) + implicit none + class(swiftest_nbody_system), intent(in) :: self !! Swiftest system object + integer(I4B), intent(inout) :: iu !! Parameters used to for writing a NetCDF dataset to file + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + end subroutine netcdf_write_frame_system + + module subroutine netcdf_write_hdr_system(self, iu, param) + implicit none + class(swiftest_nbody_system), intent(in) :: self !! Swiftest nbody system object + class(netcdf_parameters), intent(inout) :: iu !! Parameters used to for writing a NetCDF dataset to file + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + end subroutine netcdf_write_hdr_system + module subroutine obl_acc_body(self, system) implicit none class(swiftest_body), intent(inout) :: self !! Swiftest body object diff --git a/src/modules/swiftest_globals.f90 b/src/modules/swiftest_globals.f90 index 48aade302..cf0c7248a 100644 --- a/src/modules/swiftest_globals.f90 +++ b/src/modules/swiftest_globals.f90 @@ -127,32 +127,48 @@ module swiftest_globals real(DP), parameter :: einsteinC = 299792458.0_DP !! Speed of light in SI units !> NetCDF variable names and constants - character(*), parameter :: NETCDF_OUTFILE = 'bin.nc' - character(*), parameter :: TIME_DIMNAME = "time"!! netcdf id for the time dimension - character(*), parameter :: ID_DIMNAME = "id"!! NetCDF ID for the particle id dimension - character(*), parameter :: NAME_VARNAME = "name"!! NetCDF ID for the particle name variable - character(*), parameter :: A_VARNAME = "a"!! NetCDF ID for the semimajor axis variable - character(*), parameter :: E_VARNAME = "e"!! NetCDF ID for the eccentricity variable - character(*), parameter :: INC_VARNAME = "inc"!! NetCDF ID for the inclination variable - character(*), parameter :: CAPOM_VARNAME = "capom"!! NetCDF ID for the long. asc. node variable - character(*), parameter :: OMEGA_VARNAME = "omega"!! NetCDF ID for the arg. periapsis variable - character(*), parameter :: CAPM_VARNAME = "capm"!! NetCDF ID for the mean anomaly variable - character(*), parameter :: XHX_VARNAME = "xhx"!! NetCDF ID for the heliocentric position x variable - character(*), parameter :: XHY_VARNAME = "xhy"!! NetCDF ID for the heliocentric position y variable - character(*), parameter :: XHZ_VARNAME = "xhz"!! NetCDF ID for the heliocentric position z variable - character(*), parameter :: VHX_VARNAME = "vhx"!! NetCDF ID for the heliocentric velocity x variable - character(*), parameter :: VHY_VARNAME = "vhy"!! NetCDF ID for the heliocentric velocity y variable - character(*), parameter :: VHZ_VARNAME = "vhz"!! NetCDF ID for the heliocentric velocity z variable - character(*), parameter :: GMASS_VARNAME = "Gmass"!! NetCDF ID for the mass variable - character(*), parameter :: RHILL_VARNAME = "rhill"!! NetCDF ID for the hill radius variable - character(*), parameter :: RADIUS_VARNAME = "radius"!! NetCDF ID for the radius variable - character(*), parameter :: IP1_VARNAME = "Ip1"!! NetCDF ID for the axis 1 principal moment of inertial variable - character(*), parameter :: IP2_VARNAME = "Ip2"!! NetCDF ID for the axis 2 principal moment of inertial variable - character(*), parameter :: IP3_VARNAME = "Ip3"!! NetCDF ID for the axis 3 principal moment of inertial variable - character(*), parameter :: ROTX_VARNAME = "rotx"!! NetCDF ID for the rotation x variable - character(*), parameter :: ROTY_VARNAME = "roty"!! NetCDF ID for the rotation y variable - character(*), parameter :: ROTZ_VARNAME = "rotz"!! NetCDF ID for the rotation z variable - character(*), parameter :: K2_VARNAME = "k2"!! NetCDF ID for the Love number variable - character(*), parameter :: Q_VARNAME = "Q"!! NetCDF ID for the energy dissipation variable - + character(*), parameter :: NETCDF_OUTFILE = 'bin.nc' !! Default output file name + character(*), parameter :: TIME_DIMNAME = "time" !! NetCDF name of the time dimension + character(*), parameter :: ID_DIMNAME = "id" !! NetCDF name of the particle id dimension + character(*), parameter :: NAME_VARNAME = "name" !! NetCDF name of the particle name variable + character(*), parameter :: NPL_VARNAME = "npl" !! NetCDF name of the number of active massive bodies variable + character(*), parameter :: NTP_VARNAME = "ntp" !! NetCDF name of the number of active test particles variable + character(*), parameter :: A_VARNAME = "a" !! NetCDF name of the semimajor axis variable + character(*), parameter :: E_VARNAME = "e" !! NetCDF name of the eccentricity variable + character(*), parameter :: INC_VARNAME = "inc" !! NetCDF name of the inclination variable + character(*), parameter :: CAPOM_VARNAME = "capom" !! NetCDF name of the long. asc. node variable + character(*), parameter :: OMEGA_VARNAME = "omega" !! NetCDF name of the arg. periapsis variable + character(*), parameter :: CAPM_VARNAME = "capm" !! NetCDF name of the mean anomaly variable + character(*), parameter :: XHX_VARNAME = "xhx" !! NetCDF name of the heliocentric position x variable + character(*), parameter :: XHY_VARNAME = "xhy" !! NetCDF name of the heliocentric position y variable + character(*), parameter :: XHZ_VARNAME = "xhz" !! NetCDF name of the heliocentric position z variable + character(*), parameter :: VHX_VARNAME = "vhx" !! NetCDF name of the heliocentric velocity x variable + character(*), parameter :: VHY_VARNAME = "vhy" !! NetCDF name of the heliocentric velocity y variable + character(*), parameter :: VHZ_VARNAME = "vhz" !! NetCDF name of the heliocentric velocity z variable + character(*), parameter :: GMASS_VARNAME = "Gmass" !! NetCDF name of the mass variable + character(*), parameter :: RHILL_VARNAME = "rhill" !! NetCDF name of the hill radius variable + character(*), parameter :: RADIUS_VARNAME = "radius" !! NetCDF name of the radius variable + character(*), parameter :: IP1_VARNAME = "Ip1" !! NetCDF name of the axis 1 principal moment of inertial variable + character(*), parameter :: IP2_VARNAME = "Ip2" !! NetCDF name of the axis 2 principal moment of inertial variable + character(*), parameter :: IP3_VARNAME = "Ip3" !! NetCDF name of the axis 3 principal moment of inertial variable + character(*), parameter :: ROTX_VARNAME = "rotx" !! NetCDF name of the rotation x variable + character(*), parameter :: ROTY_VARNAME = "roty" !! NetCDF name of the rotation y variable + character(*), parameter :: ROTZ_VARNAME = "rotz" !! NetCDF name of the rotation z variable + character(*), parameter :: K2_VARNAME = "k2" !! NetCDF name of the Love number variable + character(*), parameter :: Q_VARNAME = "Q" !! NetCDF name of the energy dissipation variable + character(*), parameter :: KE_ORB_VARNAME = "KE_orb" !! NetCDF name of the system orbital kinetic energy variable + character(*), parameter :: KE_SPIN_VARNAME = "KE_spin" !! NetCDF name of the system spin kinetic energy variable + character(*), parameter :: PE_VARNAME = "PE" !! NetCDF name of the system potential energy variable + character(*), parameter :: L_ORBX_VARNAME = "L_orbx" !! NetCDF name of the orbital angular momentum x variable + character(*), parameter :: L_ORBY_VARNAME = "L_orby" !! NetCDF name of the orbital angular momentum y variable + character(*), parameter :: L_ORBZ_VARNAME = "L_orbz" !! NetCDF name of the orbital angular momentum z variable + character(*), parameter :: L_SPINX_VARNAME = "L_spinx" !! NetCDF name of the spin angular momentum x variable + character(*), parameter :: L_SPINY_VARNAME = "L_spiny" !! NetCDF name of the spin angular momentum y variable + character(*), parameter :: L_SPINZ_VARNAME = "L_spinz" !! NetCDF name of the spin angular momentum z variable + character(*), parameter :: L_ESCAPEX_VARNAME = "L_escapex" !! NetCDF name of the escaped angular momentum x variable + character(*), parameter :: L_ESCAPEY_VARNAME = "L_escapey" !! NetCDF name of the escaped angular momentum y variable + character(*), parameter :: L_ESCAPEZ_VARNAME = "L_escapez" !! NetCDF name of the escaped angular momentum z variable + character(*), parameter :: ECOLLISIONS_VARNAME = "Ecollisions" !! NetCDF name of the escaped angular momentum y variable + character(*), parameter :: EUNTRACKED_VARNAME = "Euntracked" !! NetCDF name of the energy that is untracked due to loss (untracked potential energy due to mergers and body energy for escaped bodies) + character(*), parameter :: GMESCAPE_VARNAME = "GMescape" !! NetCDF name of the G*Mass of bodies that escape the system end module swiftest_globals diff --git a/src/netcdf/netcdf.f90 b/src/netcdf/netcdf.f90 index 00d48110a..44670c318 100644 --- a/src/netcdf/netcdf.f90 +++ b/src/netcdf/netcdf.f90 @@ -3,30 +3,131 @@ use netcdf contains + subroutine check(status) + !! author: Carlisle A. Wishard, Dana Singh, and David A. Minton + !! + !! Checks the status of all NetCDF operations to catch errors + implicit none + ! Arguments + integer, intent (in) :: status + + if(status /= nf90_noerr) then + write(*,*) trim(nf90_strerror(status)) + call util_exit(FAILURE) + end if + + return + end subroutine check + + + module subroutine netcdf_initialize_output(self, param) + !! author: Carlisle A. Wishard, Dana Singh, and David A. Minton + !! + !! Initialize a NetCDF file system and defines all variables. + implicit none + ! Arguments + class(netcdf_parameters), intent(inout) :: self !! Parameters used to identify a particular NetCDF dataset + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + ! Internals + logical :: fileExists + + !! Create the new output file, deleting any previously existing output file of the same name + call check( nf90_create(param%outfile, NF90_HDF5, self%ncid) ) + !call check( nf90_set_fill(self%ncid, nf90_nofill, oldMode) ) + + ! Define the NetCDF dimensions with particle name as the record dimension + call check( nf90_def_dim(self%ncid, ID_DIMNAME, NF90_UNLIMITED, self%id_dimid) ) ! 'x' dimension + call check( nf90_def_dim(self%ncid, TIME_DIMNAME, NF90_UNLIMITED, self%time_dimid) ) ! 'y' dimension + self%dimids = [self%time_dimid, self%id_dimid ] + + select case (param%out_type) + case(NETCDF_FLOAT_TYPE) + self%out_type = NF90_FLOAT + case(NETCDF_DOUBLE_TYPE) + self%out_type = NF90_DOUBLE + end select + + !! Define the variables + call check( nf90_def_var(self%ncid, TIME_DIMNAME, self%out_type, self%time_dimid, self%time_varid) ) + call check( nf90_def_var(self%ncid, ID_DIMNAME, NF90_INT, self%id_dimid, self%id_varid) ) + call check( nf90_def_var(self%ncid, NPL_VARNAME, NF90_INT, self%time_dimid, self%npl_varid) ) + call check( nf90_def_var(self%ncid, NTP_VARNAME, NF90_INT, self%time_dimid, self%ntp_varid) ) + if ((param%out_form == XV) .or. (param%out_form == XVEL)) then + call check( nf90_def_var(self%ncid, XHX_VARNAME, self%out_type, self%dimids, self%xhx_varid) ) + call check( nf90_def_var(self%ncid, XHY_VARNAME, self%out_type, self%dimids, self%xhy_varid) ) + call check( nf90_def_var(self%ncid, XHZ_VARNAME, self%out_type, self%dimids, self%xhz_varid) ) + call check( nf90_def_var(self%ncid, VHX_VARNAME, self%out_type, self%dimids, self%vhx_varid) ) + call check( nf90_def_var(self%ncid, VHY_VARNAME, self%out_type, self%dimids, self%vhy_varid) ) + call check( nf90_def_var(self%ncid, VHZ_VARNAME, self%out_type, self%dimids, self%vhz_varid) ) + end if + + if ((param%out_form == EL) .or. (param%out_form == XVEL)) then + call check( nf90_def_var(self%ncid, A_VARNAME, self%out_type, self%dimids, self%a_varid) ) + call check( nf90_def_var(self%ncid, E_VARNAME, self%out_type, self%dimids, self%e_varid) ) + call check( nf90_def_var(self%ncid, INC_VARNAME, self%out_type, self%dimids, self%inc_varid) ) + call check( nf90_def_var(self%ncid, CAPOM_VARNAME, self%out_type, self%dimids, self%capom_varid) ) + call check( nf90_def_var(self%ncid, OMEGA_VARNAME, self%out_type, self%dimids, self%omega_varid) ) + call check( nf90_def_var(self%ncid, CAPM_VARNAME, self%out_type, self%dimids, self%capm_varid) ) + end if + + call check( nf90_def_var(self%ncid, GMASS_VARNAME, self%out_type, self%dimids, self%Gmass_varid) ) + if (param%lrhill_present) call check( nf90_def_var(self%ncid, RHILL_VARNAME, self%out_type, self%dimids, self%rhill_varid) ) + if (param%lclose) call check( nf90_def_var(self%ncid, RADIUS_VARNAME, self%out_type, self%dimids, self%radius_varid) ) + if (param%lrotation) then + call check( nf90_def_var(self%ncid, IP1_VARNAME, self%out_type, self%dimids, self%Ip1_varid) ) + call check( nf90_def_var(self%ncid, IP2_VARNAME, self%out_type, self%dimids, self%Ip2_varid) ) + call check( nf90_def_var(self%ncid, IP3_VARNAME, self%out_type, self%dimids, self%Ip3_varid) ) + call check( nf90_def_var(self%ncid, ROTX_VARNAME, self%out_type, self%dimids, self%rotx_varid) ) + call check( nf90_def_var(self%ncid, ROTY_VARNAME, self%out_type, self%dimids, self%roty_varid) ) + call check( nf90_def_var(self%ncid, ROTZ_VARNAME, self%out_type, self%dimids, self%rotz_varid) ) + end if + if (param%ltides) then + call check( nf90_def_var(self%ncid, K2_VARNAME, self%out_type, self%dimids, self%k2_varid) ) + call check( nf90_def_var(self%ncid, Q_VARNAME, self%out_type, self%dimids, self%Q_varid) ) + end if + if (param%lenergy) then + call check( nf90_def_var(self%ncid, KE_ORB_VARNAME, self%out_type, self%time_dimid, self%KE_orb_varid) ) + call check( nf90_def_var(self%ncid, KE_SPIN_VARNAME, self%out_type, self%time_dimid, self%KE_spin_varid) ) + call check( nf90_def_var(self%ncid, PE_VARNAME, self%out_type, self%time_dimid, self%PE_varid) ) + call check( nf90_def_var(self%ncid, L_ORBX_VARNAME, self%out_type, self%time_dimid, self%L_orbx_varid) ) + call check( nf90_def_var(self%ncid, L_ORBY_VARNAME, self%out_type, self%time_dimid, self%L_orby_varid) ) + call check( nf90_def_var(self%ncid, L_ORBZ_VARNAME, self%out_type, self%time_dimid, self%L_orbz_varid) ) + call check( nf90_def_var(self%ncid, L_SPINX_VARNAME, self%out_type, self%time_dimid, self%L_spinx_varid) ) + call check( nf90_def_var(self%ncid, L_SPINY_VARNAME, self%out_type, self%time_dimid, self%L_spiny_varid) ) + call check( nf90_def_var(self%ncid, L_SPINZ_VARNAME, self%out_type, self%time_dimid, self%L_spinz_varid) ) + call check( nf90_def_var(self%ncid, L_ESCAPEX_VARNAME, self%out_type, self%time_dimid, self%L_escapex_varid) ) + call check( nf90_def_var(self%ncid, L_ESCAPEY_VARNAME, self%out_type, self%time_dimid, self%L_escapey_varid) ) + call check( nf90_def_var(self%ncid, L_ESCAPEZ_VARNAME, self%out_type, self%time_dimid, self%L_escapez_varid) ) + call check( nf90_def_var(self%ncid, ECOLLISIONS_VARNAME, self%out_type, self%time_dimid, self%Ecollisions_varid) ) + call check( nf90_def_var(self%ncid, EUNTRACKED_VARNAME, self%out_type, self%time_dimid, self%Euntracked_varid) ) + call check( nf90_def_var(self%ncid, GMESCAPE_VARNAME, self%out_type, self%time_dimid, self%GMescape_varid) ) + end if + + call check( nf90_close(self%ncid) ) + + return + end subroutine netcdf_initialize_output + + module subroutine netcdf_write_frame_base(self, iu, param) !! author: Carlisle A. Wishard, Dana Singh, and David A. Minton !! !! Write a frame of output of either test particle or massive body data to the binary output file !! Note: If outputting to orbital elements, but sure that the conversion is done prior to calling this method - !! - !! Adapted from David E. Kaufmann's Swifter routine io_write_frame.f90 - !! Adapted from Hal Levison's Swift routine io_write_frame.F implicit none ! Arguments class(swiftest_base), intent(in) :: self !! Swiftest particle object class(netcdf_parameters), intent(inout) :: iu !! Parameters used to identify a particular NetCDF dataset class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters ! Internals - integer(I4B) :: i, j, id, ioutput + integer(I4B) :: i, j, id, tslot integer(I4B), dimension(:), allocatable :: ind !! Open the netCDF file call check( nf90_open(param%outfile, nf90_write, iu%ncid) ) !call check( nf90_set_fill(iu%ncid, nf90_nofill, oldMode) ) - - ! Calculate the output number that we are currently on - ioutput = (param%t / param%dt) / param%istep_out + tslot = int(param%ioutput, kind=I4B) + 1 select type(self) class is (swiftest_body) @@ -41,7 +142,7 @@ module subroutine netcdf_write_frame_base(self, iu, param) call check( nf90_inq_varid(iu%ncid, ID_DIMNAME, iu%id_varid)) call check( nf90_put_var(iu%ncid, iu%id_varid, id, start=[id]) ) !call check( nf90_inq_varid(iu%ncid, NAME_VARNAME, iu%name_varid)) - !call check( nf90_put_var(iu%ncid, iu%name_varid, trim(adjustl(self%name(j))), start=[ioutput + 1, id]) ) + !call check( nf90_put_var(iu%ncid, iu%name_varid, trim(adjustl(self%name(j))), start=[tslot, id]) ) if ((param%out_form == XV) .or. (param%out_form == XVEL)) then call check( nf90_inq_varid(iu%ncid, XHX_VARNAME, iu%xhx_varid)) call check( nf90_inq_varid(iu%ncid, XHY_VARNAME, iu%xhy_varid)) @@ -50,12 +151,12 @@ module subroutine netcdf_write_frame_base(self, iu, param) call check( nf90_inq_varid(iu%ncid, VHY_VARNAME, iu%vhy_varid)) call check( nf90_inq_varid(iu%ncid, VHZ_VARNAME, iu%vhz_varid)) - call check( nf90_put_var(iu%ncid, iu%xhx_varid, self%xh(1, j), start=[ioutput + 1, id]) ) - call check( nf90_put_var(iu%ncid, iu%xhy_varid, self%xh(2, j), start=[ioutput + 1, id]) ) - call check( nf90_put_var(iu%ncid, iu%xhz_varid, self%xh(3, j), start=[ioutput + 1, id]) ) - call check( nf90_put_var(iu%ncid, iu%vhx_varid, self%vh(1, j), start=[ioutput + 1, id]) ) - call check( nf90_put_var(iu%ncid, iu%vhy_varid, self%vh(2, j), start=[ioutput + 1, id]) ) - call check( nf90_put_var(iu%ncid, iu%vhz_varid, self%vh(3, j), start=[ioutput + 1, id]) ) + call check( nf90_put_var(iu%ncid, iu%xhx_varid, self%xh(1, j), start=[tslot, id]) ) + call check( nf90_put_var(iu%ncid, iu%xhy_varid, self%xh(2, j), start=[tslot, id]) ) + call check( nf90_put_var(iu%ncid, iu%xhz_varid, self%xh(3, j), start=[tslot, id]) ) + call check( nf90_put_var(iu%ncid, iu%vhx_varid, self%vh(1, j), start=[tslot, id]) ) + call check( nf90_put_var(iu%ncid, iu%vhy_varid, self%vh(2, j), start=[tslot, id]) ) + call check( nf90_put_var(iu%ncid, iu%vhz_varid, self%vh(3, j), start=[tslot, id]) ) end if if ((param%out_form == EL) .or. (param%out_form == XVEL)) then call check( nf90_inq_varid(iu%ncid, A_VARNAME, iu%a_varid)) @@ -65,24 +166,24 @@ module subroutine netcdf_write_frame_base(self, iu, param) call check( nf90_inq_varid(iu%ncid, OMEGA_VARNAME, iu%omega_varid)) call check( nf90_inq_varid(iu%ncid, CAPM_VARNAME, iu%capm_varid)) - call check( nf90_put_var(iu%ncid, iu%a_varid, self%a(j), start=[ioutput + 1, id]) ) - call check( nf90_put_var(iu%ncid, iu%e_varid, self%e(j), start=[ioutput + 1, id]) ) - call check( nf90_put_var(iu%ncid, iu%inc_varid, self%inc(j), start=[ioutput + 1, id]) ) - call check( nf90_put_var(iu%ncid, iu%capom_varid, self%capom(j), start=[ioutput + 1, id]) ) - call check( nf90_put_var(iu%ncid, iu%omega_varid, self%omega(j), start=[ioutput + 1, id]) ) - call check( nf90_put_var(iu%ncid, iu%capm_varid, self%capm(j), start=[ioutput + 1, id]) ) + call check( nf90_put_var(iu%ncid, iu%a_varid, self%a(j), start=[tslot, id]) ) + call check( nf90_put_var(iu%ncid, iu%e_varid, self%e(j), start=[tslot, id]) ) + call check( nf90_put_var(iu%ncid, iu%inc_varid, self%inc(j), start=[tslot, id]) ) + call check( nf90_put_var(iu%ncid, iu%capom_varid, self%capom(j), start=[tslot, id]) ) + call check( nf90_put_var(iu%ncid, iu%omega_varid, self%omega(j), start=[tslot, id]) ) + call check( nf90_put_var(iu%ncid, iu%capm_varid, self%capm(j), start=[tslot, id]) ) end if select type(pl => self) class is (swiftest_pl) ! Additional output if the passed polymorphic object is a massive body call check( nf90_inq_varid(iu%ncid, GMASS_VARNAME, iu%Gmass_varid)) - call check( nf90_put_var(iu%ncid, iu%Gmass_varid, pl%Gmass(j), start=[ioutput + 1, id]) ) + call check( nf90_put_var(iu%ncid, iu%Gmass_varid, pl%Gmass(j), start=[tslot, id]) ) if (param%lrhill_present) then call check( nf90_inq_varid(iu%ncid, RHILL_VARNAME, iu%rhill_varid)) - call check( nf90_put_var(iu%ncid, iu%rhill_varid, pl%rhill(j), start=[ioutput + 1, id]) ) + call check( nf90_put_var(iu%ncid, iu%rhill_varid, pl%rhill(j), start=[tslot, id]) ) end if if (param%lclose) then call check( nf90_inq_varid(iu%ncid, RADIUS_VARNAME, iu%radius_varid)) - call check( nf90_put_var(iu%ncid, iu%radius_varid, pl%radius(j), start=[ioutput + 1, id]) ) + call check( nf90_put_var(iu%ncid, iu%radius_varid, pl%radius(j), start=[tslot, id]) ) end if if (param%lrotation) then call check( nf90_inq_varid(iu%ncid, IP1_VARNAME, iu%Ip1_varid)) @@ -92,35 +193,31 @@ module subroutine netcdf_write_frame_base(self, iu, param) call check( nf90_inq_varid(iu%ncid, ROTY_VARNAME, iu%roty_varid)) call check( nf90_inq_varid(iu%ncid, ROTZ_VARNAME, iu%rotz_varid)) - call check( nf90_put_var(iu%ncid, iu%Ip1_varid, pl%Ip(1, j), start=[ioutput + 1, id]) ) - call check( nf90_put_var(iu%ncid, iu%Ip2_varid, pl%Ip(2, j), start=[ioutput + 1, id]) ) - call check( nf90_put_var(iu%ncid, iu%Ip3_varid, pl%Ip(3, j), start=[ioutput + 1, id]) ) - call check( nf90_put_var(iu%ncid, iu%rotx_varid, pl%rot(1, j), start=[ioutput + 1, id]) ) - call check( nf90_put_var(iu%ncid, iu%roty_varid, pl%rot(2, j), start=[ioutput + 1, id]) ) - call check( nf90_put_var(iu%ncid, iu%rotz_varid, pl%rot(3, j), start=[ioutput + 1, id]) ) + call check( nf90_put_var(iu%ncid, iu%Ip1_varid, pl%Ip(1, j), start=[tslot, id]) ) + call check( nf90_put_var(iu%ncid, iu%Ip2_varid, pl%Ip(2, j), start=[tslot, id]) ) + call check( nf90_put_var(iu%ncid, iu%Ip3_varid, pl%Ip(3, j), start=[tslot, id]) ) + call check( nf90_put_var(iu%ncid, iu%rotx_varid, pl%rot(1, j), start=[tslot, id]) ) + call check( nf90_put_var(iu%ncid, iu%roty_varid, pl%rot(2, j), start=[tslot, id]) ) + call check( nf90_put_var(iu%ncid, iu%rotz_varid, pl%rot(3, j), start=[tslot, id]) ) end if if (param%ltides) then call check( nf90_inq_varid(iu%ncid, K2_VARNAME, iu%k2_varid)) call check( nf90_inq_varid(iu%ncid, Q_VARNAME, iu%Q_varid)) - call check( nf90_put_var(iu%ncid, iu%k2_varid, pl%k2(j), start=[ioutput + 1, id]) ) - call check( nf90_put_var(iu%ncid, iu%Q_varid, pl%Q(j), start=[ioutput + 1, id]) ) + call check( nf90_put_var(iu%ncid, iu%k2_varid, pl%k2(j), start=[tslot, id]) ) + call check( nf90_put_var(iu%ncid, iu%Q_varid, pl%Q(j), start=[tslot, id]) ) end if end select end do end associate class is (swiftest_cb) id = self%id - call check( nf90_inq_varid(iu%ncid, TIME_DIMNAME, iu%time_varid)) - call check( nf90_put_var(iu%ncid, iu%time_varid, param%t, start=[ioutput + 1]) ) call check( nf90_inq_varid(iu%ncid, ID_DIMNAME, iu%id_varid)) call check( nf90_put_var(iu%ncid, iu%id_varid, id, start=[id]) ) - !call check( nf90_inq_varid(iu%ncid, NAME_VARNAME, iu%name_varid)) - !call check( nf90_put_var(iu%ncid, iu%name_varid, trim(adjustl(self%name)), start=[ioutput + 1, id]) ) call check( nf90_inq_varid(iu%ncid, GMASS_VARNAME, iu%Gmass_varid)) - call check( nf90_put_var(iu%ncid, iu%Gmass_varid, self%Gmass, start=[ioutput + 1, id]) ) + call check( nf90_put_var(iu%ncid, iu%Gmass_varid, self%Gmass, start=[tslot, id]) ) call check( nf90_inq_varid(iu%ncid, RADIUS_VARNAME, iu%radius_varid)) - call check( nf90_put_var(iu%ncid, iu%radius_varid, self%radius, start=[ioutput + 1, id]) ) + call check( nf90_put_var(iu%ncid, iu%radius_varid, self%radius, start=[tslot, id]) ) if (param%lrotation) then call check( nf90_inq_varid(iu%ncid, IP1_VARNAME, iu%Ip1_varid)) call check( nf90_inq_varid(iu%ncid, IP2_VARNAME, iu%Ip2_varid)) @@ -129,19 +226,19 @@ module subroutine netcdf_write_frame_base(self, iu, param) call check( nf90_inq_varid(iu%ncid, ROTY_VARNAME, iu%roty_varid)) call check( nf90_inq_varid(iu%ncid, ROTZ_VARNAME, iu%rotz_varid)) - call check( nf90_put_var(iu%ncid, iu%Ip1_varid, self%Ip(1), start=[ioutput + 1, id]) ) - call check( nf90_put_var(iu%ncid, iu%Ip2_varid, self%Ip(2), start=[ioutput + 1, id]) ) - call check( nf90_put_var(iu%ncid, iu%Ip3_varid, self%Ip(3), start=[ioutput + 1, id]) ) - call check( nf90_put_var(iu%ncid, iu%rotx_varid, self%rot(1), start=[ioutput + 1, id]) ) - call check( nf90_put_var(iu%ncid, iu%roty_varid, self%rot(2), start=[ioutput + 1, id]) ) - call check( nf90_put_var(iu%ncid, iu%rotz_varid, self%rot(3), start=[ioutput + 1, id]) ) + call check( nf90_put_var(iu%ncid, iu%Ip1_varid, self%Ip(1), start=[tslot, id]) ) + call check( nf90_put_var(iu%ncid, iu%Ip2_varid, self%Ip(2), start=[tslot, id]) ) + call check( nf90_put_var(iu%ncid, iu%Ip3_varid, self%Ip(3), start=[tslot, id]) ) + call check( nf90_put_var(iu%ncid, iu%rotx_varid, self%rot(1), start=[tslot, id]) ) + call check( nf90_put_var(iu%ncid, iu%roty_varid, self%rot(2), start=[tslot, id]) ) + call check( nf90_put_var(iu%ncid, iu%rotz_varid, self%rot(3), start=[tslot, id]) ) end if if (param%ltides) then call check( nf90_inq_varid(iu%ncid, K2_VARNAME, iu%k2_varid)) call check( nf90_inq_varid(iu%ncid, Q_VARNAME, iu%Q_varid)) - call check( nf90_put_var(iu%ncid, iu%k2_varid, self%k2, start=[ioutput + 1, id]) ) - call check( nf90_put_var(iu%ncid, iu%Q_varid, self%Q, start=[ioutput + 1, id]) ) + call check( nf90_put_var(iu%ncid, iu%k2_varid, self%k2, start=[tslot, id]) ) + call check( nf90_put_var(iu%ncid, iu%Q_varid, self%Q, start=[tslot, id]) ) end if end select @@ -151,97 +248,73 @@ module subroutine netcdf_write_frame_base(self, iu, param) return end subroutine netcdf_write_frame_base - - module subroutine netcdf_initialize_output(self, param) - !! author: Carlisle A. Wishard, Dana Singh, and David A. Mintont - !! - !! Initialize a NetCDF file system - !! There is no direct file output from this subroutine + module subroutine netcdf_write_hdr_system(self, iu, param) + !! author: David A. Minton !! - !! Adapted from David E. Kaufmann's Swifter routine io_write_frame.f90 - !! Adapted from Hal Levison's Swift routine io_write_frame.F + !! Writes header information (variables that change with time, but not particle id). + !! This subroutine significantly improves the output over the original binary file, allowing us to track energy, momentum, and other quantities that + !! previously were handled as separate output files. implicit none ! Arguments - class(netcdf_parameters), intent(inout) :: self !! Parameters used to identify a particular NetCDF dataset - class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + class(swiftest_nbody_system), intent(in) :: self !! Swiftest nbody system object + class(netcdf_parameters), intent(inout) :: iu !! Parameters used to for writing a NetCDF dataset to file + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters ! Internals - logical :: fileExists - - !! Create the new output file, deleting any previously existing output file of the same name - call check( nf90_create(param%outfile, NF90_HDF5, self%ncid) ) - !call check( nf90_set_fill(self%ncid, nf90_nofill, oldMode) ) - - ! Define the NetCDF dimensions with particle name as the record dimension - call check( nf90_def_dim(self%ncid, ID_DIMNAME, NF90_UNLIMITED, self%id_dimid) ) ! 'x' dimension - call check( nf90_def_dim(self%ncid, TIME_DIMNAME, NF90_UNLIMITED, self%time_dimid) ) ! 'y' dimension - self%dimids = [self%time_dimid, self%id_dimid ] + integer(I4B) :: tslot - select case (param%out_type) - case(NETCDF_FLOAT_TYPE) - self%out_type = NF90_FLOAT - case(NETCDF_DOUBLE_TYPE) - self%out_type = NF90_DOUBLE - end select + tslot = int(param%ioutput, kind=I4B) + 1 - !! Define the variables - !call check( nf90_def_var(self%ncid, NAME_VARNAME, NF90_CHAR, self%dimids, self%name_varid) ) - call check( nf90_def_var(self%ncid, TIME_DIMNAME, self%out_type, self%dimids(1), self%time_varid) ) - call check( nf90_def_var(self%ncid, ID_DIMNAME, NF90_INT, self%dimids(2), self%id_varid) ) - if ((param%out_form == XV) .or. (param%out_form == XVEL)) then - call check( nf90_def_var(self%ncid, XHX_VARNAME, self%out_type, self%dimids, self%xhx_varid) ) - call check( nf90_def_var(self%ncid, XHY_VARNAME, self%out_type, self%dimids, self%xhy_varid) ) - call check( nf90_def_var(self%ncid, XHZ_VARNAME, self%out_type, self%dimids, self%xhz_varid) ) - call check( nf90_def_var(self%ncid, VHX_VARNAME, self%out_type, self%dimids, self%vhx_varid) ) - call check( nf90_def_var(self%ncid, VHY_VARNAME, self%out_type, self%dimids, self%vhy_varid) ) - call check( nf90_def_var(self%ncid, VHZ_VARNAME, self%out_type, self%dimids, self%vhz_varid) ) - end if - - if ((param%out_form == EL) .or. (param%out_form == XVEL)) then - call check( nf90_def_var(self%ncid, A_VARNAME, self%out_type, self%dimids, self%a_varid) ) - call check( nf90_def_var(self%ncid, E_VARNAME, self%out_type, self%dimids, self%e_varid) ) - call check( nf90_def_var(self%ncid, INC_VARNAME, self%out_type, self%dimids, self%inc_varid) ) - call check( nf90_def_var(self%ncid, CAPOM_VARNAME, self%out_type, self%dimids, self%capom_varid) ) - call check( nf90_def_var(self%ncid, OMEGA_VARNAME, self%out_type, self%dimids, self%omega_varid) ) - call check( nf90_def_var(self%ncid, CAPM_VARNAME, self%out_type, self%dimids, self%capm_varid) ) - end if + call check( nf90_open(param%outfile, nf90_write, iu%ncid) ) - call check( nf90_def_var(self%ncid, GMASS_VARNAME, self%out_type, self%dimids, self%Gmass_varid) ) - if (param%lrhill_present) call check( nf90_def_var(self%ncid, RHILL_VARNAME, self%out_type, self%dimids, self%rhill_varid) ) - if (param%lclose) call check( nf90_def_var(self%ncid, RADIUS_VARNAME, self%out_type, self%dimids, self%radius_varid) ) - if (param%lrotation) then - call check( nf90_def_var(self%ncid, IP1_VARNAME, self%out_type, self%dimids, self%Ip1_varid) ) - call check( nf90_def_var(self%ncid, IP2_VARNAME, self%out_type, self%dimids, self%Ip2_varid) ) - call check( nf90_def_var(self%ncid, IP3_VARNAME, self%out_type, self%dimids, self%Ip3_varid) ) - call check( nf90_def_var(self%ncid, ROTX_VARNAME, self%out_type, self%dimids, self%rotx_varid) ) - call check( nf90_def_var(self%ncid, ROTY_VARNAME, self%out_type, self%dimids, self%roty_varid) ) - call check( nf90_def_var(self%ncid, ROTZ_VARNAME, self%out_type, self%dimids, self%rotz_varid) ) - end if - if (param%ltides) then - call check( nf90_def_var(self%ncid, K2_VARNAME, self%out_type, self%dimids, self%k2_varid) ) - call check( nf90_def_var(self%ncid, Q_VARNAME, self%out_type, self%dimids, self%Q_varid) ) - end if + call check( nf90_inq_varid(iu%ncid, TIME_DIMNAME, iu%time_varid)) + call check( nf90_put_var(iu%ncid, iu%time_varid, param%t, start=[tslot]) ) - call check( nf90_close(self%ncid) ) + call check( nf90_inq_varid(iu%ncid, NPL_VARNAME, iu%npl_varid)) + call check( nf90_put_var(iu%ncid, iu%npl_varid, self%pl%nbody, start=[tslot]) ) - return - end subroutine netcdf_initialize_output + call check( nf90_inq_varid(iu%ncid, NTP_VARNAME, iu%ntp_varid)) + call check( nf90_put_var(iu%ncid, iu%ntp_varid, self%tp%nbody, start=[tslot]) ) + if (param%lenergy) then + call check( nf90_inq_varid(iu%ncid, KE_ORB_VARNAME, iu%KE_orb_varid) ) + call check( nf90_inq_varid(iu%ncid, KE_SPIN_VARNAME, iu%KE_spin_varid) ) + call check( nf90_inq_varid(iu%ncid, PE_VARNAME, iu%PE_varid) ) + call check( nf90_inq_varid(iu%ncid, L_ORBX_VARNAME, iu%L_orbx_varid) ) + call check( nf90_inq_varid(iu%ncid, L_ORBY_VARNAME, iu%L_orby_varid) ) + call check( nf90_inq_varid(iu%ncid, L_ORBZ_VARNAME, iu%L_orbz_varid) ) + call check( nf90_inq_varid(iu%ncid, L_SPINX_VARNAME, iu%L_spinx_varid) ) + call check( nf90_inq_varid(iu%ncid, L_SPINY_VARNAME, iu%L_spiny_varid) ) + call check( nf90_inq_varid(iu%ncid, L_SPINZ_VARNAME, iu%L_spinz_varid) ) + call check( nf90_inq_varid(iu%ncid, L_ESCAPEX_VARNAME, iu%L_escapex_varid) ) + call check( nf90_inq_varid(iu%ncid, L_ESCAPEY_VARNAME, iu%L_escapey_varid) ) + call check( nf90_inq_varid(iu%ncid, L_ESCAPEZ_VARNAME, iu%L_escapez_varid) ) + call check( nf90_inq_varid(iu%ncid, ECOLLISIONS_VARNAME, iu%Ecollisions_varid) ) + call check( nf90_inq_varid(iu%ncid, EUNTRACKED_VARNAME, iu%Euntracked_varid) ) + call check( nf90_inq_varid(iu%ncid, GMESCAPE_VARNAME, iu%GMescape_varid) ) - subroutine check(status) - !! author: Carlisle A. Wishard, Dana Singh, and David A. Minton - !! - !! Checks the status of all NetCDF operations to catch errors - implicit none - ! Arguments - integer, intent (in) :: status + call check( nf90_put_var(iu%ncid, iu%KE_orb_varid, self%ke_orbit, start=[tslot]) ) + call check( nf90_put_var(iu%ncid, iu%KE_spin_varid, self%ke_spin, start=[tslot]) ) + call check( nf90_put_var(iu%ncid, iu%PE_varid, self%pe, start=[tslot]) ) + call check( nf90_put_var(iu%ncid, iu%L_orbx_varid, self%Lorbit(1), start=[tslot]) ) + call check( nf90_put_var(iu%ncid, iu%L_orby_varid, self%Lorbit(2), start=[tslot]) ) + call check( nf90_put_var(iu%ncid, iu%L_orbz_varid, self%Lorbit(3), start=[tslot]) ) + call check( nf90_put_var(iu%ncid, iu%L_spinx_varid, self%Lspin(1), start=[tslot]) ) + call check( nf90_put_var(iu%ncid, iu%L_spiny_varid, self%Lspin(2), start=[tslot]) ) + call check( nf90_put_var(iu%ncid, iu%L_spinz_varid, self%Lspin(3), start=[tslot]) ) + call check( nf90_put_var(iu%ncid, iu%L_escapex_varid, param%Lescape(1), start=[tslot]) ) + call check( nf90_put_var(iu%ncid, iu%L_escapey_varid, param%Lescape(2), start=[tslot]) ) + call check( nf90_put_var(iu%ncid, iu%L_escapez_varid, param%Lescape(3), start=[tslot]) ) + call check( nf90_put_var(iu%ncid, iu%Ecollisions_varid, param%Ecollisions, start=[tslot]) ) + call check( nf90_put_var(iu%ncid, iu%Euntracked_varid, param%Euntracked, start=[tslot]) ) + call check( nf90_put_var(iu%ncid, iu%GMescape_varid, param%GMescape, start=[tslot]) ) - if(status /= nf90_noerr) then - write(*,*) trim(nf90_strerror(status)) - call util_exit(FAILURE) end if + ! Close the netCDF file + call check( nf90_close(iu%ncid) ) + return - end subroutine check + end subroutine netcdf_write_hdr_system From 0042daadc9f358ed6acec79aff6650b7fe960975 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Thu, 26 Aug 2021 11:33:53 -0400 Subject: [PATCH 045/154] Restructed NetCDF so that the file is only opened (and variables inquired) once during a frame write and then closed when it's done. --- src/io/io.f90 | 7 +- src/modules/swiftest_classes.f90 | 14 +++ src/netcdf/netcdf.f90 | 171 +++++++++++++++++-------------- 3 files changed, 115 insertions(+), 77 deletions(-) diff --git a/src/io/io.f90 b/src/io/io.f90 index 2b48586fa..b13dbab6d 100644 --- a/src/io/io.f90 +++ b/src/io/io.f90 @@ -1678,10 +1678,14 @@ module subroutine io_write_frame_system(self, param) end select select case(param%out_stat) + case('APPEND') + call nciu%open(param) case('NEW', 'REPLACE', 'UNKNOWN') call nciu%initialize(param) end select lfirst = .false. + else + call nciu%open(param) end if call self%write_hdr(nciu, param) end if @@ -1707,10 +1711,9 @@ module subroutine io_write_frame_system(self, param) call cb%write_frame(nciu, param) call pl%write_frame(nciu, param) call tp%write_frame(nciu, param) + call nciu%close(param) end if - - return 667 continue diff --git a/src/modules/swiftest_classes.f90 b/src/modules/swiftest_classes.f90 index d59934c47..7703dd534 100644 --- a/src/modules/swiftest_classes.f90 +++ b/src/modules/swiftest_classes.f90 @@ -133,7 +133,9 @@ module swiftest_classes integer(I4B) :: Euntracked_varid !! NetCDF ID for the energy that is untracked due to loss (untracked potential energy due to mergers and body energy for escaped bodies) integer(I4B) :: GMescape_varid !! NetCDF ID for the G*Mass of bodies that escape the system contains + procedure :: close => netcdf_close !! Closes an open NetCDF file procedure :: initialize => netcdf_initialize_output !! Initialize a set of parameters used to identify a NetCDF output object + procedure :: open => netcdf_open !! Opens a NetCDF file end type netcdf_parameters !******************************************************************************************************************************** @@ -811,12 +813,24 @@ 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 netcdf_close(self, param) + implicit none + class(netcdf_parameters), intent(inout) :: self !! Parameters used to identify a particular NetCDF dataset + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + end subroutine netcdf_close + module subroutine netcdf_initialize_output(self, param) implicit none class(netcdf_parameters), intent(inout) :: self !! Parameters used to for writing a NetCDF dataset to file class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters end subroutine netcdf_initialize_output + module subroutine netcdf_open(self, param) + implicit none + class(netcdf_parameters), intent(inout) :: self !! Parameters used to identify a particular NetCDF dataset + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + end subroutine netcdf_open + module subroutine netcdf_write_frame_base(self, iu, param) implicit none class(swiftest_base), intent(in) :: self !! Swiftest base object diff --git a/src/netcdf/netcdf.f90 b/src/netcdf/netcdf.f90 index 44670c318..2a3e09709 100644 --- a/src/netcdf/netcdf.f90 +++ b/src/netcdf/netcdf.f90 @@ -19,6 +19,20 @@ subroutine check(status) return end subroutine check + module subroutine netcdf_close(self, param) + !! author: Carlisle A. Wishard, Dana Singh, and David A. Minton + !! + !! Closes a NetCDF file + implicit none + ! Arguments + class(netcdf_parameters), intent(inout) :: self !! Parameters used to identify a particular NetCDF dataset + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + + call check( nf90_close(self%ncid) ) + + return + end subroutine netcdf_close + module subroutine netcdf_initialize_output(self, param) !! author: Carlisle A. Wishard, Dana Singh, and David A. Minton @@ -30,10 +44,11 @@ module subroutine netcdf_initialize_output(self, param) class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters ! Internals logical :: fileExists + integer(I4B) :: old_mode !! Create the new output file, deleting any previously existing output file of the same name call check( nf90_create(param%outfile, NF90_HDF5, self%ncid) ) - !call check( nf90_set_fill(self%ncid, nf90_nofill, oldMode) ) + call check( nf90_set_fill(self%ncid, nf90_nofill, old_mode) ) ! Define the NetCDF dimensions with particle name as the record dimension call check( nf90_def_dim(self%ncid, ID_DIMNAME, NF90_UNLIMITED, self%id_dimid) ) ! 'x' dimension @@ -103,12 +118,88 @@ module subroutine netcdf_initialize_output(self, param) call check( nf90_def_var(self%ncid, GMESCAPE_VARNAME, self%out_type, self%time_dimid, self%GMescape_varid) ) end if - call check( nf90_close(self%ncid) ) + call check( nf90_enddef(self%ncid) ) return end subroutine netcdf_initialize_output + module subroutine netcdf_open(self, param) + !! author: Carlisle A. Wishard, Dana Singh, and David A. Minton + !! + !! Opens a NetCDF file and does the variable inquiries to activate variable ids + implicit none + ! Arguments + class(netcdf_parameters), intent(inout) :: self !! Parameters used to identify a particular NetCDF dataset + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + ! Internals + integer(I4B) :: old_mode + + call check( nf90_open(param%outfile, nf90_write, self%ncid) ) + call check( nf90_set_fill(self%ncid, nf90_nofill, old_mode) ) + + call check( nf90_inq_varid(self%ncid, TIME_DIMNAME, self%time_varid)) + call check( nf90_inq_varid(self%ncid, ID_DIMNAME, self%id_varid)) + call check( nf90_inq_varid(self%ncid, NPL_VARNAME, self%npl_varid)) + call check( nf90_inq_varid(self%ncid, NTP_VARNAME, self%ntp_varid)) + + !call check( nf90_inq_varid(self%ncid, NAME_VARNAME, self%name_varid)) + if ((param%out_form == XV) .or. (param%out_form == XVEL)) then + call check( nf90_inq_varid(self%ncid, XHX_VARNAME, self%xhx_varid)) + call check( nf90_inq_varid(self%ncid, XHY_VARNAME, self%xhy_varid)) + call check( nf90_inq_varid(self%ncid, XHZ_VARNAME, self%xhz_varid)) + call check( nf90_inq_varid(self%ncid, VHX_VARNAME, self%vhx_varid)) + call check( nf90_inq_varid(self%ncid, VHY_VARNAME, self%vhy_varid)) + call check( nf90_inq_varid(self%ncid, VHZ_VARNAME, self%vhz_varid)) + end if + if ((param%out_form == EL) .or. (param%out_form == XVEL)) then + call check( nf90_inq_varid(self%ncid, A_VARNAME, self%a_varid)) + call check( nf90_inq_varid(self%ncid, E_VARNAME, self%e_varid)) + call check( nf90_inq_varid(self%ncid, INC_VARNAME, self%inc_varid)) + call check( nf90_inq_varid(self%ncid, CAPOM_VARNAME, self%capom_varid)) + call check( nf90_inq_varid(self%ncid, OMEGA_VARNAME, self%omega_varid)) + call check( nf90_inq_varid(self%ncid, CAPM_VARNAME, self%capm_varid)) + end if + call check( nf90_inq_varid(self%ncid, GMASS_VARNAME, self%Gmass_varid)) + if (param%lrhill_present) call check( nf90_inq_varid(self%ncid, RHILL_VARNAME, self%rhill_varid)) + + if (param%lrotation) then + call check( nf90_inq_varid(self%ncid, RADIUS_VARNAME, self%radius_varid)) + call check( nf90_inq_varid(self%ncid, IP1_VARNAME, self%Ip1_varid)) + call check( nf90_inq_varid(self%ncid, IP2_VARNAME, self%Ip2_varid)) + call check( nf90_inq_varid(self%ncid, IP3_VARNAME, self%Ip3_varid)) + call check( nf90_inq_varid(self%ncid, ROTX_VARNAME, self%rotx_varid)) + call check( nf90_inq_varid(self%ncid, ROTY_VARNAME, self%roty_varid)) + call check( nf90_inq_varid(self%ncid, ROTZ_VARNAME, self%rotz_varid)) + end if + + if (param%ltides) then + call check( nf90_inq_varid(self%ncid, K2_VARNAME, self%k2_varid)) + call check( nf90_inq_varid(self%ncid, Q_VARNAME, self%Q_varid)) + end if + + if (param%lenergy) then + call check( nf90_inq_varid(self%ncid, KE_ORB_VARNAME, self%KE_orb_varid) ) + call check( nf90_inq_varid(self%ncid, KE_SPIN_VARNAME, self%KE_spin_varid) ) + call check( nf90_inq_varid(self%ncid, PE_VARNAME, self%PE_varid) ) + call check( nf90_inq_varid(self%ncid, L_ORBX_VARNAME, self%L_orbx_varid) ) + call check( nf90_inq_varid(self%ncid, L_ORBY_VARNAME, self%L_orby_varid) ) + call check( nf90_inq_varid(self%ncid, L_ORBZ_VARNAME, self%L_orbz_varid) ) + call check( nf90_inq_varid(self%ncid, L_SPINX_VARNAME, self%L_spinx_varid) ) + call check( nf90_inq_varid(self%ncid, L_SPINY_VARNAME, self%L_spiny_varid) ) + call check( nf90_inq_varid(self%ncid, L_SPINZ_VARNAME, self%L_spinz_varid) ) + call check( nf90_inq_varid(self%ncid, L_ESCAPEX_VARNAME, self%L_escapex_varid) ) + call check( nf90_inq_varid(self%ncid, L_ESCAPEY_VARNAME, self%L_escapey_varid) ) + call check( nf90_inq_varid(self%ncid, L_ESCAPEZ_VARNAME, self%L_escapez_varid) ) + call check( nf90_inq_varid(self%ncid, ECOLLISIONS_VARNAME, self%Ecollisions_varid) ) + call check( nf90_inq_varid(self%ncid, EUNTRACKED_VARNAME, self%Euntracked_varid) ) + call check( nf90_inq_varid(self%ncid, GMESCAPE_VARNAME, self%GMescape_varid) ) + end if + + return + end subroutine netcdf_open + + module subroutine netcdf_write_frame_base(self, iu, param) !! author: Carlisle A. Wishard, Dana Singh, and David A. Minton !! @@ -124,8 +215,6 @@ module subroutine netcdf_write_frame_base(self, iu, param) integer(I4B), dimension(:), allocatable :: ind !! Open the netCDF file - call check( nf90_open(param%outfile, nf90_write, iu%ncid) ) - !call check( nf90_set_fill(iu%ncid, nf90_nofill, oldMode) ) tslot = int(param%ioutput, kind=I4B) + 1 @@ -139,18 +228,10 @@ module subroutine netcdf_write_frame_base(self, iu, param) do i = 1, n j = ind(i) id = self%id(j) - call check( nf90_inq_varid(iu%ncid, ID_DIMNAME, iu%id_varid)) + call check( nf90_put_var(iu%ncid, iu%id_varid, id, start=[id]) ) - !call check( nf90_inq_varid(iu%ncid, NAME_VARNAME, iu%name_varid)) !call check( nf90_put_var(iu%ncid, iu%name_varid, trim(adjustl(self%name(j))), start=[tslot, id]) ) if ((param%out_form == XV) .or. (param%out_form == XVEL)) then - call check( nf90_inq_varid(iu%ncid, XHX_VARNAME, iu%xhx_varid)) - call check( nf90_inq_varid(iu%ncid, XHY_VARNAME, iu%xhy_varid)) - call check( nf90_inq_varid(iu%ncid, XHZ_VARNAME, iu%xhz_varid)) - call check( nf90_inq_varid(iu%ncid, VHX_VARNAME, iu%vhx_varid)) - call check( nf90_inq_varid(iu%ncid, VHY_VARNAME, iu%vhy_varid)) - call check( nf90_inq_varid(iu%ncid, VHZ_VARNAME, iu%vhz_varid)) - call check( nf90_put_var(iu%ncid, iu%xhx_varid, self%xh(1, j), start=[tslot, id]) ) call check( nf90_put_var(iu%ncid, iu%xhy_varid, self%xh(2, j), start=[tslot, id]) ) call check( nf90_put_var(iu%ncid, iu%xhz_varid, self%xh(3, j), start=[tslot, id]) ) @@ -159,13 +240,6 @@ module subroutine netcdf_write_frame_base(self, iu, param) call check( nf90_put_var(iu%ncid, iu%vhz_varid, self%vh(3, j), start=[tslot, id]) ) end if if ((param%out_form == EL) .or. (param%out_form == XVEL)) then - call check( nf90_inq_varid(iu%ncid, A_VARNAME, iu%a_varid)) - call check( nf90_inq_varid(iu%ncid, E_VARNAME, iu%e_varid)) - call check( nf90_inq_varid(iu%ncid, INC_VARNAME, iu%inc_varid)) - call check( nf90_inq_varid(iu%ncid, CAPOM_VARNAME, iu%capom_varid)) - call check( nf90_inq_varid(iu%ncid, OMEGA_VARNAME, iu%omega_varid)) - call check( nf90_inq_varid(iu%ncid, CAPM_VARNAME, iu%capm_varid)) - call check( nf90_put_var(iu%ncid, iu%a_varid, self%a(j), start=[tslot, id]) ) call check( nf90_put_var(iu%ncid, iu%e_varid, self%e(j), start=[tslot, id]) ) call check( nf90_put_var(iu%ncid, iu%inc_varid, self%inc(j), start=[tslot, id]) ) @@ -175,24 +249,14 @@ module subroutine netcdf_write_frame_base(self, iu, param) end if select type(pl => self) class is (swiftest_pl) ! Additional output if the passed polymorphic object is a massive body - call check( nf90_inq_varid(iu%ncid, GMASS_VARNAME, iu%Gmass_varid)) call check( nf90_put_var(iu%ncid, iu%Gmass_varid, pl%Gmass(j), start=[tslot, id]) ) if (param%lrhill_present) then - call check( nf90_inq_varid(iu%ncid, RHILL_VARNAME, iu%rhill_varid)) call check( nf90_put_var(iu%ncid, iu%rhill_varid, pl%rhill(j), start=[tslot, id]) ) end if if (param%lclose) then - call check( nf90_inq_varid(iu%ncid, RADIUS_VARNAME, iu%radius_varid)) call check( nf90_put_var(iu%ncid, iu%radius_varid, pl%radius(j), start=[tslot, id]) ) end if if (param%lrotation) then - call check( nf90_inq_varid(iu%ncid, IP1_VARNAME, iu%Ip1_varid)) - call check( nf90_inq_varid(iu%ncid, IP2_VARNAME, iu%Ip2_varid)) - call check( nf90_inq_varid(iu%ncid, IP3_VARNAME, iu%Ip3_varid)) - call check( nf90_inq_varid(iu%ncid, ROTX_VARNAME, iu%rotx_varid)) - call check( nf90_inq_varid(iu%ncid, ROTY_VARNAME, iu%roty_varid)) - call check( nf90_inq_varid(iu%ncid, ROTZ_VARNAME, iu%rotz_varid)) - call check( nf90_put_var(iu%ncid, iu%Ip1_varid, pl%Ip(1, j), start=[tslot, id]) ) call check( nf90_put_var(iu%ncid, iu%Ip2_varid, pl%Ip(2, j), start=[tslot, id]) ) call check( nf90_put_var(iu%ncid, iu%Ip3_varid, pl%Ip(3, j), start=[tslot, id]) ) @@ -201,9 +265,6 @@ module subroutine netcdf_write_frame_base(self, iu, param) call check( nf90_put_var(iu%ncid, iu%rotz_varid, pl%rot(3, j), start=[tslot, id]) ) end if if (param%ltides) then - call check( nf90_inq_varid(iu%ncid, K2_VARNAME, iu%k2_varid)) - call check( nf90_inq_varid(iu%ncid, Q_VARNAME, iu%Q_varid)) - call check( nf90_put_var(iu%ncid, iu%k2_varid, pl%k2(j), start=[tslot, id]) ) call check( nf90_put_var(iu%ncid, iu%Q_varid, pl%Q(j), start=[tslot, id]) ) end if @@ -212,20 +273,10 @@ module subroutine netcdf_write_frame_base(self, iu, param) end associate class is (swiftest_cb) id = self%id - call check( nf90_inq_varid(iu%ncid, ID_DIMNAME, iu%id_varid)) call check( nf90_put_var(iu%ncid, iu%id_varid, id, start=[id]) ) - call check( nf90_inq_varid(iu%ncid, GMASS_VARNAME, iu%Gmass_varid)) call check( nf90_put_var(iu%ncid, iu%Gmass_varid, self%Gmass, start=[tslot, id]) ) - call check( nf90_inq_varid(iu%ncid, RADIUS_VARNAME, iu%radius_varid)) call check( nf90_put_var(iu%ncid, iu%radius_varid, self%radius, start=[tslot, id]) ) if (param%lrotation) then - call check( nf90_inq_varid(iu%ncid, IP1_VARNAME, iu%Ip1_varid)) - call check( nf90_inq_varid(iu%ncid, IP2_VARNAME, iu%Ip2_varid)) - call check( nf90_inq_varid(iu%ncid, IP3_VARNAME, iu%Ip3_varid)) - call check( nf90_inq_varid(iu%ncid, ROTX_VARNAME, iu%rotx_varid)) - call check( nf90_inq_varid(iu%ncid, ROTY_VARNAME, iu%roty_varid)) - call check( nf90_inq_varid(iu%ncid, ROTZ_VARNAME, iu%rotz_varid)) - call check( nf90_put_var(iu%ncid, iu%Ip1_varid, self%Ip(1), start=[tslot, id]) ) call check( nf90_put_var(iu%ncid, iu%Ip2_varid, self%Ip(2), start=[tslot, id]) ) call check( nf90_put_var(iu%ncid, iu%Ip3_varid, self%Ip(3), start=[tslot, id]) ) @@ -234,17 +285,11 @@ module subroutine netcdf_write_frame_base(self, iu, param) call check( nf90_put_var(iu%ncid, iu%rotz_varid, self%rot(3), start=[tslot, id]) ) end if if (param%ltides) then - call check( nf90_inq_varid(iu%ncid, K2_VARNAME, iu%k2_varid)) - call check( nf90_inq_varid(iu%ncid, Q_VARNAME, iu%Q_varid)) - call check( nf90_put_var(iu%ncid, iu%k2_varid, self%k2, start=[tslot, id]) ) call check( nf90_put_var(iu%ncid, iu%Q_varid, self%Q, start=[tslot, id]) ) end if end select - ! Close the netCDF file - call check( nf90_close(iu%ncid) ) - return end subroutine netcdf_write_frame_base @@ -260,38 +305,18 @@ module subroutine netcdf_write_hdr_system(self, iu, param) class(netcdf_parameters), intent(inout) :: iu !! Parameters used to for writing a NetCDF dataset to file class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters ! Internals - integer(I4B) :: tslot + integer(I4B) :: tslot, old_mode tslot = int(param%ioutput, kind=I4B) + 1 call check( nf90_open(param%outfile, nf90_write, iu%ncid) ) + call check( nf90_set_fill(iu%ncid, nf90_nofill, old_mode) ) - call check( nf90_inq_varid(iu%ncid, TIME_DIMNAME, iu%time_varid)) call check( nf90_put_var(iu%ncid, iu%time_varid, param%t, start=[tslot]) ) - - call check( nf90_inq_varid(iu%ncid, NPL_VARNAME, iu%npl_varid)) call check( nf90_put_var(iu%ncid, iu%npl_varid, self%pl%nbody, start=[tslot]) ) - - call check( nf90_inq_varid(iu%ncid, NTP_VARNAME, iu%ntp_varid)) call check( nf90_put_var(iu%ncid, iu%ntp_varid, self%tp%nbody, start=[tslot]) ) if (param%lenergy) then - call check( nf90_inq_varid(iu%ncid, KE_ORB_VARNAME, iu%KE_orb_varid) ) - call check( nf90_inq_varid(iu%ncid, KE_SPIN_VARNAME, iu%KE_spin_varid) ) - call check( nf90_inq_varid(iu%ncid, PE_VARNAME, iu%PE_varid) ) - call check( nf90_inq_varid(iu%ncid, L_ORBX_VARNAME, iu%L_orbx_varid) ) - call check( nf90_inq_varid(iu%ncid, L_ORBY_VARNAME, iu%L_orby_varid) ) - call check( nf90_inq_varid(iu%ncid, L_ORBZ_VARNAME, iu%L_orbz_varid) ) - call check( nf90_inq_varid(iu%ncid, L_SPINX_VARNAME, iu%L_spinx_varid) ) - call check( nf90_inq_varid(iu%ncid, L_SPINY_VARNAME, iu%L_spiny_varid) ) - call check( nf90_inq_varid(iu%ncid, L_SPINZ_VARNAME, iu%L_spinz_varid) ) - call check( nf90_inq_varid(iu%ncid, L_ESCAPEX_VARNAME, iu%L_escapex_varid) ) - call check( nf90_inq_varid(iu%ncid, L_ESCAPEY_VARNAME, iu%L_escapey_varid) ) - call check( nf90_inq_varid(iu%ncid, L_ESCAPEZ_VARNAME, iu%L_escapez_varid) ) - call check( nf90_inq_varid(iu%ncid, ECOLLISIONS_VARNAME, iu%Ecollisions_varid) ) - call check( nf90_inq_varid(iu%ncid, EUNTRACKED_VARNAME, iu%Euntracked_varid) ) - call check( nf90_inq_varid(iu%ncid, GMESCAPE_VARNAME, iu%GMescape_varid) ) - call check( nf90_put_var(iu%ncid, iu%KE_orb_varid, self%ke_orbit, start=[tslot]) ) call check( nf90_put_var(iu%ncid, iu%KE_spin_varid, self%ke_spin, start=[tslot]) ) call check( nf90_put_var(iu%ncid, iu%PE_varid, self%pe, start=[tslot]) ) @@ -307,12 +332,8 @@ module subroutine netcdf_write_hdr_system(self, iu, param) call check( nf90_put_var(iu%ncid, iu%Ecollisions_varid, param%Ecollisions, start=[tslot]) ) call check( nf90_put_var(iu%ncid, iu%Euntracked_varid, param%Euntracked, start=[tslot]) ) call check( nf90_put_var(iu%ncid, iu%GMescape_varid, param%GMescape, start=[tslot]) ) - end if - ! Close the netCDF file - call check( nf90_close(iu%ncid) ) - return end subroutine netcdf_write_hdr_system From 509b174b19540abe2c5a062de17938b1452594f1 Mon Sep 17 00:00:00 2001 From: Carlisle Wishard Date: Thu, 26 Aug 2021 11:47:26 -0400 Subject: [PATCH 046/154] added compatibility for binary and netcdf output types in swiftest2xr --- python/swiftest/swiftest/io.py | 80 +++++++++++++++++++--------------- 1 file changed, 44 insertions(+), 36 deletions(-) diff --git a/python/swiftest/swiftest/io.py b/python/swiftest/swiftest/io.py index 5b4f45dd1..86015ca44 100644 --- a/python/swiftest/swiftest/io.py +++ b/python/swiftest/swiftest/io.py @@ -633,44 +633,52 @@ def swiftest2xr(param): ------- xarray dataset """ - - dims = ['time', 'id', 'vec'] - cb = [] - pl = [] - tp = [] - try: - with FortranFile(param['BIN_OUT'], 'r') as f: - for t, cbid, cvec, clab, \ - npl, plid, pvec, plab, \ - ntp, tpid, tvec, tlab in swiftest_stream(f, param): - # Prepare frames by adding an extra axis for the time coordinate - cbframe = np.expand_dims(cvec, axis=0) - plframe = np.expand_dims(pvec, axis=0) - tpframe = np.expand_dims(tvec, axis=0) - - # Create xarray DataArrays out of each body type - cbxr = xr.DataArray(cbframe, dims=dims, coords={'time': t, 'id': cbid, 'vec': clab}) - plxr = xr.DataArray(plframe, dims=dims, coords={'time': t, 'id': plid, 'vec': plab}) - tpxr = xr.DataArray(tpframe, dims=dims, coords={'time': t, 'id': tpid, 'vec': tlab}) + if ((param['OUT_TYPE'] == 'REAL8') or (param['OUT_TYPE'] == 'REAL4')): + dims = ['time', 'id', 'vec'] + cb = [] + pl = [] + tp = [] + try: + with FortranFile(param['BIN_OUT'], 'r') as f: + for t, cbid, cvec, clab, \ + npl, plid, pvec, plab, \ + ntp, tpid, tvec, tlab in swiftest_stream(f, param): + # Prepare frames by adding an extra axis for the time coordinate + cbframe = np.expand_dims(cvec, axis=0) + plframe = np.expand_dims(pvec, axis=0) + tpframe = np.expand_dims(tvec, axis=0) + + # Create xarray DataArrays out of each body type + cbxr = xr.DataArray(cbframe, dims=dims, coords={'time': t, 'id': cbid, 'vec': clab}) + plxr = xr.DataArray(plframe, dims=dims, coords={'time': t, 'id': plid, 'vec': plab}) + tpxr = xr.DataArray(tpframe, dims=dims, coords={'time': t, 'id': tpid, 'vec': tlab}) - cb.append(cbxr) - pl.append(plxr) - tp.append(tpxr) - sys.stdout.write('\r' + f"Reading in time {t[0]:.3e}") - sys.stdout.flush() - except IOError: - print(f"Error encountered reading in {param['BIN_OUT']}") - - cbda = xr.concat(cb, dim='time') - plda = xr.concat(pl, dim='time') - tpda = xr.concat(tp, dim='time') + cb.append(cbxr) + pl.append(plxr) + tp.append(tpxr) + sys.stdout.write('\r' + f"Reading in time {t[0]:.3e}") + sys.stdout.flush() + except IOError: + print(f"Error encountered reading in {param['BIN_OUT']}") + + cbda = xr.concat(cb, dim='time') + plda = xr.concat(pl, dim='time') + tpda = xr.concat(tp, dim='time') - cbds = cbda.to_dataset(dim='vec') - plds = plda.to_dataset(dim='vec') - tpds = tpda.to_dataset(dim='vec') - print('\nCreating Dataset') - ds = xr.combine_by_coords([cbds, plds, tpds]) - print(f"Successfully converted {ds.sizes['time']} output frames.") + cbds = cbda.to_dataset(dim='vec') + plds = plda.to_dataset(dim='vec') + tpds = tpda.to_dataset(dim='vec') + print('\nCreating Dataset') + ds = xr.combine_by_coords([cbds, plds, tpds]) + print(f"Successfully converted {ds.sizes['time']} output frames.") + + elif ((param['OUT_TYPE'] == 'NETCDF_DOUBLE') or (param['OUT_TYPE'] == 'NETCDF_FLOAT')): + print('\nCreating Dataset') + ds = xr.open_dataset(param['BIN_OUT']) + print(f"Successfully converted {ds.sizes['time']} output frames.") + else: + print(f"Error encountered. OUT_TYPE {param['OUT_TYPE']} not recognized.") + if param['PARTICLE_OUT'] != "": ds = swiftest_particle_2xr(ds, param) From b9989425181afff8c46bda2ced3d3dad712ab571 Mon Sep 17 00:00:00 2001 From: David Minton Date: Thu, 26 Aug 2021 13:38:23 -0400 Subject: [PATCH 047/154] Added better exception handling to the binary file reader. --- python/swiftest/swiftest/io.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/python/swiftest/swiftest/io.py b/python/swiftest/swiftest/io.py index 86015ca44..77a022e3e 100644 --- a/python/swiftest/swiftest/io.py +++ b/python/swiftest/swiftest/io.py @@ -670,14 +670,14 @@ def swiftest2xr(param): tpds = tpda.to_dataset(dim='vec') print('\nCreating Dataset') ds = xr.combine_by_coords([cbds, plds, tpds]) - print(f"Successfully converted {ds.sizes['time']} output frames.") elif ((param['OUT_TYPE'] == 'NETCDF_DOUBLE') or (param['OUT_TYPE'] == 'NETCDF_FLOAT')): print('\nCreating Dataset') ds = xr.open_dataset(param['BIN_OUT']) - print(f"Successfully converted {ds.sizes['time']} output frames.") else: print(f"Error encountered. OUT_TYPE {param['OUT_TYPE']} not recognized.") + return None + print(f"Successfully converted {ds.sizes['time']} output frames.") if param['PARTICLE_OUT'] != "": ds = swiftest_particle_2xr(ds, param) From 2c78bb02d4c9ca44582a111edff6b04d674f14be Mon Sep 17 00:00:00 2001 From: David Minton Date: Thu, 26 Aug 2021 14:01:22 -0400 Subject: [PATCH 048/154] Restructured the particle info reader to make it easier to troubleshoot problems. --- python/swiftest/swiftest/io.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/python/swiftest/swiftest/io.py b/python/swiftest/swiftest/io.py index 77a022e3e..81cfd4c77 100644 --- a/python/swiftest/swiftest/io.py +++ b/python/swiftest/swiftest/io.py @@ -680,8 +680,10 @@ def swiftest2xr(param): print(f"Successfully converted {ds.sizes['time']} output frames.") if param['PARTICLE_OUT'] != "": - ds = swiftest_particle_2xr(ds, param) - + infoxr = swiftest_particle_2xr(param) + print('\nAdding particle info to Dataset') + ds = xr.merge([ds, infoxr]) + return ds @@ -717,7 +719,7 @@ def swiftest_particle_stream(f): yield plid, origin_type, origin_vec -def swiftest_particle_2xr(ds, param): +def swiftest_particle_2xr(param): """Reads in the Swiftest SyMBA-generated PARTICLE_OUT and converts it to an xarray Dataset""" veclab = ['time_origin', 'xhx_origin', 'py_origin', 'pz_origin', 'vhx_origin', 'vhy_origin', 'vhz_origin'] id_list = [] @@ -743,9 +745,7 @@ def swiftest_particle_2xr(ds, param): infoxr = vecda.to_dataset(dim='vec') infoxr['origin_type'] = typeda - print('\nAdding particle info to Dataset') - ds = xr.merge([ds, infoxr]) - return ds + return infoxr def swiftest_xr2infile(ds, param, framenum=-1): From aa736b1f92ddb42995209b1bb9aec2dee9f47a89 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Thu, 26 Aug 2021 14:18:50 -0400 Subject: [PATCH 049/154] Enabled XVEL output mode for the old Fortran binary files. --- examples/symba_mars_disk/param.in | 6 +- examples/symba_mars_disk/testnetcdf.ipynb | 713 ++-------------------- src/io/io.f90 | 21 +- 3 files changed, 60 insertions(+), 680 deletions(-) diff --git a/examples/symba_mars_disk/param.in b/examples/symba_mars_disk/param.in index 912271752..1ff512a1d 100644 --- a/examples/symba_mars_disk/param.in +++ b/examples/symba_mars_disk/param.in @@ -8,9 +8,11 @@ TP_IN tp.in IN_TYPE ASCII ISTEP_OUT 1 ISTEP_DUMP 1 -BIN_OUT bin.nc +BIN_OUT bin.dat +OUT_TYPE REAL8 +!BIN_OUT bin.nc +!UT_TYPE NETCDF_DOUBLE PARTICLE_OUT particle.dat -OUT_TYPE NETCDF_DOUBLE OUT_FORM XVEL OUT_STAT REPLACE CHK_CLOSE yes diff --git a/examples/symba_mars_disk/testnetcdf.ipynb b/examples/symba_mars_disk/testnetcdf.ipynb index 1df10fab4..186ae1fc3 100644 --- a/examples/symba_mars_disk/testnetcdf.ipynb +++ b/examples/symba_mars_disk/testnetcdf.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 22, + "execution_count": 1, "metadata": {}, "outputs": [], "source": [ @@ -11,17 +11,31 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 2, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Reading Swiftest file param.in\n", + "\n", + "Creating Dataset\n", + "Successfully converted 11 output frames.\n", + "\n", + "Adding particle info to Dataset\n", + "Swiftest simulation data stored as xarray DataSet .ds\n" + ] + } + ], "source": [ - "import xarray as xr\n", - "dsnew = xr.open_dataset(\"bin.nc\")" + "sim = swiftest.Simulation(param_file=\"param.in\")\n", + "sim.bin2xr()" ] }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 5, "metadata": {}, "outputs": [ { @@ -378,38 +392,28 @@ " stroke: currentColor;\n", " fill: currentColor;\n", "}\n", - "
<xarray.DataArray 'time' (time: 11)>\n",
-       "array([   0.,  600., 1200., 1800., 2400., 3000., 3600., 4200., 4800., 5400.,\n",
-       "       6000.])\n",
+       "
<xarray.DataArray 'a' (time: 11)>\n",
+       "array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])\n",
        "Coordinates:\n",
-       "  * time     (time) float64 0.0 600.0 1.2e+03 1.8e+03 ... 4.8e+03 5.4e+03 6e+03
" + " id int64 1\n", + " * time (time) float64 0.0 600.0 1.2e+03 1.8e+03 ... 4.8e+03 5.4e+03 6e+03
" ], "text/plain": [ - "\n", - "array([ 0., 600., 1200., 1800., 2400., 3000., 3600., 4200., 4800., 5400.,\n", - " 6000.])\n", + "\n", + "array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])\n", "Coordinates:\n", + " id int64 1\n", " * time (time) float64 0.0 600.0 1.2e+03 1.8e+03 ... 4.8e+03 5.4e+03 6e+03" ] }, - "execution_count": 26, + "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "dsnew.time" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "import netCDF4 as nc" + "sim.ds['a'].sel(id=1)" ] }, { @@ -423,652 +427,27 @@ "text": [ "Reading Swiftest file param.in\n" ] - } - ], - "source": [ - "sim = swiftest.Simulation(param_file=\"param.in\")" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ + }, { - "name": "stdout", - "output_type": "stream", - "text": [ - "Reading in time 6.000e+03\n", - "Creating Dataset\n", - "Successfully converted 11 output frames.\n", - "\n", - "Adding particle info to Dataset\n", - "Swiftest simulation data stored as xarray DataSet .ds\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[0msim_old\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0msim\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.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[0msim_old\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 172\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 173\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--> 174\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 175\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 176\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 643\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 644\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--> 645\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 646\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 647\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 506\u001b[0m \u001b[0mp9\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 507\u001b[0m \u001b[0mp10\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--> 508\u001b[0;31m \u001b[0mp11\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 509\u001b[0m \u001b[0mp12\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 510\u001b[0m \u001b[0mGMpl\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)." ] } ], "source": [ - "sim.bin2xr()" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "sim.ds.to_netcdf(\"bin.new.nc\")" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [], - "source": [ - "ds = nc.Dataset(\"bin.new.nc\")" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "\n", - "root group (NETCDF4 data model, file format HDF5):\n", - " dimensions(sizes): id(1521), time(11)\n", - " variables(dimensions): float64 id(id), float64 Gmass(time, id), float64 radius(time, id), float64 J_2(time, id), float64 J_4(time, id), float64 Ip1(time, id), float64 Ip2(time, id), float64 Ip3(time, id), float64 rotx(time, id), float64 roty(time, id), float64 rotz(time, id), float64 time(time), float64 a(time, id), float64 e(time, id), float64 inc(time, id), float64 capom(time, id), float64 omega(time, id), float64 capm(time, id), float64 rhill(time, id), float64 time_origin(id), float64 xhx_origin(id), float64 py_origin(id), float64 pz_origin(id), float64 vhx_origin(id), float64 vhy_origin(id), float64 vhz_origin(id), origin_type(id)\n", - " groups: " - ] - }, - "execution_count": 21, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "ds" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [], - "source": [ - "ds = xr.open_dataset(\"bin.new.nc\")" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "
<xarray.Dataset>\n",
-       "Dimensions:      (id: 1521, time: 11)\n",
-       "Coordinates:\n",
-       "  * id           (id) float64 1.0 2.0 3.0 4.0 ... 1.519e+03 1.52e+03 1.521e+03\n",
-       "  * time         (time) float64 0.0 600.0 1.2e+03 ... 4.8e+03 5.4e+03 6e+03\n",
-       "Data variables: (12/25)\n",
-       "    Gmass        (time, id) float64 4.284e+13 1.71e+06 ... 1.168e+05 1.168e+05\n",
-       "    radius       (time, id) float64 3.39e+06 1.241e+04 ... 5.073e+03 5.073e+03\n",
-       "    J_2          (time, id) float64 0.0 nan nan nan nan ... nan nan nan nan nan\n",
-       "    J_4          (time, id) float64 0.0 nan nan nan nan ... nan nan nan nan nan\n",
-       "    Ip1          (time, id) float64 0.4 0.4 0.4 0.4 0.4 ... 0.4 0.4 0.4 0.4 0.4\n",
-       "    Ip2          (time, id) float64 0.4 0.4 0.4 0.4 0.4 ... 0.4 0.4 0.4 0.4 0.4\n",
-       "    ...           ...\n",
-       "    py_origin    (id) float64 0.0 -4.373e+06 ... -8.094e+06 -8.123e+06\n",
-       "    pz_origin    (id) float64 0.0 -9.627e+03 2.41e+04 ... 2.923e+03 -3.139e+03\n",
-       "    vhx_origin   (id) float64 0.0 988.0 1.016e+03 ... 1.881e+03 1.887e+03\n",
-       "    vhy_origin   (id) float64 0.0 -1.888e+03 ... -1.004e+03 -1.027e+03\n",
-       "    vhz_origin   (id) float64 0.0 10.69 -2.604 -1.465 ... 18.95 -9.448 -12.51\n",
-       "    origin_type  (id) object 'Central body' ... 'Supercatastrophic'
" - ], - "text/plain": [ - "\n", - "Dimensions: (id: 1521, time: 11)\n", - "Coordinates:\n", - " * id (id) float64 1.0 2.0 3.0 4.0 ... 1.519e+03 1.52e+03 1.521e+03\n", - " * time (time) float64 0.0 600.0 1.2e+03 ... 4.8e+03 5.4e+03 6e+03\n", - "Data variables: (12/25)\n", - " Gmass (time, id) float64 ...\n", - " radius (time, id) float64 ...\n", - " J_2 (time, id) float64 ...\n", - " J_4 (time, id) float64 ...\n", - " Ip1 (time, id) float64 ...\n", - " Ip2 (time, id) float64 ...\n", - " ... ...\n", - " py_origin (id) float64 ...\n", - " pz_origin (id) float64 ...\n", - " vhx_origin (id) float64 ...\n", - " vhy_origin (id) float64 ...\n", - " vhz_origin (id) float64 ...\n", - " origin_type (id) object ..." - ] - }, - "execution_count": 19, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "ds" + "sim_old = sim = swiftest.Simulation(param_file=\"param.in\")\n", + "sim_old.bin2xr()" ] }, { diff --git a/src/io/io.f90 b/src/io/io.f90 index b13dbab6d..18c56dd62 100644 --- a/src/io/io.f90 +++ b/src/io/io.f90 @@ -1492,23 +1492,22 @@ module subroutine io_write_frame_body(self, iu, param) associate(n => self%nbody) if (n == 0) return write(iu, err = 667, iomsg = errmsg) self%id(1:n) - !write(iu, err = 667, iomsg = errmsg) self%name(1:n) - select case (param%out_form) - case (EL) - write(iu, err = 667, iomsg = errmsg) self%a(1:n) - write(iu, err = 667, iomsg = errmsg) self%e(1:n) - write(iu, err = 667, iomsg = errmsg) self%inc(1:n) * RAD2DEG - write(iu, err = 667, iomsg = errmsg) self%capom(1:n) * RAD2DEG - write(iu, err = 667, iomsg = errmsg) self%omega(1:n) * RAD2DEG - write(iu, err = 667, iomsg = errmsg) self%capm(1:n) * RAD2DEG - case (XV) + if ((param%out_form == XV) .or. (param%out_form == XVEL)) then write(iu, err = 667, iomsg = errmsg) self%xh(1, 1:n) write(iu, err = 667, iomsg = errmsg) self%xh(2, 1:n) write(iu, err = 667, iomsg = errmsg) self%xh(3, 1:n) write(iu, err = 667, iomsg = errmsg) self%vh(1, 1:n) write(iu, err = 667, iomsg = errmsg) self%vh(2, 1:n) write(iu, err = 667, iomsg = errmsg) self%vh(3, 1:n) - end select + end if + if ((param%out_form == EL) .or. (param%out_form == XVEL)) then + write(iu, err = 667, iomsg = errmsg) self%a(1:n) + write(iu, err = 667, iomsg = errmsg) self%e(1:n) + write(iu, err = 667, iomsg = errmsg) self%inc(1:n) * RAD2DEG + write(iu, err = 667, iomsg = errmsg) self%capom(1:n) * RAD2DEG + write(iu, err = 667, iomsg = errmsg) self%omega(1:n) * RAD2DEG + write(iu, err = 667, iomsg = errmsg) self%capm(1:n) * RAD2DEG + end if select type(pl => self) class is (swiftest_pl) ! Additional output if the passed polymorphic object is a massive body write(iu, err = 667, iomsg = errmsg) pl%Gmass(1:n) From e88e975b533fa5a08e8130b772d7e1136cd4fba7 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Thu, 26 Aug 2021 14:20:00 -0400 Subject: [PATCH 050/154] Stripped out old cruft from the testnetcdf Notebook. --- examples/symba_mars_disk/testnetcdf.ipynb | 417 ---------------------- 1 file changed, 417 deletions(-) diff --git a/examples/symba_mars_disk/testnetcdf.ipynb b/examples/symba_mars_disk/testnetcdf.ipynb index 186ae1fc3..8c61f51a0 100644 --- a/examples/symba_mars_disk/testnetcdf.ipynb +++ b/examples/symba_mars_disk/testnetcdf.ipynb @@ -33,423 +33,6 @@ "sim.bin2xr()" ] }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "
<xarray.DataArray 'a' (time: 11)>\n",
-       "array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])\n",
-       "Coordinates:\n",
-       "    id       int64 1\n",
-       "  * time     (time) float64 0.0 600.0 1.2e+03 1.8e+03 ... 4.8e+03 5.4e+03 6e+03
" - ], - "text/plain": [ - "\n", - "array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])\n", - "Coordinates:\n", - " id int64 1\n", - " * time (time) float64 0.0 600.0 1.2e+03 1.8e+03 ... 4.8e+03 5.4e+03 6e+03" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "sim.ds['a'].sel(id=1)" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Reading Swiftest file param.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[0msim_old\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0msim\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.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[0msim_old\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 172\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 173\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--> 174\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 175\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 176\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 643\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 644\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--> 645\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 646\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 647\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 506\u001b[0m \u001b[0mp9\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 507\u001b[0m \u001b[0mp10\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--> 508\u001b[0;31m \u001b[0mp11\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 509\u001b[0m \u001b[0mp12\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 510\u001b[0m \u001b[0mGMpl\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)." - ] - } - ], - "source": [ - "sim_old = sim = swiftest.Simulation(param_file=\"param.in\")\n", - "sim_old.bin2xr()" - ] - }, { "cell_type": "code", "execution_count": null, From edbffe10a4328020bb7034ed86b70eeecc9700cd Mon Sep 17 00:00:00 2001 From: David A Minton Date: Thu, 26 Aug 2021 14:54:08 -0400 Subject: [PATCH 051/154] Fixed issue where conservation report was being printed before the main loop. --- src/io/io.f90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/io/io.f90 b/src/io/io.f90 index 18c56dd62..c4c9b8b81 100644 --- a/src/io/io.f90 +++ b/src/io/io.f90 @@ -1630,7 +1630,7 @@ module subroutine io_write_frame_system(self, param) logical :: fileExists type(netcdf_parameters) :: nciu - if (param%lenergy) call self%conservation_report(param, lterminal=.true.) + if (.not.lfirst .and. param%lenergy) call self%conservation_report(param, lterminal=.true.) allocate(cb, source = self%cb) allocate(pl, source = self%pl) From 60eb8979bde7a0a04cceea0a3c96ebe3101b1d41 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Thu, 26 Aug 2021 14:57:23 -0400 Subject: [PATCH 052/154] Switched example back to NetCDF output --- examples/symba_mars_disk/param.in | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/examples/symba_mars_disk/param.in b/examples/symba_mars_disk/param.in index 1ff512a1d..a50be00e4 100644 --- a/examples/symba_mars_disk/param.in +++ b/examples/symba_mars_disk/param.in @@ -8,10 +8,10 @@ TP_IN tp.in IN_TYPE ASCII ISTEP_OUT 1 ISTEP_DUMP 1 -BIN_OUT bin.dat -OUT_TYPE REAL8 -!BIN_OUT bin.nc -!UT_TYPE NETCDF_DOUBLE +!BIN_OUT bin.dat +!OUT_TYPE REAL8 +BIN_OUT bin.nc +OUT_TYPE NETCDF_DOUBLE PARTICLE_OUT particle.dat OUT_FORM XVEL OUT_STAT REPLACE From 1e5fdffed050796594180d3af63c396c024e597c Mon Sep 17 00:00:00 2001 From: Carlisle Wishard Date: Thu, 26 Aug 2021 16:11:58 -0400 Subject: [PATCH 053/154] fixed typos in init_cond.py and added XVEL case to headers --- python/swiftest/swiftest/init_cond.py | 30 +++++++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/python/swiftest/swiftest/init_cond.py b/python/swiftest/swiftest/init_cond.py index b5424f7ce..061d6d6d7 100644 --- a/python/swiftest/swiftest/init_cond.py +++ b/python/swiftest/swiftest/init_cond.py @@ -129,7 +129,7 @@ def solar_system_horizons(plname, idval, param, ephemerides_start_date, ds): ephemerides_step = '1d' clab, plab, tlab = swiftest.io.make_swiftest_labels(param) - if param['OUT_FORM'] == 'XV': + if param['OUT_FORM'] == 'EL': plab.append('a') plab.append('e') plab.append('inc') @@ -142,7 +142,7 @@ def solar_system_horizons(plname, idval, param, ephemerides_start_date, ds): tlab.append('capom') tlab.append('omega') tlab.append('capm') - elif param['OUT_FORM'] == 'EL': + elif param['OUT_FORM'] == 'XV': plab.append('xhx') plab.append('xhy') plab.append('xhz') @@ -156,6 +156,32 @@ def solar_system_horizons(plname, idval, param, ephemerides_start_date, ds): tlab.append('vhy') tlab.append('vhz') + elif param['OUT_FORM'] == 'XVEL': + plab.append('xhx') + plab.append('xhy') + plab.append('xhz') + plab.append('vhx') + plab.append('vhy') + plab.append('vhz') + tlab.append('xhx') + tlab.append('xhy') + tlab.append('xhz') + tlab.append('vhx') + tlab.append('vhy') + tlab.append('vhz') + plab.append('a') + plab.append('e') + plab.append('inc') + plab.append('capom') + plab.append('omega') + plab.append('capm') + tlab.append('a') + tlab.append('e') + tlab.append('inc') + tlab.append('capom') + tlab.append('omega') + tlab.append('capm') + dims = ['time', 'id', 'vec'] t = np.array([0.0]) From d35866394b5d7caa03b96fb8cc97c44096e6ebd8 Mon Sep 17 00:00:00 2001 From: Carlisle Wishard Date: Thu, 26 Aug 2021 16:25:49 -0400 Subject: [PATCH 054/154] cleaned up init_cond.py --- python/swiftest/swiftest/init_cond.py | 33 ++++----------------------- 1 file changed, 4 insertions(+), 29 deletions(-) diff --git a/python/swiftest/swiftest/init_cond.py b/python/swiftest/swiftest/init_cond.py index 061d6d6d7..7b28125be 100644 --- a/python/swiftest/swiftest/init_cond.py +++ b/python/swiftest/swiftest/init_cond.py @@ -129,7 +129,8 @@ def solar_system_horizons(plname, idval, param, ephemerides_start_date, ds): ephemerides_step = '1d' clab, plab, tlab = swiftest.io.make_swiftest_labels(param) - if param['OUT_FORM'] == 'EL': + # Add the missing labels + if param['OUT_FORM'] == 'XV': plab.append('a') plab.append('e') plab.append('inc') @@ -142,7 +143,7 @@ def solar_system_horizons(plname, idval, param, ephemerides_start_date, ds): tlab.append('capom') tlab.append('omega') tlab.append('capm') - elif param['OUT_FORM'] == 'XV': + elif param['OUT_FORM'] == 'EL': plab.append('xhx') plab.append('xhy') plab.append('xhz') @@ -156,32 +157,6 @@ def solar_system_horizons(plname, idval, param, ephemerides_start_date, ds): tlab.append('vhy') tlab.append('vhz') - elif param['OUT_FORM'] == 'XVEL': - plab.append('xhx') - plab.append('xhy') - plab.append('xhz') - plab.append('vhx') - plab.append('vhy') - plab.append('vhz') - tlab.append('xhx') - tlab.append('xhy') - tlab.append('xhz') - tlab.append('vhx') - tlab.append('vhy') - tlab.append('vhz') - plab.append('a') - plab.append('e') - plab.append('inc') - plab.append('capom') - plab.append('omega') - plab.append('capm') - tlab.append('a') - tlab.append('e') - tlab.append('inc') - tlab.append('capom') - tlab.append('omega') - tlab.append('capm') - dims = ['time', 'id', 'vec'] t = np.array([0.0]) @@ -199,7 +174,7 @@ def solar_system_horizons(plname, idval, param, ephemerides_start_date, ds): ds = xr.combine_by_coords([ds, cbds]) else: # Fetch solar system ephemerides from Horizons print(f"Fetching ephemerides data for {key} from JPL/Horizons") - pl = [] + p1 = [] p2 = [] p3 = [] From 6b7d3ba645aeabb7f08cce3ec03a1574aa4e7b56 Mon Sep 17 00:00:00 2001 From: Carlisle Wishard Date: Thu, 26 Aug 2021 16:26:21 -0400 Subject: [PATCH 055/154] added compatibility for out_form = XVEL --- python/swiftest/swiftest/init_cond.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/swiftest/swiftest/init_cond.py b/python/swiftest/swiftest/init_cond.py index 7b28125be..a159ba9c3 100644 --- a/python/swiftest/swiftest/init_cond.py +++ b/python/swiftest/swiftest/init_cond.py @@ -206,7 +206,7 @@ def solar_system_horizons(plname, idval, param, ephemerides_start_date, ds): pldata[key] = Horizons(id=key, id_type='smallbody', location='@sun', epochs={'start': ephemerides_start_date, 'stop': ephemerides_end_date, 'step': ephemerides_step}) - if param['OUT_FORM'] == 'XV': + if (param['OUT_FORM'] == 'XV' or param['OUT_FORM'] == 'XVEL'): p1.append(pldata[key].vectors()['x'][0] * DCONV) p2.append(pldata[key].vectors()['y'][0] * DCONV) p3.append(pldata[key].vectors()['z'][0] * DCONV) From 4e1e44b3e85bd95dafb904f30a17cb9b8d036fe3 Mon Sep 17 00:00:00 2001 From: Carlisle Wishard Date: Thu, 26 Aug 2021 16:26:55 -0400 Subject: [PATCH 056/154] changed the names of velocity labels to match horizons database --- python/swiftest/swiftest/init_cond.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/python/swiftest/swiftest/init_cond.py b/python/swiftest/swiftest/init_cond.py index a159ba9c3..0d7807524 100644 --- a/python/swiftest/swiftest/init_cond.py +++ b/python/swiftest/swiftest/init_cond.py @@ -210,9 +210,9 @@ def solar_system_horizons(plname, idval, param, ephemerides_start_date, ds): p1.append(pldata[key].vectors()['x'][0] * DCONV) p2.append(pldata[key].vectors()['y'][0] * DCONV) p3.append(pldata[key].vectors()['z'][0] * DCONV) - p4.append(pldata[key].vectors()['vhx'][0] * VCONV) - p5.append(pldata[key].vectors()['vhy'][0] * VCONV) - p6.append(pldata[key].vectors()['vhz'][0] * VCONV) + p4.append(pldata[key].vectors()['vx'][0] * VCONV) + p5.append(pldata[key].vectors()['vy'][0] * VCONV) + p6.append(pldata[key].vectors()['vz'][0] * VCONV) p7.append(pldata[key].elements()['a'][0] * DCONV) p8.append(pldata[key].elements()['e'][0]) p9.append(pldata[key].elements()['incl'][0]) @@ -229,10 +229,11 @@ def solar_system_horizons(plname, idval, param, ephemerides_start_date, ds): p7.append(pldata[key].vectors()['x'][0] * DCONV) p8.append(pldata[key].vectors()['y'][0] * DCONV) p9.append(pldata[key].vectors()['z'][0] * DCONV) - p10.append(pldata[key].vectors()['vhx'][0] * VCONV) - p11.append(pldata[key].vectors()['vhy'][0] * VCONV) - p12.append(pldata[key].vectors()['vhz'][0] * VCONV) + p10.append(pldata[key].vectors()['vx'][0] * VCONV) + p11.append(pldata[key].vectors()['vy'][0] * VCONV) + p12.append(pldata[key].vectors()['vz'][0] * VCONV) pvec = np.vstack([p1, p2, p3, p4, p5, p6]) + if ispl: Rpl.append(planetradius[key] * DCONV) GMpl.append(GMcb[0] / MSun_over_Mpl[key]) From b0678b930544ddef710ee91b07536d05cc74f729 Mon Sep 17 00:00:00 2001 From: Carlisle Wishard Date: Thu, 26 Aug 2021 16:27:27 -0400 Subject: [PATCH 057/154] incremented planetid by 1 to match horizons database and netcdf --- python/swiftest/swiftest/init_cond.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/python/swiftest/swiftest/init_cond.py b/python/swiftest/swiftest/init_cond.py index 0d7807524..395ebdb89 100644 --- a/python/swiftest/swiftest/init_cond.py +++ b/python/swiftest/swiftest/init_cond.py @@ -263,9 +263,9 @@ def solar_system_horizons(plname, idval, param, ephemerides_start_date, ds): pvec = np.vstack([pvec, p7, p8, p9, p10, p11, p12]) if idval is None: - plid = np.array([planetid[key]], dtype=int) + plid = np.array([planetid[key]+1], dtype=int) else: - plid = np.array([idval], dtype=int) + plid = np.array([idval]+1, dtype=int) # Prepare frames by adding an extra axis for the time coordinate plframe = np.expand_dims(pvec.T, axis=0) From 40c58cf8b0d29615a2924aab4ab49955d10b47ed Mon Sep 17 00:00:00 2001 From: Carlisle Wishard Date: Thu, 26 Aug 2021 16:33:36 -0400 Subject: [PATCH 058/154] fixed typo in planetid incrementation --- python/swiftest/swiftest/init_cond.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/swiftest/swiftest/init_cond.py b/python/swiftest/swiftest/init_cond.py index 395ebdb89..83ced66b8 100644 --- a/python/swiftest/swiftest/init_cond.py +++ b/python/swiftest/swiftest/init_cond.py @@ -263,7 +263,7 @@ def solar_system_horizons(plname, idval, param, ephemerides_start_date, ds): pvec = np.vstack([pvec, p7, p8, p9, p10, p11, p12]) if idval is None: - plid = np.array([planetid[key]+1], dtype=int) + plid = np.array([planetid[key]], dtype=int) + 1 else: plid = np.array([idval]+1, dtype=int) From b747365841f752ef43fa51a4ca3c7198f2daef4d Mon Sep 17 00:00:00 2001 From: David A Minton Date: Thu, 26 Aug 2021 17:29:06 -0400 Subject: [PATCH 059/154] Updated particle info generation code --- src/symba/symba_collision.f90 | 13 ++++++++----- src/symba/symba_util.f90 | 7 ++++--- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/src/symba/symba_collision.f90 b/src/symba/symba_collision.f90 index fd4eae517..034038ded 100644 --- a/src/symba/symba_collision.f90 +++ b/src/symba/symba_collision.f90 @@ -67,8 +67,9 @@ module function symba_collision_casedisruption(system, param, family, x, v, mass ! Distribute any residual mass if there is any and set the radius m_frag(nfrag) = m_frag(nfrag) + (mtot - sum(m_frag(:))) - rad_frag(:) = (3 * m_frag(:) / (4 * PI * avg_dens))**(1.0_DP / 3.0_DP) - id_frag(:) = [(i, i = param%maxid + 1, param%maxid + nfrag)] + rad_frag(1:nfrag) = (3 * m_frag(:) / (4 * PI * avg_dens))**(1.0_DP / 3.0_DP) + id_frag(1:nfrag) = [(i, i = param%maxid + 1, param%maxid + nfrag)] + param%maxid = id_frag(nfrag) do i = 1, nfrag Ip_frag(:, i) = Ip_new(:) @@ -169,7 +170,8 @@ module function symba_collision_casehitandrun(system, param, family, x, v, mass, m_frag(2:nfrag) = (mtot - m_frag(1)) / (nfrag - 1) rad_frag(2:nfrag) = (3 * m_frag(2:nfrag) / (4 * PI * avg_dens))**(1.0_DP / 3.0_DP) m_frag(nfrag) = m_frag(nfrag) + (mtot - sum(m_frag(:))) - id_frag(1:nfrag) = [(i, i = param%maxid + 1, param%maxid + nfrag)] + id_frag(2:nfrag) = [(i, i = param%maxid + 1, param%maxid + nfrag - 1)] + param%maxid = id_frag(nfrag) do i = 1, nfrag Ip_frag(:, i) = Ip(:, jproj) @@ -369,8 +371,9 @@ module function symba_collision_casesupercatastrophic(system, param, family, x, end if ! Distribute any residual mass if there is any and set the radius m_frag(nfrag) = m_frag(nfrag) + (mtot - sum(m_frag(:))) - rad_frag(:) = (3 * m_frag(:) / (4 * PI * avg_dens))**(1.0_DP / 3.0_DP) - id_frag(:) = [(i, i = param%maxid + 1, param%maxid + nfrag)] + rad_frag(1:nfrag) = (3 * m_frag(:) / (4 * PI * avg_dens))**(1.0_DP / 3.0_DP) + id_frag(1:nfrag) = [(i, i = param%maxid + 1, param%maxid + nfrag)] + param%maxid = id_frag(nfrag) do i = 1, nfrag Ip_frag(:, i) = Ip_new(:) diff --git a/src/symba/symba_util.f90 b/src/symba/symba_util.f90 index c50e0d373..aa2fe0234 100644 --- a/src/symba/symba_util.f90 +++ b/src/symba/symba_util.f90 @@ -495,11 +495,12 @@ module subroutine symba_util_rearray_pl(self, system, param) if (nadd > 0) then ! Append the adds to the main pl object call pl%append(pl_adds, lsource_mask=[(.true., i=1, nadd)]) - npl = pl%nbody - allocate(lmask(npl)) - lmask(1:npl) = pl%status(1:npl) == NEW_PARTICLE + allocate(lmask(npl+nadd)) + lmask(1:npl) = .false. + lmask(npl+1:npl+nadd) = pl%status(npl+1:npl+nadd) == NEW_PARTICLE + npl = pl%nbody call symba_io_dump_particle_info(system, param, plidx=pack([(i, i=1, npl)], lmask)) deallocate(lmask) From 2ff7ebed9cc357a0c9b6fa0b9cd2471634aec7d7 Mon Sep 17 00:00:00 2001 From: David Minton Date: Thu, 26 Aug 2021 20:45:46 -0400 Subject: [PATCH 060/154] Fixed bad central body id in initial conditions generator. Also made XVEL the default out put type and EL the default input type --- python/swiftest/swiftest/init_cond.py | 3 +-- python/swiftest/swiftest/simulation_class.py | 4 ++-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/python/swiftest/swiftest/init_cond.py b/python/swiftest/swiftest/init_cond.py index 83ced66b8..1e23eabe8 100644 --- a/python/swiftest/swiftest/init_cond.py +++ b/python/swiftest/swiftest/init_cond.py @@ -118,7 +118,7 @@ def solar_system_horizons(plname, idval, param, ephemerides_start_date, ds): rotcb = solarpole.cartesian * solarrot Ipsun = np.array([0.0, 0.0, planetIpz['Sun']]) - cbid = np.array([0]) + cbid = np.array([1]) cvec = np.vstack([GMcb, Rcb, J2RP2, J4RP4, Ipsun[0], Ipsun[1], Ipsun[2], rotcb.x, rotcb.y, rotcb.z ]) # Horizons date time internal variables @@ -167,7 +167,6 @@ def solar_system_horizons(plname, idval, param, ephemerides_start_date, ds): val = -1 if key == "Sun" : # Create central body print("Creating the Sun as a central body") - cb = [] cbframe = np.expand_dims(cvec.T, axis=0) cbxr = xr.DataArray(cbframe, dims=dims, coords={'time': t, 'id': cbid, 'vec': clab}) cbds = cbxr.to_dataset(dim='vec') diff --git a/python/swiftest/swiftest/simulation_class.py b/python/swiftest/swiftest/simulation_class.py index 1663b3366..f3047fa71 100644 --- a/python/swiftest/swiftest/simulation_class.py +++ b/python/swiftest/swiftest/simulation_class.py @@ -21,12 +21,12 @@ def __init__(self, codename="Swiftest", param_file=""): 'TP_IN': "tp.in", 'CB_IN': "cb.in", 'IN_TYPE': "ASCII", - 'IN_FORM': "XV", + 'IN_FORM': "EL", 'ISTEP_OUT': "1", 'ISTEP_DUMP': "1", 'BIN_OUT': "bin.dat", 'OUT_TYPE': 'REAL8', - 'OUT_FORM': "EL", + 'OUT_FORM': "XVEL", 'OUT_STAT': "REPLACE", 'CHK_RMAX': "-1.0", 'CHK_EJECT': "-1.0", From 4d539033aaaa22ec7952392019de222d73897b82 Mon Sep 17 00:00:00 2001 From: David Minton Date: Thu, 26 Aug 2021 20:48:08 -0400 Subject: [PATCH 061/154] Fixed mismatch between DataSet labels and JPL/Horizons-retrieved ephermides --- python/swiftest/swiftest/init_cond.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/python/swiftest/swiftest/init_cond.py b/python/swiftest/swiftest/init_cond.py index 1e23eabe8..d058744ba 100644 --- a/python/swiftest/swiftest/init_cond.py +++ b/python/swiftest/swiftest/init_cond.py @@ -231,7 +231,7 @@ def solar_system_horizons(plname, idval, param, ephemerides_start_date, ds): p10.append(pldata[key].vectors()['vx'][0] * VCONV) p11.append(pldata[key].vectors()['vy'][0] * VCONV) p12.append(pldata[key].vectors()['vz'][0] * VCONV) - pvec = np.vstack([p1, p2, p3, p4, p5, p6]) + pvec = np.vstack([p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12]) if ispl: Rpl.append(planetradius[key] * DCONV) @@ -259,7 +259,6 @@ def solar_system_horizons(plname, idval, param, ephemerides_start_date, ds): pvec = np.vstack([pvec, Ip1, Ip2, Ip3, rotx, roty, rotz]) else: plab = tlab.copy() - pvec = np.vstack([pvec, p7, p8, p9, p10, p11, p12]) if idval is None: plid = np.array([planetid[key]], dtype=int) + 1 From 7c035a2602e69a7c4c44f06309dcf6c7c3b11d16 Mon Sep 17 00:00:00 2001 From: David Minton Date: Fri, 27 Aug 2021 07:03:37 -0400 Subject: [PATCH 062/154] Performed some maintenance on the intial conditions generators and conversion routines to fix issues with the indexing of the central body and when rotation is disabled --- python/swiftest/swiftest/init_cond.py | 4 +++- python/swiftest/swiftest/io.py | 23 ++++++++++++----------- 2 files changed, 15 insertions(+), 12 deletions(-) diff --git a/python/swiftest/swiftest/init_cond.py b/python/swiftest/swiftest/init_cond.py index d058744ba..2b8248ec4 100644 --- a/python/swiftest/swiftest/init_cond.py +++ b/python/swiftest/swiftest/init_cond.py @@ -119,7 +119,9 @@ def solar_system_horizons(plname, idval, param, ephemerides_start_date, ds): Ipsun = np.array([0.0, 0.0, planetIpz['Sun']]) cbid = np.array([1]) - cvec = np.vstack([GMcb, Rcb, J2RP2, J4RP4, Ipsun[0], Ipsun[1], Ipsun[2], rotcb.x, rotcb.y, rotcb.z ]) + cvec = np.vstack([GMcb, Rcb, J2RP2, J4RP4]) + if param['ROTATION'] == 'YES': + cvec = np.vstack([cvec, Ipsun[0], Ipsun[1], Ipsun[2], rotcb.x, rotcb.y, rotcb.z]) # Horizons date time internal variables tstart = datetime.date.fromisoformat(ephemerides_start_date) diff --git a/python/swiftest/swiftest/io.py b/python/swiftest/swiftest/io.py index 81cfd4c77..0b29bc5d5 100644 --- a/python/swiftest/swiftest/io.py +++ b/python/swiftest/swiftest/io.py @@ -766,8 +766,8 @@ def swiftest_xr2infile(ds, param, framenum=-1): A set of three input files for a Swiftest run """ frame = ds.isel(time=framenum) - cb = frame.where(frame.id == 0, drop=True) - pl = frame.where(frame.id > 0, drop=True) + cb = frame.where(frame.id == 1, drop=True) + pl = frame.where(frame.id > 1, drop=True) pl = pl.where(np.invert(np.isnan(pl['Gmass'])), drop=True).drop_vars(['J_2', 'J_4']) tp = frame.where(np.isnan(frame['Gmass']), drop=True).drop_vars(['Gmass', 'radius', 'J_2', 'J_4']) @@ -775,12 +775,13 @@ def swiftest_xr2infile(ds, param, framenum=-1): RSun = np.double(cb['radius']) J2 = np.double(cb['J_2']) J4 = np.double(cb['J_4']) - Ip1cb = np.double(cb['Ip1']) - Ip2cb = np.double(cb['Ip2']) - Ip3cb = np.double(cb['Ip3']) - rotxcb = np.double(cb['rotx']) - rotycb = np.double(cb['roty']) - rotzcb = np.double(cb['rotz']) + if param['ROTATION'] == 'YES': + Ip1cb = np.double(cb['Ip1']) + Ip2cb = np.double(cb['Ip2']) + Ip3cb = np.double(cb['Ip3']) + rotxcb = np.double(cb['rotx']) + rotycb = np.double(cb['roty']) + rotzcb = np.double(cb['rotz']) cbid = int(0) if param['IN_TYPE'] == 'ASCII': @@ -942,8 +943,8 @@ def swifter_xr2infile(ds, param, framenum=-1): A set of input files for a Swifter run """ frame = ds.isel(time=framenum) - cb = frame.where(frame.id == 0, drop=True) - pl = frame.where(frame.id > 0, drop=True) + cb = frame.where(frame.id == 1, drop=True) + pl = frame.where(frame.id > 1, drop=True) pl = pl.where(np.invert(np.isnan(pl['Gmass'])), drop=True).drop_vars(['J_2', 'J_4']) tp = frame.where(np.isnan(frame['Gmass']), drop=True).drop_vars(['Gmass', 'radius', 'J_2', 'J_4']) @@ -956,7 +957,7 @@ def swifter_xr2infile(ds, param, framenum=-1): # Swiftest Central body file plfile = open(param['PL_IN'], 'w') print(pl.id.count().values + 1, file=plfile) - print(cb.id.values[0], cb['Gmass'].values[0], file=plfile) + print(cb.id.values[0], GMSun, file=plfile) print('0.0 0.0 0.0', file=plfile) print('0.0 0.0 0.0', file=plfile) for i in pl.id: From 6222eb143e2fa7817824e4f16dc161eb74256281 Mon Sep 17 00:00:00 2001 From: David Minton Date: Fri, 27 Aug 2021 07:06:35 -0400 Subject: [PATCH 063/154] Removed the IN_FORM parameter for a swiftest2swifter conversion --- python/swiftest/swiftest/io.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/swiftest/swiftest/io.py b/python/swiftest/swiftest/io.py index 0b29bc5d5..a8c2daf08 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", "IN_FORM") def real2float(realstr): """ From e9dc3bfb33c3e0c80f3ff3e0070517ecfac8a91e Mon Sep 17 00:00:00 2001 From: David Minton Date: Fri, 27 Aug 2021 07:08:09 -0400 Subject: [PATCH 064/154] Updated the WHM_GR test to use new features: NetCDF, EL inputs, and XVEL outputs --- examples/whm_gr_test/init_cond.py | 10 ++++-- examples/whm_gr_test/param.swifter.in | 2 +- examples/whm_gr_test/param.swiftest.in | 13 ++++--- examples/whm_gr_test/pl.swifter.in | 50 +++++++++++++------------- examples/whm_gr_test/pl.swiftest.in | 48 ++++++++++++------------- 5 files changed, 63 insertions(+), 60 deletions(-) diff --git a/examples/whm_gr_test/init_cond.py b/examples/whm_gr_test/init_cond.py index 09feca135..edb4f3db3 100755 --- a/examples/whm_gr_test/init_cond.py +++ b/examples/whm_gr_test/init_cond.py @@ -5,7 +5,7 @@ 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['BIN_OUT'] = "bin.swiftest.nc" sim.param['ENC_OUT'] = "enc.swiftest.dat" sim.param['MU2KG'] = swiftest.MSun @@ -22,8 +22,10 @@ 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['IN_FORM'] = "EL" +sim.param['OUT_FORM'] = "XVEL" +sim.param['OUT_TYPE'] = "NETCDF_DOUBLE" sim.param['RHILL_PRESENT'] = "YES" sim.param['GR'] = 'YES' @@ -40,13 +42,15 @@ } for name, id in bodyid.items(): - sim.add(name, idval=id) + sim.add(name) 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.param['OUT_FORM'] = "EL" +sim.param['OUT_TYPE'] = "REAL8" sim.save("param.swifter.in", codename="Swifter") diff --git a/examples/whm_gr_test/param.swifter.in b/examples/whm_gr_test/param.swifter.in index f1574759a..105579a82 100644 --- a/examples/whm_gr_test/param.swifter.in +++ b/examples/whm_gr_test/param.swifter.in @@ -11,13 +11,13 @@ 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 +ENC_OUT enc.swifter.dat EXTRA_FORCE NO BIG_DISCARD NO CHK_CLOSE YES diff --git a/examples/whm_gr_test/param.swiftest.in b/examples/whm_gr_test/param.swiftest.in index 00b2c2546..d7f584790 100644 --- a/examples/whm_gr_test/param.swiftest.in +++ b/examples/whm_gr_test/param.swiftest.in @@ -4,15 +4,14 @@ TSTOP 1000.0 DT 0.0006844626967830253 ISTEP_OUT 1461 ISTEP_DUMP 1461 -OUT_FORM EL -OUT_TYPE REAL8 +OUT_FORM XVEL +OUT_TYPE NETCDF_DOUBLE 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 +BIN_OUT bin.swiftest.nc CHK_QMIN 0.004650467260962157 CHK_RMIN 0.004650467260962157 CHK_RMAX 1000.0 @@ -22,7 +21,10 @@ CHK_QMIN_RANGE 0.004650467260962157 1000.0 MU2KG 1.988409870698051e+30 TU2S 31557600.0 DU2M 149597870700.0 +IN_FORM EL +ENC_OUT enc.swiftest.dat EXTRA_FORCE NO +DISCARD_OUT discard.out BIG_DISCARD NO CHK_CLOSE YES RHILL_PRESENT YES @@ -31,6 +33,3 @@ ROTATION NO TIDES NO ENERGY NO GR YES -YARKOVSKY NO -YORP NO -MTINY 0.0 diff --git a/examples/whm_gr_test/pl.swifter.in b/examples/whm_gr_test/pl.swifter.in index 0b02f19c8..0d8d216fb 100644 --- a/examples/whm_gr_test/pl.swifter.in +++ b/examples/whm_gr_test/pl.swifter.in @@ -1,36 +1,36 @@ 9 -0 39.476926408897625196 +1 39.476926408897626 0.0 0.0 0.0 0.0 0.0 0.0 -1 6.5537098095653139645e-06 0.001475124456355905224 +2 6.553709809565314146e-06 0.0014751261514880139061 1.6306381826061645943e-05 --0.30949970210807342674 0.1619004125820537876 0.041620272188990829754 --6.8742992150644793847 -8.672423996611946485 -0.078109307586001638286 -2 9.663313399581537916e-05 0.006759069616556246028 +-0.29510017042975300594 -0.34346884022084378518 -0.000997917547895216684 +5.709185893355676925 -6.2220892824670268354 -1.0321515701207669188 +3 9.6633133995815381836e-05 0.006759061578633710828 4.0453784346544178454e-05 --0.5567137338251560985 -0.46074173273652380134 0.02580196630219121906 -4.6580776303108450487 -5.726444072926637749 -0.3473859047161406309 -3 0.000120026935827952453094 0.010044908171483009529 +-0.21096294566811030213 -0.6945147553261317164 0.0026420019351886940041 +7.0187176732445560167 -2.1783670470162428854 -0.43491289164169576724 +4 0.000120026935827952456416 0.010044949983771724966 4.25875607065040958e-05 -0.6978790186886838498 -0.73607603319120218366 3.261671020506711323e-05 -4.4579240279134950613 4.300011122687349501 -0.00022055769049333364448 -4 1.2739802010675941456e-05 0.0072466797341124641736 +0.905522725638602366 -0.44829515638659761523 1.8122901980659660508e-05 +2.685845700565266851 5.6080546137104218133 -0.00027833838024725729542 +5 1.2739802010675941808e-05 0.0072465915674003790445 2.265740805092889601e-05 --1.617661473167097963 0.38314370807747849534 0.04771055403546069218 --0.98751874613118001086 -4.5371239937302254657 -0.07086074102213555221 -5 0.037692251088985676735 0.35527079166215922855 +-1.6511945936824949932 0.1180803833522415941 0.042978148735422203042 +-0.17443328105136805607 -4.661619009141641736 -0.09341597039948347882 +6 0.03769225108898567778 0.3552713110772063853 0.00046732617030490929307 -4.1527454588897487753 -2.8347492039446908763 -0.081136554176388195336 -1.5225069137843642898 2.4087104911325327961 -0.044067446366273183833 -6 0.011285899820091272997 0.43765832419088212185 +4.2381319671740662614 -2.694827110197309139 -0.08362807329786287047 +1.44742540330701551 2.4581907268113588696 -0.042593445938391914576 +7 0.01128589982009127331 0.4376635990332856823 0.00038925687730393611812 -6.39471595410062843 -7.621162747287802297 -0.121992225877669294154 -1.4493167787574136286 1.3075474785896286071 -0.08039429377859412155 -7 0.0017236589478267730203 0.46960112247450473807 +6.4776155764849425722 -7.5454781609219372385 -0.12660625214421539209 +1.4343694668413992401 1.3251694474665614901 -0.08010594537316981756 +8 0.001723658947826773068 0.46966224198242572768 0.00016953449859497231466 -14.793135356927480828 13.074218343364380601 -0.14311846037737518955 --0.9605086875596024784 1.0118431725941020164 0.016148779866732710198 -8 0.0020336100526728302319 0.78136567314580814177 +14.737783583010530819 13.132284780084109599 -0.14218874866247160904 +-0.96494157148906816704 1.0080364706941240677 0.016191990849809560611 +9 0.0020336100526728302882 0.7814394516095526881 0.000164587904124493665 -29.568629894896030663 -4.5543028991960081697 -0.58771107137394917874 -0.16867624969736024011 1.1427992197933557251 -0.027387722828706092838 +29.578253698940308425 -4.488584904681241383 -0.58928426126360722304 +0.16609282485651713797 1.143247554888599065 -0.027336661118935745503 diff --git a/examples/whm_gr_test/pl.swiftest.in b/examples/whm_gr_test/pl.swiftest.in index 84cae57a2..ddb1a7016 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 0.001475124456355905224 +2 6.553709809565314146e-06 0.0014751261514880139061 1.6306381826061645943e-05 --0.30949970210807342674 0.1619004125820537876 0.041620272188990829754 --6.8742992150644793847 -8.672423996611946485 -0.078109307586001638286 -2 9.663313399581537916e-05 0.006759069616556246028 +0.38709861919270799335 0.20562987442219879397 7.0036598799530471737 +48.303764444546942514 29.187012577257871015 139.02452846395490837 +3 9.6633133995815381836e-05 0.006759061578633710828 4.0453784346544178454e-05 --0.5567137338251560985 -0.46074173273652380134 0.02580196630219121906 -4.6580776303108450487 -5.726444072926637749 -0.3473859047161406309 -3 0.000120026935827952453094 0.010044908171483009529 +0.72332350338494522113 0.0067851993472706276234 3.3945100118236060105 +76.62172575937908903 55.11451498626085055 120.69543184874230235 +4 0.000120026935827952456416 0.010044949983771724966 4.25875607065040958e-05 -0.6978790186886838498 -0.73607603319120218366 3.261671020506711323e-05 -4.4579240279134950613 4.300011122687349501 -0.00022055769049333364448 -4 1.2739802010675941456e-05 0.0072466797341124641736 +1.000022414803547921 0.016679693167334301573 0.002750719340522077977 +175.59912721852418827 287.3487256951211748 232.20474506920808722 +5 1.2739802010675941808e-05 0.0072465915674003790445 2.265740805092889601e-05 --1.617661473167097963 0.38314370807747849534 0.04771055403546069218 --0.98751874613118001086 -4.5371239937302254657 -0.07086074102213555221 -5 0.037692251088985676735 0.35527079166215922855 +1.5237056817307590428 0.09335454089002033495 1.8479086301002540793 +49.490790672135332784 286.7030449733272235 203.56009534652309867 +6 0.03769225108898567778 0.3552713110772063853 0.00046732617030490929307 -4.1527454588897487753 -2.8347492039446908763 -0.081136554176388195336 -1.5225069137843642898 2.4087104911325327961 -0.044067446366273183833 -6 0.011285899820091272997 0.43765832419088212185 +5.203524963998765074 0.048518619089771883313 1.3035691332389880426 +100.516740776557597314 273.38311024861741316 317.57998688455870706 +7 0.01128589982009127331 0.4376635990332856823 0.00038925687730393611812 -6.39471595410062843 -7.621162747287802297 -0.121992225877669294154 -1.4493167787574136286 1.3075474785896286071 -0.08039429377859412155 -7 0.0017236589478267730203 0.46960112247450473807 +9.581861578191695372 0.05220296447788015659 2.4862598063103709123 +113.59526938704850352 335.69019804854252698 225.44748806008931297 +8 0.001723658947826773068 0.46966224198242572768 0.00016953449859497231466 -14.793135356927480828 13.074218343364380601 -0.14311846037737518955 --0.9605086875596024784 1.0118431725941020164 0.016148779866732710198 -8 0.0020336100526728302319 0.78136567314580814177 +19.23638216159032055 0.04433184777155944195 0.7703424893861580136 +74.09557761028084144 95.84993853316392176 235.82773290830229485 +9 0.0020336100526728302882 0.7814394516095526881 0.000164587904124493665 -29.568629894896030663 -4.5543028991960081697 -0.58771107137394917874 -0.16867624969736024011 1.1427992197933557251 -0.027387722828706092838 +30.289653279202511271 0.013458737599393380546 1.769000156955224945 +131.74519418988560915 245.79890439350270981 334.51418242279709148 From be5e5d26f2960102dc235c1c8133ed3aff12df13 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Fri, 27 Aug 2021 12:12:43 -0400 Subject: [PATCH 065/154] Enabled non-unique character coordinate name to bodies. Tested in REAL8 mode, but does not yet work in NetCDF --- python/swiftest/swiftest/io.py | 36 ++++++++++--- src/io/io.f90 | 8 +-- src/modules/swiftest_classes.f90 | 53 ++++++++++--------- src/modules/swiftest_globals.f90 | 2 + src/netcdf/netcdf.f90 | 90 +++++++++++++++++--------------- 5 files changed, 112 insertions(+), 77 deletions(-) diff --git a/python/swiftest/swiftest/io.py b/python/swiftest/swiftest/io.py index a8c2daf08..35d22f5b3 100644 --- a/python/swiftest/swiftest/io.py +++ b/python/swiftest/swiftest/io.py @@ -468,6 +468,7 @@ def swiftest_stream(f, param): tlab : string list Labels for the tvec data """ + NAMELEN = 32 while True: # Loop until you read the end of file try: # Read multi-line header @@ -478,6 +479,9 @@ def swiftest_stream(f, param): ntp = f.read_ints() iout_form = f.read_reals('c') cbid = f.read_ints() + dtstr = f'a{NAMELEN}' + cbnames = f.read_record(dtstr) + cbnames = [np.char.strip(str(cbnames[0], encoding='utf-8'))] Mcb = f.read_reals(np.float64) Rcb = f.read_reals(np.float64) J2cb = f.read_reals(np.float64) @@ -494,6 +498,11 @@ def swiftest_stream(f, param): Qcb = f.read_reals(np.float64) if npl[0] > 0: plid = f.read_ints() + dtstr = f'({npl[0]},)a{NAMELEN}' + names = f.read_record(np.dtype(dtstr)) + plnames = [] + for i in range(npl[0]): + plnames.append(np.char.strip(str(names[i], encoding='utf-8'))) p1 = f.read_reals(np.float64) p2 = f.read_reals(np.float64) p3 = f.read_reals(np.float64) @@ -523,6 +532,11 @@ def swiftest_stream(f, param): Qpl = f.read_reals(np.float64) if ntp[0] > 0: tpid = f.read_ints() + dtstr = f'({ntp[0]},)a{NAMELEN}' + names = f.read_record(np.dtype(dtstr)) + tpnames = [] + for i in range(npl[0]): + tpnames.append(np.char.strip(str(names[i], encoding='utf-8'))) t1 = f.read_reals(np.float64) t2 = f.read_reals(np.float64) t3 = f.read_reals(np.float64) @@ -550,6 +564,7 @@ def swiftest_stream(f, param): else: pvec = np.empty((8, 0)) plid = np.empty(0) + plnames = np.empty(0) if ntp > 0: tvec = np.vstack([t1, t2, t3, t4, t5, t6]) if param['OUT_FORM'] == 'XVEL': @@ -560,6 +575,7 @@ def swiftest_stream(f, param): else: tvec = np.empty((6, 0)) tpid = np.empty(0) + tpnames = np.empty(0) cvec = np.array([Mcb, Rcb, J2cb, J4cb]) if param['RHILL_PRESENT'] == 'YES': if npl > 0: @@ -572,9 +588,9 @@ def swiftest_stream(f, param): cvec = np.vstack([cvec, k2cb, Qcb]) if npl > 0: pvec = np.vstack([pvec, k2pl, Qpl]) - yield t, cbid, cvec.T, clab, \ - npl, plid, pvec.T, plab, \ - ntp, tpid, tvec.T, tlab + yield t, cbid, cbnames, cvec.T, clab, \ + npl, plid, plnames, pvec.T, plab, \ + ntp, tpid, tpnames, tvec.T, tlab def swifter2xr(param): @@ -638,24 +654,30 @@ def swiftest2xr(param): cb = [] pl = [] tp = [] + cbn = None try: with FortranFile(param['BIN_OUT'], 'r') as f: - for t, cbid, cvec, clab, \ - npl, plid, pvec, plab, \ - ntp, tpid, tvec, tlab in swiftest_stream(f, param): + for t, cbid, cbnames, cvec, clab, \ + npl, plid, plnames, pvec, plab, \ + ntp, tpid, tpnames, tvec, tlab in swiftest_stream(f, param): # Prepare frames by adding an extra axis for the time coordinate cbframe = np.expand_dims(cvec, axis=0) plframe = np.expand_dims(pvec, axis=0) tpframe = np.expand_dims(tvec, axis=0) + # Create xarray DataArrays out of each body type cbxr = xr.DataArray(cbframe, dims=dims, coords={'time': t, 'id': cbid, 'vec': clab}) + cbxr = cbxr.assign_coords(name=("id", cbnames)) plxr = xr.DataArray(plframe, dims=dims, coords={'time': t, 'id': plid, 'vec': plab}) + plxr = plxr.assign_coords(name=("id", plnames)) tpxr = xr.DataArray(tpframe, dims=dims, coords={'time': t, 'id': tpid, 'vec': tlab}) - + tpxr = tpxr.assign_coords(name=("id", tpnames)) + cb.append(cbxr) pl.append(plxr) tp.append(tpxr) + sys.stdout.write('\r' + f"Reading in time {t[0]:.3e}") sys.stdout.flush() except IOError: diff --git a/src/io/io.f90 b/src/io/io.f90 index c4c9b8b81..b30718c83 100644 --- a/src/io/io.f90 +++ b/src/io/io.f90 @@ -1036,7 +1036,7 @@ module function io_read_frame_body(self, iu, param) result(ierr) select case(param%in_type) case (REAL4_TYPE, REAL8_TYPE) read(iu, err = 667, iomsg = errmsg) self%id(:) - !read(iu, err = 667, iomsg = errmsg) self%name(:) + read(iu, err = 667, iomsg = errmsg) self%name(:) select case (param%in_form) case (XV) @@ -1158,7 +1158,7 @@ module function io_read_frame_cb(self, iu, param) result(ierr) character(len=STRMAX) :: errmsg read(iu, err = 667, iomsg = errmsg) self%id - !read(iu, err = 667, iomsg = errmsg) self%name + read(iu, err = 667, iomsg = errmsg) self%name read(iu, err = 667, iomsg = errmsg) self%Gmass self%mass = self%Gmass / param%GU read(iu, err = 667, iomsg = errmsg) self%radius @@ -1473,6 +1473,7 @@ module subroutine io_write_encounter(self, pl, encbody, param) call util_exit(FAILURE) end subroutine io_write_encounter + module subroutine io_write_frame_body(self, iu, param) !! author: David A. Minton !! @@ -1492,6 +1493,7 @@ module subroutine io_write_frame_body(self, iu, param) associate(n => self%nbody) if (n == 0) return write(iu, err = 667, iomsg = errmsg) self%id(1:n) + write(iu, err = 667, iomsg = errmsg) self%name(1:n) if ((param%out_form == XV) .or. (param%out_form == XVEL)) then write(iu, err = 667, iomsg = errmsg) self%xh(1, 1:n) write(iu, err = 667, iomsg = errmsg) self%xh(2, 1:n) @@ -1551,8 +1553,8 @@ module subroutine io_write_frame_cb(self, iu, param) character(len=STRMAX) :: errmsg associate(cb => self) - !write(iu, err = 667, iomsg = errmsg) cb%name write(iu, err = 667, iomsg = errmsg) cb%id + write(iu, err = 667, iomsg = errmsg) cb%name write(iu, err = 667, iomsg = errmsg) cb%Gmass write(iu, err = 667, iomsg = errmsg) cb%radius write(iu, err = 667, iomsg = errmsg) cb%j2rp2 diff --git a/src/modules/swiftest_classes.f90 b/src/modules/swiftest_classes.f90 index 7703dd534..06435cbe7 100644 --- a/src/modules/swiftest_classes.f90 +++ b/src/modules/swiftest_classes.f90 @@ -86,10 +86,11 @@ module swiftest_classes type :: netcdf_parameters integer(I4B) :: out_type !! NetCDF output type (will be assigned either NF90_DOUBLE or NF90_FLOAT, depending on the user parameter) integer(I4B) :: ncid !! NetCDF ID for the output file - integer(I4B) :: dimids(2) !! Dimensions of the NetCDF file + integer(I4B) :: dimids(3) !! Dimensions of the NetCDF file integer(I4B) :: time_dimid !! NetCDF ID for the time dimension + integer(I4B) :: id_dimid !! NetCDF ID for the particle id dimension + integer(I4B) :: str_dimid !! NetCDF ID for the character string dimension integer(I4B) :: time_varid !! NetCDF ID for the time variable - integer(I4B) :: id_dimid !! NetCDF ID for the particle name dimension integer(I4B) :: id_varid !! NetCDF ID for the particle name variable integer(I4B) :: name_varid !! NetCDF ID for the semimajor axis variable integer(I4B) :: npl_varid !! NetCDF ID for the number of active massive bodies variable @@ -156,7 +157,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=NAMELEN) :: 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) @@ -193,29 +194,29 @@ module swiftest_classes !> An abstract class for a generic collection of Swiftest bodies 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 - character(len=STRMAX), dimension(:), allocatable :: name !! Non-unique name - 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 !! Swiftestcentric position - real(DP), dimension(:,:), allocatable :: vh !! Swiftestcentric velocity - real(DP), dimension(:,:), allocatable :: xb !! Barycentric position - 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) - real(DP), dimension(:), allocatable :: e !! Eccentricity - real(DP), dimension(:), allocatable :: inc !! Inclination - real(DP), dimension(:), allocatable :: capom !! Longitude of ascending node - real(DP), dimension(:), allocatable :: omega !! Argument of pericenter - real(DP), dimension(:), allocatable :: capm !! Mean anomaly + logical :: lfirst = .true. !! Run the current step as a first + integer(I4B) :: nbody = 0 !! Number of bodies + character(len=NAMELEN), dimension(:), allocatable :: name !! Non-unique name + 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 !! Swiftestcentric position + real(DP), dimension(:,:), allocatable :: vh !! Swiftestcentric velocity + real(DP), dimension(:,:), allocatable :: xb !! Barycentric position + 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) + real(DP), dimension(:), allocatable :: e !! Eccentricity + real(DP), dimension(:), allocatable :: inc !! Inclination + real(DP), dimension(:), allocatable :: capom !! Longitude of ascending node + real(DP), dimension(:), allocatable :: omega !! Argument of pericenter + real(DP), dimension(:), allocatable :: capm !! Mean anomaly !! 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/swiftest_globals.f90 b/src/modules/swiftest_globals.f90 index cf0c7248a..3df99a8d1 100644 --- a/src/modules/swiftest_globals.f90 +++ b/src/modules/swiftest_globals.f90 @@ -43,6 +43,7 @@ module swiftest_globals integer(I4B), parameter :: RINGMOONS = 9 integer(I4B), parameter :: STRMAX = 512 !! Maximum size of character strings + integer(I4B), parameter :: NAMELEN = 32 !! Maximum size of name strings character(*), parameter :: ASCII_TYPE = 'ASCII' !! Symbolic name for ASCII file type character(*), parameter :: REAL4_TYPE = 'REAL4' !! Symbolic name for binary file type REAL4 @@ -130,6 +131,7 @@ module swiftest_globals character(*), parameter :: NETCDF_OUTFILE = 'bin.nc' !! Default output file name character(*), parameter :: TIME_DIMNAME = "time" !! NetCDF name of the time dimension character(*), parameter :: ID_DIMNAME = "id" !! NetCDF name of the particle id dimension + character(*), parameter :: STR_DIMNAME = "str" !! NetCDF name of the particle id dimension character(*), parameter :: NAME_VARNAME = "name" !! NetCDF name of the particle name variable character(*), parameter :: NPL_VARNAME = "npl" !! NetCDF name of the number of active massive bodies variable character(*), parameter :: NTP_VARNAME = "ntp" !! NetCDF name of the number of active test particles variable diff --git a/src/netcdf/netcdf.f90 b/src/netcdf/netcdf.f90 index 2a3e09709..8234ad4c2 100644 --- a/src/netcdf/netcdf.f90 +++ b/src/netcdf/netcdf.f90 @@ -53,7 +53,8 @@ module subroutine netcdf_initialize_output(self, param) ! Define the NetCDF dimensions with particle name as the record dimension call check( nf90_def_dim(self%ncid, ID_DIMNAME, NF90_UNLIMITED, self%id_dimid) ) ! 'x' dimension call check( nf90_def_dim(self%ncid, TIME_DIMNAME, NF90_UNLIMITED, self%time_dimid) ) ! 'y' dimension - self%dimids = [self%time_dimid, self%id_dimid ] + call check( nf90_def_dim(self%ncid, STR_DIMNAME, NAMELEN, self%str_dimid) ) ! Dimension for string variables (aka character arrays) + self%dimids = [self%time_dimid, self%id_dimid, self%str_dimid] select case (param%out_type) case(NETCDF_FLOAT_TYPE) @@ -67,6 +68,7 @@ module subroutine netcdf_initialize_output(self, param) call check( nf90_def_var(self%ncid, ID_DIMNAME, NF90_INT, self%id_dimid, self%id_varid) ) call check( nf90_def_var(self%ncid, NPL_VARNAME, NF90_INT, self%time_dimid, self%npl_varid) ) call check( nf90_def_var(self%ncid, NTP_VARNAME, NF90_INT, self%time_dimid, self%ntp_varid) ) + call check( nf90_def_var(self%ncid, NAME_VARNAME, NF90_CHAR, [self%id_dimid, self%str_dimid], self%name_varid) ) if ((param%out_form == XV) .or. (param%out_form == XVEL)) then call check( nf90_def_var(self%ncid, XHX_VARNAME, self%out_type, self%dimids, self%xhx_varid) ) call check( nf90_def_var(self%ncid, XHY_VARNAME, self%out_type, self%dimids, self%xhy_varid) ) @@ -142,6 +144,7 @@ module subroutine netcdf_open(self, param) call check( nf90_inq_varid(self%ncid, ID_DIMNAME, self%id_varid)) call check( nf90_inq_varid(self%ncid, NPL_VARNAME, self%npl_varid)) call check( nf90_inq_varid(self%ncid, NTP_VARNAME, self%ntp_varid)) + call check( nf90_inq_varid(self%ncid, NAME_VARNAME, self%name_varid)) !call check( nf90_inq_varid(self%ncid, NAME_VARNAME, self%name_varid)) if ((param%out_form == XV) .or. (param%out_form == XVEL)) then @@ -161,10 +164,10 @@ module subroutine netcdf_open(self, param) call check( nf90_inq_varid(self%ncid, CAPM_VARNAME, self%capm_varid)) end if call check( nf90_inq_varid(self%ncid, GMASS_VARNAME, self%Gmass_varid)) + if (param%lclose) call check( nf90_inq_varid(self%ncid, RADIUS_VARNAME, self%radius_varid)) if (param%lrhill_present) call check( nf90_inq_varid(self%ncid, RHILL_VARNAME, self%rhill_varid)) if (param%lrotation) then - call check( nf90_inq_varid(self%ncid, RADIUS_VARNAME, self%radius_varid)) call check( nf90_inq_varid(self%ncid, IP1_VARNAME, self%Ip1_varid)) call check( nf90_inq_varid(self%ncid, IP2_VARNAME, self%Ip2_varid)) call check( nf90_inq_varid(self%ncid, IP3_VARNAME, self%Ip3_varid)) @@ -211,8 +214,9 @@ module subroutine netcdf_write_frame_base(self, iu, param) class(netcdf_parameters), intent(inout) :: iu !! Parameters used to identify a particular NetCDF dataset class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters ! Internals - integer(I4B) :: i, j, id, tslot + integer(I4B) :: i, j, id, tslot, strlen, idslot integer(I4B), dimension(:), allocatable :: ind + character(len=:), allocatable :: name !! Open the netCDF file @@ -227,66 +231,70 @@ module subroutine netcdf_write_frame_base(self, iu, param) do i = 1, n j = ind(i) - id = self%id(j) - - call check( nf90_put_var(iu%ncid, iu%id_varid, id, start=[id]) ) - !call check( nf90_put_var(iu%ncid, iu%name_varid, trim(adjustl(self%name(j))), start=[tslot, id]) ) + idslot = self%id(j) + 1 + call check( nf90_put_var(iu%ncid, iu%id_varid, id, start=[idslot]) ) + name = trim(adjustl(self%name(j))) + strlen = len(name) + call check( nf90_put_var(iu%ncid, iu%name_varid, name, start=[id, 1], count=[1, strlen]) ) if ((param%out_form == XV) .or. (param%out_form == XVEL)) then - call check( nf90_put_var(iu%ncid, iu%xhx_varid, self%xh(1, j), start=[tslot, id]) ) - call check( nf90_put_var(iu%ncid, iu%xhy_varid, self%xh(2, j), start=[tslot, id]) ) - call check( nf90_put_var(iu%ncid, iu%xhz_varid, self%xh(3, j), start=[tslot, id]) ) - call check( nf90_put_var(iu%ncid, iu%vhx_varid, self%vh(1, j), start=[tslot, id]) ) - call check( nf90_put_var(iu%ncid, iu%vhy_varid, self%vh(2, j), start=[tslot, id]) ) - call check( nf90_put_var(iu%ncid, iu%vhz_varid, self%vh(3, j), start=[tslot, id]) ) + call check( nf90_put_var(iu%ncid, iu%xhx_varid, self%xh(1, j), start=[tslot, idslot]) ) + call check( nf90_put_var(iu%ncid, iu%xhy_varid, self%xh(2, j), start=[tslot, idslot]) ) + call check( nf90_put_var(iu%ncid, iu%xhz_varid, self%xh(3, j), start=[tslot, idslot]) ) + call check( nf90_put_var(iu%ncid, iu%vhx_varid, self%vh(1, j), start=[tslot, idslot]) ) + call check( nf90_put_var(iu%ncid, iu%vhy_varid, self%vh(2, j), start=[tslot, idslot]) ) + call check( nf90_put_var(iu%ncid, iu%vhz_varid, self%vh(3, j), start=[tslot, idslot]) ) end if if ((param%out_form == EL) .or. (param%out_form == XVEL)) then - call check( nf90_put_var(iu%ncid, iu%a_varid, self%a(j), start=[tslot, id]) ) - call check( nf90_put_var(iu%ncid, iu%e_varid, self%e(j), start=[tslot, id]) ) - call check( nf90_put_var(iu%ncid, iu%inc_varid, self%inc(j), start=[tslot, id]) ) - call check( nf90_put_var(iu%ncid, iu%capom_varid, self%capom(j), start=[tslot, id]) ) - call check( nf90_put_var(iu%ncid, iu%omega_varid, self%omega(j), start=[tslot, id]) ) - call check( nf90_put_var(iu%ncid, iu%capm_varid, self%capm(j), start=[tslot, id]) ) + call check( nf90_put_var(iu%ncid, iu%a_varid, self%a(j), start=[tslot, idslot]) ) + call check( nf90_put_var(iu%ncid, iu%e_varid, self%e(j), start=[tslot, idslot]) ) + call check( nf90_put_var(iu%ncid, iu%inc_varid, self%inc(j), start=[tslot, idslot]) ) + call check( nf90_put_var(iu%ncid, iu%capom_varid, self%capom(j), start=[tslot, idslot]) ) + call check( nf90_put_var(iu%ncid, iu%omega_varid, self%omega(j), start=[tslot, idslot]) ) + call check( nf90_put_var(iu%ncid, iu%capm_varid, self%capm(j), start=[tslot, idslot]) ) end if select type(pl => self) class is (swiftest_pl) ! Additional output if the passed polymorphic object is a massive body - call check( nf90_put_var(iu%ncid, iu%Gmass_varid, pl%Gmass(j), start=[tslot, id]) ) + call check( nf90_put_var(iu%ncid, iu%Gmass_varid, pl%Gmass(j), start=[tslot, idslot]) ) if (param%lrhill_present) then - call check( nf90_put_var(iu%ncid, iu%rhill_varid, pl%rhill(j), start=[tslot, id]) ) + call check( nf90_put_var(iu%ncid, iu%rhill_varid, pl%rhill(j), start=[tslot, idslot]) ) end if if (param%lclose) then - call check( nf90_put_var(iu%ncid, iu%radius_varid, pl%radius(j), start=[tslot, id]) ) + call check( nf90_put_var(iu%ncid, iu%radius_varid, pl%radius(j), start=[tslot, idslot]) ) end if if (param%lrotation) then - call check( nf90_put_var(iu%ncid, iu%Ip1_varid, pl%Ip(1, j), start=[tslot, id]) ) - call check( nf90_put_var(iu%ncid, iu%Ip2_varid, pl%Ip(2, j), start=[tslot, id]) ) - call check( nf90_put_var(iu%ncid, iu%Ip3_varid, pl%Ip(3, j), start=[tslot, id]) ) - call check( nf90_put_var(iu%ncid, iu%rotx_varid, pl%rot(1, j), start=[tslot, id]) ) - call check( nf90_put_var(iu%ncid, iu%roty_varid, pl%rot(2, j), start=[tslot, id]) ) - call check( nf90_put_var(iu%ncid, iu%rotz_varid, pl%rot(3, j), start=[tslot, id]) ) + call check( nf90_put_var(iu%ncid, iu%Ip1_varid, pl%Ip(1, j), start=[tslot, idslot]) ) + call check( nf90_put_var(iu%ncid, iu%Ip2_varid, pl%Ip(2, j), start=[tslot, idslot]) ) + call check( nf90_put_var(iu%ncid, iu%Ip3_varid, pl%Ip(3, j), start=[tslot, idslot]) ) + call check( nf90_put_var(iu%ncid, iu%rotx_varid, pl%rot(1, j), start=[tslot, idslot]) ) + call check( nf90_put_var(iu%ncid, iu%roty_varid, pl%rot(2, j), start=[tslot, idslot]) ) + call check( nf90_put_var(iu%ncid, iu%rotz_varid, pl%rot(3, j), start=[tslot, idslot]) ) end if if (param%ltides) then - call check( nf90_put_var(iu%ncid, iu%k2_varid, pl%k2(j), start=[tslot, id]) ) - call check( nf90_put_var(iu%ncid, iu%Q_varid, pl%Q(j), start=[tslot, id]) ) + call check( nf90_put_var(iu%ncid, iu%k2_varid, pl%k2(j), start=[tslot, idslot]) ) + call check( nf90_put_var(iu%ncid, iu%Q_varid, pl%Q(j), start=[tslot, idslot]) ) end if end select end do end associate class is (swiftest_cb) id = self%id - call check( nf90_put_var(iu%ncid, iu%id_varid, id, start=[id]) ) - call check( nf90_put_var(iu%ncid, iu%Gmass_varid, self%Gmass, start=[tslot, id]) ) - call check( nf90_put_var(iu%ncid, iu%radius_varid, self%radius, start=[tslot, id]) ) + call check( nf90_put_var(iu%ncid, iu%id_varid, id, start=[idslot]) ) + name = trim(adjustl(self%name)) + strlen = len(name) + call check( nf90_put_var(iu%ncid, iu%name_varid, name, start=[id, 1], count=[1, strlen]) ) + call check( nf90_put_var(iu%ncid, iu%Gmass_varid, self%Gmass, start=[tslot, idslot]) ) + call check( nf90_put_var(iu%ncid, iu%radius_varid, self%radius, start=[tslot, idslot]) ) if (param%lrotation) then - call check( nf90_put_var(iu%ncid, iu%Ip1_varid, self%Ip(1), start=[tslot, id]) ) - call check( nf90_put_var(iu%ncid, iu%Ip2_varid, self%Ip(2), start=[tslot, id]) ) - call check( nf90_put_var(iu%ncid, iu%Ip3_varid, self%Ip(3), start=[tslot, id]) ) - call check( nf90_put_var(iu%ncid, iu%rotx_varid, self%rot(1), start=[tslot, id]) ) - call check( nf90_put_var(iu%ncid, iu%roty_varid, self%rot(2), start=[tslot, id]) ) - call check( nf90_put_var(iu%ncid, iu%rotz_varid, self%rot(3), start=[tslot, id]) ) + call check( nf90_put_var(iu%ncid, iu%Ip1_varid, self%Ip(1), start=[tslot, idslot]) ) + call check( nf90_put_var(iu%ncid, iu%Ip2_varid, self%Ip(2), start=[tslot, idslot]) ) + call check( nf90_put_var(iu%ncid, iu%Ip3_varid, self%Ip(3), start=[tslot, idslot]) ) + call check( nf90_put_var(iu%ncid, iu%rotx_varid, self%rot(1), start=[tslot, idslot]) ) + call check( nf90_put_var(iu%ncid, iu%roty_varid, self%rot(2), start=[tslot, idslot]) ) + call check( nf90_put_var(iu%ncid, iu%rotz_varid, self%rot(3), start=[tslot, idslot]) ) end if if (param%ltides) then - call check( nf90_put_var(iu%ncid, iu%k2_varid, self%k2, start=[tslot, id]) ) - call check( nf90_put_var(iu%ncid, iu%Q_varid, self%Q, start=[tslot, id]) ) + call check( nf90_put_var(iu%ncid, iu%k2_varid, self%k2, start=[tslot, idslot]) ) + call check( nf90_put_var(iu%ncid, iu%Q_varid, self%Q, start=[tslot, idslot]) ) end if end select From 0ad89598756110e7a1c4e9a74bde766593098b4c Mon Sep 17 00:00:00 2001 From: David A Minton Date: Fri, 27 Aug 2021 12:49:43 -0400 Subject: [PATCH 066/154] Fixed issues of indexing in the NetCDF code, and started process of cleaning up the strings from NetCDF reads --- examples/symba_mars_disk/testnetcdf.ipynb | 1509 ++++++++++++++++++++- examples/whm_gr_test/Untitled.ipynb | 516 +++++++ examples/whm_gr_test/cb.swiftest.in | 2 +- examples/whm_gr_test/init_cond.py | 10 +- examples/whm_gr_test/param.swifter.in | 6 +- examples/whm_gr_test/param.swiftest.in | 6 +- examples/whm_gr_test/pl.swifter.in | 16 +- examples/whm_gr_test/pl.swiftest.in | 16 +- python/swiftest/swiftest/init_cond.py | 6 +- python/swiftest/swiftest/io.py | 10 +- src/io/io.f90 | 10 +- src/netcdf/netcdf.f90 | 10 +- 12 files changed, 2073 insertions(+), 44 deletions(-) create mode 100644 examples/whm_gr_test/Untitled.ipynb diff --git a/examples/symba_mars_disk/testnetcdf.ipynb b/examples/symba_mars_disk/testnetcdf.ipynb index 8c61f51a0..d98408178 100644 --- a/examples/symba_mars_disk/testnetcdf.ipynb +++ b/examples/symba_mars_disk/testnetcdf.ipynb @@ -4,14 +4,28 @@ "cell_type": "code", "execution_count": 1, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "'/home/daminton/git/swiftest/examples/symba_mars_disk'" + ] + }, + "execution_count": 1, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ - "import swiftest" + "import swiftest\n", + "import os\n", + "import xarray as xr\n", + "os.getcwd()" ] }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 12, "metadata": {}, "outputs": [ { @@ -30,7 +44,1494 @@ ], "source": [ "sim = swiftest.Simulation(param_file=\"param.in\")\n", - "sim.bin2xr()" + "sim.bin2xr()\n" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
<xarray.Dataset>\n",
+       "Dimensions:      (id: 1521, time: 11)\n",
+       "Coordinates:\n",
+       "  * id           (id) int64 1 2 3 4 5 6 7 ... 1515 1516 1517 1518 1519 1520 1521\n",
+       "  * time         (time) float64 0.0 600.0 1.2e+03 ... 4.8e+03 5.4e+03 6e+03\n",
+       "Data variables: (12/46)\n",
+       "    npl          (time) int32 1500 1500 1500 1500 1500 ... 1518 1518 1518 1518\n",
+       "    ntp          (time) int32 0 0 0 0 0 0 0 0 0 0 0\n",
+       "    xhx          (id, time) float64 0.0 0.0 0.0 ... 1.587e+06 2.838e+06\n",
+       "    xhy          (id, time) float64 0.0 0.0 0.0 ... -9.103e+06 -8.791e+06\n",
+       "    xhz          (id, time) float64 0.0 0.0 0.0 ... -3.433e+04 -3.905e+04\n",
+       "    vhx          (id, time) float64 0.0 0.0 0.0 ... 2.118e+03 2.045e+03\n",
+       "    ...           ...\n",
+       "    py_origin    (id) float64 0.0 -4.373e+06 ... -8.094e+06 -8.123e+06\n",
+       "    pz_origin    (id) float64 0.0 -9.627e+03 2.41e+04 ... 2.923e+03 -3.139e+03\n",
+       "    vhx_origin   (id) float64 0.0 988.0 1.016e+03 ... 1.881e+03 1.887e+03\n",
+       "    vhy_origin   (id) float64 0.0 -1.888e+03 ... -1.004e+03 -1.027e+03\n",
+       "    vhz_origin   (id) float64 0.0 10.69 -2.604 -1.465 ... 18.95 -9.448 -12.51\n",
+       "    origin_type  (id) <U32 'Central body' ... 'Supercatastrophic'
" + ], + "text/plain": [ + "\n", + "Dimensions: (id: 1521, time: 11)\n", + "Coordinates:\n", + " * id (id) int64 1 2 3 4 5 6 7 ... 1515 1516 1517 1518 1519 1520 1521\n", + " * time (time) float64 0.0 600.0 1.2e+03 ... 4.8e+03 5.4e+03 6e+03\n", + "Data variables: (12/46)\n", + " npl (time) int32 ...\n", + " ntp (time) int32 ...\n", + " xhx (id, time) float64 ...\n", + " xhy (id, time) float64 ...\n", + " xhz (id, time) float64 ...\n", + " vhx (id, time) float64 ...\n", + " ... ...\n", + " py_origin (id) float64 0.0 -4.373e+06 ... -8.094e+06 -8.123e+06\n", + " pz_origin (id) float64 0.0 -9.627e+03 2.41e+04 ... 2.923e+03 -3.139e+03\n", + " vhx_origin (id) float64 0.0 988.0 1.016e+03 ... 1.881e+03 1.887e+03\n", + " vhy_origin (id) float64 0.0 -1.888e+03 ... -1.004e+03 -1.027e+03\n", + " vhz_origin (id) float64 0.0 10.69 -2.604 -1.465 ... 18.95 -9.448 -12.51\n", + " origin_type (id) \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
<xarray.Dataset>\n",
+       "Dimensions:      (id: 1521)\n",
+       "Coordinates:\n",
+       "  * id           (id) int32 1 1130 216 1326 20 27 ... 1517 1518 1519 1520 1521\n",
+       "Data variables:\n",
+       "    time_origin  (id) float64 0.0 0.0 0.0 0.0 ... 2.4e+03 2.4e+03 2.4e+03\n",
+       "    xhx_origin   (id) float64 0.0 1.047e+07 -1.034e+07 ... -4.435e+06 -4.426e+06\n",
+       "    py_origin    (id) float64 0.0 3.395e+06 2.852e+05 ... -8.094e+06 -8.123e+06\n",
+       "    pz_origin    (id) float64 0.0 2.709e+04 -3.221e+04 ... 2.923e+03 -3.139e+03\n",
+       "    vhx_origin   (id) float64 0.0 -597.1 -50.0 ... 1.885e+03 1.881e+03 1.887e+03\n",
+       "    vhy_origin   (id) float64 0.0 1.881e+03 -2.018e+03 ... -1.004e+03 -1.027e+03\n",
+       "    vhz_origin   (id) float64 0.0 -6.96 11.61 3.592 ... 18.95 -9.448 -12.51\n",
+       "    origin_type  (id) <U32 'Central body' ... 'Supercatastrophic'
" + ], + "text/plain": [ + "\n", + "Dimensions: (id: 1521)\n", + "Coordinates:\n", + " * id (id) int32 1 1130 216 1326 20 27 ... 1517 1518 1519 1520 1521\n", + "Data variables:\n", + " time_origin (id) float64 0.0 0.0 0.0 0.0 ... 2.4e+03 2.4e+03 2.4e+03\n", + " xhx_origin (id) float64 0.0 1.047e+07 -1.034e+07 ... -4.435e+06 -4.426e+06\n", + " py_origin (id) float64 0.0 3.395e+06 2.852e+05 ... -8.094e+06 -8.123e+06\n", + " pz_origin (id) float64 0.0 2.709e+04 -3.221e+04 ... 2.923e+03 -3.139e+03\n", + " vhx_origin (id) float64 0.0 -597.1 -50.0 ... 1.885e+03 1.881e+03 1.887e+03\n", + " vhy_origin (id) float64 0.0 1.881e+03 -2.018e+03 ... -1.004e+03 -1.027e+03\n", + " vhz_origin (id) float64 0.0 -6.96 11.61 3.592 ... 18.95 -9.448 -12.51\n", + " origin_type (id) 0, drop=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "ename": "KeyError", + "evalue": "216", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mKeyError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m~/.conda/envs/cent7/2020.02-py37/swiftestOOF/lib/python3.7/site-packages/pandas/core/indexes/base.py\u001b[0m in \u001b[0;36mget_loc\u001b[0;34m(self, key, method, tolerance)\u001b[0m\n\u001b[1;32m 3079\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-> 3080\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_engine\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_loc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcasted_key\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 3081\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mKeyError\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0merr\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32mpandas/_libs/index.pyx\u001b[0m in \u001b[0;36mpandas._libs.index.IndexEngine.get_loc\u001b[0;34m()\u001b[0m\n", + "\u001b[0;32mpandas/_libs/index.pyx\u001b[0m in \u001b[0;36mpandas._libs.index.IndexEngine.get_loc\u001b[0;34m()\u001b[0m\n", + "\u001b[0;32mpandas/_libs/hashtable_class_helper.pxi\u001b[0m in \u001b[0;36mpandas._libs.hashtable.Int64HashTable.get_item\u001b[0;34m()\u001b[0m\n", + "\u001b[0;32mpandas/_libs/hashtable_class_helper.pxi\u001b[0m in \u001b[0;36mpandas._libs.hashtable.Int64HashTable.get_item\u001b[0;34m()\u001b[0m\n", + "\u001b[0;31mKeyError\u001b[0m: 216", + "\nThe above exception was the direct cause of the following exception:\n", + "\u001b[0;31mKeyError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mnewp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msel\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mid\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m216\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~/.conda/envs/cent7/2020.02-py37/swiftestOOF/lib/python3.7/site-packages/xarray/core/dataset.py\u001b[0m in \u001b[0;36msel\u001b[0;34m(self, indexers, method, tolerance, drop, **indexers_kwargs)\u001b[0m\n\u001b[1;32m 2347\u001b[0m \u001b[0mindexers\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0meither_dict_or_kwargs\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mindexers\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mindexers_kwargs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m\"sel\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2348\u001b[0m pos_indexers, new_indexes = remap_label_indexers(\n\u001b[0;32m-> 2349\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mindexers\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mindexers\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmethod\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mmethod\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtolerance\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mtolerance\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2350\u001b[0m )\n\u001b[1;32m 2351\u001b[0m \u001b[0mresult\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0misel\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mindexers\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mpos_indexers\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdrop\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mdrop\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/coordinates.py\u001b[0m in \u001b[0;36mremap_label_indexers\u001b[0;34m(obj, indexers, method, tolerance, **indexers_kwargs)\u001b[0m\n\u001b[1;32m 418\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 419\u001b[0m pos_indexers, new_indexes = indexing.remap_label_indexers(\n\u001b[0;32m--> 420\u001b[0;31m \u001b[0mobj\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mv_indexers\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmethod\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mmethod\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtolerance\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mtolerance\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 421\u001b[0m )\n\u001b[1;32m 422\u001b[0m \u001b[0;31m# attach indexer's coordinate to pos_indexers\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/indexing.py\u001b[0m in \u001b[0;36mremap_label_indexers\u001b[0;34m(data_obj, indexers, method, tolerance)\u001b[0m\n\u001b[1;32m 276\u001b[0m \u001b[0mcoords_dtype\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mdata_obj\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcoords\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mdim\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdtype\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 277\u001b[0m \u001b[0mlabel\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mmaybe_cast_to_coords_dtype\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mlabel\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcoords_dtype\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 278\u001b[0;31m \u001b[0midxr\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mnew_idx\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mconvert_label_indexer\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mindex\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlabel\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdim\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmethod\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtolerance\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 279\u001b[0m \u001b[0mpos_indexers\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mdim\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0midxr\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 280\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mnew_idx\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0;32mNone\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/indexing.py\u001b[0m in \u001b[0;36mconvert_label_indexer\u001b[0;34m(index, label, index_name, method, tolerance)\u001b[0m\n\u001b[1;32m 197\u001b[0m \u001b[0mindexer\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mindex\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_loc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mlabel_value\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 198\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 199\u001b[0;31m \u001b[0mindexer\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mindex\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_loc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mlabel_value\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmethod\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mmethod\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtolerance\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mtolerance\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 200\u001b[0m \u001b[0;32melif\u001b[0m \u001b[0mlabel\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdtype\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mkind\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;34m\"b\"\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 201\u001b[0m \u001b[0mindexer\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mlabel\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/pandas/core/indexes/base.py\u001b[0m in \u001b[0;36mget_loc\u001b[0;34m(self, key, method, tolerance)\u001b[0m\n\u001b[1;32m 3080\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_engine\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_loc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcasted_key\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3081\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mKeyError\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0merr\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 3082\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mKeyError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mkey\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0merr\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 3083\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3084\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mtolerance\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mKeyError\u001b[0m: 216" + ] + } + ], + "source": [] + }, + { + "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.Dataset>\n",
+       "Dimensions:      ()\n",
+       "Coordinates:\n",
+       "    id           int32 216\n",
+       "Data variables:\n",
+       "    time_origin  float64 0.0\n",
+       "    xhx_origin   float64 -1.034e+07\n",
+       "    py_origin    float64 2.852e+05\n",
+       "    pz_origin    float64 -3.221e+04\n",
+       "    vhx_origin   float64 -50.0\n",
+       "    vhy_origin   float64 -2.018e+03\n",
+       "    vhz_origin   float64 11.61\n",
+       "    origin_type  <U32 'Initial conditions'
" + ], + "text/plain": [ + "\n", + "Dimensions: ()\n", + "Coordinates:\n", + " id int32 216\n", + "Data variables:\n", + " time_origin float64 0.0\n", + " xhx_origin float64 -1.034e+07\n", + " py_origin float64 2.852e+05\n", + " pz_origin float64 -3.221e+04\n", + " vhx_origin float64 -50.0\n", + " vhy_origin float64 -2.018e+03\n", + " vhz_origin float64 11.61\n", + " origin_type \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
<xarray.DataArray 'name' (str: 32)>\n",
+       "array([b'M', b'e', b'r', b'c', b'u', b'r', b'y', b'', b'', b'', b'', b'', b'',\n",
+       "       b'', b'', b'', b'', b'', b'', b'', b'', b'', b'', b'', b'', b'', b'',\n",
+       "       b'', b'', b'', b'', b''], dtype='|S1')\n",
+       "Coordinates:\n",
+       "    id       int32 1\n",
+       "Dimensions without coordinates: str
" + ], + "text/plain": [ + "\n", + "array([b'M', b'e', b'r', b'c', b'u', b'r', b'y', b'', b'', b'', b'', b'', b'',\n", + " b'', b'', b'', b'', b'', b'', b'', b'', b'', b'', b'', b'', b'', b'',\n", + " b'', b'', b'', b'', b''], dtype='|S1')\n", + "Coordinates:\n", + " id int32 1\n", + "Dimensions without coordinates: str" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "sim.ds.sel(id=1)['name']" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "ds = sim.ds" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "ename": "SyntaxError", + "evalue": "can't assign to function call (, line 2)", + "output_type": "error", + "traceback": [ + "\u001b[0;36m File \u001b[0;32m\"\"\u001b[0;36m, line \u001b[0;32m2\u001b[0m\n\u001b[0;31m ds['name'].sel(id=i) = 'test'\u001b[0m\n\u001b[0m ^\u001b[0m\n\u001b[0;31mSyntaxError\u001b[0m\u001b[0;31m:\u001b[0m can't assign to function call\n" + ] + } + ], + "source": [ + "for i in ds.id:\n", + " ds['name'].sel(id=i) = 'test'" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array('SMVEMJSUNueeaauarenrnrrptap\\x00cutsiunt\\x00ush\\x00truu\\x00r\\x00\\x00\\x00ensn\\x00y\\x00\\x00\\x00r\\x00\\x00e',\n", + " dtype=' Date: Fri, 27 Aug 2021 14:33:01 -0400 Subject: [PATCH 067/154] Fixed array order problems for dimension id arrays in the NetCDF file --- python/swiftest/swiftest/io.py | 18 +++++ src/netcdf/netcdf.f90 | 123 ++++++++++++++++----------------- 2 files changed, 78 insertions(+), 63 deletions(-) diff --git a/python/swiftest/swiftest/io.py b/python/swiftest/swiftest/io.py index 8ee84a902..85d99d4f6 100644 --- a/python/swiftest/swiftest/io.py +++ b/python/swiftest/swiftest/io.py @@ -710,6 +710,24 @@ def swiftest2xr(param): return ds +def clean_string_values(param, ds): + """ + Cleans up the string values in the DataSet that have artifacts as a result of coming from NetCDF Fortran + + Parameters + ---------- + param : dict + ds : xarray dataset + + Returns + ------- + dscleanstring : xarray dataset with the strings cleaned up + """ + + dscleanstring = ds + return dscleanstring + + def swiftest_particle_stream(f): """ Reads in a Swiftest particle.dat file and returns a single frame of particle data as a datastream diff --git a/src/netcdf/netcdf.f90 b/src/netcdf/netcdf.f90 index 0cd91ac50..2abcbead1 100644 --- a/src/netcdf/netcdf.f90 +++ b/src/netcdf/netcdf.f90 @@ -54,7 +54,6 @@ module subroutine netcdf_initialize_output(self, param) call check( nf90_def_dim(self%ncid, ID_DIMNAME, NF90_UNLIMITED, self%id_dimid) ) ! 'x' dimension call check( nf90_def_dim(self%ncid, TIME_DIMNAME, NF90_UNLIMITED, self%time_dimid) ) ! 'y' dimension call check( nf90_def_dim(self%ncid, STR_DIMNAME, NAMELEN, self%str_dimid) ) ! Dimension for string variables (aka character arrays) - self%dimids = [self%time_dimid, self%id_dimid, self%str_dimid] select case (param%out_type) case(NETCDF_FLOAT_TYPE) @@ -68,39 +67,39 @@ module subroutine netcdf_initialize_output(self, param) call check( nf90_def_var(self%ncid, ID_DIMNAME, NF90_INT, self%id_dimid, self%id_varid) ) call check( nf90_def_var(self%ncid, NPL_VARNAME, NF90_INT, self%time_dimid, self%npl_varid) ) call check( nf90_def_var(self%ncid, NTP_VARNAME, NF90_INT, self%time_dimid, self%ntp_varid) ) - call check( nf90_def_var(self%ncid, NAME_VARNAME, NF90_CHAR, [self%id_dimid, self%str_dimid], self%name_varid) ) + call check( nf90_def_var(self%ncid, NAME_VARNAME, NF90_CHAR, [self%str_dimid, self%id_dimid], self%name_varid) ) if ((param%out_form == XV) .or. (param%out_form == XVEL)) then - call check( nf90_def_var(self%ncid, XHX_VARNAME, self%out_type, self%dimids, self%xhx_varid) ) - call check( nf90_def_var(self%ncid, XHY_VARNAME, self%out_type, self%dimids, self%xhy_varid) ) - call check( nf90_def_var(self%ncid, XHZ_VARNAME, self%out_type, self%dimids, self%xhz_varid) ) - call check( nf90_def_var(self%ncid, VHX_VARNAME, self%out_type, self%dimids, self%vhx_varid) ) - call check( nf90_def_var(self%ncid, VHY_VARNAME, self%out_type, self%dimids, self%vhy_varid) ) - call check( nf90_def_var(self%ncid, VHZ_VARNAME, self%out_type, self%dimids, self%vhz_varid) ) + call check( nf90_def_var(self%ncid, XHX_VARNAME, self%out_type, [self%id_dimid, self%time_dimid], self%xhx_varid) ) + call check( nf90_def_var(self%ncid, XHY_VARNAME, self%out_type, [self%id_dimid, self%time_dimid], self%xhy_varid) ) + call check( nf90_def_var(self%ncid, XHZ_VARNAME, self%out_type, [self%id_dimid, self%time_dimid], self%xhz_varid) ) + call check( nf90_def_var(self%ncid, VHX_VARNAME, self%out_type, [self%id_dimid, self%time_dimid], self%vhx_varid) ) + call check( nf90_def_var(self%ncid, VHY_VARNAME, self%out_type, [self%id_dimid, self%time_dimid], self%vhy_varid) ) + call check( nf90_def_var(self%ncid, VHZ_VARNAME, self%out_type, [self%id_dimid, self%time_dimid], self%vhz_varid) ) end if if ((param%out_form == EL) .or. (param%out_form == XVEL)) then - call check( nf90_def_var(self%ncid, A_VARNAME, self%out_type, self%dimids, self%a_varid) ) - call check( nf90_def_var(self%ncid, E_VARNAME, self%out_type, self%dimids, self%e_varid) ) - call check( nf90_def_var(self%ncid, INC_VARNAME, self%out_type, self%dimids, self%inc_varid) ) - call check( nf90_def_var(self%ncid, CAPOM_VARNAME, self%out_type, self%dimids, self%capom_varid) ) - call check( nf90_def_var(self%ncid, OMEGA_VARNAME, self%out_type, self%dimids, self%omega_varid) ) - call check( nf90_def_var(self%ncid, CAPM_VARNAME, self%out_type, self%dimids, self%capm_varid) ) + call check( nf90_def_var(self%ncid, A_VARNAME, self%out_type, [self%id_dimid, self%time_dimid], self%a_varid) ) + call check( nf90_def_var(self%ncid, E_VARNAME, self%out_type, [self%id_dimid, self%time_dimid], self%e_varid) ) + call check( nf90_def_var(self%ncid, INC_VARNAME, self%out_type, [self%id_dimid, self%time_dimid], self%inc_varid) ) + call check( nf90_def_var(self%ncid, CAPOM_VARNAME, self%out_type, [self%id_dimid, self%time_dimid], self%capom_varid) ) + call check( nf90_def_var(self%ncid, OMEGA_VARNAME, self%out_type, [self%id_dimid, self%time_dimid], self%omega_varid) ) + call check( nf90_def_var(self%ncid, CAPM_VARNAME, self%out_type, [self%id_dimid, self%time_dimid], self%capm_varid) ) end if - call check( nf90_def_var(self%ncid, GMASS_VARNAME, self%out_type, self%dimids, self%Gmass_varid) ) - if (param%lrhill_present) call check( nf90_def_var(self%ncid, RHILL_VARNAME, self%out_type, self%dimids, self%rhill_varid) ) - if (param%lclose) call check( nf90_def_var(self%ncid, RADIUS_VARNAME, self%out_type, self%dimids, self%radius_varid) ) + call check( nf90_def_var(self%ncid, GMASS_VARNAME, self%out_type, [self%id_dimid, self%time_dimid], self%Gmass_varid) ) + if (param%lrhill_present) call check( nf90_def_var(self%ncid, RHILL_VARNAME, self%out_type, [self%id_dimid, self%time_dimid], self%rhill_varid) ) + if (param%lclose) call check( nf90_def_var(self%ncid, RADIUS_VARNAME, self%out_type, [self%id_dimid, self%time_dimid], self%radius_varid) ) if (param%lrotation) then - call check( nf90_def_var(self%ncid, IP1_VARNAME, self%out_type, self%dimids, self%Ip1_varid) ) - call check( nf90_def_var(self%ncid, IP2_VARNAME, self%out_type, self%dimids, self%Ip2_varid) ) - call check( nf90_def_var(self%ncid, IP3_VARNAME, self%out_type, self%dimids, self%Ip3_varid) ) - call check( nf90_def_var(self%ncid, ROTX_VARNAME, self%out_type, self%dimids, self%rotx_varid) ) - call check( nf90_def_var(self%ncid, ROTY_VARNAME, self%out_type, self%dimids, self%roty_varid) ) - call check( nf90_def_var(self%ncid, ROTZ_VARNAME, self%out_type, self%dimids, self%rotz_varid) ) + call check( nf90_def_var(self%ncid, IP1_VARNAME, self%out_type, [self%id_dimid, self%time_dimid], self%Ip1_varid) ) + call check( nf90_def_var(self%ncid, IP2_VARNAME, self%out_type, [self%id_dimid, self%time_dimid], self%Ip2_varid) ) + call check( nf90_def_var(self%ncid, IP3_VARNAME, self%out_type, [self%id_dimid, self%time_dimid], self%Ip3_varid) ) + call check( nf90_def_var(self%ncid, ROTX_VARNAME, self%out_type, [self%id_dimid, self%time_dimid], self%rotx_varid) ) + call check( nf90_def_var(self%ncid, ROTY_VARNAME, self%out_type, [self%id_dimid, self%time_dimid], self%roty_varid) ) + call check( nf90_def_var(self%ncid, ROTZ_VARNAME, self%out_type, [self%id_dimid, self%time_dimid], self%rotz_varid) ) end if if (param%ltides) then - call check( nf90_def_var(self%ncid, K2_VARNAME, self%out_type, self%dimids, self%k2_varid) ) - call check( nf90_def_var(self%ncid, Q_VARNAME, self%out_type, self%dimids, self%Q_varid) ) + call check( nf90_def_var(self%ncid, K2_VARNAME, self%out_type, [self%id_dimid, self%time_dimid], self%k2_varid) ) + call check( nf90_def_var(self%ncid, Q_VARNAME, self%out_type, [self%id_dimid, self%time_dimid], self%Q_varid) ) end if if (param%lenergy) then call check( nf90_def_var(self%ncid, KE_ORB_VARNAME, self%out_type, self%time_dimid, self%KE_orb_varid) ) @@ -146,7 +145,6 @@ module subroutine netcdf_open(self, param) call check( nf90_inq_varid(self%ncid, NTP_VARNAME, self%ntp_varid)) call check( nf90_inq_varid(self%ncid, NAME_VARNAME, self%name_varid)) - !call check( nf90_inq_varid(self%ncid, NAME_VARNAME, self%name_varid)) if ((param%out_form == XV) .or. (param%out_form == XVEL)) then call check( nf90_inq_varid(self%ncid, XHX_VARNAME, self%xhx_varid)) call check( nf90_inq_varid(self%ncid, XHY_VARNAME, self%xhy_varid)) @@ -235,66 +233,66 @@ module subroutine netcdf_write_frame_base(self, iu, param) call check( nf90_put_var(iu%ncid, iu%id_varid, self%id(j), start=[idslot]) ) name = trim(adjustl(self%name(j))) strlen = len(name) - call check( nf90_put_var(iu%ncid, iu%name_varid, name, start=[idslot, 1], count=[1, strlen]) ) + call check( nf90_put_var(iu%ncid, iu%name_varid, name, start=[1, idslot], count=[strlen, 1]) ) if ((param%out_form == XV) .or. (param%out_form == XVEL)) then - call check( nf90_put_var(iu%ncid, iu%xhx_varid, self%xh(1, j), start=[tslot, idslot]) ) - call check( nf90_put_var(iu%ncid, iu%xhy_varid, self%xh(2, j), start=[tslot, idslot]) ) - call check( nf90_put_var(iu%ncid, iu%xhz_varid, self%xh(3, j), start=[tslot, idslot]) ) - call check( nf90_put_var(iu%ncid, iu%vhx_varid, self%vh(1, j), start=[tslot, idslot]) ) - call check( nf90_put_var(iu%ncid, iu%vhy_varid, self%vh(2, j), start=[tslot, idslot]) ) - call check( nf90_put_var(iu%ncid, iu%vhz_varid, self%vh(3, j), start=[tslot, idslot]) ) + call check( nf90_put_var(iu%ncid, iu%xhx_varid, self%xh(1, j), start=[idslot, tslot]) ) + call check( nf90_put_var(iu%ncid, iu%xhy_varid, self%xh(2, j), start=[idslot, tslot]) ) + call check( nf90_put_var(iu%ncid, iu%xhz_varid, self%xh(3, j), start=[idslot, tslot]) ) + call check( nf90_put_var(iu%ncid, iu%vhx_varid, self%vh(1, j), start=[idslot, tslot]) ) + call check( nf90_put_var(iu%ncid, iu%vhy_varid, self%vh(2, j), start=[idslot, tslot]) ) + call check( nf90_put_var(iu%ncid, iu%vhz_varid, self%vh(3, j), start=[idslot, tslot]) ) end if if ((param%out_form == EL) .or. (param%out_form == XVEL)) then - call check( nf90_put_var(iu%ncid, iu%a_varid, self%a(j), start=[tslot, idslot]) ) - call check( nf90_put_var(iu%ncid, iu%e_varid, self%e(j), start=[tslot, idslot]) ) - call check( nf90_put_var(iu%ncid, iu%inc_varid, self%inc(j), start=[tslot, idslot]) ) - call check( nf90_put_var(iu%ncid, iu%capom_varid, self%capom(j), start=[tslot, idslot]) ) - call check( nf90_put_var(iu%ncid, iu%omega_varid, self%omega(j), start=[tslot, idslot]) ) - call check( nf90_put_var(iu%ncid, iu%capm_varid, self%capm(j), start=[tslot, idslot]) ) + call check( nf90_put_var(iu%ncid, iu%a_varid, self%a(j), start=[idslot, tslot]) ) + call check( nf90_put_var(iu%ncid, iu%e_varid, self%e(j), start=[idslot, tslot]) ) + call check( nf90_put_var(iu%ncid, iu%inc_varid, self%inc(j), start=[idslot, tslot]) ) + call check( nf90_put_var(iu%ncid, iu%capom_varid, self%capom(j), start=[idslot, tslot]) ) + call check( nf90_put_var(iu%ncid, iu%omega_varid, self%omega(j), start=[idslot, tslot]) ) + call check( nf90_put_var(iu%ncid, iu%capm_varid, self%capm(j), start=[idslot, tslot]) ) end if select type(pl => self) class is (swiftest_pl) ! Additional output if the passed polymorphic object is a massive body - call check( nf90_put_var(iu%ncid, iu%Gmass_varid, pl%Gmass(j), start=[tslot, idslot]) ) + call check( nf90_put_var(iu%ncid, iu%Gmass_varid, pl%Gmass(j), start=[idslot, tslot]) ) if (param%lrhill_present) then - call check( nf90_put_var(iu%ncid, iu%rhill_varid, pl%rhill(j), start=[tslot, idslot]) ) + call check( nf90_put_var(iu%ncid, iu%rhill_varid, pl%rhill(j), start=[idslot, tslot]) ) end if if (param%lclose) then - call check( nf90_put_var(iu%ncid, iu%radius_varid, pl%radius(j), start=[tslot, idslot]) ) + call check( nf90_put_var(iu%ncid, iu%radius_varid, pl%radius(j), start=[idslot, tslot]) ) end if if (param%lrotation) then - call check( nf90_put_var(iu%ncid, iu%Ip1_varid, pl%Ip(1, j), start=[tslot, idslot]) ) - call check( nf90_put_var(iu%ncid, iu%Ip2_varid, pl%Ip(2, j), start=[tslot, idslot]) ) - call check( nf90_put_var(iu%ncid, iu%Ip3_varid, pl%Ip(3, j), start=[tslot, idslot]) ) - call check( nf90_put_var(iu%ncid, iu%rotx_varid, pl%rot(1, j), start=[tslot, idslot]) ) - call check( nf90_put_var(iu%ncid, iu%roty_varid, pl%rot(2, j), start=[tslot, idslot]) ) - call check( nf90_put_var(iu%ncid, iu%rotz_varid, pl%rot(3, j), start=[tslot, idslot]) ) + call check( nf90_put_var(iu%ncid, iu%Ip1_varid, pl%Ip(1, j), start=[idslot, tslot]) ) + call check( nf90_put_var(iu%ncid, iu%Ip2_varid, pl%Ip(2, j), start=[idslot, tslot]) ) + call check( nf90_put_var(iu%ncid, iu%Ip3_varid, pl%Ip(3, j), start=[idslot, tslot]) ) + call check( nf90_put_var(iu%ncid, iu%rotx_varid, pl%rot(1, j), start=[idslot, tslot]) ) + call check( nf90_put_var(iu%ncid, iu%roty_varid, pl%rot(2, j), start=[idslot, tslot]) ) + call check( nf90_put_var(iu%ncid, iu%rotz_varid, pl%rot(3, j), start=[idslot, tslot]) ) end if if (param%ltides) then - call check( nf90_put_var(iu%ncid, iu%k2_varid, pl%k2(j), start=[tslot, idslot]) ) - call check( nf90_put_var(iu%ncid, iu%Q_varid, pl%Q(j), start=[tslot, idslot]) ) + call check( nf90_put_var(iu%ncid, iu%k2_varid, pl%k2(j), start=[idslot, tslot]) ) + call check( nf90_put_var(iu%ncid, iu%Q_varid, pl%Q(j), start=[idslot, tslot]) ) end if end select end do end associate class is (swiftest_cb) idslot = self%id + 1 - call check( nf90_put_var(iu%ncid, iu%id_varid, id, start=[idslot]) ) + call check( nf90_put_var(iu%ncid, iu%id_varid, self%id, start=[idslot]) ) name = trim(adjustl(self%name)) strlen = len(name) - call check( nf90_put_var(iu%ncid, iu%name_varid, name, start=[idslot, 1], count=[1, strlen]) ) - call check( nf90_put_var(iu%ncid, iu%Gmass_varid, self%Gmass, start=[tslot, idslot]) ) - call check( nf90_put_var(iu%ncid, iu%radius_varid, self%radius, start=[tslot, idslot]) ) + call check( nf90_put_var(iu%ncid, iu%name_varid, name, start=[1, idslot], count=[strlen, 1]) ) + call check( nf90_put_var(iu%ncid, iu%Gmass_varid, self%Gmass, start=[idslot, tslot]) ) + call check( nf90_put_var(iu%ncid, iu%radius_varid, self%radius, start=[idslot, tslot]) ) if (param%lrotation) then - call check( nf90_put_var(iu%ncid, iu%Ip1_varid, self%Ip(1), start=[tslot, idslot]) ) - call check( nf90_put_var(iu%ncid, iu%Ip2_varid, self%Ip(2), start=[tslot, idslot]) ) - call check( nf90_put_var(iu%ncid, iu%Ip3_varid, self%Ip(3), start=[tslot, idslot]) ) - call check( nf90_put_var(iu%ncid, iu%rotx_varid, self%rot(1), start=[tslot, idslot]) ) - call check( nf90_put_var(iu%ncid, iu%roty_varid, self%rot(2), start=[tslot, idslot]) ) - call check( nf90_put_var(iu%ncid, iu%rotz_varid, self%rot(3), start=[tslot, idslot]) ) + call check( nf90_put_var(iu%ncid, iu%Ip1_varid, self%Ip(1), start=[idslot, tslot]) ) + call check( nf90_put_var(iu%ncid, iu%Ip2_varid, self%Ip(2), start=[idslot, tslot]) ) + call check( nf90_put_var(iu%ncid, iu%Ip3_varid, self%Ip(3), start=[idslot, tslot]) ) + call check( nf90_put_var(iu%ncid, iu%rotx_varid, self%rot(1), start=[idslot, tslot]) ) + call check( nf90_put_var(iu%ncid, iu%roty_varid, self%rot(2), start=[idslot, tslot]) ) + call check( nf90_put_var(iu%ncid, iu%rotz_varid, self%rot(3), start=[idslot, tslot]) ) end if if (param%ltides) then - call check( nf90_put_var(iu%ncid, iu%k2_varid, self%k2, start=[tslot, idslot]) ) - call check( nf90_put_var(iu%ncid, iu%Q_varid, self%Q, start=[tslot, idslot]) ) + call check( nf90_put_var(iu%ncid, iu%k2_varid, self%k2, start=[idslot, tslot]) ) + call check( nf90_put_var(iu%ncid, iu%Q_varid, self%Q, start=[idslot, tslot]) ) end if end select @@ -346,5 +344,4 @@ module subroutine netcdf_write_hdr_system(self, iu, param) end subroutine netcdf_write_hdr_system - end submodule s_netcdf \ No newline at end of file From defb93ee2af65d2bf1d134279fffa014b3da9af6 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Fri, 27 Aug 2021 14:38:09 -0400 Subject: [PATCH 068/154] Completed clean_string_values function. --- python/swiftest/swiftest/io.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/python/swiftest/swiftest/io.py b/python/swiftest/swiftest/io.py index 85d99d4f6..1eb8df95e 100644 --- a/python/swiftest/swiftest/io.py +++ b/python/swiftest/swiftest/io.py @@ -721,11 +721,10 @@ def clean_string_values(param, ds): Returns ------- - dscleanstring : xarray dataset with the strings cleaned up + ds : xarray dataset with the strings cleaned up """ - - dscleanstring = ds - return dscleanstring + ds['name'] = ds['name'].str.decode(encoding='utf-8') + return ds def swiftest_particle_stream(f): From 0fb9a2cc4501aacf6d8ba06bf236d0aff06ce2a2 Mon Sep 17 00:00:00 2001 From: David Minton Date: Fri, 27 Aug 2021 14:43:41 -0400 Subject: [PATCH 069/154] Auto stash before merge of "IO" and "origin/IO" --- python/swiftest/swiftest/init_cond.py | 8 ++++---- python/swiftest/swiftest/simulation_class.py | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/python/swiftest/swiftest/init_cond.py b/python/swiftest/swiftest/init_cond.py index b98680f62..ca959f3f9 100644 --- a/python/swiftest/swiftest/init_cond.py +++ b/python/swiftest/swiftest/init_cond.py @@ -118,7 +118,7 @@ def solar_system_horizons(plname, idval, param, ephemerides_start_date, ds): rotcb = solarpole.cartesian * solarrot Ipsun = np.array([0.0, 0.0, planetIpz['Sun']]) - cbid = np.array([1]) + cbid = np.array([0]) cvec = np.vstack([GMcb, Rcb, J2RP2, J4RP4]) if param['ROTATION'] == 'YES': cvec = np.vstack([cvec, Ipsun[0], Ipsun[1], Ipsun[2], rotcb.x, rotcb.y, rotcb.z]) @@ -264,9 +264,9 @@ def solar_system_horizons(plname, idval, param, ephemerides_start_date, ds): plab = tlab.copy() if idval is None: - plid = np.array([planetid[key]], dtype=int) + 1 + plid = np.array([planetid[key]], dtype=int) else: - plid = np.array([idval]+1, dtype=int) + plid = np.array([idval], dtype=int) # Prepare frames by adding an extra axis for the time coordinate plframe = np.expand_dims(pvec.T, axis=0) @@ -277,7 +277,7 @@ def solar_system_horizons(plname, idval, param, ephemerides_start_date, ds): return ds -def vec2xr(param, names, idvals, v1, v2, v3, v4, v5, v6, GMpl=None, Rpl=None, rhill=None, Ip1=None, Ip2=None, Ip3=None, rotx=None, roty=None, rotz=None, t=0.0): +def vec2xr(param, idvals, namevals, v1, v2, v3, v4, v5, v6, GMpl=None, Rpl=None, rhill=None, Ip1=None, Ip2=None, Ip3=None, rotx=None, roty=None, rotz=None, t=0.0): if param['ROTATION'] == 'YES': if Ip1 is None: diff --git a/python/swiftest/swiftest/simulation_class.py b/python/swiftest/swiftest/simulation_class.py index f3047fa71..3a3834434 100644 --- a/python/swiftest/swiftest/simulation_class.py +++ b/python/swiftest/swiftest/simulation_class.py @@ -74,7 +74,7 @@ def add(self, plname, date=date.today().isoformat(), idval=None): return - def addp(self, idvals, t1, t2, t3, t4, t5, t6, GMpl=None, Rpl=None, rhill=None, Ip1=None, Ip2=None, Ip3=None, rotx=None, roty=None, rotz=None): + def addp(self, idvals, namevals, t1, t2, t3, t4, t5, t6, GMpl=None, Rpl=None, rhill=None, Ip1=None, Ip2=None, Ip3=None, rotx=None, roty=None, rotz=None): """ Adds a body (test particle or massive body) to the internal DataSet given a set up 6 vectors (orbital elements or cartesian state vectors, depending on the value of self.param). Input all angles in degress @@ -99,7 +99,7 @@ def addp(self, idvals, t1, t2, t3, t4, t5, t6, GMpl=None, Rpl=None, rhill=None, """ t = self.param['T0'] - dsnew = init_cond.vec2xr(self.param, idvals, t1, t2, t3, t4, t5, t6, GMpl, Rpl, rhill, Ip1, Ip2, Ip3, rotx, roty, rotz, t) + dsnew = init_cond.vec2xr(self.param, idvals, namevales, t1, t2, t3, t4, t5, t6, GMpl, Rpl, rhill, Ip1, Ip2, Ip3, rotx, roty, rotz, t) if dsnew is not None: self.ds = xr.combine_by_coords([self.ds, dsnew]) return From a56ea8108143b2e6368baac47b6444bd8135f364 Mon Sep 17 00:00:00 2001 From: David Minton Date: Fri, 27 Aug 2021 14:44:22 -0400 Subject: [PATCH 070/154] Refactored argument name of name list as namevals for consistency --- python/swiftest/swiftest/init_cond.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/swiftest/swiftest/init_cond.py b/python/swiftest/swiftest/init_cond.py index ca959f3f9..e0d3b749d 100644 --- a/python/swiftest/swiftest/init_cond.py +++ b/python/swiftest/swiftest/init_cond.py @@ -320,7 +320,7 @@ def vec2xr(param, idvals, namevals, v1, v2, v3, v4, v5, v6, GMpl=None, Rpl=None, else: bodyxr = xr.DataArray(bodyframe, dims=dims, coords={'time': [t], 'id': idvals, 'vec': tlab}) - bodyxr = bodyxr.assign_coords(name=('id', names)) + bodyxr = bodyxr.assign_coords(name=('id', namevals)) ds = bodyxr.to_dataset(dim='vec') return ds \ No newline at end of file From 9af4c72fe9d67b37398e4fd475efe1dfe9cc2a35 Mon Sep 17 00:00:00 2001 From: David Minton Date: Fri, 27 Aug 2021 14:46:35 -0400 Subject: [PATCH 071/154] Fixed indexing of central body --- examples/whm_gr_test/pl.swifter.in | 18 +++++++++--------- examples/whm_gr_test/pl.swiftest.in | 16 ++++++++-------- python/swiftest/swiftest/io.py | 8 ++++---- 3 files changed, 21 insertions(+), 21 deletions(-) diff --git a/examples/whm_gr_test/pl.swifter.in b/examples/whm_gr_test/pl.swifter.in index e88c0fcf3..a27e62f95 100644 --- a/examples/whm_gr_test/pl.swifter.in +++ b/examples/whm_gr_test/pl.swifter.in @@ -1,36 +1,36 @@ 9 -1 39.476926408897626 +0 39.476926408897626 0.0 0.0 0.0 0.0 0.0 0.0 -2 6.5537098095653139645e-06 0.001475126151488013514 +1 6.553709809565314146e-06 0.0014751261514880139061 1.6306381826061645943e-05 -0.29510017042975300594 -0.34346884022084378518 -0.000997917547895216684 5.709185893355676925 -6.2220892824670268354 -1.0321515701207669188 -3 9.663313399581537916e-05 0.006759061578633709628 +2 9.6633133995815381836e-05 0.006759061578633710828 4.0453784346544178454e-05 -0.21096294566811030213 -0.6945147553261317164 0.0026420019351886940041 7.0187176732445560167 -2.1783670470162428854 -0.43491289164169576724 -4 0.000120026935827952453094 0.010044949983771722159 +3 0.000120026935827952456416 0.010044949983771724966 4.25875607065040958e-05 0.905522725638602366 -0.44829515638659761523 1.8122901980659660508e-05 2.685845700565266851 5.6080546137104218133 -0.00027833838024725729542 -5 1.2739802010675941456e-05 0.0072465915674003775008 +4 1.2739802010675941808e-05 0.0072465915674003790445 2.265740805092889601e-05 -1.6511945936824949932 0.1180803833522415941 0.042978148735422203042 -0.17443328105136805607 -4.661619009141641736 -0.09341597039948347882 -6 0.037692251088985676735 0.3552713110772063034 +5 0.03769225108898567778 0.3552713110772063853 0.00046732617030490929307 4.2381319671740662614 -2.694827110197309139 -0.08362807329786287047 1.44742540330701551 2.4581907268113588696 -0.042593445938391914576 -7 0.011285899820091272997 0.43766359903328559694 +6 0.01128589982009127331 0.4376635990332856823 0.00038925687730393611812 6.4776155764849425722 -7.5454781609219372385 -0.12660625214421539209 1.4343694668413992401 1.3251694474665614901 -0.08010594537316981756 -8 0.0017236589478267730203 0.4696622419824256353 +7 0.001723658947826773068 0.46966224198242572768 0.00016953449859497231466 14.737783583010530819 13.132284780084109599 -0.14218874866247160904 -0.96494157148906816704 1.0080364706941240677 0.016191990849809560611 -9 0.0020336100526728302319 0.781439451609552476 +8 0.0020336100526728302882 0.7814394516095526881 0.000164587904124493665 29.578253698940308425 -4.488584904681241383 -0.58928426126360722304 0.16609282485651713797 1.143247554888599065 -0.027336661118935745503 diff --git a/examples/whm_gr_test/pl.swiftest.in b/examples/whm_gr_test/pl.swiftest.in index fd4d2b011..9d3171b2a 100644 --- a/examples/whm_gr_test/pl.swiftest.in +++ b/examples/whm_gr_test/pl.swiftest.in @@ -1,33 +1,33 @@ 8 -Mercury 6.5537098095653139645e-06 0.001475126151488013514 +Mercury 6.553709809565314146e-06 0.0014751261514880139061 1.6306381826061645943e-05 0.38709861919270799335 0.20562987442219879397 7.0036598799530471737 48.303764444546942514 29.187012577257871015 139.02452846395490837 -Venus 9.663313399581537916e-05 0.006759061578633709628 +Venus 9.6633133995815381836e-05 0.006759061578633710828 4.0453784346544178454e-05 0.72332350338494522113 0.0067851993472706276234 3.3945100118236060105 76.62172575937908903 55.11451498626085055 120.69543184874230235 -Earth 0.000120026935827952453094 0.010044949983771722159 +Earth 0.000120026935827952456416 0.010044949983771724966 4.25875607065040958e-05 1.000022414803547921 0.016679693167334301573 0.002750719340522077977 175.59912721852418827 287.3487256951211748 232.20474506920808722 -Mars 1.2739802010675941456e-05 0.0072465915674003775008 +Mars 1.2739802010675941808e-05 0.0072465915674003790445 2.265740805092889601e-05 1.5237056817307590428 0.09335454089002033495 1.8479086301002540793 49.490790672135332784 286.7030449733272235 203.56009534652309867 -Jupiter 0.037692251088985676735 0.3552713110772063034 +Jupiter 0.03769225108898567778 0.3552713110772063853 0.00046732617030490929307 5.203524963998765074 0.048518619089771883313 1.3035691332389880426 100.516740776557597314 273.38311024861741316 317.57998688455870706 -Saturn 0.011285899820091272997 0.43766359903328559694 +Saturn 0.01128589982009127331 0.4376635990332856823 0.00038925687730393611812 9.581861578191695372 0.05220296447788015659 2.4862598063103709123 113.59526938704850352 335.69019804854252698 225.44748806008931297 -Uranus 0.0017236589478267730203 0.4696622419824256353 +Uranus 0.001723658947826773068 0.46966224198242572768 0.00016953449859497231466 19.23638216159032055 0.04433184777155944195 0.7703424893861580136 74.09557761028084144 95.84993853316392176 235.82773290830229485 -Neptune 0.0020336100526728302319 0.781439451609552476 +Neptune 0.0020336100526728302882 0.7814394516095526881 0.000164587904124493665 30.289653279202511271 0.013458737599393380546 1.769000156955224945 131.74519418988560915 245.79890439350270981 334.51418242279709148 diff --git a/python/swiftest/swiftest/io.py b/python/swiftest/swiftest/io.py index 1eb8df95e..28835a69b 100644 --- a/python/swiftest/swiftest/io.py +++ b/python/swiftest/swiftest/io.py @@ -806,8 +806,8 @@ def swiftest_xr2infile(ds, param, framenum=-1): A set of three input files for a Swiftest run """ frame = ds.isel(time=framenum) - cb = frame.where(frame.id == 1, drop=True) - pl = frame.where(frame.id > 1, drop=True) + cb = frame.where(frame.id == 0, drop=True) + pl = frame.where(frame.id > 0, drop=True) pl = pl.where(np.invert(np.isnan(pl['Gmass'])), drop=True).drop_vars(['J_2', 'J_4']) tp = frame.where(np.isnan(frame['Gmass']), drop=True).drop_vars(['Gmass', 'radius', 'J_2', 'J_4']) @@ -984,8 +984,8 @@ def swifter_xr2infile(ds, param, framenum=-1): A set of input files for a Swifter run """ frame = ds.isel(time=framenum) - cb = frame.where(frame.id == 1, drop=True) - pl = frame.where(frame.id > 1, drop=True) + cb = frame.where(frame.id == 0, drop=True) + pl = frame.where(frame.id > 0, drop=True) pl = pl.where(np.invert(np.isnan(pl['Gmass'])), drop=True).drop_vars(['J_2', 'J_4']) tp = frame.where(np.isnan(frame['Gmass']), drop=True).drop_vars(['Gmass', 'radius', 'J_2', 'J_4']) From 74fd250beff52992cba0b3126893977b00afec64 Mon Sep 17 00:00:00 2001 From: David Minton Date: Fri, 27 Aug 2021 14:52:50 -0400 Subject: [PATCH 072/154] Fixed a typo and check to make sure that IN_FORM is used when generating labels for input data, rather than OUT_FORM --- python/swiftest/swiftest/init_cond.py | 6 +++++- python/swiftest/swiftest/simulation_class.py | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/python/swiftest/swiftest/init_cond.py b/python/swiftest/swiftest/init_cond.py index e0d3b749d..12f0ef6ed 100644 --- a/python/swiftest/swiftest/init_cond.py +++ b/python/swiftest/swiftest/init_cond.py @@ -305,8 +305,12 @@ def vec2xr(param, idvals, namevals, v1, v2, v3, v4, v5, v6, GMpl=None, Rpl=None, if ispl and rhill is None and param['RHILL_PRESENT'] == 'YES': print("rhill is required.") return None - + + # Be sure we use the correct input format + old_out_form = param['OUT_FORM'] + param['OUT_FORM'] = param['IN_FORM'] clab, plab, tlab = swiftest.io.make_swiftest_labels(param) + param['OUT_FORM'] = old_out_form vec = np.vstack([v1, v2, v3, v4, v5, v6]) if ispl: vec = np.vstack([vec, GMpl, Rpl]) diff --git a/python/swiftest/swiftest/simulation_class.py b/python/swiftest/swiftest/simulation_class.py index 3a3834434..e28d31587 100644 --- a/python/swiftest/swiftest/simulation_class.py +++ b/python/swiftest/swiftest/simulation_class.py @@ -99,7 +99,7 @@ def addp(self, idvals, namevals, t1, t2, t3, t4, t5, t6, GMpl=None, Rpl=None, rh """ t = self.param['T0'] - dsnew = init_cond.vec2xr(self.param, idvals, namevales, t1, t2, t3, t4, t5, t6, GMpl, Rpl, rhill, Ip1, Ip2, Ip3, rotx, roty, rotz, t) + dsnew = init_cond.vec2xr(self.param, idvals, namevals, t1, t2, t3, t4, t5, t6, GMpl, Rpl, rhill, Ip1, Ip2, Ip3, rotx, roty, rotz, t) if dsnew is not None: self.ds = xr.combine_by_coords([self.ds, dsnew]) return From 0d836c5717ed9a3f8a0a33f85bbc1524ac2cda14 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Fri, 27 Aug 2021 17:32:29 -0400 Subject: [PATCH 073/154] Major restructuring to bring the particle information to all integrators, not just SyMBA. Name is now contains therein --- src/io/io.f90 | 199 +++++++++++++++++++++++++++++-- src/modules/swiftest_classes.f90 | 176 ++++++++++++++++++++------- src/modules/swiftest_globals.f90 | 17 ++- src/modules/symba_classes.f90 | 119 ++++++------------ src/netcdf/netcdf.f90 | 4 +- src/setup/setup.f90 | 51 +++++++- src/symba/symba_collision.f90 | 196 ++++++++++++++++-------------- src/symba/symba_io.f90 | 142 ++++------------------ src/symba/symba_setup.f90 | 76 +++++------- src/symba/symba_util.f90 | 142 +--------------------- src/util/util_append.f90 | 30 ++++- src/util/util_fill.f90 | 23 +++- src/util/util_resize.f90 | 37 +++++- src/util/util_sort.f90 | 23 +++- src/util/util_spill.f90 | 43 ++++++- 15 files changed, 730 insertions(+), 548 deletions(-) diff --git a/src/io/io.f90 b/src/io/io.f90 index 17c75aeea..8dcb37053 100644 --- a/src/io/io.f90 +++ b/src/io/io.f90 @@ -111,7 +111,90 @@ module subroutine io_dump_param(self, param_file_name) end subroutine io_dump_param - module subroutine io_dump_swiftest(self, param) + module subroutine io_dump_particle_info(self, iu) + !! author: David A. Minton + !! + !! Reads in particle information object information from an open file unformatted file + implicit none + ! Arguments + class(swiftest_particle_info), intent(in) :: self !! Particle metadata information object + integer(I4B), intent(in) :: iu !! Open file unit number + ! Internals + character(STRMAX) :: errmsg + + write(iu, err = 667, iomsg = errmsg) self%name + write(iu, err = 667, iomsg = errmsg) self%particle_type + + return + + 667 continue + write(*,*) "Error writing particle metadata information from file: " // trim(adjustl(errmsg)) + call util_exit(FAILURE) + end subroutine io_dump_particle_info + + + module subroutine io_dump_particle_info_base(self, param, idx) + !! author: David A. Minton + !! + !! Dumps the particle information data to a file. + !! Pass a list of array indices for test particles (tpidx) and/or massive bodies (plidx) to append + implicit none + ! Arguments + class(swiftest_base), intent(inout) :: self !! Swiftest base object (can be cb, pl, or tp) + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + integer(I4B), dimension(:), optional, intent(in) :: idx !! Array of test particle indices to append to the particle file + + ! Internals + logical, save :: lfirst = .true. + integer(I4B), parameter :: LUN = 22 + integer(I4B) :: i + character(STRMAX) :: errmsg + + if (lfirst) then + select case(param%out_stat) + case('APPEND') + open(unit = LUN, file = param%particle_out, status = 'OLD', position = 'APPEND', form = 'UNFORMATTED', err = 667, iomsg = errmsg) + case('NEW', 'UNKNOWN', 'REPLACE') + open(unit = LUN, file = param%particle_out, status = param%out_stat, form = 'UNFORMATTED', err = 667, iomsg = errmsg) + case default + write(*,*) 'Invalid status code',trim(adjustl(param%out_stat)) + call util_exit(FAILURE) + end select + + lfirst = .false. + else + open(unit = LUN, file = param%particle_out, status = 'OLD', position = 'APPEND', form = 'UNFORMATTED', err = 667, iomsg = errmsg) + end if + + select type(self) + class is (swiftest_cb) + write(LUN, err = 667, iomsg = errmsg) self%id + call self%info%dump(LUN) + class is (swiftest_body) + if (present(idx)) then + do i = 1, size(idx) + write(LUN, err = 667, iomsg = errmsg) self%id(idx(i)) + call self%info(idx(i))%dump(LUN) + end do + else + do i = 1, self%nbody + write(LUN, err = 667, iomsg = errmsg) self%id(i) + call self%info(i)%dump(LUN) + end do + end if + end select + + close(unit = LUN, err = 667, iomsg = errmsg) + + return + + 667 continue + write(*,*) "Error reading central body file: " // trim(adjustl(errmsg)) + call util_exit(FAILURE) + end subroutine io_dump_particle_info_base + + + module subroutine io_dump_base(self, param) !! author: David A. Minton !! !! Dump massive body data to files @@ -152,7 +235,7 @@ module subroutine io_dump_swiftest(self, param) 667 continue write(*,*) "Error dumping body data to file " // trim(adjustl(errmsg)) call util_exit(FAILURE) - end subroutine io_dump_swiftest + end subroutine io_dump_base module subroutine io_dump_system(self, param) @@ -554,7 +637,9 @@ module subroutine io_param_reader(self, unit, iotype, v_list, iostat, iomsg) read(param_value, *, err = 667, iomsg = iomsg) param%Euntracked case ("MAXID") read(param_value, *, err = 667, iomsg = iomsg) param%maxid - case ("NPLMAX", "NTPMAX", "GMTINY", "MIN_GMFRAG", "PARTICLE_OUT", "FRAGMENTATION", "SEED", "YARKOVSKY", "YORP") ! Ignore SyMBA-specific, not-yet-implemented, or obsolete input parameters + case ("PARTICLE_OUT") + param%particle_out = param_value + case ("NPLMAX", "NTPMAX", "GMTINY", "MIN_GMFRAG", "FRAGMENTATION", "SEED", "YARKOVSKY", "YORP") ! Ignore SyMBA-specific, not-yet-implemented, or obsolete input parameters case default write(*,*) "Unknown parameter -> ",param_name iostat = -1 @@ -771,6 +856,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, err = 667, iomsg = iomsg) adjustl(param_name), adjustl(param_value) write(param_name, Afmt) "OUT_STAT"; write(param_value, Afmt) "APPEND"; write(unit, Afmt, err = 667, iomsg = iomsg) adjustl(param_name), adjustl(param_value) end if + write(param_name, Afmt) "PARTICLE_OUT"; write(param_value, Afmt) trim(adjustl(param%particle_out)); write(unit, Afmt, err = 667, iomsg = iomsg) adjustl(param_name), adjustl(param_value) write(param_name, Afmt) "ENC_OUT"; write(param_value, Afmt) trim(adjustl(param%enc_out)); write(unit, Afmt, err = 667, iomsg = iomsg) adjustl(param_name), adjustl(param_value) write(param_name, Afmt) "CHK_RMIN"; write(param_value, Rfmt) param%rmin; write(unit, Afmt, err = 667, iomsg = iomsg) adjustl(param_name), adjustl(param_value) write(param_name, Afmt) "CHK_RMAX"; write(param_value, Rfmt) param%rmax; write(unit, Afmt, err = 667, iomsg = iomsg) adjustl(param_name), adjustl(param_value) @@ -906,7 +992,7 @@ module subroutine io_read_in_cb(self, param) self%id = 0 param%maxid = 0 open(unit = iu, file = param%incbfile, status = 'old', form = 'FORMATTED', err = 667, iomsg = errmsg) - read(iu, *, err = 667, iomsg = errmsg) self%name + read(iu, *, err = 667, iomsg = errmsg) self%info%name read(iu, *, err = 667, iomsg = errmsg) self%Gmass self%mass = real(self%Gmass / param%GU, kind=DP) read(iu, *, err = 667, iomsg = errmsg) self%radius @@ -1036,7 +1122,9 @@ module function io_read_frame_body(self, iu, param) result(ierr) select case(param%in_type) case (REAL4_TYPE, REAL8_TYPE) read(iu, err = 667, iomsg = errmsg) self%id(:) - read(iu, err = 667, iomsg = errmsg) self%name(:) + associate(name => self%info%name) + read(iu, err = 667, iomsg = errmsg) name(:) + end associate select case (param%in_form) case (XV) @@ -1082,9 +1170,9 @@ module function io_read_frame_body(self, iu, param) result(ierr) select type(self) class is (swiftest_pl) if (param%lrhill_present) then - read(iu, *, err = 667, iomsg = errmsg) self%name(i), val, self%rhill(i) + read(iu, *, err = 667, iomsg = errmsg) self%info(i)%name, val, self%rhill(i) else - read(iu, *, err = 667, iomsg = errmsg) self%name(i), val + read(iu, *, err = 667, iomsg = errmsg) self%info(i)%name, val end if self%Gmass(i) = real(val, kind=DP) self%mass(i) = real(val / param%GU, kind=DP) @@ -1160,7 +1248,7 @@ module function io_read_frame_cb(self, iu, param) result(ierr) character(len=STRMAX) :: errmsg read(iu, err = 667, iomsg = errmsg) self%id - read(iu, err = 667, iomsg = errmsg) self%name + read(iu, err = 667, iomsg = errmsg) self%info%name read(iu, err = 667, iomsg = errmsg) self%Gmass self%mass = self%Gmass / param%GU read(iu, err = 667, iomsg = errmsg) self%radius @@ -1279,6 +1367,7 @@ function io_read_hdr(iu, t, npl, ntp, out_form, out_type) result(ierr) return end function io_read_hdr + module subroutine io_read_in_param(self, param_file_name) !! author: David A. Minton !! @@ -1314,6 +1403,96 @@ module subroutine io_read_in_param(self, param_file_name) end subroutine io_read_in_param + module subroutine io_read_in_particle_info(self, iu) + !! author: David A. Minton + !! + !! Reads in particle information object information from an open file unformatted file + implicit none + ! Arguments + class(swiftest_particle_info), intent(inout) :: self !! Particle metadata information object + integer(I4B), intent(in) :: iu !! Open file unit number + ! Internals + character(STRMAX) :: errmsg + + read(iu, err = 667, iomsg = errmsg) self%name + read(iu, err = 667, iomsg = errmsg) self%particle_type + + return + + 667 continue + write(*,*) "Error reading particle metadata information from file: " // trim(adjustl(errmsg)) + call util_exit(FAILURE) + end subroutine io_read_in_particle_info + + + module subroutine io_read_particle_info_system(self, param) + !! author: David A. Minton + !! + !! Reads an old particle information file for a restartd run + implicit none + ! Arguments + class(swiftest_nbody_system), intent(inout) :: self !! Swiftest nbody system object + class(swiftest_parameters), intent(inout) :: param !! Current run configuration parameters + ! Internals + integer(I4B), parameter :: LUN = 22 + integer(I4B) :: i, id, idx + logical :: lmatch + character(STRMAX) :: errmsg + class(swiftest_particle_info), allocatable :: tmpinfo + + open(unit = LUN, file = param%particle_out, status = 'OLD', form = 'UNFORMATTED', err = 667, iomsg = errmsg) + + allocate(tmpinfo, mold=self%cb%info) + + select type(cb => self%cb) + class is (swiftest_cb) + select type(pl => self%pl) + class is (swiftest_pl) + select type(tp => self%tp) + class is (swiftest_tp) + associate(npl => pl%nbody, ntp => tp%nbody) + do + lmatch = .false. + read(LUN, err = 667, iomsg = errmsg, end = 333) id + + if (id == cb%id) then + call cb%info%read_in(LUN) + lmatch = .true. + else + if (npl > 0) then + idx = findloc(pl%id(1:npl), id, dim=1) + if (idx /= 0) then + call pl%info(idx)%read_in(LUN) + lmatch = .true. + end if + end if + if (.not.lmatch .and. ntp > 0) then + idx = findloc(tp%id(1:ntp), id, dim=1) + if (idx /= 0) then + call tp%info(idx)%read_in(LUN) + lmatch = .true. + end if + end if + end if + if (.not.lmatch) then + call tmpinfo%read_in(LUN) + end if + end do + end associate + close(unit = LUN, err = 667, iomsg = errmsg) + end select + end select + end select + + 333 continue + return + + 667 continue + write(*,*) "Error reading particle information file: " // trim(adjustl(errmsg)) + call util_exit(FAILURE) + end subroutine io_read_particle_info_system + + module subroutine io_toupper(string) !! author: David A. Minton !! @@ -1495,7 +1674,7 @@ module subroutine io_write_frame_body(self, iu, param) associate(n => self%nbody) if (n == 0) return write(iu, err = 667, iomsg = errmsg) self%id(1:n) - write(iu, err = 667, iomsg = errmsg) self%name(1:n) + write(iu, err = 667, iomsg = errmsg) self%info(1:n)%name if ((param%out_form == XV) .or. (param%out_form == XVEL)) then write(iu, err = 667, iomsg = errmsg) self%xh(1, 1:n) write(iu, err = 667, iomsg = errmsg) self%xh(2, 1:n) @@ -1556,7 +1735,7 @@ module subroutine io_write_frame_cb(self, iu, param) associate(cb => self) write(iu, err = 667, iomsg = errmsg) cb%id - write(iu, err = 667, iomsg = errmsg) cb%name + write(iu, err = 667, iomsg = errmsg) cb%info%name write(iu, err = 667, iomsg = errmsg) cb%Gmass write(iu, err = 667, iomsg = errmsg) cb%radius write(iu, err = 667, iomsg = errmsg) cb%j2rp2 diff --git a/src/modules/swiftest_classes.f90 b/src/modules/swiftest_classes.f90 index 06435cbe7..34e530bb9 100644 --- a/src/modules/swiftest_classes.f90 +++ b/src/modules/swiftest_classes.f90 @@ -31,6 +31,7 @@ module swiftest_classes character(STRMAX) :: out_type = NETCDF_DOUBLE_TYPE !! Binary format of output file character(STRMAX) :: out_form = XVEL !! Data to write to output file character(STRMAX) :: out_stat = 'NEW' !! Open status for output binary file + character(STRMAX) :: particle_out = PARTICLE_OUTFILE !! Name of output particle information file integer(I4B) :: istep_dump = -1 !! Number of time steps between dumps real(DP) :: rmin = -1.0_DP !! Minimum heliocentric radius for test particle real(DP) :: rmax = -1.0_DP !! Maximum heliocentric radius for test particle @@ -139,15 +140,28 @@ module swiftest_classes procedure :: open => netcdf_open !! Opens a NetCDF file end type netcdf_parameters + !******************************************************************************************************************************** + ! swiftest_swiftest_particle_info class definitions and method interfaces + !******************************************************************************************************************************* + !> Class definition for the particle origin information object. This object is used to track time, location, and collisional regime + !> of fragments produced in collisional events. + type :: swiftest_particle_info + character(len=NAMELEN) :: name !! Non-unique name + character(len=NAMELEN) :: particle_type !! String containing a description of the particle type (e.g. CentralBody, MassiveBody, TestParticle) + contains + procedure :: dump => io_dump_particle_info !! Dumps contents of particle information to file + procedure :: read_in => io_read_in_particle_info !! Read in a particle information object from an open file + end type swiftest_particle_info + !******************************************************************************************************************************** ! swiftest_base class definitions and methods !******************************************************************************************************************************** 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 + !! An abstract superclass for a generic Swiftest object contains !! The minimal methods that all systems must have - procedure :: dump => io_dump_swiftest !! Dump contents to file + procedure :: dump => io_dump_base !! Dump contents to file + procedure :: dump_particle_info => io_dump_particle_info_base !! Dump contents of particle information metadata to file procedure :: write_frame_netcdf => netcdf_write_frame_base !! I/O routine for writing out a single frame of time-series data for all bodies in the system in NetCDF format generic :: write_frame => write_frame_netcdf !! Set up generic procedure that will switch between NetCDF or Fortran binary depending on arguments end type swiftest_base @@ -157,30 +171,30 @@ module swiftest_classes !******************************************************************************************************************************** !> A concrete lass for the central body in a Swiftest simulation type, abstract, extends(swiftest_base) :: swiftest_cb - character(len=NAMELEN) :: 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) :: 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 + class(swiftest_particle_info), allocatable :: info !! Particle metadata information + 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 procedure :: read_in => io_read_in_cb !! 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 @@ -196,7 +210,7 @@ module swiftest_classes !! 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 - character(len=NAMELEN), dimension(:), allocatable :: name !! Non-unique name + class(swiftest_particle_info), dimension(:), allocatable :: info !! Particle metadata information 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 @@ -357,22 +371,24 @@ 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 :: 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 :: get_old_t_final => io_get_old_t_final_system !! Validates the dump file to check whether the dump file initial conditions duplicate the last frame of the binary output. - 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 :: write_hdr_bin => io_write_hdr_system !! Write a header for an output frame in Fortran binary format - procedure :: write_hdr_netcdf => netcdf_write_hdr_system !! Write a header for an output frame in NetCDF format - 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 - procedure :: rescale => util_rescale_system !! Rescales the system into a new set of units - procedure :: validate_ids => util_valid_id_system !! Validate the numerical ids passed to the system and save the maximum value - generic :: write_hdr => write_hdr_bin, write_hdr_netcdf !! Generic method call for writing headers + 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 :: get_old_t_final => io_get_old_t_final_system !! Validates the dump file to check whether the dump file initial conditions duplicate the last frame of the binary output. + procedure :: read_frame => io_read_frame_system !! Read in a frame of input data from file + procedure :: read_particle_info => io_read_particle_info_system !! Read in particle metadata 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 :: write_hdr_bin => io_write_hdr_system !! Write a header for an output frame in Fortran binary format + procedure :: write_hdr_netcdf => netcdf_write_hdr_system !! Write a header for an output frame in NetCDF format + procedure :: initialize => setup_initialize_system !! Initialize the system from input files + procedure :: init_particle_info => setup_initialize_particle_info_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 + procedure :: rescale => util_rescale_system !! Rescales the system into a new set of units + procedure :: validate_ids => util_valid_id_system !! Validate the numerical ids passed to the system and save the maximum value + generic :: write_hdr => write_hdr_bin, write_hdr_netcdf !! Generic method call for writing headers end type swiftest_nbody_system type :: swiftest_encounter @@ -614,11 +630,24 @@ module subroutine io_dump_param(self, param_file_name) character(len=*), intent(in) :: param_file_name !! Parameter input file name (i.e. param.in) end subroutine io_dump_param - module subroutine io_dump_swiftest(self, param) + module subroutine io_dump_particle_info_base(self, param, idx) + implicit none + class(swiftest_base), intent(inout) :: self !! Swiftest base object (can be cb, pl, or tp) + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + integer(I4B), dimension(:), optional, intent(in) :: idx !! Array of test particle indices to append to the particle file + end subroutine io_dump_particle_info_base + + module subroutine io_dump_particle_info(self, iu) + implicit none + class(swiftest_particle_info), intent(in) :: self !! Swiftest particle info metadata object + integer(I4B), intent(in) :: iu !! Open unformatted file unit number + end subroutine io_dump_particle_info + + module subroutine io_dump_base(self, param) implicit none class(swiftest_base), intent(inout) :: self !! Swiftest base object class(swiftest_parameters), intent(inout) :: param !! Current run configuration parameters - end subroutine io_dump_swiftest + end subroutine io_dump_base module subroutine io_dump_system(self, param) implicit none @@ -689,6 +718,12 @@ module subroutine io_read_in_param(self, param_file_name) character(len=*), intent(in) :: param_file_name !! Parameter input file name (i.e. param.in) end subroutine io_read_in_param + module subroutine io_read_in_particle_info(self, iu) + implicit none + class(swiftest_particle_info), intent(inout) :: self !! Particle metadata information object + integer(I4B), intent(in) :: iu !! Open file unit number + end subroutine io_read_in_particle_info + module function io_read_frame_body(self, iu, param) result(ierr) implicit none class(swiftest_body), intent(inout) :: self !! Swiftest body object @@ -713,6 +748,12 @@ module function io_read_frame_system(self, iu, param) result(ierr) integer(I4B) :: ierr !! Error code: returns 0 if the read is successful end function io_read_frame_system + module subroutine io_read_particle_info_system(self, param) + implicit none + class(swiftest_nbody_system), intent(inout) :: self !! Swiftest nbody system object + class(swiftest_parameters), intent(inout) :: param !! Current run configuration parameters + end subroutine io_read_particle_info_system + module subroutine io_write_discard(self, param) implicit none class(swiftest_nbody_system), intent(inout) :: self !! Swiftest system object @@ -953,6 +994,12 @@ module subroutine setup_encounter(self, n) integer(I4B), intent(in) :: n !! Number of encounters to allocate space for end subroutine setup_encounter + module subroutine setup_initialize_particle_info_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 + end subroutine setup_initialize_particle_info_system + module subroutine setup_initialize_system(self, param) implicit none class(swiftest_nbody_system), intent(inout) :: self !! Swiftest system object @@ -1030,6 +1077,14 @@ module subroutine util_append_arr_I4B(arr, source, nold, nsrc, lsource_mask) logical, dimension(:), intent(in) :: lsource_mask !! Logical mask indicating which elements to append to end subroutine util_append_arr_I4B + module subroutine util_append_arr_info(arr, source, nold, nsrc, lsource_mask) + implicit none + class(swiftest_particle_info), dimension(:), allocatable, intent(inout) :: arr !! Destination array + class(swiftest_particle_info), dimension(:), allocatable, intent(in) :: source !! Array to append + integer(I4B), intent(in) :: nold, nsrc !! Extend of the old array and the source array, respectively + logical, dimension(:), intent(in) :: lsource_mask !! Logical mask indicating which elements to append to + end subroutine util_append_arr_info + module subroutine util_append_arr_logical(arr, source, nold, nsrc, lsource_mask) implicit none logical, dimension(:), allocatable, intent(inout) :: arr !! Destination array @@ -1037,6 +1092,7 @@ module subroutine util_append_arr_logical(arr, source, nold, nsrc, lsource_mask) integer(I4B), intent(in) :: nold, nsrc !! Extend of the old array and the source array, respectively logical, dimension(:), intent(in) :: lsource_mask !! Logical mask indicating which elements to append to end subroutine util_append_arr_logical + end interface interface @@ -1190,6 +1246,13 @@ module subroutine util_fill_arr_I4B(keeps, inserts, lfill_list) 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_info(keeps, inserts, lfill_list) + implicit none + class(swiftest_particle_info), dimension(:), allocatable, intent(inout) :: keeps !! Array of values to keep + class(swiftest_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 util_fill_arr_info + module subroutine util_fill_arr_logical(keeps, inserts, lfill_list) implicit none logical, dimension(:), allocatable, intent(inout) :: keeps !! Array of values to keep @@ -1252,6 +1315,12 @@ module subroutine util_resize_arr_I4B(arr, nnew) integer(I4B), intent(in) :: nnew !! New size end subroutine util_resize_arr_I4B + module subroutine util_resize_arr_info(arr, nnew) + implicit none + class(swiftest_particle_info), dimension(:), allocatable, intent(inout) :: arr !! Array to resize + integer(I4B), intent(in) :: nnew !! New size + end subroutine util_resize_arr_info + module subroutine util_resize_arr_logical(arr, nnew) implicit none logical, dimension(:), allocatable, intent(inout) :: arr !! Array to resize @@ -1430,6 +1499,13 @@ module subroutine util_sort_rearrange_arr_I4B(arr, ind, n) integer(I4B), intent(in) :: n !! Number of elements in arr and ind to rearrange end subroutine util_sort_rearrange_arr_I4B + module subroutine util_sort_rearrange_arr_info(arr, ind, n) + implicit none + class(swiftest_particle_info), dimension(:), allocatable, intent(inout) :: arr !! Destination array + integer(I4B), dimension(:), intent(in) :: ind !! Index to rearrange against + integer(I4B), intent(in) :: n !! Number of elements in arr and ind to rearrange + end subroutine util_sort_rearrange_arr_info + module subroutine util_sort_rearrange_arr_logical(arr, ind, n) implicit none logical, dimension(:), allocatable, intent(inout) :: arr !! Destination array @@ -1520,6 +1596,14 @@ module subroutine util_spill_arr_I8B(keeps, 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_arr_I8B + module subroutine util_spill_arr_info(keeps, discards, lspill_list, ldestructive) + implicit none + class(swiftest_particle_info), dimension(:), allocatable, intent(inout) :: keeps !! Array of values to keep + class(swiftest_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 util_spill_arr_info + module subroutine util_spill_arr_logical(keeps, discards, lspill_list, ldestructive) implicit none logical, dimension(:), allocatable, intent(inout) :: keeps !! Array of values to keep diff --git a/src/modules/swiftest_globals.f90 b/src/modules/swiftest_globals.f90 index 3df99a8d1..dd6752b8f 100644 --- a/src/modules/swiftest_globals.f90 +++ b/src/modules/swiftest_globals.f90 @@ -55,6 +55,10 @@ module swiftest_globals character(*), parameter :: XV = 'XV' !! Symbolic name for binary output file contents for cartesian position and velocity vectors character(*), parameter :: XVEL = 'XVEL' !! Symbolic name for binary output file contents for both cartesian position and velocity and orbital elements + character(*), parameter :: CB_TYPE_NAME = "CentralBody" + character(*), parameter :: PL_TYPE_NAME = "MassiveBody" + character(*), parameter :: TP_TYPE_NAME = "TestParticle" + ! OpenMP Parameters integer(I4B) :: nthreads = 1 !! Number of OpenMP threads integer(I4B), parameter :: NTHERSHOLD = 1000 !! Threshold value for OpenMP loop parallelization @@ -113,11 +117,14 @@ module swiftest_globals character(*), dimension(2), parameter :: DUMP_PARAM_FILE = ['dump_param1.in', 'dump_param2.in'] !> Default file names that can be changed by the user in the parameters file - character(*), parameter :: CB_INFILE = 'cb.in' - character(*), parameter :: PL_INFILE = 'pl.in' - character(*), parameter :: TP_INFILE = 'tp.in' - character(*), parameter :: BIN_OUTFILE = 'bin.dat' - integer(I4B), parameter :: BINUNIT = 20 !! File unit number for the binary output file + character(*), parameter :: CB_INFILE = 'cb.in' + character(*), parameter :: PL_INFILE = 'pl.in' + character(*), parameter :: TP_INFILE = 'tp.in' + character(*), parameter :: BIN_OUTFILE = 'bin.dat' + integer(I4B), parameter :: BINUNIT = 20 !! File unit number for the binary output file + character(*), parameter :: PARTICLE_OUTFILE = 'particle.dat' + integer(I4B), parameter :: PARTICLEUNIT = 44 !! File unit number for the binary particle info output file + !> Miscellaneous constants: integer(I4B), parameter :: NDIM = 3 !! Number of dimensions in our reality diff --git a/src/modules/symba_classes.f90 b/src/modules/symba_classes.f90 index 25f9b5940..5294efa64 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, swiftest_encounter + use swiftest_classes, only : swiftest_parameters, swiftest_base, swiftest_encounter, swiftest_particle_info use helio_classes, only : helio_cb, helio_pl, helio_tp, helio_nbody_system use rmvs_classes, only : rmvs_chk_ind implicit none @@ -14,11 +14,8 @@ module symba_classes 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, extends(swiftest_parameters) :: symba_parameters - character(STRMAX) :: particle_out = PARTICLE_OUTFILE !! Name of output particle information file real(DP) :: GMTINY = -1.0_DP !! Smallest G*mass that is fully gravitating real(DP) :: min_GMfrag = -1.0_DP !! Smallest G*mass that can be produced in a fragmentation event integer(I4B), dimension(:), allocatable :: seed !! Random seeds @@ -29,16 +26,17 @@ module symba_classes end type symba_parameters !******************************************************************************************************************************** - ! symba_particle_info class definitions and method interfaces + ! symba_swiftest_particle_info class definitions and method interfaces !******************************************************************************************************************************* !> Class definition for the particle origin information object. This object is used to track time, location, and collisional regime !> of fragments produced in collisional events. - type :: symba_particle_info - sequence - character(len=32) :: origin_type !! String containing a description of the origin of the particle (e.g. Initial Conditions, Supercatastrophic, Disruption, etc.) + type, extends(swiftest_particle_info) :: symba_particle_info + character(len=NAMELEN) :: origin_type !! String containing a description of the origin of the particle (e.g. Initial Conditions, Supercatastrophic, Disruption, etc.) real(DP) :: origin_time !! The time of the particle's formation real(DP), dimension(NDIM) :: origin_xh !! The heliocentric distance vector at the time of the particle's formation real(DP), dimension(NDIM) :: origin_vh !! The heliocentric velocity vector at the time of the particle's formation + contains + procedure :: read_in => symba_io_read_in_particle_info !! Reads in SyMBA particle information metadata from an open unformatted file end type symba_particle_info !******************************************************************************************************************************** @@ -60,7 +58,6 @@ module symba_classes real(DP) :: dGM = 0.0_DP !! Change in G*mass of the central body real(DP) :: R0 = 0.0_DP !! Initial radius of the central body real(DP) :: dR = 0.0_DP !! Change in the radius of the central body - type(symba_particle_info) :: info contains end type symba_cb @@ -82,7 +79,6 @@ module symba_classes 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 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 :: index => symba_util_index_eucl_plpl !! Sets up the (i, j) -> k indexing used for the single-loop blocking Euclidean distance matrix @@ -118,7 +114,6 @@ module symba_classes integer(I4B), dimension(:), allocatable :: nplenc !! number of encounters with planets this time step integer(I4B), dimension(:), allocatable :: levelg !! level at which this particle should be moved integer(I4B), dimension(:), allocatable :: levelm !! deepest encounter level achieved this time step - type(symba_particle_info), dimension(:), allocatable :: info contains procedure :: drift => symba_drift_tp !! Method for Danby drift in Democratic Heliocentric coordinates. Sets the mask to the current recursion level procedure :: encounter_check => symba_encounter_check_tp !! Checks if any test particles are undergoing a close encounter with a massive body @@ -173,19 +168,20 @@ module symba_classes ! symba_nbody_system class definitions and method interfaces !******************************************************************************************************************************** type, extends(helio_nbody_system) :: symba_nbody_system - class(symba_merger), allocatable :: pl_adds !! List of added bodies in mergers or collisions - class(symba_pltpenc), allocatable :: pltpenc_list !! List of massive body-test particle encounters in a single step - class(symba_plplenc), allocatable :: plplenc_list !! List of massive body-massive body encounters in a single step - class(symba_plplenc), allocatable :: plplcollision_list !! List of massive body-massive body collisions in a single step - integer(I4B) :: irec !! System recursion level + class(symba_merger), allocatable :: pl_adds !! List of added bodies in mergers or collisions + class(symba_pltpenc), allocatable :: pltpenc_list !! List of massive body-test particle encounters in a single step + class(symba_plplenc), allocatable :: plplenc_list !! List of massive body-massive body encounters in a single step + class(symba_plplenc), allocatable :: plplcollision_list !! List of massive body-massive body collisions in a single step + 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 - 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 :: 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 :: init_particle_info => symba_setup_initialize_particle_info_system !! Initialize the system from input files + 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 @@ -362,21 +358,12 @@ module subroutine symba_util_index_eucl_plpl(self, param) class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters end subroutine symba_util_index_eucl_plpl - module subroutine symba_io_write_discard(self, param) - use swiftest_classes, only : swiftest_parameters - implicit none - 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(system, param, lincludecb, tpidx, plidx) + module subroutine symba_io_dump_particle_info(self, iu) 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 extensions - logical, optional, intent(in) :: lincludecb !! Set to true to include the central body (default is false) - integer(I4B), dimension(:), optional, intent(in) :: tpidx !! Array of test particle indices to append to the particle file - integer(I4B), dimension(:), optional, intent(in) :: plidx !! Array of massive body indices to append to the particle file + class(symba_particle_info), intent(in) :: self !! Particle metadata information object + integer(I4B), intent(in) :: iu !! Open file unit number end subroutine symba_io_dump_particle_info + module subroutine symba_io_param_reader(self, unit, iotype, v_list, iostat, iomsg) implicit none @@ -400,11 +387,18 @@ module subroutine symba_io_param_writer(self, unit, iotype, v_list, iostat, ioms character(len=*), intent(inout) :: iomsg !! Message to pass if iostat /= 0 end subroutine symba_io_param_writer - module subroutine symba_io_read_particle(system, param) + module subroutine symba_io_read_in_particle_info(self, iu) implicit none - class(symba_nbody_system), intent(inout) :: system !! SyMBA nbody system file - class(symba_parameters), intent(inout) :: param !! Current run configuration parameters with SyMBA extensions - end subroutine symba_io_read_particle + class(symba_particle_info), intent(inout) :: self !! Particle metadata information object + integer(I4B), intent(in) :: iu !! Open file unit number + end subroutine symba_io_read_in_particle_info + + module subroutine symba_io_write_discard(self, param) + use swiftest_classes, only : swiftest_parameters + implicit none + 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_kick_getacch_int_pl(self) implicit none @@ -440,11 +434,12 @@ module subroutine symba_kick_encounter(self, system, dt, irec, sgn) integer(I4B), intent(in) :: sgn !! sign to be applied to acceleration end subroutine symba_kick_encounter - module subroutine symba_setup_initialize_particle_info(system, param) + module subroutine symba_setup_initialize_particle_info_system(self, param) + use swiftest_classes, only : swiftest_parameters implicit none - class(symba_nbody_system), intent(inout) :: system !! SyMBA nbody system object - class(symba_parameters), intent(inout) :: param !! Current run configuration parameters with SyMBA extensions - end subroutine symba_setup_initialize_particle_info + class(symba_nbody_system), intent(inout) :: self !! SyMBA nbody system object + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters with SyMBA extensions + end subroutine symba_setup_initialize_particle_info_system module subroutine symba_setup_initialize_system(self, param) use swiftest_classes, only : swiftest_parameters @@ -524,14 +519,6 @@ end subroutine symba_step_reset_system end interface interface util_append - module subroutine symba_util_append_arr_info(arr, source, nold, nsrc, lsource_mask) - implicit none - type(symba_particle_info), dimension(:), allocatable, intent(inout) :: arr !! Destination array - type(symba_particle_info), dimension(:), allocatable, intent(in) :: source !! Array to append - integer(I4B), intent(in) :: nold, nsrc !! Extend of the old array and the source array, respectively - logical, dimension(:), intent(in) :: lsource_mask !! Logical mask indicating which elements to append to - end subroutine symba_util_append_arr_info - module subroutine symba_util_append_arr_kin(arr, source, nold, nsrc, lsource_mask) implicit none type(symba_kinship), dimension(:), allocatable, intent(inout) :: arr !! Destination array @@ -582,13 +569,6 @@ end subroutine symba_util_copy_encounter end interface interface util_fill - 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_info - 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 @@ -631,12 +611,6 @@ end subroutine symba_util_rearray_pl 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_arr_kin(arr, nnew) implicit none type(symba_kinship), dimension(:), allocatable, intent(inout) :: arr !! Array to resize @@ -679,13 +653,6 @@ end subroutine symba_util_sort_tp end interface interface util_sort_rearrange - module subroutine symba_util_sort_rearrange_arr_info(arr, ind, n) - implicit none - type(symba_particle_info), dimension(:), allocatable, intent(inout) :: arr !! Destination array - integer(I4B), dimension(:), intent(in) :: ind !! Index to rearrange against - integer(I4B), intent(in) :: n !! Number of elements in arr and ind to rearrange - end subroutine symba_util_sort_rearrange_arr_info - module subroutine symba_util_sort_rearrange_arr_kin(arr, ind, n) implicit none type(symba_kinship), dimension(:), allocatable, intent(inout) :: arr !! Destination array @@ -709,14 +676,6 @@ 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 diff --git a/src/netcdf/netcdf.f90 b/src/netcdf/netcdf.f90 index 2abcbead1..785e10a92 100644 --- a/src/netcdf/netcdf.f90 +++ b/src/netcdf/netcdf.f90 @@ -231,7 +231,7 @@ module subroutine netcdf_write_frame_base(self, iu, param) j = ind(i) idslot = self%id(j) + 1 call check( nf90_put_var(iu%ncid, iu%id_varid, self%id(j), start=[idslot]) ) - name = trim(adjustl(self%name(j))) + name = trim(adjustl(self%info(j)%name)) strlen = len(name) call check( nf90_put_var(iu%ncid, iu%name_varid, name, start=[1, idslot], count=[strlen, 1]) ) if ((param%out_form == XV) .or. (param%out_form == XVEL)) then @@ -277,7 +277,7 @@ module subroutine netcdf_write_frame_base(self, iu, param) class is (swiftest_cb) idslot = self%id + 1 call check( nf90_put_var(iu%ncid, iu%id_varid, self%id, start=[idslot]) ) - name = trim(adjustl(self%name)) + name = trim(adjustl(self%info%name)) strlen = len(name) call check( nf90_put_var(iu%ncid, iu%name_varid, name, start=[1, idslot], count=[strlen, 1]) ) call check( nf90_put_var(iu%ncid, iu%Gmass_varid, self%Gmass, start=[idslot, tslot]) ) diff --git a/src/setup/setup.f90 b/src/setup/setup.f90 index 070308838..fe78ee9e3 100644 --- a/src/setup/setup.f90 +++ b/src/setup/setup.f90 @@ -67,6 +67,13 @@ module subroutine setup_construct_system(system, param) call util_exit(FAILURE) end select + select type(system) + class is (symba_nbody_system) + allocate(symba_particle_info :: system%cb%info) + class default + allocate(swiftest_particle_info :: system%cb%info) + end select + return end subroutine setup_construct_system @@ -127,6 +134,33 @@ module subroutine setup_encounter(self, n) end subroutine setup_encounter + module subroutine setup_initialize_particle_info_system(self, param) + !! author: David A. Minton + !! + !! Setup up particle information metadata from initial conditions + ! + implicit none + ! Arguments + class(swiftest_nbody_system), intent(inout) :: self !! Swiftest nbody system object + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + + associate(cb => self%cb, pl => self%pl, npl => self%pl%nbody, tp => self%tp, ntp => self%tp%nbody) + cb%info%particle_type = CB_TYPE_NAME + call cb%dump_particle_info(param) + if (npl > 0) then + pl%info(1:npl)%particle_type = PL_TYPE_NAME + call pl%dump_particle_info(param) + end if + if (ntp > 0) then + tp%info(1:ntp)%particle_type = TP_TYPE_NAME + call tp%dump_particle_info(param) + end if + end associate + + return + end subroutine setup_initialize_particle_info_system + + module subroutine setup_initialize_system(self, param) !! author: David A. Minton !! @@ -152,6 +186,12 @@ module subroutine setup_initialize_system(self, param) if (.not.param%lrhill_present) call self%pl%set_rhill(self%cb) self%pl%lfirst = param%lfirstkick self%tp%lfirst = param%lfirstkick + + if (param%lrestart) then + call self%read_particle_info(param) + else + call self%init_particle_info(param) + end if return end subroutine setup_initialize_system @@ -173,7 +213,7 @@ module subroutine setup_body(self, n, param) self%lfirst = .true. if (allocated(self%id)) deallocate(self%id) - if (allocated(self%name)) deallocate(self%name) + if (allocated(self%info)) deallocate(self%info) if (allocated(self%status)) deallocate(self%status) if (allocated(self%ldiscard)) deallocate(self%ldiscard) if (allocated(self%xh)) deallocate(self%xh) @@ -186,7 +226,7 @@ module subroutine setup_body(self, n, param) if (allocated(self%lmask)) deallocate(self%lmask) allocate(self%id(n)) - allocate(self%name(n)) + allocate(self%info(n)) allocate(self%status(n)) allocate(self%ldiscard(n)) allocate(self%xh(NDIM, n)) @@ -199,7 +239,7 @@ module subroutine setup_body(self, n, param) allocate(self%lmask(n)) self%id(:) = 0 - self%name(:) = "UNNAMED" + self%info(:)%name = "UNNAMED" self%status(:) = INACTIVE self%lmask(:) = .false. self%ldiscard(:) = .false. @@ -247,10 +287,12 @@ module subroutine setup_pl(self, n, param) call setup_body(self, n, param) if (n <= 0) return + if (allocated(self%info)) deallocate(self%info) if (allocated(self%mass)) deallocate(self%mass) if (allocated(self%Gmass)) deallocate(self%Gmass) if (allocated(self%rhill)) deallocate(self%rhill) + allocate(swiftest_particle_info :: self%info(n)) allocate(self%mass(n)) allocate(self%Gmass(n)) allocate(self%rhill(n)) @@ -311,14 +353,17 @@ module subroutine setup_tp(self, n, param) call setup_body(self, n, param) if (n <= 0) return + if (allocated(self%info)) deallocate(self%info) if (allocated(self%isperi)) deallocate(self%isperi) if (allocated(self%peri)) deallocate(self%peri) if (allocated(self%atp)) deallocate(self%atp) + allocate(swiftest_particle_info :: self%info(n)) allocate(self%isperi(n)) allocate(self%peri(n)) allocate(self%atp(n)) + self%info(:)%particle_type = TP_TYPE_NAME self%isperi(:) = 0 self%peri(:) = 0.0_DP self%atp(:) = 0.0_DP diff --git a/src/symba/symba_collision.f90 b/src/symba/symba_collision.f90 index 034038ded..4e21b9411 100644 --- a/src/symba/symba_collision.f90 +++ b/src/symba/symba_collision.f90 @@ -838,101 +838,117 @@ subroutine symba_collision_mergeaddsub(system, param, family, id_frag, Ip_frag, class is (symba_pl) select type(pl_discards => system%pl_discards) class is (symba_merger) - associate(pl_adds => system%pl_adds, cb => system%cb) - - ! Add the family bodies to the subtraction list - nfamily = size(family(:)) - nfrag = size(m_frag(:)) - lmask(:) = .false. - lmask(family(:)) = .true. - pl%status(family(:)) = MERGED - nstart = pl_discards%nbody + 1 - nend = pl_discards%nbody + nfamily - call pl_discards%append(pl, lmask) - pl%ldiscard(family(:)) = .true. - pl%lcollision(family(:)) = .true. - - ! Record how many bodies were subtracted in this event - pl_discards%ncomp(nstart:nend) = nfamily - - ! Setup new bodies - allocate(plnew, mold=pl) - call plnew%setup(nfrag, param) - ibiggest = family(maxloc(pl%Gmass(family(:)), dim=1)) - - ! Copy over identification, information, and physical properties of the new bodies from the fragment list - plnew%id(1:nfrag) = id_frag(1:nfrag) - param%maxid = param%maxid + nfrag - plnew%xb(:, 1:nfrag) = xb_frag(:, 1:nfrag) - plnew%vb(:, 1:nfrag) = vb_frag(:, 1:nfrag) - do i = 1, nfrag - plnew%xh(:,i) = xb_frag(:, i) - cb%xb(:) - plnew%vh(:,i) = vb_frag(:, i) - cb%vb(:) - end do - plnew%mass(1:nfrag) = m_frag(1:nfrag) - plnew%Gmass(1:nfrag) = param%GU * m_frag(1:nfrag) - plnew%radius(1:nfrag) = rad_frag(1:nfrag) - plnew%density(1:nfrag) = m_frag(1:nfrag) / rad_frag(1:nfrag) + select type(info => pl%info) + class is (symba_particle_info) + associate(pl_adds => system%pl_adds, cb => system%cb) + + ! Add the family bodies to the subtraction list + nfamily = size(family(:)) + nfrag = size(m_frag(:)) + lmask(:) = .false. + lmask(family(:)) = .true. + pl%status(family(:)) = MERGED + nstart = pl_discards%nbody + 1 + nend = pl_discards%nbody + nfamily + call pl_discards%append(pl, lmask) + pl%ldiscard(family(:)) = .true. + pl%lcollision(family(:)) = .true. + + ! Record how many bodies were subtracted in this event + pl_discards%ncomp(nstart:nend) = nfamily + + ! Setup new bodies + allocate(plnew, mold=pl) + call plnew%setup(nfrag, param) + ibiggest = family(maxloc(pl%Gmass(family(:)), dim=1)) - select case(status) - case(DISRUPTION) - plnew%info(1:nfrag)%origin_type = "Disruption" - plnew%status(1:nfrag) = NEW_PARTICLE - plnew%info(1:nfrag)%origin_time = param%t + ! Copy over identification, information, and physical properties of the new bodies from the fragment list + plnew%id(1:nfrag) = id_frag(1:nfrag) + param%maxid = param%maxid + nfrag + plnew%xb(:, 1:nfrag) = xb_frag(:, 1:nfrag) + plnew%vb(:, 1:nfrag) = vb_frag(:, 1:nfrag) do i = 1, nfrag - plnew%info(i)%origin_xh(:) = plnew%xh(:,i) - plnew%info(i)%origin_vh(:) = plnew%vh(:,i) + plnew%xh(:,i) = xb_frag(:, i) - cb%xb(:) + plnew%vh(:,i) = vb_frag(:, i) - cb%vb(:) end do - case(SUPERCATASTROPHIC) - plnew%info(1:nfrag)%origin_type = "Supercatastrophic" - plnew%status(1:nfrag) = NEW_PARTICLE - plnew%info(1:nfrag)%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 - case(HIT_AND_RUN_DISRUPT) - plnew%info(1) = pl%info(ibiggest) - plnew%status(1) = OLD_PARTICLE - plnew%status(2:nfrag) = NEW_PARTICLE - plnew%info(2:nfrag)%origin_type = "Hit and run fragment" - plnew%info(2:nfrag)%origin_time = param%t - do i = 2, nfrag - plnew%info(i)%origin_xh(:) = plnew%xh(:,i) - plnew%info(i)%origin_vh(:) = plnew%vh(:,i) - end do - case(MERGED) - plnew%info(1) = pl%info(ibiggest) - plnew%status(1) = OLD_PARTICLE - end select - - if (param%lrotation) then - plnew%Ip(:, 1:nfrag) = Ip_frag(:, 1:nfrag) - plnew%rot(:, 1:nfrag) = rot_frag(:, 1:nfrag) - end if + plnew%mass(1:nfrag) = m_frag(1:nfrag) + plnew%Gmass(1:nfrag) = param%GU * m_frag(1:nfrag) + plnew%radius(1:nfrag) = rad_frag(1:nfrag) + plnew%density(1:nfrag) = m_frag(1:nfrag) / rad_frag(1:nfrag) - if (param%ltides) then - plnew%Q = pl%Q(ibiggest) - plnew%k2 = pl%k2(ibiggest) - plnew%tlag = pl%tlag(ibiggest) - end if + select type(info => plnew%info) + class is (symba_particle_info) + select case(status) + case(DISRUPTION) + info(1:nfrag)%origin_type = "Disruption" + plnew%status(1:nfrag) = NEW_PARTICLE + info(1:nfrag)%origin_time = param%t + do i = 1, nfrag + info(i)%origin_xh(:) = plnew%xh(:,i) + info(i)%origin_vh(:) = plnew%vh(:,i) + end do + case(SUPERCATASTROPHIC) + info(1:nfrag)%origin_type = "Supercatastrophic" + plnew%status(1:nfrag) = NEW_PARTICLE + info(1:nfrag)%origin_time = param%t + do i = 1, nfrag + info(i)%origin_xh(:) = plnew%xh(:,i) + info(i)%origin_vh(:) = plnew%vh(:,i) + end do + case(HIT_AND_RUN_DISRUPT) + select type(plinfo => pl%info) + class is (symba_particle_info) + info(1)%name = plinfo(ibiggest)%name + info(1)%origin_xh(:) = plinfo(ibiggest)%origin_xh(:) + info(1)%origin_vh(:) = plinfo(ibiggest)%origin_vh(:) + end select + plnew%status(1) = OLD_PARTICLE + plnew%status(2:nfrag) = NEW_PARTICLE + info(2:nfrag)%origin_type = "Hit and run fragment" + info(2:nfrag)%origin_time = param%t + do i = 2, nfrag + info(i)%origin_xh(:) = plnew%xh(:,i) + info(i)%origin_vh(:) = plnew%vh(:,i) + end do + case(MERGED) + select type(plinfo => pl%info) + class is (symba_particle_info) + info(1)%name = plinfo(ibiggest)%name + info(1)%origin_xh(:) = plinfo(ibiggest)%origin_xh(:) + info(1)%origin_vh(:) = plinfo(ibiggest)%origin_vh(:) + end select + plnew%status(1) = OLD_PARTICLE + end select + end select + + if (param%lrotation) then + plnew%Ip(:, 1:nfrag) = Ip_frag(:, 1:nfrag) + plnew%rot(:, 1:nfrag) = rot_frag(:, 1:nfrag) + end if + + if (param%ltides) then + plnew%Q = pl%Q(ibiggest) + plnew%k2 = pl%k2(ibiggest) + plnew%tlag = pl%tlag(ibiggest) + end if - call plnew%set_mu(cb) - !Copy over or set integration parameters for new bodies - plnew%lcollision(1:nfrag) = .false. - plnew%ldiscard(1:nfrag) = .false. - plnew%levelg(1:nfrag) = pl%levelg(ibiggest) - plnew%levelm(1:nfrag) = pl%levelm(ibiggest) - - ! Append the new merged body to the list and record how many we made - nstart = pl_adds%nbody + 1 - nend = pl_adds%nbody + plnew%nbody - call pl_adds%append(plnew, lsource_mask=[(.true., i=1, plnew%nbody)]) - pl_adds%ncomp(nstart:nend) = plnew%nbody - - call plnew%setup(0, param) - deallocate(plnew) - end associate + call plnew%set_mu(cb) + !Copy over or set integration parameters for new bodies + plnew%lcollision(1:nfrag) = .false. + plnew%ldiscard(1:nfrag) = .false. + plnew%levelg(1:nfrag) = pl%levelg(ibiggest) + plnew%levelm(1:nfrag) = pl%levelm(ibiggest) + + ! Append the new merged body to the list and record how many we made + nstart = pl_adds%nbody + 1 + nend = pl_adds%nbody + plnew%nbody + call pl_adds%append(plnew, lsource_mask=[(.true., i=1, plnew%nbody)]) + pl_adds%ncomp(nstart:nend) = plnew%nbody + + call plnew%setup(0, param) + deallocate(plnew) + end associate + end select end select end select diff --git a/src/symba/symba_io.f90 b/src/symba/symba_io.f90 index 542db70c9..281fe7cdb 100644 --- a/src/symba/symba_io.f90 +++ b/src/symba/symba_io.f90 @@ -2,76 +2,26 @@ use swiftest contains - module subroutine symba_io_dump_particle_info(system, param, lincludecb, tpidx, plidx) + module subroutine symba_io_dump_particle_info(self, iu) !! author: David A. Minton !! - !! Dumps the particle information data to a file. - !! Pass a list of array indices for test particles (tpidx) and/or massive bodies (plidx) to append + !! Reads in particle information object information from an open file unformatted file 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 extensions - logical, optional, intent(in) :: lincludecb !! Set to true to include the central body (default is false) - integer(I4B), dimension(:), optional, intent(in) :: tpidx !! Array of test particle indices to append to the particle file - integer(I4B), dimension(:), optional, intent(in) :: plidx !! Array of massive body indices to append to the particle file + class(symba_particle_info), intent(in) :: self !! Particle metadata information object + integer(I4B), intent(in) :: iu !! Open file unit number ! Internals - logical, save :: lfirst = .true. - integer(I4B), parameter :: LUN = 22 - integer(I4B) :: i - character(STRMAX) :: errmsg - - if (lfirst) then - select case(param%out_stat) - case('APPEND') - open(unit = LUN, file = param%particle_out, status = 'OLD', position = 'APPEND', form = 'UNFORMATTED', err = 667, iomsg = errmsg) - case('NEW', 'UNKNOWN', 'REPLACE') - open(unit = LUN, file = param%particle_out, status = param%out_stat, form = 'UNFORMATTED', err = 667, iomsg = errmsg) - case default - write(*,*) 'Invalid status code',trim(adjustl(param%out_stat)) - call util_exit(FAILURE) - end select + character(STRMAX) :: errmsg - lfirst = .false. - else - open(unit = LUN, file = param%particle_out, status = 'OLD', position = 'APPEND', form = 'UNFORMATTED', err = 667, iomsg = errmsg) - end if - - if (present(lincludecb)) then - if (lincludecb) then - select type(cb => system%cb) - class is (symba_cb) - write(LUN, err = 667, iomsg = errmsg) cb%id - write(LUN, err = 667, iomsg = errmsg) cb%info - end select - end if - end if - - if (present(plidx) .and. (system%pl%nbody > 0)) then - select type(pl => system%pl) - class is (symba_pl) - do i = 1, size(plidx) - write(LUN, err = 667, iomsg = errmsg) pl%id(plidx(i)) - write(LUN, err = 667, iomsg = errmsg) pl%info(plidx(i)) - end do - end select - end if - - if (present(tpidx) .and. (system%tp%nbody > 0)) then - select type(tp => system%tp) - class is (symba_tp) - do i = 1, size(tpidx) - write(LUN, err = 667, iomsg = errmsg) tp%id(tpidx(i)) - write(LUN, err = 667, iomsg = errmsg) tp%info(tpidx(i)) - end do - end select - end if - - close(unit = LUN, err = 667, iomsg = errmsg) + write(iu, err = 667, iomsg = errmsg) self%origin_type + write(iu, err = 667, iomsg = errmsg) self%origin_time + write(iu, err = 667, iomsg = errmsg) self%origin_xh(:) + write(iu, err = 667, iomsg = errmsg) self%origin_vh(:) return 667 continue - write(*,*) "Error reading central body file: " // trim(adjustl(errmsg)) + write(*,*) "Error writing particle metadata information from file: " // trim(adjustl(errmsg)) call util_exit(FAILURE) end subroutine symba_io_dump_particle_info @@ -120,8 +70,6 @@ module subroutine symba_io_param_reader(self, unit, iotype, v_list, iostat, ioms ifirst = ilast + 1 param_value = io_get_token(line_trim, ifirst, ilast, iostat) select case (param_name) - case ("PARTICLE_OUT") - param%particle_out = param_value case ("FRAGMENTATION") call io_toupper(param_value) if (param_value == "YES" .or. param_value == "T") self%lfragmentation = .true. @@ -226,7 +174,6 @@ module subroutine symba_io_param_writer(self, unit, iotype, v_list, iostat, ioms ! Special handling is required for writing the random number seed array as its size is not known until runtime ! For the "SEED" parameter line, the first value will be the size of the seed array and the rest will be the seed array elements - write(param_name, Afmt) "PARTICLE_OUT"; write(param_value, Afmt) trim(adjustl(param%particle_out)); write(unit, Afmt, err = 667, iomsg = iomsg) adjustl(param_name), adjustl(param_value) write(param_name, Afmt) "GMTINY"; write(param_value, Rfmt) param%GMTINY; write(unit, Afmt, err = 667, iomsg = iomsg) adjustl(param_name), adjustl(param_value) write(param_name, Afmt) "MIN_GMFRAG"; write(param_value, Rfmt) param%min_GMfrag; write(unit, Afmt, err = 667, iomsg = iomsg) adjustl(param_name), adjustl(param_value) write(param_name, Afmt) "FRAGMENTATION"; write(param_value, Lfmt) param%lfragmentation; write(unit, Afmt, err = 667, iomsg = iomsg) adjustl(param_name), adjustl(param_value) @@ -256,70 +203,29 @@ module subroutine symba_io_param_writer(self, unit, iotype, v_list, iostat, ioms end subroutine symba_io_param_writer - module subroutine symba_io_read_particle(system, param) + module subroutine symba_io_read_in_particle_info(self, iu) !! author: David A. Minton !! - !! Reads an old particle information file for a restartd run + !! Reads in particle information object information from an open file unformatted file implicit none - class(symba_nbody_system), intent(inout) :: system !! SyMBA nbody system file - class(symba_parameters), intent(inout) :: param !! Current run configuration parameters with SyMBA extensions - + ! Arguments + class(symba_particle_info), intent(inout) :: self !! Particle metadata information object + integer(I4B), intent(in) :: iu !! Open file unit number ! Internals - integer(I4B), parameter :: LUN = 22 - integer(I4B) :: i, id, idx - logical :: lmatch - type(symba_particle_info) :: tmpinfo - character(STRMAX) :: errmsg - - open(unit = LUN, file = param%particle_out, status = 'OLD', form = 'UNFORMATTED', err = 667, iomsg = errmsg) - - select type(cb => system%cb) - class is (symba_cb) - select type(pl => system%pl) - class is (symba_pl) - select type(tp => system%tp) - class is (symba_tp) - associate(npl => pl%nbody, ntp => tp%nbody) - do - lmatch = .false. - read(LUN, err = 667, iomsg = errmsg, end = 333) id - - if (id == cb%id) then - read(LUN, err = 667, iomsg = errmsg) cb%info - lmatch = .true. - else - if (npl > 0) then - idx = findloc(pl%id(1:npl), id, dim=1) - if (idx /= 0) then - read(LUN, err = 667, iomsg = errmsg) pl%info(idx) - lmatch = .true. - end if - end if - if (.not.lmatch .and. ntp > 0) then - idx = findloc(tp%id(1:ntp), id, dim=1) - if (idx /= 0) then - read(LUN, err = 667, iomsg = errmsg) tp%info(idx) - lmatch = .true. - end if - end if - end if - if (.not.lmatch) then - read(LUN, err = 667, iomsg = errmsg) tmpinfo - end if - end do - end associate - close(unit = LUN, err = 667, iomsg = errmsg) - end select - end select - end select + character(STRMAX) :: errmsg + + call io_read_in_particle_info(self, iu) + read(iu, err = 667, iomsg = errmsg) self%origin_type + read(iu, err = 667, iomsg = errmsg) self%origin_time + read(iu, err = 667, iomsg = errmsg) self%origin_xh(:) + read(iu, err = 667, iomsg = errmsg) self%origin_vh(:) - 333 continue return 667 continue - write(*,*) "Error reading particle information file: " // trim(adjustl(errmsg)) + write(*,*) "Error reading particle metadata information from file: " // trim(adjustl(errmsg)) call util_exit(FAILURE) - end subroutine symba_io_read_particle + end subroutine symba_io_read_in_particle_info module subroutine symba_io_write_discard(self, param) diff --git a/src/symba/symba_setup.f90 b/src/symba/symba_setup.f90 index 166f6e804..f7cc82024 100644 --- a/src/symba/symba_setup.f90 +++ b/src/symba/symba_setup.f90 @@ -2,60 +2,48 @@ use swiftest contains - module subroutine symba_setup_initialize_particle_info(system, param) + module subroutine symba_setup_initialize_particle_info_system(self, param) !! author: David A. Minton !! !! Initializes a new particle information data structure with initial conditions recorded implicit none ! Argumets - class(symba_nbody_system), intent(inout) :: system !! SyMBA nbody system object - class(symba_parameters), intent(inout) :: param !! Current run configuration parameters with SyMBA extensions + class(symba_nbody_system), intent(inout) :: self !! SyMBA nbody system object + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters ! Internals integer(I4B) :: i - integer(I4B), dimension(:), allocatable :: idx - - select type(cb => system%cb) - class is (symba_cb) - cb%info%origin_type = "Central body" - cb%info%origin_time = param%t0 - cb%info%origin_xh(:) = 0.0_DP - cb%info%origin_vh(:) = 0.0_DP - call symba_io_dump_particle_info(system, param, lincludecb=.true.) + + select type(cbinfo => self%cb%info) + class is (symba_particle_info) + cbinfo%origin_type = "Initial conditions" + cbinfo%origin_time = param%t0 + cbinfo%origin_xh(:) = 0.0_DP + cbinfo%origin_vh(:) = 0.0_DP end select - select type(pl => system%pl) - class is (symba_pl) - do i = 1, pl%nbody - pl%info(i)%origin_type = "Initial conditions" - pl%info(i)%origin_time = param%t0 - pl%info(i)%origin_xh(:) = pl%xh(:,i) - pl%info(i)%origin_vh(:) = pl%vh(:,i) + select type(plinfo => self%pl%info) + class is (symba_particle_info) + do i = 1, self%pl%nbody + plinfo(i)%origin_type = "Initial conditions" + plinfo(i)%origin_time = param%t0 + plinfo(i)%origin_xh(:) = self%pl%xh(:,i) + plinfo(i)%origin_vh(:) = self%pl%vh(:,i) end do - if (pl%nbody > 0) then - allocate(idx(pl%nbody)) - call symba_io_dump_particle_info(system, param, plidx=[(i, i=1, pl%nbody)]) - deallocate(idx) - end if end select - select type(tp => system%tp) - class is (symba_tp) - do i = 1, tp%nbody - tp%info(i)%origin_type = "Initial conditions" - tp%info(i)%origin_time = param%t0 - tp%info(i)%origin_xh(:) = tp%xh(:,i) - tp%info(i)%origin_vh(:) = tp%vh(:,i) + select type(tpinfo => self%tp%info) + class is (symba_particle_info) + do i = 1, self%tp%nbody + tpinfo(i)%origin_type = "Initial conditions" + tpinfo(i)%origin_time = param%t0 + tpinfo(i)%origin_xh(:) = self%tp%xh(:,i) + tpinfo(i)%origin_vh(:) = self%tp%vh(:,i) end do - if (tp%nbody > 0) then - allocate(idx(tp%nbody)) - call symba_io_dump_particle_info(system, param, tpidx=[(i, i=1, tp%nbody)]) - deallocate(idx) - end if end select - + call setup_initialize_particle_info_system(self, param) return - end subroutine symba_setup_initialize_particle_info + end subroutine symba_setup_initialize_particle_info_system module subroutine symba_setup_initialize_system(self, param) @@ -77,14 +65,6 @@ module subroutine symba_setup_initialize_system(self, param) call system%pltpenc_list%setup(0) call system%plplenc_list%setup(0) call system%plplcollision_list%setup(0) - select type(param) - class is (symba_parameters) - if (param%lrestart) then - call symba_io_read_particle(system, param) - else - call symba_setup_initialize_particle_info(system, param) - end if - end select end associate return @@ -135,6 +115,8 @@ module subroutine symba_setup_pl(self, n, param) call setup_pl(self, n, param) if (n <= 0) return + + if (allocated(self%info)) deallocate(self%info) if (allocated(self%lcollision)) deallocate(self%lcollision) if (allocated(self%lencounter)) deallocate(self%lencounter) if (allocated(self%lmtiny)) deallocate(self%lmtiny) @@ -148,6 +130,7 @@ module subroutine symba_setup_pl(self, n, param) if (allocated(self%kin)) deallocate(self%kin) if (allocated(self%info)) deallocate(self%info) + allocate(symba_particle_info :: self%info(n)) allocate(self%lcollision(n)) allocate(self%lencounter(n)) allocate(self%lmtiny(n)) @@ -159,7 +142,6 @@ module subroutine symba_setup_pl(self, n, param) allocate(self%peri(n)) allocate(self%atp(n)) allocate(self%kin(n)) - allocate(self%info(n)) self%lcollision(:) = .false. self%lencounter(:) = .false. diff --git a/src/symba/symba_util.f90 b/src/symba/symba_util.f90 index aa2fe0234..f5201ac6c 100644 --- a/src/symba/symba_util.f90 +++ b/src/symba/symba_util.f90 @@ -2,33 +2,6 @@ use swiftest contains - module subroutine symba_util_append_arr_info(arr, source, nold, nsrc, lsource_mask) - !! author: David A. Minton - !! - !! Append a single array of particle information type onto another. If the destination array is not allocated, or is not big enough, this will allocate space for it. - 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 - integer(I4B), intent(in) :: nold, nsrc !! Extend of the old array and the source array, respectively - logical, dimension(:), intent(in) :: lsource_mask !! Logical mask indicating which elements to append to - ! Internals - integer(I4B) :: nnew - - if (.not. allocated(source)) return - - nnew = count(lsource_mask(1:nsrc)) - if (.not.allocated(arr)) then - allocate(arr(nold+nnew)) - else - call util_resize(arr, nold + nnew) - end if - - arr(nold + 1:nold + nnew) = pack(source(1:nsrc), lsource_mask(1:nsrc)) - - return - end subroutine symba_util_append_arr_info - module subroutine symba_util_append_arr_kin(arr, source, nold, nsrc, lsource_mask) !! author: David A. Minton @@ -210,26 +183,6 @@ module subroutine symba_util_copy_encounter(self, source) end subroutine symba_util_copy_encounter - 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 - !! 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_info - - module subroutine symba_util_fill_arr_kin(keeps, inserts, lfill_list) !! author: David A. Minton !! @@ -501,7 +454,7 @@ module subroutine symba_util_rearray_pl(self, system, param) lmask(npl+1:npl+nadd) = pl%status(npl+1:npl+nadd) == NEW_PARTICLE npl = pl%nbody - call symba_io_dump_particle_info(system, param, plidx=pack([(i, i=1, npl)], lmask)) + call pl%dump_particle_info(param, idx=pack([(i, i=1, npl)], lmask)) deallocate(lmask) end if @@ -578,40 +531,6 @@ module subroutine symba_util_rearray_pl(self, system, param) end subroutine symba_util_rearray_pl - 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 !! @@ -803,26 +722,6 @@ module subroutine symba_util_sort_tp(self, sortby, ascending) end subroutine symba_util_sort_tp - module subroutine symba_util_sort_rearrange_arr_info(arr, ind, n) - !! author: David A. Minton - !! - !! Rearrange a single array of particle information type in-place from an index list. - implicit none - ! Arguments - type(symba_particle_info), dimension(:), allocatable, intent(inout) :: arr !! Destination array - integer(I4B), dimension(:), intent(in) :: ind !! Index to rearrange against - integer(I4B), intent(in) :: n !! Number of elements in arr and ind to rearrange - ! Internals - type(symba_particle_info), dimension(:), allocatable :: tmp !! Temporary copy of array used during rearrange operation - - if (.not. allocated(arr) .or. n <= 0) return - allocate(tmp, source=arr) - tmp(1:n) = arr(ind(1:n)) - call move_alloc(tmp, arr) - - return - end subroutine symba_util_sort_rearrange_arr_info - module subroutine symba_util_sort_rearrange_arr_kin(arr, ind, n) !! author: David A. Minton @@ -908,45 +807,6 @@ 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 - ! Internals - integer(I4B) :: nspill, nkeep, nlist - - nkeep = count(.not.lspill_list(:)) - nspill = count(lspill_list(:)) - nlist = size(lspill_list(:)) - - if (.not.allocated(keeps) .or. nspill == 0) return - if (.not.allocated(discards)) then - allocate(discards(nspill)) - else if (size(discards) /= nspill) then - deallocate(discards) - allocate(discards(nspill)) - end if - - discards(:) = pack(keeps(1:nlist), lspill_list(1:nlist)) - if (ldestructive) then - if (nkeep > 0) then - keeps(:) = pack(keeps(1:nlist), .not. lspill_list(1:nlist)) - 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 !! diff --git a/src/util/util_append.f90 b/src/util/util_append.f90 index 971e3c950..11664827e 100644 --- a/src/util/util_append.f90 +++ b/src/util/util_append.f90 @@ -116,6 +116,34 @@ module subroutine util_append_arr_I4B(arr, source, nold, nsrc, lsource_mask) end subroutine util_append_arr_I4B + module subroutine util_append_arr_info(arr, source, nold, nsrc, lsource_mask) + !! author: David A. Minton + !! + !! Append a single array of particle information type onto another. If the destination array is not allocated, or is not big enough, this will allocate space for it. + implicit none + ! Arguments + class(swiftest_particle_info), dimension(:), allocatable, intent(inout) :: arr !! Destination array + class(swiftest_particle_info), dimension(:), allocatable, intent(in) :: source !! Array to append + integer(I4B), intent(in) :: nold, nsrc !! Extend of the old array and the source array, respectively + logical, dimension(:), intent(in) :: lsource_mask !! Logical mask indicating which elements to append to + ! Internals + integer(I4B) :: nnew + + if (.not. allocated(source)) return + + nnew = count(lsource_mask(1:nsrc)) + if (.not.allocated(arr)) then + allocate(arr(nold+nnew)) + else + call util_resize(arr, nold + nnew) + end if + + arr(nold + 1:nold + nnew) = pack(source(1:nsrc), lsource_mask(1:nsrc)) + + return + end subroutine util_append_arr_info + + module subroutine util_append_arr_logical(arr, source, nold, nsrc, lsource_mask) !! author: David A. Minton !! @@ -156,7 +184,7 @@ module subroutine util_append_body(self, source, lsource_mask) logical, dimension(:), intent(in) :: lsource_mask !! Logical mask indicating which elements to append to associate(nold => self%nbody, nsrc => source%nbody) - call util_append(self%name, source%name, nold, nsrc, lsource_mask) + call util_append(self%info, source%info, nold, nsrc, lsource_mask) call util_append(self%id, source%id, nold, nsrc, lsource_mask) call util_append(self%status, source%status, nold, nsrc, lsource_mask) call util_append(self%ldiscard, source%ldiscard, nold, nsrc, lsource_mask) diff --git a/src/util/util_fill.f90 b/src/util/util_fill.f90 index 4a5a70311..b1bf951d0 100644 --- a/src/util/util_fill.f90 +++ b/src/util/util_fill.f90 @@ -82,6 +82,27 @@ module subroutine util_fill_arr_I4B(keeps, inserts, lfill_list) return end subroutine util_fill_arr_I4B + + module subroutine 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 + !! This is the inverse of a spill operation + implicit none + ! Arguments + class(swiftest_particle_info), dimension(:), allocatable, intent(inout) :: keeps !! Array of values to keep + class(swiftest_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 util_fill_arr_info + + module subroutine util_fill_arr_logical(keeps, inserts, lfill_list) !! author: David A. Minton !! @@ -119,7 +140,7 @@ module subroutine util_fill_body(self, inserts, lfill_list) !> 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%info, inserts%info, 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) diff --git a/src/util/util_resize.f90 b/src/util/util_resize.f90 index 1dee5fdb3..e76d53a8d 100644 --- a/src/util/util_resize.f90 +++ b/src/util/util_resize.f90 @@ -138,6 +138,41 @@ module subroutine util_resize_arr_I4B(arr, nnew) end subroutine util_resize_arr_I4B + + module subroutine 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 + class(swiftest_particle_info), dimension(:), allocatable, intent(inout) :: arr !! Array to resize + integer(I4B), intent(in) :: nnew !! New size + ! Internals + class(swiftest_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 util_resize_arr_info + + module subroutine util_resize_arr_logical(arr, nnew) !! author: David A. Minton !! @@ -181,7 +216,7 @@ module subroutine util_resize_body(self, nnew) 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%info, nnew) call util_resize(self%id, nnew) call util_resize(self%status, nnew) call util_resize(self%ldiscard, nnew) diff --git a/src/util/util_sort.f90 b/src/util/util_sort.f90 index b2a5464aa..4b96dd9d1 100644 --- a/src/util/util_sort.f90 +++ b/src/util/util_sort.f90 @@ -328,7 +328,7 @@ module subroutine util_sort_rearrange_body(self, ind) associate(n => self%nbody) call util_sort_rearrange(self%id, ind, n) - call util_sort_rearrange(self%name, ind, n) + call util_sort_rearrange(self%info, ind, n) call util_sort_rearrange(self%status, ind, n) call util_sort_rearrange(self%ldiscard, ind, n) call util_sort_rearrange(self%xh, ind, n) @@ -459,6 +459,27 @@ module subroutine util_sort_rearrange_arr_logical(arr, ind, n) end subroutine util_sort_rearrange_arr_logical + module subroutine util_sort_rearrange_arr_info(arr, ind, n) + !! author: David A. Minton + !! + !! Rearrange a single array of particle information type in-place from an index list. + implicit none + ! Arguments + class(swiftest_particle_info), dimension(:), allocatable, intent(inout) :: arr !! Destination array + integer(I4B), dimension(:), intent(in) :: ind !! Index to rearrange against + integer(I4B), intent(in) :: n !! Number of elements in arr and ind to rearrange + ! Internals + class(swiftest_particle_info), dimension(:), allocatable :: tmp !! Temporary copy of array used during rearrange operation + + if (.not. allocated(arr) .or. n <= 0) return + allocate(tmp, source=arr) + tmp(1:n) = arr(ind(1:n)) + call move_alloc(tmp, arr) + + return + end subroutine util_sort_rearrange_arr_info + + module subroutine util_sort_rearrange_pl(self, ind) !! author: David A. Minton !! diff --git a/src/util/util_spill.f90 b/src/util/util_spill.f90 index 63cce317a..66e5d22d8 100644 --- a/src/util/util_spill.f90 +++ b/src/util/util_spill.f90 @@ -199,7 +199,46 @@ module subroutine util_spill_arr_I8B(keeps, discards, lspill_list, ldestructive) return end subroutine util_spill_arr_I8B - + + + module subroutine 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 + class(swiftest_particle_info), dimension(:), allocatable, intent(inout) :: keeps !! Array of values to keep + class(swiftest_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 + ! Internals + integer(I4B) :: nspill, nkeep, nlist + + nkeep = count(.not.lspill_list(:)) + nspill = count(lspill_list(:)) + nlist = size(lspill_list(:)) + + if (.not.allocated(keeps) .or. nspill == 0) return + if (.not.allocated(discards)) then + allocate(discards(nspill)) + else if (size(discards) /= nspill) then + deallocate(discards) + allocate(discards(nspill)) + end if + + discards(:) = pack(keeps(1:nlist), lspill_list(1:nlist)) + if (ldestructive) then + if (nkeep > 0) then + keeps(:) = pack(keeps(1:nlist), .not. lspill_list(1:nlist)) + else + deallocate(keeps) + end if + end if + + return + end subroutine util_spill_arr_info + module subroutine util_spill_arr_logical(keeps, discards, lspill_list, ldestructive) !! author: David A. Minton @@ -257,7 +296,7 @@ module subroutine util_spill_body(self, discards, lspill_list, ldestructive) !> 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%info, discards%info, 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) From a634afd964889a5e7f327f3454b70e3c40932012 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Fri, 27 Aug 2021 18:29:31 -0400 Subject: [PATCH 074/154] Added SyMBA variables to NetCDF --- examples/symba_mars_disk/testnetcdf.ipynb | 1132 +-------------------- examples/whm_gr_test/Untitled.ipynb | 552 +++++++++- python/swiftest/swiftest/io.py | 9 +- src/io/io.f90 | 2 + src/modules/swiftest_classes.f90 | 5 +- src/modules/swiftest_globals.f90 | 7 +- src/modules/symba_classes.f90 | 48 +- src/netcdf/netcdf.f90 | 33 +- src/symba/symba_netcdf.f90 | 115 +++ 9 files changed, 709 insertions(+), 1194 deletions(-) create mode 100644 src/symba/symba_netcdf.f90 diff --git a/examples/symba_mars_disk/testnetcdf.ipynb b/examples/symba_mars_disk/testnetcdf.ipynb index d98408178..88e68d95f 100644 --- a/examples/symba_mars_disk/testnetcdf.ipynb +++ b/examples/symba_mars_disk/testnetcdf.ipynb @@ -25,7 +25,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 2, "metadata": {}, "outputs": [ { @@ -36,8 +36,6 @@ "\n", "Creating Dataset\n", "Successfully converted 11 output frames.\n", - "\n", - "Adding particle info to Dataset\n", "Swiftest simulation data stored as xarray DataSet .ds\n" ] } @@ -49,1096 +47,7 @@ }, { "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "
<xarray.Dataset>\n",
-       "Dimensions:      (id: 1521, time: 11)\n",
-       "Coordinates:\n",
-       "  * id           (id) int64 1 2 3 4 5 6 7 ... 1515 1516 1517 1518 1519 1520 1521\n",
-       "  * time         (time) float64 0.0 600.0 1.2e+03 ... 4.8e+03 5.4e+03 6e+03\n",
-       "Data variables: (12/46)\n",
-       "    npl          (time) int32 1500 1500 1500 1500 1500 ... 1518 1518 1518 1518\n",
-       "    ntp          (time) int32 0 0 0 0 0 0 0 0 0 0 0\n",
-       "    xhx          (id, time) float64 0.0 0.0 0.0 ... 1.587e+06 2.838e+06\n",
-       "    xhy          (id, time) float64 0.0 0.0 0.0 ... -9.103e+06 -8.791e+06\n",
-       "    xhz          (id, time) float64 0.0 0.0 0.0 ... -3.433e+04 -3.905e+04\n",
-       "    vhx          (id, time) float64 0.0 0.0 0.0 ... 2.118e+03 2.045e+03\n",
-       "    ...           ...\n",
-       "    py_origin    (id) float64 0.0 -4.373e+06 ... -8.094e+06 -8.123e+06\n",
-       "    pz_origin    (id) float64 0.0 -9.627e+03 2.41e+04 ... 2.923e+03 -3.139e+03\n",
-       "    vhx_origin   (id) float64 0.0 988.0 1.016e+03 ... 1.881e+03 1.887e+03\n",
-       "    vhy_origin   (id) float64 0.0 -1.888e+03 ... -1.004e+03 -1.027e+03\n",
-       "    vhz_origin   (id) float64 0.0 10.69 -2.604 -1.465 ... 18.95 -9.448 -12.51\n",
-       "    origin_type  (id) <U32 'Central body' ... 'Supercatastrophic'
" - ], - "text/plain": [ - "\n", - "Dimensions: (id: 1521, time: 11)\n", - "Coordinates:\n", - " * id (id) int64 1 2 3 4 5 6 7 ... 1515 1516 1517 1518 1519 1520 1521\n", - " * time (time) float64 0.0 600.0 1.2e+03 ... 4.8e+03 5.4e+03 6e+03\n", - "Data variables: (12/46)\n", - " npl (time) int32 ...\n", - " ntp (time) int32 ...\n", - " xhx (id, time) float64 ...\n", - " xhy (id, time) float64 ...\n", - " xhz (id, time) float64 ...\n", - " vhx (id, time) float64 ...\n", - " ... ...\n", - " py_origin (id) float64 0.0 -4.373e+06 ... -8.094e+06 -8.123e+06\n", - " pz_origin (id) float64 0.0 -9.627e+03 2.41e+04 ... 2.923e+03 -3.139e+03\n", - " vhx_origin (id) float64 0.0 988.0 1.016e+03 ... 1.881e+03 1.887e+03\n", - " vhy_origin (id) float64 0.0 -1.888e+03 ... -1.004e+03 -1.027e+03\n", - " vhz_origin (id) float64 0.0 10.69 -2.604 -1.465 ... 18.95 -9.448 -12.51\n", - " origin_type (id) \n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "
<xarray.Dataset>\n",
-       "Dimensions:      (id: 1521)\n",
-       "Coordinates:\n",
-       "  * id           (id) int32 1 1130 216 1326 20 27 ... 1517 1518 1519 1520 1521\n",
-       "Data variables:\n",
-       "    time_origin  (id) float64 0.0 0.0 0.0 0.0 ... 2.4e+03 2.4e+03 2.4e+03\n",
-       "    xhx_origin   (id) float64 0.0 1.047e+07 -1.034e+07 ... -4.435e+06 -4.426e+06\n",
-       "    py_origin    (id) float64 0.0 3.395e+06 2.852e+05 ... -8.094e+06 -8.123e+06\n",
-       "    pz_origin    (id) float64 0.0 2.709e+04 -3.221e+04 ... 2.923e+03 -3.139e+03\n",
-       "    vhx_origin   (id) float64 0.0 -597.1 -50.0 ... 1.885e+03 1.881e+03 1.887e+03\n",
-       "    vhy_origin   (id) float64 0.0 1.881e+03 -2.018e+03 ... -1.004e+03 -1.027e+03\n",
-       "    vhz_origin   (id) float64 0.0 -6.96 11.61 3.592 ... 18.95 -9.448 -12.51\n",
-       "    origin_type  (id) <U32 'Central body' ... 'Supercatastrophic'
" - ], - "text/plain": [ - "\n", - "Dimensions: (id: 1521)\n", - "Coordinates:\n", - " * id (id) int32 1 1130 216 1326 20 27 ... 1517 1518 1519 1520 1521\n", - "Data variables:\n", - " time_origin (id) float64 0.0 0.0 0.0 0.0 ... 2.4e+03 2.4e+03 2.4e+03\n", - " xhx_origin (id) float64 0.0 1.047e+07 -1.034e+07 ... -4.435e+06 -4.426e+06\n", - " py_origin (id) float64 0.0 3.395e+06 2.852e+05 ... -8.094e+06 -8.123e+06\n", - " pz_origin (id) float64 0.0 2.709e+04 -3.221e+04 ... 2.923e+03 -3.139e+03\n", - " vhx_origin (id) float64 0.0 -597.1 -50.0 ... 1.885e+03 1.881e+03 1.887e+03\n", - " vhy_origin (id) float64 0.0 1.881e+03 -2.018e+03 ... -1.004e+03 -1.027e+03\n", - " vhz_origin (id) float64 0.0 -6.96 11.61 3.592 ... 18.95 -9.448 -12.51\n", - " origin_type (id) 0, drop=True)" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "ename": "KeyError", - "evalue": "216", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mKeyError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m~/.conda/envs/cent7/2020.02-py37/swiftestOOF/lib/python3.7/site-packages/pandas/core/indexes/base.py\u001b[0m in \u001b[0;36mget_loc\u001b[0;34m(self, key, method, tolerance)\u001b[0m\n\u001b[1;32m 3079\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-> 3080\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_engine\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_loc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcasted_key\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 3081\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mKeyError\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0merr\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32mpandas/_libs/index.pyx\u001b[0m in \u001b[0;36mpandas._libs.index.IndexEngine.get_loc\u001b[0;34m()\u001b[0m\n", - "\u001b[0;32mpandas/_libs/index.pyx\u001b[0m in \u001b[0;36mpandas._libs.index.IndexEngine.get_loc\u001b[0;34m()\u001b[0m\n", - "\u001b[0;32mpandas/_libs/hashtable_class_helper.pxi\u001b[0m in \u001b[0;36mpandas._libs.hashtable.Int64HashTable.get_item\u001b[0;34m()\u001b[0m\n", - "\u001b[0;32mpandas/_libs/hashtable_class_helper.pxi\u001b[0m in \u001b[0;36mpandas._libs.hashtable.Int64HashTable.get_item\u001b[0;34m()\u001b[0m\n", - "\u001b[0;31mKeyError\u001b[0m: 216", - "\nThe above exception was the direct cause of the following exception:\n", - "\u001b[0;31mKeyError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mnewp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msel\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mid\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m216\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~/.conda/envs/cent7/2020.02-py37/swiftestOOF/lib/python3.7/site-packages/xarray/core/dataset.py\u001b[0m in \u001b[0;36msel\u001b[0;34m(self, indexers, method, tolerance, drop, **indexers_kwargs)\u001b[0m\n\u001b[1;32m 2347\u001b[0m \u001b[0mindexers\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0meither_dict_or_kwargs\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mindexers\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mindexers_kwargs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m\"sel\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2348\u001b[0m pos_indexers, new_indexes = remap_label_indexers(\n\u001b[0;32m-> 2349\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mindexers\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mindexers\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmethod\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mmethod\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtolerance\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mtolerance\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2350\u001b[0m )\n\u001b[1;32m 2351\u001b[0m \u001b[0mresult\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0misel\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mindexers\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mpos_indexers\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdrop\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mdrop\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/coordinates.py\u001b[0m in \u001b[0;36mremap_label_indexers\u001b[0;34m(obj, indexers, method, tolerance, **indexers_kwargs)\u001b[0m\n\u001b[1;32m 418\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 419\u001b[0m pos_indexers, new_indexes = indexing.remap_label_indexers(\n\u001b[0;32m--> 420\u001b[0;31m \u001b[0mobj\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mv_indexers\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmethod\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mmethod\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtolerance\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mtolerance\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 421\u001b[0m )\n\u001b[1;32m 422\u001b[0m \u001b[0;31m# attach indexer's coordinate to pos_indexers\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/indexing.py\u001b[0m in \u001b[0;36mremap_label_indexers\u001b[0;34m(data_obj, indexers, method, tolerance)\u001b[0m\n\u001b[1;32m 276\u001b[0m \u001b[0mcoords_dtype\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mdata_obj\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcoords\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mdim\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdtype\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 277\u001b[0m \u001b[0mlabel\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mmaybe_cast_to_coords_dtype\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mlabel\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcoords_dtype\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 278\u001b[0;31m \u001b[0midxr\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mnew_idx\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mconvert_label_indexer\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mindex\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlabel\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdim\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmethod\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtolerance\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 279\u001b[0m \u001b[0mpos_indexers\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mdim\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0midxr\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 280\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mnew_idx\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0;32mNone\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/indexing.py\u001b[0m in \u001b[0;36mconvert_label_indexer\u001b[0;34m(index, label, index_name, method, tolerance)\u001b[0m\n\u001b[1;32m 197\u001b[0m \u001b[0mindexer\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mindex\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_loc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mlabel_value\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 198\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 199\u001b[0;31m \u001b[0mindexer\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mindex\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_loc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mlabel_value\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmethod\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mmethod\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtolerance\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mtolerance\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 200\u001b[0m \u001b[0;32melif\u001b[0m \u001b[0mlabel\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdtype\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mkind\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;34m\"b\"\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 201\u001b[0m \u001b[0mindexer\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mlabel\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/pandas/core/indexes/base.py\u001b[0m in \u001b[0;36mget_loc\u001b[0;34m(self, key, method, tolerance)\u001b[0m\n\u001b[1;32m 3080\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_engine\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_loc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcasted_key\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3081\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mKeyError\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0merr\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 3082\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mKeyError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mkey\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0merr\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 3083\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3084\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mtolerance\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mKeyError\u001b[0m: 216" - ] - } - ], - "source": [] - }, - { - "cell_type": "code", - "execution_count": 7, + "execution_count": 5, "metadata": {}, "outputs": [ { @@ -1495,43 +404,28 @@ " stroke: currentColor;\n", " fill: currentColor;\n", "}\n", - "
<xarray.Dataset>\n",
-       "Dimensions:      ()\n",
+       "
<xarray.DataArray 'particle_type' (id: 1521)>\n",
+       "array([b'Central Body', b'Massive Body', b'Massive Body', ..., b'Massive Body',\n",
+       "       b'Massive Body', b'Massive Body'], dtype='|S32')\n",
        "Coordinates:\n",
-       "    id           int32 216\n",
-       "Data variables:\n",
-       "    time_origin  float64 0.0\n",
-       "    xhx_origin   float64 -1.034e+07\n",
-       "    py_origin    float64 2.852e+05\n",
-       "    pz_origin    float64 -3.221e+04\n",
-       "    vhx_origin   float64 -50.0\n",
-       "    vhy_origin   float64 -2.018e+03\n",
-       "    vhz_origin   float64 11.61\n",
-       "    origin_type  <U32 'Initial conditions'
" + " * id (id) int32 0 1 2 3 4 5 6 7 ... 1514 1515 1516 1517 1518 1519 1520
" ], "text/plain": [ - "\n", - "Dimensions: ()\n", + "\n", + "array([b'Central Body', b'Massive Body', b'Massive Body', ..., b'Massive Body',\n", + " b'Massive Body', b'Massive Body'], dtype='|S32')\n", "Coordinates:\n", - " id int32 216\n", - "Data variables:\n", - " time_origin float64 0.0\n", - " xhx_origin float64 -1.034e+07\n", - " py_origin float64 2.852e+05\n", - " pz_origin float64 -3.221e+04\n", - " vhx_origin float64 -50.0\n", - " vhy_origin float64 -2.018e+03\n", - " vhz_origin float64 11.61\n", - " origin_type
<xarray.DataArray 'name' (str: 32)>\n",
-       "array([b'M', b'e', b'r', b'c', b'u', b'r', b'y', b'', b'', b'', b'', b'', b'',\n",
-       "       b'', b'', b'', b'', b'', b'', b'', b'', b'', b'', b'', b'', b'', b'',\n",
-       "       b'', b'', b'', b'', b''], dtype='|S1')\n",
+       "
<xarray.DataArray 'name' (id: 9)>\n",
+       "array(['Sun', 'Mercury', 'Venus', 'Earth', 'Mars', 'Jupiter', 'Saturn',\n",
+       "       'Uranus', 'Neptune'], dtype='<U7')\n",
        "Coordinates:\n",
-       "    id       int32 1\n",
-       "Dimensions without coordinates: str
" + " * id (id) int32 0 1 2 3 4 5 6 7 8
" ], "text/plain": [ - "\n", - "array([b'M', b'e', b'r', b'c', b'u', b'r', b'y', b'', b'', b'', b'', b'', b'',\n", - " b'', b'', b'', b'', b'', b'', b'', b'', b'', b'', b'', b'', b'', b'',\n", - " b'', b'', b'', b'', b''], dtype='|S1')\n", + "\n", + "array(['Sun', 'Mercury', 'Venus', 'Earth', 'Mars', 'Jupiter', 'Saturn',\n", + " 'Uranus', 'Neptune'], dtype=', line 2)", - "output_type": "error", - "traceback": [ - "\u001b[0;36m File \u001b[0;32m\"\"\u001b[0;36m, line \u001b[0;32m2\u001b[0m\n\u001b[0;31m ds['name'].sel(id=i) = 'test'\u001b[0m\n\u001b[0m ^\u001b[0m\n\u001b[0;31mSyntaxError\u001b[0m\u001b[0;31m:\u001b[0m can't assign to function call\n" - ] - } - ], - "source": [ - "for i in ds.id:\n", - " ds['name'].sel(id=i) = 'test'" + "ds['name']" ] }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 6, "metadata": {}, "outputs": [ { "data": { + "text/html": [ + "
\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
<xarray.Dataset>\n",
+       "Dimensions:        (id: 9, time: 3)\n",
+       "Coordinates:\n",
+       "  * time           (time) float64 0.0 0.0006845 0.001369\n",
+       "  * id             (id) int32 0 1 2 3 4 5 6 7 8\n",
+       "Data variables: (12/19)\n",
+       "    npl            (time) int32 8 8 8\n",
+       "    ntp            (time) int32 0 0 0\n",
+       "    name           (id) <U7 'Sun' 'Mercury' 'Venus' ... 'Uranus' 'Neptune'\n",
+       "    particle_type  (id) <U12 'Central Body' 'Massive Body' ... 'Massive Body'\n",
+       "    xhx            (time, id) float64 0.0 -0.2951 -0.211 ... 6.48 14.74 29.58\n",
+       "    xhy            (time, id) float64 0.0 -0.3435 -0.6945 ... 13.13 -4.487\n",
+       "    ...             ...\n",
+       "    capom          (time, id) float64 0.0 0.8431 1.337 ... 1.983 1.293 2.299\n",
+       "    omega          (time, id) float64 0.0 0.5094 0.9619 ... 5.859 1.673 4.29\n",
+       "    capm           (time, id) float64 0.0 2.426 2.107 ... 3.935 4.116 5.838\n",
+       "    Gmass          (time, id) float64 39.48 6.554e-06 ... 0.001724 0.002034\n",
+       "    rhill          (time, id) float64 0.0 0.001475 0.006759 ... 0.4697 0.7814\n",
+       "    radius         (time, id) float64 0.00465 1.631e-05 ... 0.0001695 0.0001646
" + ], "text/plain": [ - "array('SMVEMJSUNueeaauarenrnrrptap\\x00cutsiunt\\x00ush\\x00truu\\x00r\\x00\\x00\\x00ensn\\x00y\\x00\\x00\\x00r\\x00\\x00e',\n", - " dtype='\n", + "Dimensions: (id: 9, time: 3)\n", + "Coordinates:\n", + " * time (time) float64 0.0 0.0006845 0.001369\n", + " * id (id) int32 0 1 2 3 4 5 6 7 8\n", + "Data variables: (12/19)\n", + " npl (time) int32 ...\n", + " ntp (time) int32 ...\n", + " name (id) of fragments produced in collisional events. type :: swiftest_particle_info character(len=NAMELEN) :: name !! Non-unique name - character(len=NAMELEN) :: particle_type !! String containing a description of the particle type (e.g. CentralBody, MassiveBody, TestParticle) + character(len=NAMELEN) :: particle_type !! String containing a description of the particle type (e.g. Central Body, Massive Body, Test Particle) contains procedure :: dump => io_dump_particle_info !! Dumps contents of particle information to file procedure :: read_in => io_read_in_particle_info !! Read in a particle information object from an open file diff --git a/src/modules/swiftest_globals.f90 b/src/modules/swiftest_globals.f90 index dd6752b8f..b84e7f2f9 100644 --- a/src/modules/swiftest_globals.f90 +++ b/src/modules/swiftest_globals.f90 @@ -55,9 +55,9 @@ module swiftest_globals character(*), parameter :: XV = 'XV' !! Symbolic name for binary output file contents for cartesian position and velocity vectors character(*), parameter :: XVEL = 'XVEL' !! Symbolic name for binary output file contents for both cartesian position and velocity and orbital elements - character(*), parameter :: CB_TYPE_NAME = "CentralBody" - character(*), parameter :: PL_TYPE_NAME = "MassiveBody" - character(*), parameter :: TP_TYPE_NAME = "TestParticle" + character(*), parameter :: CB_TYPE_NAME = "Central Body" + character(*), parameter :: PL_TYPE_NAME = "Massive Body" + character(*), parameter :: TP_TYPE_NAME = "Test Particle" ! OpenMP Parameters integer(I4B) :: nthreads = 1 !! Number of OpenMP threads @@ -139,6 +139,7 @@ module swiftest_globals character(*), parameter :: TIME_DIMNAME = "time" !! NetCDF name of the time dimension character(*), parameter :: ID_DIMNAME = "id" !! NetCDF name of the particle id dimension character(*), parameter :: STR_DIMNAME = "str" !! NetCDF name of the particle id dimension + character(*), parameter :: PTYPE_VARNAME = "particle_type" ! NetCDF name of the particle type variable character(*), parameter :: NAME_VARNAME = "name" !! NetCDF name of the particle name variable character(*), parameter :: NPL_VARNAME = "npl" !! NetCDF name of the number of active massive bodies variable character(*), parameter :: NTP_VARNAME = "ntp" !! NetCDF name of the number of active test particles variable diff --git a/src/modules/symba_classes.f90 b/src/modules/symba_classes.f90 index 5294efa64..18cb8fe96 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, swiftest_encounter, swiftest_particle_info + use swiftest_classes, only : swiftest_parameters, swiftest_base, swiftest_encounter, swiftest_particle_info, netcdf_parameters use helio_classes, only : helio_cb, helio_pl, helio_tp, helio_nbody_system use rmvs_classes, only : rmvs_chk_ind implicit none @@ -14,6 +14,28 @@ module symba_classes integer(I4B), private, parameter :: NTENC = 3 real(DP), private, parameter :: RHSCALE = 6.5_DP real(DP), private, parameter :: RSHELL = 0.48075_DP + character(*), parameter :: ORIGIN_TYPE_VARNAME = "origin_type" + character(*), parameter :: ORIGIN_TIME_VARNAME = "origin_time" + character(*), parameter :: ORIGIN_XHX_VARNAME = "origin_xhx" + character(*), parameter :: ORIGIN_XHY_VARNAME = "origin_xhy" + character(*), parameter :: ORIGIN_XHZ_VARNAME = "origin_xhz" + character(*), parameter :: ORIGIN_VHX_VARNAME = "origin_vhx" + character(*), parameter :: ORIGIN_VHY_VARNAME = "origin_vhy" + character(*), parameter :: ORIGIN_VHZ_VARNAME = "origin_vhz" + + type, extends(netcdf_parameters) :: symba_netcdf_parameters + integer(I4B) :: origin_type_varid !! NetCDF ID for the origin type + integer(I4B) :: origin_time_varid !! NetCDF ID for the origin type + integer(I4B) :: origin_xhx_varid !! NetCDF ID for the origin xh x component + integer(I4B) :: origin_xhy_varid !! NetCDF ID for the origin xh y component + integer(I4B) :: origin_xhz_varid !! NetCDF ID for the origin xh z component + integer(I4B) :: origin_vhx_varid !! NetCDF ID for the origin xh x component + integer(I4B) :: origin_vhy_varid !! NetCDF ID for the origin xh y component + integer(I4B) :: origin_vhz_varid !! NetCDF ID for the origin xh z component + contains + procedure :: initialize => symba_netcdf_initialize_output !! Initialize a set of parameters used to identify a NetCDF output objec + procedure :: open => symba_netcdf_open !! Opens a NetCDF file + end type symba_netcdf_parameters type, extends(swiftest_parameters) :: symba_parameters real(DP) :: GMTINY = -1.0_DP !! Smallest G*mass that is fully gravitating @@ -96,6 +118,8 @@ module symba_classes 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 :: write_frame_netcdf => symba_netcdf_write_frame_pl !! I/O routine for writing out a single frame of time-series data for all bodies in the system in NetCDF format + generic :: write_frame => write_frame_netcdf end type symba_pl type, extends(symba_pl) :: symba_merger @@ -433,6 +457,28 @@ module subroutine symba_kick_encounter(self, system, dt, irec, sgn) integer(I4B), intent(in) :: irec !! Current recursion level integer(I4B), intent(in) :: sgn !! sign to be applied to acceleration end subroutine symba_kick_encounter + + module subroutine symba_netcdf_initialize_output(self, param) + use swiftest_classes, only : swiftest_parameters + implicit none + class(symba_netcdf_parameters), intent(inout) :: self !! Parameters used to identify a particular NetCDF dataset + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + end subroutine symba_netcdf_initialize_output + + module subroutine symba_netcdf_open(self, param) + use swiftest_classes, only : swiftest_parameters + implicit none + class(symba_netcdf_parameters), intent(inout) :: self !! Parameters used to identify a particular NetCDF dataset + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + end subroutine symba_netcdf_open + + module subroutine symba_netcdf_write_frame_pl(self, iu, param) + use swiftest_classes, only : swiftest_parameters, netcdf_parameters + implicit none + class(symba_pl), intent(in) :: self !! Swiftest particle object + class(netcdf_parameters), intent(inout) :: iu !! Parameters used to identify a particular NetCDF dataset + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + end subroutine symba_netcdf_write_frame_pl module subroutine symba_setup_initialize_particle_info_system(self, param) use swiftest_classes, only : swiftest_parameters diff --git a/src/netcdf/netcdf.f90 b/src/netcdf/netcdf.f90 index 785e10a92..8925b05ac 100644 --- a/src/netcdf/netcdf.f90 +++ b/src/netcdf/netcdf.f90 @@ -47,7 +47,7 @@ module subroutine netcdf_initialize_output(self, param) integer(I4B) :: old_mode !! Create the new output file, deleting any previously existing output file of the same name - call check( nf90_create(param%outfile, NF90_HDF5, self%ncid) ) + call check( nf90_create(param%outfile, NF90_NETCDF4, self%ncid) ) call check( nf90_set_fill(self%ncid, nf90_nofill, old_mode) ) ! Define the NetCDF dimensions with particle name as the record dimension @@ -68,6 +68,7 @@ module subroutine netcdf_initialize_output(self, param) call check( nf90_def_var(self%ncid, NPL_VARNAME, NF90_INT, self%time_dimid, self%npl_varid) ) call check( nf90_def_var(self%ncid, NTP_VARNAME, NF90_INT, self%time_dimid, self%ntp_varid) ) call check( nf90_def_var(self%ncid, NAME_VARNAME, NF90_CHAR, [self%str_dimid, self%id_dimid], self%name_varid) ) + call check( nf90_def_var(self%ncid, PTYPE_VARNAME, NF90_CHAR, [self%str_dimid, self%id_dimid], self%ptype_varid) ) if ((param%out_form == XV) .or. (param%out_form == XVEL)) then call check( nf90_def_var(self%ncid, XHX_VARNAME, self%out_type, [self%id_dimid, self%time_dimid], self%xhx_varid) ) call check( nf90_def_var(self%ncid, XHY_VARNAME, self%out_type, [self%id_dimid, self%time_dimid], self%xhy_varid) ) @@ -119,8 +120,6 @@ module subroutine netcdf_initialize_output(self, param) call check( nf90_def_var(self%ncid, GMESCAPE_VARNAME, self%out_type, self%time_dimid, self%GMescape_varid) ) end if - call check( nf90_enddef(self%ncid) ) - return end subroutine netcdf_initialize_output @@ -144,6 +143,7 @@ module subroutine netcdf_open(self, param) call check( nf90_inq_varid(self%ncid, NPL_VARNAME, self%npl_varid)) call check( nf90_inq_varid(self%ncid, NTP_VARNAME, self%ntp_varid)) call check( nf90_inq_varid(self%ncid, NAME_VARNAME, self%name_varid)) + call check( nf90_inq_varid(self%ncid, PTYPE_VARNAME, self%ptype_varid)) if ((param%out_form == XV) .or. (param%out_form == XVEL)) then call check( nf90_inq_varid(self%ncid, XHX_VARNAME, self%xhx_varid)) @@ -214,9 +214,7 @@ module subroutine netcdf_write_frame_base(self, iu, param) ! Internals integer(I4B) :: i, j, tslot, strlen, idslot integer(I4B), dimension(:), allocatable :: ind - character(len=:), allocatable :: name - - !! Open the netCDF file + character(len=:), allocatable :: charstring tslot = int(param%ioutput, kind=I4B) + 1 @@ -231,9 +229,14 @@ module subroutine netcdf_write_frame_base(self, iu, param) j = ind(i) idslot = self%id(j) + 1 call check( nf90_put_var(iu%ncid, iu%id_varid, self%id(j), start=[idslot]) ) - name = trim(adjustl(self%info(j)%name)) - strlen = len(name) - call check( nf90_put_var(iu%ncid, iu%name_varid, name, start=[1, idslot], count=[strlen, 1]) ) + charstring = trim(adjustl(self%info(j)%name)) + strlen = len(charstring) + call check( nf90_put_var(iu%ncid, iu%name_varid, charstring, start=[1, idslot], count=[strlen, 1]) ) + + charstring = trim(adjustl(self%info(j)%particle_type)) + strlen = len(charstring) + call check( nf90_put_var(iu%ncid, iu%ptype_varid, charstring, start=[1, idslot], count=[strlen, 1]) ) + if ((param%out_form == XV) .or. (param%out_form == XVEL)) then call check( nf90_put_var(iu%ncid, iu%xhx_varid, self%xh(1, j), start=[idslot, tslot]) ) call check( nf90_put_var(iu%ncid, iu%xhy_varid, self%xh(2, j), start=[idslot, tslot]) ) @@ -277,9 +280,15 @@ module subroutine netcdf_write_frame_base(self, iu, param) class is (swiftest_cb) idslot = self%id + 1 call check( nf90_put_var(iu%ncid, iu%id_varid, self%id, start=[idslot]) ) - name = trim(adjustl(self%info%name)) - strlen = len(name) - call check( nf90_put_var(iu%ncid, iu%name_varid, name, start=[1, idslot], count=[strlen, 1]) ) + + charstring = trim(adjustl(self%info%name)) + strlen = len(charstring) + call check( nf90_put_var(iu%ncid, iu%name_varid, charstring, start=[1, idslot], count=[strlen, 1]) ) + + charstring = trim(adjustl(self%info%particle_type)) + strlen = len(charstring) + call check( nf90_put_var(iu%ncid, iu%ptype_varid, charstring, start=[1, idslot], count=[strlen, 1]) ) + call check( nf90_put_var(iu%ncid, iu%Gmass_varid, self%Gmass, start=[idslot, tslot]) ) call check( nf90_put_var(iu%ncid, iu%radius_varid, self%radius, start=[idslot, tslot]) ) if (param%lrotation) then diff --git a/src/symba/symba_netcdf.f90 b/src/symba/symba_netcdf.f90 new file mode 100644 index 000000000..e4e715f35 --- /dev/null +++ b/src/symba/symba_netcdf.f90 @@ -0,0 +1,115 @@ +submodule (symba_classes) s_symba_netcdf + use swiftest + use netcdf +contains + + subroutine check(status) + !! author: Carlisle A. Wishard, Dana Singh, and David A. Minton + !! + !! Checks the status of all NetCDF operations to catch errors + implicit none + ! Arguments + integer, intent (in) :: status + + if(status /= nf90_noerr) then + write(*,*) trim(nf90_strerror(status)) + call util_exit(FAILURE) + end if + + return + end subroutine check + + module subroutine symba_netcdf_initialize_output(self, param) + !! author: Carlisle A. Wishard, Dana Singh, and David A. Minton + !! + !! Initialize a NetCDF file system and defines all variables. + implicit none + ! Arguments + class(symba_netcdf_parameters), intent(inout) :: self !! Parameters used to identify a particular NetCDF dataset + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + + + call netcdf_initialize_output(self, param) + + ! Define the variables + call check( nf90_def_var(self%ncid, ORIGIN_TYPE_VARNAME, NF90_CHAR, [self%str_dimid, self%id_dimid], self%origin_type_varid) ) + call check( nf90_def_var(self%ncid, ORIGIN_TIME_VARNAME, self%out_type, self%id_dimid, self%origin_time_varid) ) + call check( nf90_def_var(self%ncid, ORIGIN_XHX_VARNAME, self%out_type, self%id_dimid, self%origin_xhx_varid) ) + call check( nf90_def_var(self%ncid, ORIGIN_XHY_VARNAME, self%out_type, self%id_dimid, self%origin_xhy_varid) ) + call check( nf90_def_var(self%ncid, ORIGIN_XHZ_VARNAME, self%out_type, self%id_dimid, self%origin_xhz_varid) ) + call check( nf90_def_var(self%ncid, ORIGIN_VHX_VARNAME, self%out_type, self%id_dimid, self%origin_vhx_varid) ) + call check( nf90_def_var(self%ncid, ORIGIN_VHY_VARNAME, self%out_type, self%id_dimid, self%origin_vhy_varid) ) + call check( nf90_def_var(self%ncid, ORIGIN_VHZ_VARNAME, self%out_type, self%id_dimid, self%origin_vhz_varid) ) + + return + + end subroutine symba_netcdf_initialize_output + + + module subroutine symba_netcdf_open(self, param) + !! author: Carlisle A. Wishard, Dana Singh, and David A. Minton + !! + !! Opens a NetCDF file and does the variable inquiries to activate variable ids + implicit none + ! Arguments + class(symba_netcdf_parameters), intent(inout) :: self !! Parameters used to identify a particular NetCDF dataset + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + ! Internals + integer(I4B) :: old_mode + + call netcdf_open(self, param) + + call check( nf90_inq_varid(self%ncid, ORIGIN_TYPE_VARNAME, self%origin_type_varid)) + call check( nf90_inq_varid(self%ncid, ORIGIN_TIME_VARNAME, self%origin_type_varid)) + call check( nf90_inq_varid(self%ncid, ORIGIN_XHX_VARNAME, self%origin_xhx_varid)) + call check( nf90_inq_varid(self%ncid, ORIGIN_XHY_VARNAME, self%origin_xhy_varid)) + call check( nf90_inq_varid(self%ncid, ORIGIN_XHZ_VARNAME, self%origin_xhz_varid)) + call check( nf90_inq_varid(self%ncid, ORIGIN_VHX_VARNAME, self%origin_vhx_varid)) + call check( nf90_inq_varid(self%ncid, ORIGIN_VHY_VARNAME, self%origin_vhy_varid)) + call check( nf90_inq_varid(self%ncid, ORIGIN_VHZ_VARNAME, self%origin_vhz_varid)) + + return + end subroutine symba_netcdf_open + + + module subroutine symba_netcdf_write_frame_pl(self, iu, param) + !! author: Carlisle A. Wishard, Dana Singh, and David A. Minton + !! + !! Write a frame of output of a SyMBA massive body data to the binary output file + !! Note: If outputting to orbital elements, but sure that the conversion is done prior to calling this method + implicit none + ! Arguments + class(symba_pl), intent(in) :: self !! SyMBA massive body object + class(netcdf_parameters), intent(inout) :: iu !! Parameters used to identify a particular NetCDF dataset + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + ! Internals + integer(I4B) :: i, j, tslot, strlen, idslot + integer(I4B), dimension(:), allocatable :: ind + character(len=:), allocatable :: charstring + + call netcdf_write_frame_base(self, iu, param) + tslot = int(param%ioutput, kind=I4B) + 1 + select type(iu) + class is (symba_netcdf_parameters) + associate(npl => self%nbody) + if (npl == 0) return + allocate(ind(npl)) + call util_sort(self%id(1:npl), ind(1:npl)) + select type(info => self%info) + class is (symba_particle_info) + do i = 1, npl + j = ind(i) + idslot = self%id(j) + 1 + + charstring = trim(adjustl(info(j)%origin_type)) + strlen = len(charstring) + call check( nf90_put_var(iu%ncid, iu%origin_type_varid, charstring, start=[1, idslot], count=[strlen, 1]) ) + end do + end select + end associate + + end select + + return + end subroutine symba_netcdf_write_frame_pl +end submodule s_symba_netcdf \ No newline at end of file From 00b40c54531ecf784d795e262b231c3ea4e969b3 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Fri, 27 Aug 2021 19:47:41 -0400 Subject: [PATCH 075/154] Fixed a bunch of issues and now SyMBA info stuff is going into the NetCDF files properly --- src/fragmentation/fragmentation.f90 | 2 +- src/io/io.f90 | 21 +++-- src/modules/swiftest_classes.f90 | 118 ++++++++++++++-------------- src/modules/symba_classes.f90 | 21 ++++- src/setup/setup.f90 | 8 +- src/symba/symba_netcdf.f90 | 97 ++++++++++++++++++++++- src/util/util_append.f90 | 1 + 7 files changed, 191 insertions(+), 77 deletions(-) diff --git a/src/fragmentation/fragmentation.f90 b/src/fragmentation/fragmentation.f90 index 7b6190400..43ed02599 100644 --- a/src/fragmentation/fragmentation.f90 +++ b/src/fragmentation/fragmentation.f90 @@ -364,7 +364,7 @@ subroutine construct_temporary_system(tmpsys, tmpparam) end where lexclude(npl+1:(npl + nfrag)) = .true. allocate(tmpparam, source=param) - call setup_construct_system(tmpsys, param) + call setup_construct_system(tmpsys, tmpparam) call tmpsys%tp%setup(0, param) deallocate(tmpsys%cb) allocate(tmpsys%cb, source=cb) diff --git a/src/io/io.f90 b/src/io/io.f90 index e54d67042..45d2e2b13 100644 --- a/src/io/io.f90 +++ b/src/io/io.f90 @@ -1811,7 +1811,6 @@ module subroutine io_write_frame_system(self, param) character(len=STRMAX) :: errmsg integer(I4B) :: iu = BINUNIT !! Unit number for the output file to write frame to logical :: fileExists - type(netcdf_parameters) :: nciu if (.not.lfirst .and. param%lenergy) call self%conservation_report(param, lterminal=.true.) @@ -1861,17 +1860,17 @@ module subroutine io_write_frame_system(self, param) select case(param%out_stat) case('APPEND') - call nciu%open(param) + call param%nciu%open(param) case('NEW', 'REPLACE', 'UNKNOWN') - call nciu%initialize(param) - call nciu%close(param) - call nciu%open(param) + call param%nciu%initialize(param) + call param%nciu%close(param) + call param%nciu%open(param) end select lfirst = .false. else - call nciu%open(param) + call param%nciu%open(param) end if - call self%write_hdr(nciu, param) + call self%write_hdr(param%nciu, param) end if if (param%lgr) then @@ -1892,10 +1891,10 @@ module subroutine io_write_frame_system(self, param) close(iu, err = 667, iomsg = errmsg) else if ((param%out_type == NETCDF_FLOAT_TYPE) .or. (param%out_type == NETCDF_DOUBLE_TYPE)) then - call cb%write_frame(nciu, param) - call pl%write_frame(nciu, param) - call tp%write_frame(nciu, param) - call nciu%close(param) + call cb%write_frame(param%nciu, param) + call pl%write_frame(param%nciu, param) + call tp%write_frame(param%nciu, param) + call param%nciu%close(param) end if return diff --git a/src/modules/swiftest_classes.f90 b/src/modules/swiftest_classes.f90 index 322b759e9..8b07b5b33 100644 --- a/src/modules/swiftest_classes.f90 +++ b/src/modules/swiftest_classes.f90 @@ -7,6 +7,64 @@ module swiftest_classes implicit none public + + type :: netcdf_parameters + integer(I4B) :: out_type !! NetCDF output type (will be assigned either NF90_DOUBLE or NF90_FLOAT, depending on the user parameter) + integer(I4B) :: ncid !! NetCDF ID for the output file + integer(I4B) :: dimids(3) !! Dimensions of the NetCDF file + integer(I4B) :: time_dimid !! NetCDF ID for the time dimension + integer(I4B) :: id_dimid !! NetCDF ID for the particle id dimension + integer(I4B) :: str_dimid !! NetCDF ID for the character string dimension + integer(I4B) :: time_varid !! NetCDF ID for the time variable + integer(I4B) :: id_varid !! NetCDF ID for the particle name variable + integer(I4B) :: name_varid !! NetCDF ID for the namevariable + integer(I4B) :: ptype_varid !! NetCDF ID for the particle type variable + integer(I4B) :: npl_varid !! NetCDF ID for the number of active massive bodies variable + integer(I4B) :: ntp_varid !! NetCDF ID for the number of active test particles variable + integer(I4B) :: a_varid !! NetCDF ID for the semimajor axis variable + integer(I4B) :: e_varid !! NetCDF ID for the eccentricity variable + integer(I4B) :: inc_varid !! NetCDF ID for the inclination variable + integer(I4B) :: capom_varid !! NetCDF ID for the long. asc. node variable + integer(I4B) :: omega_varid !! NetCDF ID for the arg. periapsis variable + integer(I4B) :: capm_varid !! NetCDF ID for the mean anomaly variable + integer(I4B) :: xhx_varid !! NetCDF ID for the heliocentric position x variable + integer(I4B) :: xhy_varid !! NetCDF ID for the heliocentric position y variable + integer(I4B) :: xhz_varid !! NetCDF ID for the heliocentric position z variable + integer(I4B) :: vhx_varid !! NetCDF ID for the heliocentric velocity x variable + integer(I4B) :: vhy_varid !! NetCDF ID for the heliocentric velocity y variable + integer(I4B) :: vhz_varid !! NetCDF ID for the heliocentric velocity z variable + integer(I4B) :: Gmass_varid !! NetCDF ID for the mass variable + integer(I4B) :: rhill_varid !! NetCDF ID for the hill radius variable + integer(I4B) :: radius_varid !! NetCDF ID for the radius variable + integer(I4B) :: Ip1_varid !! NetCDF ID for the axis 1 principal moment of inertia variable + integer(I4B) :: Ip2_varid !! NetCDF ID for the axis 2 principal moment of inertia variable + integer(I4B) :: Ip3_varid !! NetCDF ID for the axis 3 principal moment of inertia variable + integer(I4B) :: rotx_varid !! NetCDF ID for the rotation x variable + integer(I4B) :: roty_varid !! NetCDF ID for the rotation y variable + integer(I4B) :: rotz_varid !! NetCDF ID for the rotation z variable + integer(I4B) :: k2_varid !! NetCDF ID for the Love number variable + integer(I4B) :: Q_varid !! NetCDF ID for the energy dissipation variable + integer(I4B) :: KE_orb_varid !! NetCDF ID for the system orbital kinetic energy variable + integer(I4B) :: KE_spin_varid !! NetCDF ID for the system spin kinetic energy variable + integer(I4B) :: PE_varid !! NetCDF ID for the system potential energy variable + integer(I4B) :: L_orbx_varid !! NetCDF ID for the system orbital angular momentum x variable + integer(I4B) :: L_orby_varid !! NetCDF ID for the system orbital angular momentum y variable + integer(I4B) :: L_orbz_varid !! NetCDF ID for the system orbital angular momentum z variable + integer(I4B) :: L_spinx_varid !! NetCDF ID for the system spin angular momentum x variable + integer(I4B) :: L_spiny_varid !! NetCDF ID for the system spin angular momentum y variable + integer(I4B) :: L_spinz_varid !! NetCDF ID for the system spin angular momentum z variable + integer(I4B) :: L_escapex_varid !! NetCDF ID for the escaped angular momentum x variable + integer(I4B) :: L_escapey_varid !! NetCDF ID for the escaped angular momentum x variable + integer(I4B) :: L_escapez_varid !! NetCDF ID for the escaped angular momentum x variable + integer(I4B) :: Ecollisions_varid !! NetCDF ID for the energy lost in collisions variable + integer(I4B) :: Euntracked_varid !! NetCDF ID for the energy that is untracked due to loss (untracked potential energy due to mergers and body energy for escaped bodies) + integer(I4B) :: GMescape_varid !! NetCDF ID for the G*Mass of bodies that escape the system + contains + procedure :: close => netcdf_close !! Closes an open NetCDF file + procedure :: initialize => netcdf_initialize_output !! Initialize a set of parameters used to identify a NetCDF output object + procedure :: open => netcdf_open !! Opens a NetCDF file + end type netcdf_parameters + !******************************************************************************************************************************** ! swiftest_parameters class definitions !******************************************************************************************************************************** @@ -77,6 +135,8 @@ module swiftest_classes logical :: lgr = .false. !! Turn on GR logical :: lyarkovsky = .false. !! Turn on Yarkovsky effect logical :: lyorp = .false. !! Turn on YORP effect + + class(netcdf_parameters), allocatable :: nciu !! Object containing NetCDF parameters contains procedure :: reader => io_param_reader procedure :: writer => io_param_writer @@ -84,62 +144,6 @@ module swiftest_classes procedure :: read_in => io_read_in_param end type swiftest_parameters - type :: netcdf_parameters - integer(I4B) :: out_type !! NetCDF output type (will be assigned either NF90_DOUBLE or NF90_FLOAT, depending on the user parameter) - integer(I4B) :: ncid !! NetCDF ID for the output file - integer(I4B) :: dimids(3) !! Dimensions of the NetCDF file - integer(I4B) :: time_dimid !! NetCDF ID for the time dimension - integer(I4B) :: id_dimid !! NetCDF ID for the particle id dimension - integer(I4B) :: str_dimid !! NetCDF ID for the character string dimension - integer(I4B) :: time_varid !! NetCDF ID for the time variable - integer(I4B) :: id_varid !! NetCDF ID for the particle name variable - integer(I4B) :: name_varid !! NetCDF ID for the namevariable - integer(I4B) :: ptype_varid !! NetCDF ID for the particle type variable - integer(I4B) :: npl_varid !! NetCDF ID for the number of active massive bodies variable - integer(I4B) :: ntp_varid !! NetCDF ID for the number of active test particles variable - integer(I4B) :: a_varid !! NetCDF ID for the semimajor axis variable - integer(I4B) :: e_varid !! NetCDF ID for the eccentricity variable - integer(I4B) :: inc_varid !! NetCDF ID for the inclination variable - integer(I4B) :: capom_varid !! NetCDF ID for the long. asc. node variable - integer(I4B) :: omega_varid !! NetCDF ID for the arg. periapsis variable - integer(I4B) :: capm_varid !! NetCDF ID for the mean anomaly variable - integer(I4B) :: xhx_varid !! NetCDF ID for the heliocentric position x variable - integer(I4B) :: xhy_varid !! NetCDF ID for the heliocentric position y variable - integer(I4B) :: xhz_varid !! NetCDF ID for the heliocentric position z variable - integer(I4B) :: vhx_varid !! NetCDF ID for the heliocentric velocity x variable - integer(I4B) :: vhy_varid !! NetCDF ID for the heliocentric velocity y variable - integer(I4B) :: vhz_varid !! NetCDF ID for the heliocentric velocity z variable - integer(I4B) :: Gmass_varid !! NetCDF ID for the mass variable - integer(I4B) :: rhill_varid !! NetCDF ID for the hill radius variable - integer(I4B) :: radius_varid !! NetCDF ID for the radius variable - integer(I4B) :: Ip1_varid !! NetCDF ID for the axis 1 principal moment of inertia variable - integer(I4B) :: Ip2_varid !! NetCDF ID for the axis 2 principal moment of inertia variable - integer(I4B) :: Ip3_varid !! NetCDF ID for the axis 3 principal moment of inertia variable - integer(I4B) :: rotx_varid !! NetCDF ID for the rotation x variable - integer(I4B) :: roty_varid !! NetCDF ID for the rotation y variable - integer(I4B) :: rotz_varid !! NetCDF ID for the rotation z variable - integer(I4B) :: k2_varid !! NetCDF ID for the Love number variable - integer(I4B) :: Q_varid !! NetCDF ID for the energy dissipation variable - integer(I4B) :: KE_orb_varid !! NetCDF ID for the system orbital kinetic energy variable - integer(I4B) :: KE_spin_varid !! NetCDF ID for the system spin kinetic energy variable - integer(I4B) :: PE_varid !! NetCDF ID for the system potential energy variable - integer(I4B) :: L_orbx_varid !! NetCDF ID for the system orbital angular momentum x variable - integer(I4B) :: L_orby_varid !! NetCDF ID for the system orbital angular momentum y variable - integer(I4B) :: L_orbz_varid !! NetCDF ID for the system orbital angular momentum z variable - integer(I4B) :: L_spinx_varid !! NetCDF ID for the system spin angular momentum x variable - integer(I4B) :: L_spiny_varid !! NetCDF ID for the system spin angular momentum y variable - integer(I4B) :: L_spinz_varid !! NetCDF ID for the system spin angular momentum z variable - integer(I4B) :: L_escapex_varid !! NetCDF ID for the escaped angular momentum x variable - integer(I4B) :: L_escapey_varid !! NetCDF ID for the escaped angular momentum x variable - integer(I4B) :: L_escapez_varid !! NetCDF ID for the escaped angular momentum x variable - integer(I4B) :: Ecollisions_varid !! NetCDF ID for the energy lost in collisions variable - integer(I4B) :: Euntracked_varid !! NetCDF ID for the energy that is untracked due to loss (untracked potential energy due to mergers and body energy for escaped bodies) - integer(I4B) :: GMescape_varid !! NetCDF ID for the G*Mass of bodies that escape the system - contains - procedure :: close => netcdf_close !! Closes an open NetCDF file - procedure :: initialize => netcdf_initialize_output !! Initialize a set of parameters used to identify a NetCDF output object - procedure :: open => netcdf_open !! Opens a NetCDF file - end type netcdf_parameters !******************************************************************************************************************************** ! swiftest_swiftest_particle_info class definitions and method interfaces @@ -986,7 +990,7 @@ end subroutine setup_body module subroutine setup_construct_system(system, param) implicit none class(swiftest_nbody_system), allocatable, intent(inout) :: system !! 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 setup_construct_system module subroutine setup_encounter(self, n) diff --git a/src/modules/symba_classes.f90 b/src/modules/symba_classes.f90 index 18cb8fe96..aa0a187f8 100644 --- a/src/modules/symba_classes.f90 +++ b/src/modules/symba_classes.f90 @@ -81,6 +81,7 @@ module symba_classes 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 + procedure :: write_frame_netcdf => symba_netcdf_write_frame_cb !! I/O routine for writing out a single frame of time-series data for all bodies in the system in NetCDF format end type symba_cb !******************************************************************************************************************************** @@ -119,7 +120,6 @@ module symba_classes 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 :: write_frame_netcdf => symba_netcdf_write_frame_pl !! I/O routine for writing out a single frame of time-series data for all bodies in the system in NetCDF format - generic :: write_frame => write_frame_netcdf end type symba_pl type, extends(symba_pl) :: symba_merger @@ -149,6 +149,7 @@ module symba_classes 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 :: write_frame_netcdf => symba_netcdf_write_frame_tp !! I/O routine for writing out a single frame of time-series data for all bodies in the system in NetCDF format end type symba_tp !******************************************************************************************************************************** @@ -472,14 +473,30 @@ module subroutine symba_netcdf_open(self, param) class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters end subroutine symba_netcdf_open + module subroutine symba_netcdf_write_frame_cb(self, iu, param) + use swiftest_classes, only : swiftest_parameters, netcdf_parameters + implicit none + class(symba_cb), intent(in) :: self !! Symba central body object + class(netcdf_parameters), intent(inout) :: iu !! Parameters used to identify a particular NetCDF dataset + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + end subroutine symba_netcdf_write_frame_cb + module subroutine symba_netcdf_write_frame_pl(self, iu, param) use swiftest_classes, only : swiftest_parameters, netcdf_parameters implicit none - class(symba_pl), intent(in) :: self !! Swiftest particle object + class(symba_pl), intent(in) :: self !! Symba massive body object class(netcdf_parameters), intent(inout) :: iu !! Parameters used to identify a particular NetCDF dataset class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters end subroutine symba_netcdf_write_frame_pl + module subroutine symba_netcdf_write_frame_tp(self, iu, param) + use swiftest_classes, only : swiftest_parameters, netcdf_parameters + implicit none + class(symba_tp), intent(in) :: self !! SyMBA test particle object + class(netcdf_parameters), intent(inout) :: iu !! Parameters used to identify a particular NetCDF dataset + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + end subroutine symba_netcdf_write_frame_tp + module subroutine symba_setup_initialize_particle_info_system(self, param) use swiftest_classes, only : swiftest_parameters implicit none diff --git a/src/setup/setup.f90 b/src/setup/setup.f90 index fe78ee9e3..02a44f091 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 - class(swiftest_parameters), intent(in) :: param !! Swiftest parameters + class(swiftest_parameters), intent(inout) :: param !! Swiftest parameters select case(param%integrator) case (BS) @@ -69,9 +69,11 @@ module subroutine setup_construct_system(system, param) select type(system) class is (symba_nbody_system) - allocate(symba_particle_info :: system%cb%info) + if (.not.allocated(system%cb%info)) allocate(symba_particle_info :: system%cb%info) + if (.not.allocated(param%nciu)) allocate(symba_netcdf_parameters :: param%nciu) class default - allocate(swiftest_particle_info :: system%cb%info) + if (.not.allocated(system%cb%info)) allocate(swiftest_particle_info :: system%cb%info) + if (.not.allocated(param%nciu)) allocate(netcdf_parameters :: param%nciu) end select return diff --git a/src/symba/symba_netcdf.f90 b/src/symba/symba_netcdf.f90 index e4e715f35..a3ef5cec0 100644 --- a/src/symba/symba_netcdf.f90 +++ b/src/symba/symba_netcdf.f90 @@ -60,7 +60,7 @@ module subroutine symba_netcdf_open(self, param) call netcdf_open(self, param) call check( nf90_inq_varid(self%ncid, ORIGIN_TYPE_VARNAME, self%origin_type_varid)) - call check( nf90_inq_varid(self%ncid, ORIGIN_TIME_VARNAME, self%origin_type_varid)) + call check( nf90_inq_varid(self%ncid, ORIGIN_TIME_VARNAME, self%origin_time_varid)) call check( nf90_inq_varid(self%ncid, ORIGIN_XHX_VARNAME, self%origin_xhx_varid)) call check( nf90_inq_varid(self%ncid, ORIGIN_XHY_VARNAME, self%origin_xhy_varid)) call check( nf90_inq_varid(self%ncid, ORIGIN_XHZ_VARNAME, self%origin_xhz_varid)) @@ -71,6 +71,43 @@ module subroutine symba_netcdf_open(self, param) return end subroutine symba_netcdf_open + module subroutine symba_netcdf_write_frame_cb(self, iu, param) + !! author: Carlisle A. Wishard, Dana Singh, and David A. Minton + !! + !! Write a frame of output of a SyMBA massive body data to the binary output file + !! Note: If outputting to orbital elements, but sure that the conversion is done prior to calling this method + implicit none + ! Arguments + class(symba_cb), intent(in) :: self !! SyMBA central body object + class(netcdf_parameters), intent(inout) :: iu !! Parameters used to identify a particular NetCDF dataset + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + ! Internals + integer(I4B) :: strlen, idslot + character(len=:), allocatable :: charstring + + call netcdf_write_frame_base(self, iu, param) + select type(iu) + class is (symba_netcdf_parameters) + select type(info => self%info) + class is (symba_particle_info) + idslot = self%id + 1 + + charstring = trim(adjustl(info%origin_type)) + strlen = len(charstring) + call check( nf90_put_var(iu%ncid, iu%origin_type_varid, charstring, start=[1, idslot], count=[strlen, 1]) ) + call check( nf90_put_var(iu%ncid, iu%origin_time_varid, info%origin_time, start=[idslot]) ) + call check( nf90_put_var(iu%ncid, iu%origin_xhx_varid, info%origin_xh(1), start=[idslot]) ) + call check( nf90_put_var(iu%ncid, iu%origin_xhy_varid, info%origin_xh(2), start=[idslot]) ) + call check( nf90_put_var(iu%ncid, iu%origin_xhz_varid, info%origin_xh(3), start=[idslot]) ) + call check( nf90_put_var(iu%ncid, iu%origin_vhx_varid, info%origin_vh(1), start=[idslot]) ) + call check( nf90_put_var(iu%ncid, iu%origin_vhy_varid, info%origin_vh(2), start=[idslot]) ) + call check( nf90_put_var(iu%ncid, iu%origin_vhz_varid, info%origin_vh(3), start=[idslot]) ) + end select + end select + + return + end subroutine symba_netcdf_write_frame_cb + module subroutine symba_netcdf_write_frame_pl(self, iu, param) !! author: Carlisle A. Wishard, Dana Singh, and David A. Minton @@ -83,12 +120,11 @@ module subroutine symba_netcdf_write_frame_pl(self, iu, param) class(netcdf_parameters), intent(inout) :: iu !! Parameters used to identify a particular NetCDF dataset class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters ! Internals - integer(I4B) :: i, j, tslot, strlen, idslot + integer(I4B) :: i, j, strlen, idslot integer(I4B), dimension(:), allocatable :: ind character(len=:), allocatable :: charstring call netcdf_write_frame_base(self, iu, param) - tslot = int(param%ioutput, kind=I4B) + 1 select type(iu) class is (symba_netcdf_parameters) associate(npl => self%nbody) @@ -104,6 +140,13 @@ module subroutine symba_netcdf_write_frame_pl(self, iu, param) charstring = trim(adjustl(info(j)%origin_type)) strlen = len(charstring) call check( nf90_put_var(iu%ncid, iu%origin_type_varid, charstring, start=[1, idslot], count=[strlen, 1]) ) + call check( nf90_put_var(iu%ncid, iu%origin_time_varid, info(j)%origin_time, start=[idslot]) ) + call check( nf90_put_var(iu%ncid, iu%origin_xhx_varid, info(j)%origin_xh(1), start=[idslot]) ) + call check( nf90_put_var(iu%ncid, iu%origin_xhy_varid, info(j)%origin_xh(2), start=[idslot]) ) + call check( nf90_put_var(iu%ncid, iu%origin_xhz_varid, info(j)%origin_xh(3), start=[idslot]) ) + call check( nf90_put_var(iu%ncid, iu%origin_vhx_varid, info(j)%origin_vh(1), start=[idslot]) ) + call check( nf90_put_var(iu%ncid, iu%origin_vhy_varid, info(j)%origin_vh(2), start=[idslot]) ) + call check( nf90_put_var(iu%ncid, iu%origin_vhz_varid, info(j)%origin_vh(3), start=[idslot]) ) end do end select end associate @@ -112,4 +155,52 @@ module subroutine symba_netcdf_write_frame_pl(self, iu, param) return end subroutine symba_netcdf_write_frame_pl + + + module subroutine symba_netcdf_write_frame_tp(self, iu, param) + !! author: Carlisle A. Wishard, Dana Singh, and David A. Minton + !! + !! Write a frame of output of a SyMBA massive body data to the binary output file + !! Note: If outputting to orbital elements, but sure that the conversion is done prior to calling this method + implicit none + ! Arguments + class(symba_tp), intent(in) :: self !! SyMBA test particle + class(netcdf_parameters), intent(inout) :: iu !! Parameters used to identify a particular NetCDF dataset + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + ! Internals + integer(I4B) :: i, j, strlen, idslot + integer(I4B), dimension(:), allocatable :: ind + character(len=:), allocatable :: charstring + + call netcdf_write_frame_base(self, iu, param) + select type(iu) + class is (symba_netcdf_parameters) + associate(ntp => self%nbody) + if (ntp == 0) return + allocate(ind(ntp)) + call util_sort(self%id(1:ntp), ind(1:ntp)) + select type(info => self%info) + class is (symba_particle_info) + do i = 1, ntp + j = ind(i) + idslot = self%id(j) + 1 + + charstring = trim(adjustl(info(j)%origin_type)) + strlen = len(charstring) + call check( nf90_put_var(iu%ncid, iu%origin_type_varid, charstring, start=[1, idslot], count=[strlen, 1]) ) + call check( nf90_put_var(iu%ncid, iu%origin_time_varid, info(j)%origin_time, start=[idslot]) ) + call check( nf90_put_var(iu%ncid, iu%origin_xhx_varid, info(j)%origin_xh(1), start=[idslot]) ) + call check( nf90_put_var(iu%ncid, iu%origin_xhy_varid, info(j)%origin_xh(2), start=[idslot]) ) + call check( nf90_put_var(iu%ncid, iu%origin_xhz_varid, info(j)%origin_xh(3), start=[idslot]) ) + call check( nf90_put_var(iu%ncid, iu%origin_vhx_varid, info(j)%origin_vh(1), start=[idslot]) ) + call check( nf90_put_var(iu%ncid, iu%origin_vhy_varid, info(j)%origin_vh(2), start=[idslot]) ) + call check( nf90_put_var(iu%ncid, iu%origin_vhz_varid, info(j)%origin_vh(3), start=[idslot]) ) + end do + end select + end associate + + end select + + return + end subroutine symba_netcdf_write_frame_tp end submodule s_symba_netcdf \ No newline at end of file diff --git a/src/util/util_append.f90 b/src/util/util_append.f90 index 11664827e..2f7d54474 100644 --- a/src/util/util_append.f90 +++ b/src/util/util_append.f90 @@ -128,6 +128,7 @@ module subroutine util_append_arr_info(arr, source, nold, nsrc, lsource_mask) logical, dimension(:), intent(in) :: lsource_mask !! Logical mask indicating which elements to append to ! Internals integer(I4B) :: nnew + class(swiftest_particle_info), allocatable :: tmp if (.not. allocated(source)) return From 179709c27b80797b9a0c0089dd9e664293b8156a Mon Sep 17 00:00:00 2001 From: David A Minton Date: Fri, 27 Aug 2021 20:00:08 -0400 Subject: [PATCH 076/154] Added naming of new bodies and setting of particle types in fragmentations. --- src/modules/symba_classes.f90 | 1 + src/symba/symba_collision.f90 | 4 ++++ src/symba/symba_util.f90 | 5 +++++ 3 files changed, 10 insertions(+) diff --git a/src/modules/symba_classes.f90 b/src/modules/symba_classes.f90 index aa0a187f8..8bc32ffed 100644 --- a/src/modules/symba_classes.f90 +++ b/src/modules/symba_classes.f90 @@ -22,6 +22,7 @@ module symba_classes character(*), parameter :: ORIGIN_VHX_VARNAME = "origin_vhx" character(*), parameter :: ORIGIN_VHY_VARNAME = "origin_vhy" character(*), parameter :: ORIGIN_VHZ_VARNAME = "origin_vhz" + character(*), parameter :: PL_TINY_TYPE_NAME = "Semi-Interacting Massive Body" type, extends(netcdf_parameters) :: symba_netcdf_parameters integer(I4B) :: origin_type_varid !! NetCDF ID for the origin type diff --git a/src/symba/symba_collision.f90 b/src/symba/symba_collision.f90 index 4e21b9411..b4505741b 100644 --- a/src/symba/symba_collision.f90 +++ b/src/symba/symba_collision.f90 @@ -833,6 +833,7 @@ subroutine symba_collision_mergeaddsub(system, param, family, id_frag, Ip_frag, integer(I4B) :: i, ibiggest, nstart, nend, nfamily, nfrag logical, dimension(system%pl%nbody) :: lmask class(symba_pl), allocatable :: plnew + character(*), parameter :: FRAGFMT = '("Fragment",I0.7)' select type(pl => system%pl) class is (symba_pl) @@ -884,6 +885,7 @@ subroutine symba_collision_mergeaddsub(system, param, family, id_frag, Ip_frag, plnew%status(1:nfrag) = NEW_PARTICLE info(1:nfrag)%origin_time = param%t do i = 1, nfrag + write(info(i)%name, FRAGFMT) id_frag(i) info(i)%origin_xh(:) = plnew%xh(:,i) info(i)%origin_vh(:) = plnew%vh(:,i) end do @@ -892,6 +894,7 @@ subroutine symba_collision_mergeaddsub(system, param, family, id_frag, Ip_frag, plnew%status(1:nfrag) = NEW_PARTICLE info(1:nfrag)%origin_time = param%t do i = 1, nfrag + write(info(i)%name, FRAGFMT) id_frag(i) info(i)%origin_xh(:) = plnew%xh(:,i) info(i)%origin_vh(:) = plnew%vh(:,i) end do @@ -907,6 +910,7 @@ subroutine symba_collision_mergeaddsub(system, param, family, id_frag, Ip_frag, info(2:nfrag)%origin_type = "Hit and run fragment" info(2:nfrag)%origin_time = param%t do i = 2, nfrag + write(info(i)%name, FRAGFMT) id_frag(i) info(i)%origin_xh(:) = plnew%xh(:,i) info(i)%origin_vh(:) = plnew%vh(:,i) end do diff --git a/src/symba/symba_util.f90 b/src/symba/symba_util.f90 index f5201ac6c..93d4155e2 100644 --- a/src/symba/symba_util.f90 +++ b/src/symba/symba_util.f90 @@ -298,6 +298,11 @@ module subroutine symba_util_index_eucl_plpl(self, param) select type(param) class is (symba_parameters) pl%lmtiny(1:npl) = pl%Gmass(1:npl) < param%GMTINY + where(pl%lmtiny(1:npl)) + pl%info(1:npl)%particle_type = PL_TINY_TYPE_NAME + elsewhere + pl%info(1:npl)%particle_type = PL_TYPE_NAME + end where end select nplm = count(.not. pl%lmtiny(1:npl)) pl%nplm = int(nplm, kind=I4B) From d008ac3a879375020ec1f94d0c53296d1b4f563f Mon Sep 17 00:00:00 2001 From: David A Minton Date: Fri, 27 Aug 2021 20:07:49 -0400 Subject: [PATCH 077/154] Getting SyMBA info into the NetCDF --- python/swiftest/swiftest/io.py | 7 ++++--- src/util/util_append.f90 | 7 ++++++- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/python/swiftest/swiftest/io.py b/python/swiftest/swiftest/io.py index 00bcd914c..0397335d6 100644 --- a/python/swiftest/swiftest/io.py +++ b/python/swiftest/swiftest/io.py @@ -718,9 +718,10 @@ def clean_string_values(param, ds): ------- ds : xarray dataset with the strings cleaned up """ - #ds['name'] = ds['name'].str.decode(encoding='utf-8') - #ds['particle_type'] = ds['particle_type'].str.decode(encoding='utf-8') - # ds['origin_type'] = ds['origin_type'].str.decode(encoding='utf-8') + ds['name'] = ds['name'].str.decode(encoding='utf-8') + ds['particle_type'] = ds['particle_type'].str.decode(encoding='utf-8') + if 'origin_type' in ds: + ds['origin_type'] = ds['origin_type'].str.decode(encoding='utf-8') return ds diff --git a/src/util/util_append.f90 b/src/util/util_append.f90 index 2f7d54474..d6b18d4e8 100644 --- a/src/util/util_append.f90 +++ b/src/util/util_append.f90 @@ -134,7 +134,12 @@ module subroutine util_append_arr_info(arr, source, nold, nsrc, lsource_mask) nnew = count(lsource_mask(1:nsrc)) if (.not.allocated(arr)) then - allocate(arr(nold+nnew)) + select type(source) + class is (symba_particle_info) + allocate(symba_particle_info :: arr(nold+nnew)) + class default + allocate(swiftest_particle_info :: arr(nold+nnew)) + end select else call util_resize(arr, nold + nnew) end if From a86b33e6ac6a40bb65fdbb9d502c0aea39fb2a36 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Fri, 27 Aug 2021 20:11:56 -0400 Subject: [PATCH 078/154] Trying to get Symba info into the NetCDF --- src/util/util_resize.f90 | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/src/util/util_resize.f90 b/src/util/util_resize.f90 index e76d53a8d..7ba7e19df 100644 --- a/src/util/util_resize.f90 +++ b/src/util/util_resize.f90 @@ -150,9 +150,16 @@ module subroutine util_resize_arr_info(arr, nnew) ! Internals class(swiftest_particle_info), dimension(:), allocatable :: tmp !! Temporary storage array in case the input array is already allocated integer(I4B) :: nold !! Old size + logical :: is_symba if (.not. allocated(arr) .or. nnew < 0) return + select type(arr) + class is (symba_particle_info) + is_symba = .true. + class default + is_symba = .false. + end select nold = size(arr) if (nnew == nold) return @@ -160,8 +167,12 @@ module subroutine util_resize_arr_info(arr, nnew) deallocate(arr) return end if - - allocate(tmp(nnew)) + + if (is_symba) then + allocate(symba_particle_info :: tmp(nnew)) + else + allocate(swiftest_particle_info :: tmp(nnew)) + end if if (nnew > nold) then tmp(1:nold) = arr(1:nold) else From b92eb1f20f5381795efec9751ea120272772e9bd Mon Sep 17 00:00:00 2001 From: David A Minton Date: Sat, 28 Aug 2021 02:14:14 -0400 Subject: [PATCH 079/154] Fixed bugs in info tracking. Code seems to work now. --- examples/symba_energy_momentum/Untitled.ipynb | 470 ++ .../param.disruption_headon.in | 6 +- .../param.disruption_off_axis.in | 8 +- .../param.supercatastrophic_headon.in | 6 +- examples/symba_mars_disk/mars.in | 6016 ++++++++--------- examples/symba_mars_disk/testnetcdf.ipynb | 433 +- src/netcdf/netcdf.f90 | 2 +- src/symba/symba_util.f90 | 10 - src/util/util_append.f90 | 36 +- src/util/util_fill.f90 | 28 +- src/util/util_sort.f90 | 12 +- 11 files changed, 3969 insertions(+), 3058 deletions(-) create mode 100644 examples/symba_energy_momentum/Untitled.ipynb diff --git a/examples/symba_energy_momentum/Untitled.ipynb b/examples/symba_energy_momentum/Untitled.ipynb new file mode 100644 index 000000000..3b730328e --- /dev/null +++ b/examples/symba_energy_momentum/Untitled.ipynb @@ -0,0 +1,470 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'/home/daminton/git/swiftest/examples/symba_energy_momentum'" + ] + }, + "execution_count": 1, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import swiftest\n", + "import os\n", + "import xarray as xr\n", + "import numpy as np\n", + "os.getcwd()" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Reading Swiftest file param.disruption_off_axis.in\n", + "\n", + "Creating Dataset\n", + "Successfully converted 102 output frames.\n", + "Swiftest simulation data stored as xarray DataSet .ds\n" + ] + } + ], + "source": [ + "sim = swiftest.Simulation(param_file=\"param.disruption_off_axis.in\")\n", + "sim.bin2xr()" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
<xarray.DataArray 'origin_type' (id: 15)>\n",
+       "array(['Initial conditions', 'Initial conditions', 'Initial conditions',\n",
+       "       'Disruption', 'Disruption', 'Disruption', 'Disruption',\n",
+       "       'Disruption', 'Disruption', 'Disruption', 'Disruption',\n",
+       "       'Disruption', 'Disruption', 'Disruption', 'Disruption'],\n",
+       "      dtype='<U18')\n",
+       "Coordinates:\n",
+       "  * id       (id) int32 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
" + ], + "text/plain": [ + "\n", + "array(['Initial conditions', 'Initial conditions', 'Initial conditions',\n", + " 'Disruption', 'Disruption', 'Disruption', 'Disruption',\n", + " 'Disruption', 'Disruption', 'Disruption', 'Disruption',\n", + " 'Disruption', 'Disruption', 'Disruption', 'Disruption'],\n", + " dtype='
<xarray.DataArray 'particle_type' (id: 1521)>\n",
-       "array([b'Central Body', b'Massive Body', b'Massive Body', ..., b'Massive Body',\n",
-       "       b'Massive Body', b'Massive Body'], dtype='|S32')\n",
+       "
<xarray.DataArray 'origin_type' (id: 1521)>\n",
+       "array(['Initial conditions', 'Body                    Initial',\n",
+       "       'Body                    Initial', ..., '', '', ''], dtype='<U32')\n",
        "Coordinates:\n",
-       "  * id       (id) int32 0 1 2 3 4 5 6 7 ... 1514 1515 1516 1517 1518 1519 1520
" + " * id (id) int32 0 1 2 3 4 5 6 7 ... 1514 1515 1516 1517 1518 1519 1520
" ], "text/plain": [ - "\n", - "array([b'Central Body', b'Massive Body', b'Massive Body', ..., b'Massive Body',\n", - " b'Massive Body', b'Massive Body'], dtype='|S32')\n", + "\n", + "array(['Initial conditions', 'Body Initial',\n", + " 'Body Initial', ..., '', '', ''], dtype='\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
<xarray.Dataset>\n",
+       "Dimensions:        ()\n",
+       "Coordinates:\n",
+       "    time           float64 0.0\n",
+       "    id             int32 2\n",
+       "Data variables: (12/48)\n",
+       "    npl            int32 1500\n",
+       "    ntp            int32 0\n",
+       "    name           <U32 'Body3'\n",
+       "    particle_type  <U12 'Massive Body'\n",
+       "    xhx            float64 -8.012e+06\n",
+       "    xhy            float64 -6.936e+06\n",
+       "    ...             ...\n",
+       "    origin_xhx     float64 6.013e-154\n",
+       "    origin_xhy     float64 6.013e-154\n",
+       "    origin_xhz     float64 0.0\n",
+       "    origin_vhx     float64 7.029e+06\n",
+       "    origin_vhy     float64 6.052e+06\n",
+       "    origin_vhz     float64 3.879e+03
" + ], + "text/plain": [ + "\n", + "Dimensions: ()\n", + "Coordinates:\n", + " time float64 0.0\n", + " id int32 2\n", + "Data variables: (12/48)\n", + " npl int32 ...\n", + " ntp int32 ...\n", + " name self%nbody) if (n == 0) return allocate(ind(n)) - call util_sort(self%id(1:n), ind(1:n)) + call util_sort(self%id(1:n), ind) do i = 1, n j = ind(i) diff --git a/src/symba/symba_util.f90 b/src/symba/symba_util.f90 index 93d4155e2..b8428dd99 100644 --- a/src/symba/symba_util.f90 +++ b/src/symba/symba_util.f90 @@ -79,7 +79,6 @@ module subroutine symba_util_append_pl(self, source, lsource_mask) call util_append(self%peri, source%peri, nold, nsrc, lsource_mask) call util_append(self%atp, source%atp, nold, nsrc, lsource_mask) call util_append(self%kin, source%kin, nold, nsrc, lsource_mask) - call util_append(self%info, source%info, nold, nsrc, lsource_mask) call util_append_pl(self, source, lsource_mask) ! Note: helio_pl does not have its own append method, so we skip back to the base class end associate @@ -148,7 +147,6 @@ module subroutine symba_util_append_tp(self, source, lsource_mask) call util_append(self%nplenc, source%nplenc, nold, nsrc, lsource_mask) call util_append(self%levelg, source%levelg, nold, nsrc, lsource_mask) call util_append(self%levelm, source%levelm, nold, nsrc, lsource_mask) - call util_append(self%info, source%info, nold, nsrc, lsource_mask) call util_append_tp(self, source, lsource_mask) ! Note: helio_tp does not have its own append method, so we skip back to the base class end associate @@ -229,7 +227,6 @@ module subroutine symba_util_fill_pl(self, inserts, lfill_list) call util_fill(keeps%peri, inserts%peri, lfill_list) call util_fill(keeps%atp, inserts%atp, 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) ! Note: helio_pl does not have its own fill method, so we skip back to the base class class default @@ -260,7 +257,6 @@ module subroutine symba_util_fill_tp(self, inserts, lfill_list) call util_fill(keeps%nplenc, inserts%nplenc, lfill_list) call util_fill(keeps%levelg, inserts%levelg, lfill_list) call util_fill(keeps%levelm, inserts%levelm, lfill_list) - call util_fill(keeps%info, inserts%info, lfill_list) call util_fill_tp(keeps, inserts, lfill_list) ! Note: helio_tp does not have its own fill method, so we skip back to the base class class default @@ -607,7 +603,6 @@ module subroutine symba_util_resize_pl(self, 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) call util_resize_pl(self, nnew) @@ -627,7 +622,6 @@ module subroutine symba_util_resize_tp(self, nnew) call util_resize(self%nplenc, nnew) call util_resize(self%levelg, nnew) call util_resize(self%levelm, nnew) - call util_resize(self%info, nnew) call util_resize_tp(self, nnew) @@ -779,7 +773,6 @@ module subroutine symba_util_sort_rearrange_pl(self, ind) call util_sort_rearrange(pl%isperi, ind, npl) call util_sort_rearrange(pl%peri, ind, npl) call util_sort_rearrange(pl%atp, ind, npl) - call util_sort_rearrange(pl%info, ind, npl) call util_sort_rearrange(pl%kin, ind, npl) call util_sort_rearrange_pl(pl,ind) @@ -803,7 +796,6 @@ module subroutine symba_util_sort_rearrange_tp(self, ind) call util_sort_rearrange(tp%nplenc, ind, ntp) call util_sort_rearrange(tp%levelg, ind, ntp) call util_sort_rearrange(tp%levelm, ind, ntp) - call util_sort_rearrange(tp%info, ind, ntp) call util_sort_rearrange_tp(tp,ind) end associate @@ -880,7 +872,6 @@ 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) - 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) @@ -945,7 +936,6 @@ module subroutine symba_util_spill_tp(self, discards, lspill_list, ldestructive) call util_spill(keeps%nplenc, discards%nplenc, lspill_list, ldestructive) call util_spill(keeps%levelg, discards%levelg, lspill_list, ldestructive) call util_spill(keeps%levelm, discards%levelm, lspill_list, ldestructive) - call util_spill(keeps%info, discards%info, lspill_list, ldestructive) call util_spill_tp(keeps, discards, lspill_list, ldestructive) class default diff --git a/src/util/util_append.f90 b/src/util/util_append.f90 index d6b18d4e8..98a98ac0a 100644 --- a/src/util/util_append.f90 +++ b/src/util/util_append.f90 @@ -128,23 +128,35 @@ module subroutine util_append_arr_info(arr, source, nold, nsrc, lsource_mask) logical, dimension(:), intent(in) :: lsource_mask !! Logical mask indicating which elements to append to ! Internals integer(I4B) :: nnew - class(swiftest_particle_info), allocatable :: tmp + class(swiftest_particle_info), dimension(:), allocatable :: arr_tmp, source_tmp if (.not. allocated(source)) return nnew = count(lsource_mask(1:nsrc)) - if (.not.allocated(arr)) then - select type(source) - class is (symba_particle_info) - allocate(symba_particle_info :: arr(nold+nnew)) - class default - allocate(swiftest_particle_info :: arr(nold+nnew)) - end select - else - call util_resize(arr, nold + nnew) - end if - arr(nold + 1:nold + nnew) = pack(source(1:nsrc), lsource_mask(1:nsrc)) + select type(source) + class is (symba_particle_info) + allocate(symba_particle_info :: arr_tmp(nold+nnew)) + if (nold > 0) then + arr_tmp(1:nold) = arr(1:nold) + deallocate(arr) + end if + class is (swiftest_particle_info) + allocate(swiftest_particle_info :: arr_tmp(nold+nnew)) + if (nold > 0) then + arr_tmp(1:nold) = arr(1:nold) + deallocate(arr) + end if + end select + + select type(source) + class is (symba_particle_info) + arr_tmp(nold + 1:nold + nnew) = pack(source(1:nsrc), lsource_mask(1:nsrc)) + class is (swiftest_particle_info) + arr_tmp(nold + 1:nold + nnew) = pack(source(1:nsrc), lsource_mask(1:nsrc)) + end select + + call move_alloc(arr_tmp, arr) return end subroutine util_append_arr_info diff --git a/src/util/util_fill.f90 b/src/util/util_fill.f90 index b1bf951d0..f3f6a3a95 100644 --- a/src/util/util_fill.f90 +++ b/src/util/util_fill.f90 @@ -92,12 +92,34 @@ module subroutine util_fill_arr_info(keeps, inserts, lfill_list) ! Arguments class(swiftest_particle_info), dimension(:), allocatable, intent(inout) :: keeps !! Array of values to keep class(swiftest_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 + logical, dimension(:), intent(in) :: lfill_list !! Logical array of bodies to merge into the keeps + ! Internals + class(swiftest_particle_info), dimension(:), allocatable :: ktmp, itmp + integer(I4B) :: nk, ni if (.not.allocated(keeps) .or. .not.allocated(inserts)) return - keeps(:) = unpack(keeps(:), .not.lfill_list(:), keeps(:)) - keeps(:) = unpack(inserts(:), lfill_list(:), keeps(:)) + nk = size(keeps) + ni = size(inserts) + + select type(keeps) + class is (symba_particle_info) + allocate(symba_particle_info :: ktmp(nk)) + class is (swiftest_particle_info) + allocate(swiftest_particle_info :: ktmp(nk)) + end select + + select type(inserts) + class is (symba_particle_info) + allocate(symba_particle_info :: itmp(ni)) + class is (swiftest_particle_info) + allocate(swiftest_particle_info :: itmp(ni)) + end select + + ktmp(:) = unpack(ktmp(:), .not.lfill_list(:), ktmp(:)) + ktmp(:) = unpack(itmp(:), lfill_list(:), ktmp(:)) + + keeps(:) = ktmp(:) return end subroutine util_fill_arr_info diff --git a/src/util/util_sort.f90 b/src/util/util_sort.f90 index 4b96dd9d1..4364aa02a 100644 --- a/src/util/util_sort.f90 +++ b/src/util/util_sort.f90 @@ -466,15 +466,21 @@ module subroutine util_sort_rearrange_arr_info(arr, ind, n) implicit none ! Arguments class(swiftest_particle_info), dimension(:), allocatable, intent(inout) :: arr !! Destination array - integer(I4B), dimension(:), intent(in) :: ind !! Index to rearrange against + integer(I4B), dimension(:), intent(in) :: ind !! Index to rearrange against integer(I4B), intent(in) :: n !! Number of elements in arr and ind to rearrange ! Internals class(swiftest_particle_info), dimension(:), allocatable :: tmp !! Temporary copy of array used during rearrange operation + integer(I4B) :: i if (.not. allocated(arr) .or. n <= 0) return - allocate(tmp, source=arr) + select type(arr) + class is (symba_particle_info) + allocate(symba_particle_info :: tmp(n)) + class is (swiftest_particle_info) + allocate(swiftest_particle_info :: tmp(n)) + end select tmp(1:n) = arr(ind(1:n)) - call move_alloc(tmp, arr) + arr(1:n) = tmp(1:n) return end subroutine util_sort_rearrange_arr_info From 4c2152f71073677d1f935475e1ff78f516639c1a Mon Sep 17 00:00:00 2001 From: David A Minton Date: Sat, 28 Aug 2021 03:30:35 -0400 Subject: [PATCH 080/154] Consolidated NetCDF and particle info into main Swiftest class. Info still gets corrupted after some amount of time. --- examples/symba_mars_disk/param.in | 6 +- examples/symba_mars_disk/testnetcdf.ipynb | 453 ++-------------------- src/io/io.f90 | 10 +- src/modules/swiftest_classes.f90 | 37 +- src/modules/swiftest_globals.f90 | 10 + src/modules/symba_classes.f90 | 99 ----- src/netcdf/netcdf.f90 | 78 +++- src/setup/setup.f90 | 48 ++- src/symba/symba_collision.f90 | 207 +++++----- src/symba/symba_io.f90 | 49 --- src/symba/symba_netcdf.f90 | 206 ---------- src/symba/symba_setup.f90 | 47 --- src/util/util_append.f90 | 38 +- src/util/util_fill.f90 | 31 +- src/util/util_resize.f90 | 19 +- src/util/util_sort.f90 | 14 +- src/util/util_spill.f90 | 4 +- 17 files changed, 310 insertions(+), 1046 deletions(-) delete mode 100644 src/symba/symba_netcdf.f90 diff --git a/examples/symba_mars_disk/param.in b/examples/symba_mars_disk/param.in index a50be00e4..725927f1b 100644 --- a/examples/symba_mars_disk/param.in +++ b/examples/symba_mars_disk/param.in @@ -1,13 +1,13 @@ !Parameter file for the SyMBA-RINGMOONS test T0 0.0 -TSTOP 6000.0 +TSTOP 60000.0 DT 600.0 CB_IN cb.in PL_IN mars.in TP_IN tp.in IN_TYPE ASCII -ISTEP_OUT 1 -ISTEP_DUMP 1 +ISTEP_OUT 10 +ISTEP_DUMP 10 !BIN_OUT bin.dat !OUT_TYPE REAL8 BIN_OUT bin.nc diff --git a/examples/symba_mars_disk/testnetcdf.ipynb b/examples/symba_mars_disk/testnetcdf.ipynb index 955dc994f..a6d21ec0e 100644 --- a/examples/symba_mars_disk/testnetcdf.ipynb +++ b/examples/symba_mars_disk/testnetcdf.ipynb @@ -35,9 +35,30 @@ "text": [ "Reading Swiftest file param.in\n", "\n", - "Creating Dataset\n", - "Successfully converted 11 output frames.\n", - "Swiftest simulation data stored as xarray DataSet .ds\n" + "Creating Dataset\n" + ] + }, + { + "ename": "UnicodeDecodeError", + "evalue": "'utf-8' codec can't decode byte 0x80 in position 0: invalid start byte", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mUnicodeDecodeError\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[0msim\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.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[0msim\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 172\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 173\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--> 174\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 175\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 176\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 697\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[1;32m 698\u001b[0m \u001b[0mds\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mxr\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mopen_dataset\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mparam\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'BIN_OUT'\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--> 699\u001b[0;31m \u001b[0mds\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mclean_string_values\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mparam\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mds\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 700\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 701\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34mf\"Error encountered. OUT_TYPE {param['OUT_TYPE']} not recognized.\"\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;36mclean_string_values\u001b[0;34m(param, ds)\u001b[0m\n\u001b[1;32m 719\u001b[0m \u001b[0mds\u001b[0m \u001b[0;34m:\u001b[0m \u001b[0mxarray\u001b[0m \u001b[0mdataset\u001b[0m \u001b[0;32mwith\u001b[0m \u001b[0mthe\u001b[0m \u001b[0mstrings\u001b[0m \u001b[0mcleaned\u001b[0m \u001b[0mup\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 720\u001b[0m \"\"\" \n\u001b[0;32m--> 721\u001b[0;31m \u001b[0mds\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'name'\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mds\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'name'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mstr\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdecode\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mencoding\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'utf-8'\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 722\u001b[0m \u001b[0mds\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'particle_type'\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mds\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'particle_type'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mstr\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdecode\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mencoding\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'utf-8'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 723\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;34m'origin_type'\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mds\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/accessor_str.py\u001b[0m in \u001b[0;36mdecode\u001b[0;34m(self, encoding, errors)\u001b[0m\n\u001b[1;32m 2545\u001b[0m \u001b[0mdecoder\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mcodecs\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mgetdecoder\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mencoding\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2546\u001b[0m \u001b[0mfunc\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mlambda\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mdecoder\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0merrors\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[0m\n\u001b[0;32m-> 2547\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_apply\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfunc\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mfunc\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdtype\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mstr_\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 2548\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2549\u001b[0m def encode(\n", + "\u001b[0;32m~/.conda/envs/cent7/2020.02-py37/swiftestOOF/lib/python3.7/site-packages/xarray/core/accessor_str.py\u001b[0m in \u001b[0;36m_apply\u001b[0;34m(self, func, dtype, output_core_dims, output_sizes, func_args, func_kwargs)\u001b[0m\n\u001b[1;32m 239\u001b[0m \u001b[0moutput_sizes\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0moutput_sizes\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 240\u001b[0m \u001b[0mfunc_args\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mfunc_args\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 241\u001b[0;31m \u001b[0mfunc_kwargs\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mfunc_kwargs\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 242\u001b[0m )\n\u001b[1;32m 243\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/accessor_str.py\u001b[0m in \u001b[0;36m_apply_str_ufunc\u001b[0;34m(func, obj, dtype, output_core_dims, output_sizes, func_args, func_kwargs)\u001b[0m\n\u001b[1;32m 136\u001b[0m \u001b[0moutput_core_dims\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0moutput_core_dims\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 137\u001b[0m \u001b[0mdask_gufunc_kwargs\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mdask_gufunc_kwargs\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 138\u001b[0;31m \u001b[0;34m**\u001b[0m\u001b[0mfunc_kwargs\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 139\u001b[0m )\n\u001b[1;32m 140\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/computation.py\u001b[0m in \u001b[0;36mapply_ufunc\u001b[0;34m(func, input_core_dims, output_core_dims, exclude_dims, vectorize, join, dataset_join, dataset_fill_value, keep_attrs, kwargs, dask, output_dtypes, output_sizes, meta, dask_gufunc_kwargs, *args)\u001b[0m\n\u001b[1;32m 1142\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[1;32m 1143\u001b[0m \u001b[0mexclude_dims\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mexclude_dims\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1144\u001b[0;31m \u001b[0mkeep_attrs\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mkeep_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 1145\u001b[0m )\n\u001b[1;32m 1146\u001b[0m \u001b[0;31m# feed Variables directly through apply_variable_ufunc\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/computation.py\u001b[0m in \u001b[0;36mapply_dataarray_vfunc\u001b[0;34m(func, signature, join, exclude_dims, keep_attrs, *args)\u001b[0m\n\u001b[1;32m 269\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 270\u001b[0m \u001b[0mdata_vars\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0mgetattr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ma\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m\"variable\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0ma\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0ma\u001b[0m \u001b[0;32min\u001b[0m \u001b[0margs\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 271\u001b[0;31m \u001b[0mresult_var\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mfunc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0mdata_vars\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 272\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 273\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0msignature\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnum_outputs\u001b[0m \u001b[0;34m>\u001b[0m \u001b[0;36m1\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/computation.py\u001b[0m in \u001b[0;36mapply_variable_ufunc\u001b[0;34m(func, signature, exclude_dims, dask, output_dtypes, vectorize, keep_attrs, dask_gufunc_kwargs, *args)\u001b[0m\n\u001b[1;32m 722\u001b[0m )\n\u001b[1;32m 723\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 724\u001b[0;31m \u001b[0mresult_data\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mfunc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0minput_data\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 725\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 726\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0msignature\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnum_outputs\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/.local/lib/python3.7/site-packages/numpy/lib/function_base.py\u001b[0m in \u001b[0;36m__call__\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m 2111\u001b[0m \u001b[0mvargs\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mextend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0m_n\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0m_n\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mnames\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 2112\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 2113\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_vectorize_call\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfunc\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mfunc\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0margs\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mvargs\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 2114\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2115\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m_get_ufunc_and_otypes\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfunc\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0margs\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~/.local/lib/python3.7/site-packages/numpy/lib/function_base.py\u001b[0m in \u001b[0;36m_vectorize_call\u001b[0;34m(self, func, args)\u001b[0m\n\u001b[1;32m 2195\u001b[0m for a in args]\n\u001b[1;32m 2196\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 2197\u001b[0;31m \u001b[0moutputs\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mufunc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0minputs\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 2198\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2199\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mufunc\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnout\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;36m1\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/accessor_str.py\u001b[0m in \u001b[0;36m\u001b[0;34m(x)\u001b[0m\n\u001b[1;32m 2541\u001b[0m \"\"\"\n\u001b[1;32m 2542\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mencoding\u001b[0m \u001b[0;32min\u001b[0m \u001b[0m_cpython_optimized_decoders\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 2543\u001b[0;31m \u001b[0mfunc\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mlambda\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdecode\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mencoding\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0merrors\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 2544\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2545\u001b[0m \u001b[0mdecoder\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mcodecs\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mgetdecoder\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mencoding\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mUnicodeDecodeError\u001b[0m: 'utf-8' codec can't decode byte 0x80 in position 0: invalid start byte" ] } ], @@ -50,388 +71,14 @@ "cell_type": "code", "execution_count": 3, "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "
<xarray.DataArray 'origin_type' (id: 1521)>\n",
-       "array(['Initial conditions', 'Body                    Initial',\n",
-       "       'Body                    Initial', ..., '', '', ''], dtype='<U32')\n",
-       "Coordinates:\n",
-       "  * id       (id) int32 0 1 2 3 4 5 6 7 ... 1514 1515 1516 1517 1518 1519 1520
" - ], - "text/plain": [ - "\n", - "array(['Initial conditions', 'Body Initial',\n", - " 'Body Initial', ..., '', '', ''], dtype='
<xarray.Dataset>\n",
-       "Dimensions:        ()\n",
+       "
<xarray.DataArray 'name' ()>\n",
+       "array(b'UNNAMED', dtype='|S32')\n",
        "Coordinates:\n",
-       "    time           float64 0.0\n",
-       "    id             int32 2\n",
-       "Data variables: (12/48)\n",
-       "    npl            int32 1500\n",
-       "    ntp            int32 0\n",
-       "    name           <U32 'Body3'\n",
-       "    particle_type  <U12 'Massive Body'\n",
-       "    xhx            float64 -8.012e+06\n",
-       "    xhy            float64 -6.936e+06\n",
-       "    ...             ...\n",
-       "    origin_xhx     float64 6.013e-154\n",
-       "    origin_xhy     float64 6.013e-154\n",
-       "    origin_xhz     float64 0.0\n",
-       "    origin_vhx     float64 7.029e+06\n",
-       "    origin_vhy     float64 6.052e+06\n",
-       "    origin_vhz     float64 3.879e+03
" + " id int32 1885
" ], "text/plain": [ - "\n", - "Dimensions: ()\n", + "\n", + "array(b'UNNAMED', dtype='|S32')\n", "Coordinates:\n", - " time float64 0.0\n", - " id int32 2\n", - "Data variables: (12/48)\n", - " npl int32 ...\n", - " ntp int32 ...\n", - " name netcdf_close !! Closes an open NetCDF file procedure :: initialize => netcdf_initialize_output !! Initialize a set of parameters used to identify a NetCDF output object @@ -136,7 +145,7 @@ module swiftest_classes logical :: lyarkovsky = .false. !! Turn on Yarkovsky effect logical :: lyorp = .false. !! Turn on YORP effect - class(netcdf_parameters), allocatable :: nciu !! Object containing NetCDF parameters + type(netcdf_parameters) :: nciu !! Object containing NetCDF parameters contains procedure :: reader => io_param_reader procedure :: writer => io_param_writer @@ -153,6 +162,10 @@ module swiftest_classes type :: swiftest_particle_info character(len=NAMELEN) :: name !! Non-unique name character(len=NAMELEN) :: particle_type !! String containing a description of the particle type (e.g. Central Body, Massive Body, Test Particle) + character(len=NAMELEN) :: origin_type !! String containing a description of the origin of the particle (e.g. Initial Conditions, Supercatastrophic, Disruption, etc.) + real(DP) :: origin_time !! The time of the particle's formation + real(DP), dimension(NDIM) :: origin_xh !! The heliocentric distance vector at the time of the particle's formation + real(DP), dimension(NDIM) :: origin_vh !! The heliocentric velocity vector at the time of the particle's formation contains procedure :: dump => io_dump_particle_info !! Dumps contents of particle information to file procedure :: read_in => io_read_in_particle_info !! Read in a particle information object from an open file @@ -176,7 +189,7 @@ module swiftest_classes !******************************************************************************************************************************** !> A concrete lass for the central body in a Swiftest simulation type, abstract, extends(swiftest_base) :: swiftest_cb - class(swiftest_particle_info), allocatable :: info !! Particle metadata information + type(swiftest_particle_info) :: info !! Particle metadata information 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) @@ -215,7 +228,7 @@ module swiftest_classes !! 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 - class(swiftest_particle_info), dimension(:), allocatable :: info !! Particle metadata information + type(swiftest_particle_info), dimension(:), allocatable :: info !! Particle metadata information 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 @@ -1002,7 +1015,7 @@ end subroutine setup_encounter module subroutine setup_initialize_particle_info_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 + class(swiftest_parameters), intent(inout) :: param !! Current run configuration parameters end subroutine setup_initialize_particle_info_system module subroutine setup_initialize_system(self, param) @@ -1084,8 +1097,8 @@ end subroutine util_append_arr_I4B module subroutine util_append_arr_info(arr, source, nold, nsrc, lsource_mask) implicit none - class(swiftest_particle_info), dimension(:), allocatable, intent(inout) :: arr !! Destination array - class(swiftest_particle_info), dimension(:), allocatable, intent(in) :: source !! Array to append + type(swiftest_particle_info), dimension(:), allocatable, intent(inout) :: arr !! Destination array + type(swiftest_particle_info), dimension(:), allocatable, intent(in) :: source !! Array to append integer(I4B), intent(in) :: nold, nsrc !! Extend of the old array and the source array, respectively logical, dimension(:), intent(in) :: lsource_mask !! Logical mask indicating which elements to append to end subroutine util_append_arr_info @@ -1253,8 +1266,8 @@ end subroutine util_fill_arr_I4B module subroutine util_fill_arr_info(keeps, inserts, lfill_list) implicit none - class(swiftest_particle_info), dimension(:), allocatable, intent(inout) :: keeps !! Array of values to keep - class(swiftest_particle_info), dimension(:), allocatable, intent(in) :: inserts !! Array of values to insert into keep + type(swiftest_particle_info), dimension(:), allocatable, intent(inout) :: keeps !! Array of values to keep + type(swiftest_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 util_fill_arr_info @@ -1322,7 +1335,7 @@ end subroutine util_resize_arr_I4B module subroutine util_resize_arr_info(arr, nnew) implicit none - class(swiftest_particle_info), dimension(:), allocatable, intent(inout) :: arr !! Array to resize + type(swiftest_particle_info), dimension(:), allocatable, intent(inout) :: arr !! Array to resize integer(I4B), intent(in) :: nnew !! New size end subroutine util_resize_arr_info @@ -1506,7 +1519,7 @@ end subroutine util_sort_rearrange_arr_I4B module subroutine util_sort_rearrange_arr_info(arr, ind, n) implicit none - class(swiftest_particle_info), dimension(:), allocatable, intent(inout) :: arr !! Destination array + type(swiftest_particle_info), dimension(:), allocatable, intent(inout) :: arr !! Destination array integer(I4B), dimension(:), intent(in) :: ind !! Index to rearrange against integer(I4B), intent(in) :: n !! Number of elements in arr and ind to rearrange end subroutine util_sort_rearrange_arr_info @@ -1603,8 +1616,8 @@ end subroutine util_spill_arr_I8B module subroutine util_spill_arr_info(keeps, discards, lspill_list, ldestructive) implicit none - class(swiftest_particle_info), dimension(:), allocatable, intent(inout) :: keeps !! Array of values to keep - class(swiftest_particle_info), dimension(:), allocatable, intent(inout) :: discards !! Array of discards + type(swiftest_particle_info), dimension(:), allocatable, intent(inout) :: keeps !! Array of values to keep + type(swiftest_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 util_spill_arr_info diff --git a/src/modules/swiftest_globals.f90 b/src/modules/swiftest_globals.f90 index b84e7f2f9..a9dd2d762 100644 --- a/src/modules/swiftest_globals.f90 +++ b/src/modules/swiftest_globals.f90 @@ -181,4 +181,14 @@ module swiftest_globals character(*), parameter :: ECOLLISIONS_VARNAME = "Ecollisions" !! NetCDF name of the escaped angular momentum y variable character(*), parameter :: EUNTRACKED_VARNAME = "Euntracked" !! NetCDF name of the energy that is untracked due to loss (untracked potential energy due to mergers and body energy for escaped bodies) character(*), parameter :: GMESCAPE_VARNAME = "GMescape" !! NetCDF name of the G*Mass of bodies that escape the system + character(*), parameter :: ORIGIN_TYPE_VARNAME = "origin_type" + character(*), parameter :: ORIGIN_TIME_VARNAME = "origin_time" + character(*), parameter :: ORIGIN_XHX_VARNAME = "origin_xhx" + character(*), parameter :: ORIGIN_XHY_VARNAME = "origin_xhy" + character(*), parameter :: ORIGIN_XHZ_VARNAME = "origin_xhz" + character(*), parameter :: ORIGIN_VHX_VARNAME = "origin_vhx" + character(*), parameter :: ORIGIN_VHY_VARNAME = "origin_vhy" + character(*), parameter :: ORIGIN_VHZ_VARNAME = "origin_vhz" + character(*), parameter :: PL_TINY_TYPE_NAME = "Semi-Interacting Massive Body" + end module swiftest_globals diff --git a/src/modules/symba_classes.f90 b/src/modules/symba_classes.f90 index 8bc32ffed..3a9e37fce 100644 --- a/src/modules/symba_classes.f90 +++ b/src/modules/symba_classes.f90 @@ -14,29 +14,6 @@ module symba_classes integer(I4B), private, parameter :: NTENC = 3 real(DP), private, parameter :: RHSCALE = 6.5_DP real(DP), private, parameter :: RSHELL = 0.48075_DP - character(*), parameter :: ORIGIN_TYPE_VARNAME = "origin_type" - character(*), parameter :: ORIGIN_TIME_VARNAME = "origin_time" - character(*), parameter :: ORIGIN_XHX_VARNAME = "origin_xhx" - character(*), parameter :: ORIGIN_XHY_VARNAME = "origin_xhy" - character(*), parameter :: ORIGIN_XHZ_VARNAME = "origin_xhz" - character(*), parameter :: ORIGIN_VHX_VARNAME = "origin_vhx" - character(*), parameter :: ORIGIN_VHY_VARNAME = "origin_vhy" - character(*), parameter :: ORIGIN_VHZ_VARNAME = "origin_vhz" - character(*), parameter :: PL_TINY_TYPE_NAME = "Semi-Interacting Massive Body" - - type, extends(netcdf_parameters) :: symba_netcdf_parameters - integer(I4B) :: origin_type_varid !! NetCDF ID for the origin type - integer(I4B) :: origin_time_varid !! NetCDF ID for the origin type - integer(I4B) :: origin_xhx_varid !! NetCDF ID for the origin xh x component - integer(I4B) :: origin_xhy_varid !! NetCDF ID for the origin xh y component - integer(I4B) :: origin_xhz_varid !! NetCDF ID for the origin xh z component - integer(I4B) :: origin_vhx_varid !! NetCDF ID for the origin xh x component - integer(I4B) :: origin_vhy_varid !! NetCDF ID for the origin xh y component - integer(I4B) :: origin_vhz_varid !! NetCDF ID for the origin xh z component - contains - procedure :: initialize => symba_netcdf_initialize_output !! Initialize a set of parameters used to identify a NetCDF output objec - procedure :: open => symba_netcdf_open !! Opens a NetCDF file - end type symba_netcdf_parameters type, extends(swiftest_parameters) :: symba_parameters real(DP) :: GMTINY = -1.0_DP !! Smallest G*mass that is fully gravitating @@ -48,20 +25,6 @@ module symba_classes procedure :: writer => symba_io_param_writer end type symba_parameters - !******************************************************************************************************************************** - ! symba_swiftest_particle_info class definitions and method interfaces - !******************************************************************************************************************************* - !> Class definition for the particle origin information object. This object is used to track time, location, and collisional regime - !> of fragments produced in collisional events. - type, extends(swiftest_particle_info) :: symba_particle_info - character(len=NAMELEN) :: origin_type !! String containing a description of the origin of the particle (e.g. Initial Conditions, Supercatastrophic, Disruption, etc.) - real(DP) :: origin_time !! The time of the particle's formation - real(DP), dimension(NDIM) :: origin_xh !! The heliocentric distance vector at the time of the particle's formation - real(DP), dimension(NDIM) :: origin_vh !! The heliocentric velocity vector at the time of the particle's formation - contains - procedure :: read_in => symba_io_read_in_particle_info !! Reads in SyMBA particle information metadata from an open unformatted file - end type symba_particle_info - !******************************************************************************************************************************** ! symba_kinship class definitions and method interfaces !******************************************************************************************************************************* @@ -82,7 +45,6 @@ module symba_classes 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 - procedure :: write_frame_netcdf => symba_netcdf_write_frame_cb !! I/O routine for writing out a single frame of time-series data for all bodies in the system in NetCDF format end type symba_cb !******************************************************************************************************************************** @@ -120,7 +82,6 @@ module symba_classes 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 :: write_frame_netcdf => symba_netcdf_write_frame_pl !! I/O routine for writing out a single frame of time-series data for all bodies in the system in NetCDF format end type symba_pl type, extends(symba_pl) :: symba_merger @@ -150,7 +111,6 @@ module symba_classes 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 :: write_frame_netcdf => symba_netcdf_write_frame_tp !! I/O routine for writing out a single frame of time-series data for all bodies in the system in NetCDF format end type symba_tp !******************************************************************************************************************************** @@ -202,7 +162,6 @@ module symba_classes 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 :: init_particle_info => symba_setup_initialize_particle_info_system !! Initialize the system from input files 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 @@ -384,13 +343,6 @@ module subroutine symba_util_index_eucl_plpl(self, param) class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters end subroutine symba_util_index_eucl_plpl - module subroutine symba_io_dump_particle_info(self, iu) - implicit none - class(symba_particle_info), intent(in) :: self !! Particle metadata information object - integer(I4B), intent(in) :: iu !! Open file unit number - 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 !! Current run configuration parameters with SyMBA additionss @@ -413,12 +365,6 @@ module subroutine symba_io_param_writer(self, unit, iotype, v_list, iostat, ioms character(len=*), intent(inout) :: iomsg !! Message to pass if iostat /= 0 end subroutine symba_io_param_writer - module subroutine symba_io_read_in_particle_info(self, iu) - implicit none - class(symba_particle_info), intent(inout) :: self !! Particle metadata information object - integer(I4B), intent(in) :: iu !! Open file unit number - end subroutine symba_io_read_in_particle_info - module subroutine symba_io_write_discard(self, param) use swiftest_classes, only : swiftest_parameters implicit none @@ -460,51 +406,6 @@ module subroutine symba_kick_encounter(self, system, dt, irec, sgn) integer(I4B), intent(in) :: sgn !! sign to be applied to acceleration end subroutine symba_kick_encounter - module subroutine symba_netcdf_initialize_output(self, param) - use swiftest_classes, only : swiftest_parameters - implicit none - class(symba_netcdf_parameters), intent(inout) :: self !! Parameters used to identify a particular NetCDF dataset - class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters - end subroutine symba_netcdf_initialize_output - - module subroutine symba_netcdf_open(self, param) - use swiftest_classes, only : swiftest_parameters - implicit none - class(symba_netcdf_parameters), intent(inout) :: self !! Parameters used to identify a particular NetCDF dataset - class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters - end subroutine symba_netcdf_open - - module subroutine symba_netcdf_write_frame_cb(self, iu, param) - use swiftest_classes, only : swiftest_parameters, netcdf_parameters - implicit none - class(symba_cb), intent(in) :: self !! Symba central body object - class(netcdf_parameters), intent(inout) :: iu !! Parameters used to identify a particular NetCDF dataset - class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters - end subroutine symba_netcdf_write_frame_cb - - module subroutine symba_netcdf_write_frame_pl(self, iu, param) - use swiftest_classes, only : swiftest_parameters, netcdf_parameters - implicit none - class(symba_pl), intent(in) :: self !! Symba massive body object - class(netcdf_parameters), intent(inout) :: iu !! Parameters used to identify a particular NetCDF dataset - class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters - end subroutine symba_netcdf_write_frame_pl - - module subroutine symba_netcdf_write_frame_tp(self, iu, param) - use swiftest_classes, only : swiftest_parameters, netcdf_parameters - implicit none - class(symba_tp), intent(in) :: self !! SyMBA test particle object - class(netcdf_parameters), intent(inout) :: iu !! Parameters used to identify a particular NetCDF dataset - class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters - end subroutine symba_netcdf_write_frame_tp - - module subroutine symba_setup_initialize_particle_info_system(self, param) - use swiftest_classes, only : swiftest_parameters - implicit none - class(symba_nbody_system), intent(inout) :: self !! SyMBA nbody system object - class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters with SyMBA extensions - end subroutine symba_setup_initialize_particle_info_system - module subroutine symba_setup_initialize_system(self, param) use swiftest_classes, only : swiftest_parameters implicit none diff --git a/src/netcdf/netcdf.f90 b/src/netcdf/netcdf.f90 index 274b05e3e..d2f7a0f80 100644 --- a/src/netcdf/netcdf.f90 +++ b/src/netcdf/netcdf.f90 @@ -120,6 +120,17 @@ module subroutine netcdf_initialize_output(self, param) call check( nf90_def_var(self%ncid, GMESCAPE_VARNAME, self%out_type, self%time_dimid, self%GMescape_varid) ) end if + if (self%ltrack_origin) then + call check( nf90_def_var(self%ncid, ORIGIN_TYPE_VARNAME, NF90_CHAR, [self%str_dimid, self%id_dimid], self%origin_type_varid) ) + call check( nf90_def_var(self%ncid, ORIGIN_TIME_VARNAME, self%out_type, self%id_dimid, self%origin_time_varid) ) + call check( nf90_def_var(self%ncid, ORIGIN_XHX_VARNAME, self%out_type, self%id_dimid, self%origin_xhx_varid) ) + call check( nf90_def_var(self%ncid, ORIGIN_XHY_VARNAME, self%out_type, self%id_dimid, self%origin_xhy_varid) ) + call check( nf90_def_var(self%ncid, ORIGIN_XHZ_VARNAME, self%out_type, self%id_dimid, self%origin_xhz_varid) ) + call check( nf90_def_var(self%ncid, ORIGIN_VHX_VARNAME, self%out_type, self%id_dimid, self%origin_vhx_varid) ) + call check( nf90_def_var(self%ncid, ORIGIN_VHY_VARNAME, self%out_type, self%id_dimid, self%origin_vhy_varid) ) + call check( nf90_def_var(self%ncid, ORIGIN_VHZ_VARNAME, self%out_type, self%id_dimid, self%origin_vhz_varid) ) + end if + return end subroutine netcdf_initialize_output @@ -197,6 +208,17 @@ module subroutine netcdf_open(self, param) call check( nf90_inq_varid(self%ncid, GMESCAPE_VARNAME, self%GMescape_varid) ) end if + if (self%ltrack_origin) then + call check( nf90_inq_varid(self%ncid, ORIGIN_TYPE_VARNAME, self%origin_type_varid)) + call check( nf90_inq_varid(self%ncid, ORIGIN_TIME_VARNAME, self%origin_time_varid)) + call check( nf90_inq_varid(self%ncid, ORIGIN_XHX_VARNAME, self%origin_xhx_varid)) + call check( nf90_inq_varid(self%ncid, ORIGIN_XHY_VARNAME, self%origin_xhy_varid)) + call check( nf90_inq_varid(self%ncid, ORIGIN_XHZ_VARNAME, self%origin_xhz_varid)) + call check( nf90_inq_varid(self%ncid, ORIGIN_VHX_VARNAME, self%origin_vhx_varid)) + call check( nf90_inq_varid(self%ncid, ORIGIN_VHY_VARNAME, self%origin_vhy_varid)) + call check( nf90_inq_varid(self%ncid, ORIGIN_VHZ_VARNAME, self%origin_vhz_varid)) + end if + return end subroutine netcdf_open @@ -219,7 +241,7 @@ module subroutine netcdf_write_frame_base(self, iu, param) tslot = int(param%ioutput, kind=I4B) + 1 select type(self) - class is (swiftest_body) + class is (swiftest_body) associate(n => self%nbody) if (n == 0) return allocate(ind(n)) @@ -245,6 +267,7 @@ module subroutine netcdf_write_frame_base(self, iu, param) call check( nf90_put_var(iu%ncid, iu%vhy_varid, self%vh(2, j), start=[idslot, tslot]) ) call check( nf90_put_var(iu%ncid, iu%vhz_varid, self%vh(3, j), start=[idslot, tslot]) ) end if + if ((param%out_form == EL) .or. (param%out_form == XVEL)) then call check( nf90_put_var(iu%ncid, iu%a_varid, self%a(j), start=[idslot, tslot]) ) call check( nf90_put_var(iu%ncid, iu%e_varid, self%e(j), start=[idslot, tslot]) ) @@ -253,27 +276,42 @@ module subroutine netcdf_write_frame_base(self, iu, param) call check( nf90_put_var(iu%ncid, iu%omega_varid, self%omega(j), start=[idslot, tslot]) ) call check( nf90_put_var(iu%ncid, iu%capm_varid, self%capm(j), start=[idslot, tslot]) ) end if - select type(pl => self) + + if (iu%ltrack_origin) then + charstring = trim(adjustl(self%info(j)%origin_type)) + strlen = len(charstring) + call check( nf90_put_var(iu%ncid, iu%origin_type_varid, charstring, start=[1, idslot], count=[strlen, 1]) ) + call check( nf90_put_var(iu%ncid, iu%origin_time_varid, self%info(j)%origin_time, start=[idslot]) ) + call check( nf90_put_var(iu%ncid, iu%origin_xhx_varid, self%info(j)%origin_xh(1), start=[idslot]) ) + call check( nf90_put_var(iu%ncid, iu%origin_xhy_varid, self%info(j)%origin_xh(2), start=[idslot]) ) + call check( nf90_put_var(iu%ncid, iu%origin_xhz_varid, self%info(j)%origin_xh(3), start=[idslot]) ) + call check( nf90_put_var(iu%ncid, iu%origin_vhx_varid, self%info(j)%origin_vh(1), start=[idslot]) ) + call check( nf90_put_var(iu%ncid, iu%origin_vhy_varid, self%info(j)%origin_vh(2), start=[idslot]) ) + call check( nf90_put_var(iu%ncid, iu%origin_vhz_varid, self%info(j)%origin_vh(3), start=[idslot]) ) + end if + + select type(self) class is (swiftest_pl) ! Additional output if the passed polymorphic object is a massive body - call check( nf90_put_var(iu%ncid, iu%Gmass_varid, pl%Gmass(j), start=[idslot, tslot]) ) + call check( nf90_put_var(iu%ncid, iu%Gmass_varid, self%Gmass(j), start=[idslot, tslot]) ) if (param%lrhill_present) then - call check( nf90_put_var(iu%ncid, iu%rhill_varid, pl%rhill(j), start=[idslot, tslot]) ) + call check( nf90_put_var(iu%ncid, iu%rhill_varid, self%rhill(j), start=[idslot, tslot]) ) end if if (param%lclose) then - call check( nf90_put_var(iu%ncid, iu%radius_varid, pl%radius(j), start=[idslot, tslot]) ) + call check( nf90_put_var(iu%ncid, iu%radius_varid, self%radius(j), start=[idslot, tslot]) ) end if if (param%lrotation) then - call check( nf90_put_var(iu%ncid, iu%Ip1_varid, pl%Ip(1, j), start=[idslot, tslot]) ) - call check( nf90_put_var(iu%ncid, iu%Ip2_varid, pl%Ip(2, j), start=[idslot, tslot]) ) - call check( nf90_put_var(iu%ncid, iu%Ip3_varid, pl%Ip(3, j), start=[idslot, tslot]) ) - call check( nf90_put_var(iu%ncid, iu%rotx_varid, pl%rot(1, j), start=[idslot, tslot]) ) - call check( nf90_put_var(iu%ncid, iu%roty_varid, pl%rot(2, j), start=[idslot, tslot]) ) - call check( nf90_put_var(iu%ncid, iu%rotz_varid, pl%rot(3, j), start=[idslot, tslot]) ) + call check( nf90_put_var(iu%ncid, iu%Ip1_varid, self%Ip(1, j), start=[idslot, tslot]) ) + call check( nf90_put_var(iu%ncid, iu%Ip2_varid, self%Ip(2, j), start=[idslot, tslot]) ) + call check( nf90_put_var(iu%ncid, iu%Ip3_varid, self%Ip(3, j), start=[idslot, tslot]) ) + call check( nf90_put_var(iu%ncid, iu%rotx_varid, self%rot(1, j), start=[idslot, tslot]) ) + call check( nf90_put_var(iu%ncid, iu%roty_varid, self%rot(2, j), start=[idslot, tslot]) ) + call check( nf90_put_var(iu%ncid, iu%rotz_varid, self%rot(3, j), start=[idslot, tslot]) ) end if if (param%ltides) then - call check( nf90_put_var(iu%ncid, iu%k2_varid, pl%k2(j), start=[idslot, tslot]) ) - call check( nf90_put_var(iu%ncid, iu%Q_varid, pl%Q(j), start=[idslot, tslot]) ) + call check( nf90_put_var(iu%ncid, iu%k2_varid, self%k2(j), start=[idslot, tslot]) ) + call check( nf90_put_var(iu%ncid, iu%Q_varid, self%Q(j), start=[idslot, tslot]) ) end if + end select end do end associate @@ -303,11 +341,25 @@ module subroutine netcdf_write_frame_base(self, iu, param) call check( nf90_put_var(iu%ncid, iu%k2_varid, self%k2, start=[idslot, tslot]) ) call check( nf90_put_var(iu%ncid, iu%Q_varid, self%Q, start=[idslot, tslot]) ) end if + + if (iu%ltrack_origin) then + charstring = trim(adjustl(self%info%origin_type)) + strlen = len(charstring) + call check( nf90_put_var(iu%ncid, iu%origin_type_varid, charstring, start=[1, idslot], count=[strlen, 1]) ) + call check( nf90_put_var(iu%ncid, iu%origin_time_varid, self%info%origin_time, start=[idslot]) ) + call check( nf90_put_var(iu%ncid, iu%origin_xhx_varid, self%info%origin_xh(1), start=[idslot]) ) + call check( nf90_put_var(iu%ncid, iu%origin_xhy_varid, self%info%origin_xh(2), start=[idslot]) ) + call check( nf90_put_var(iu%ncid, iu%origin_xhz_varid, self%info%origin_xh(3), start=[idslot]) ) + call check( nf90_put_var(iu%ncid, iu%origin_vhx_varid, self%info%origin_vh(1), start=[idslot]) ) + call check( nf90_put_var(iu%ncid, iu%origin_vhy_varid, self%info%origin_vh(2), start=[idslot]) ) + call check( nf90_put_var(iu%ncid, iu%origin_vhz_varid, self%info%origin_vh(3), start=[idslot]) ) + end if end select return end subroutine netcdf_write_frame_base + module subroutine netcdf_write_hdr_system(self, iu, param) !! author: David A. Minton !! diff --git a/src/setup/setup.f90 b/src/setup/setup.f90 index 02a44f091..c87aea559 100644 --- a/src/setup/setup.f90 +++ b/src/setup/setup.f90 @@ -67,15 +67,6 @@ module subroutine setup_construct_system(system, param) call util_exit(FAILURE) end select - select type(system) - class is (symba_nbody_system) - if (.not.allocated(system%cb%info)) allocate(symba_particle_info :: system%cb%info) - if (.not.allocated(param%nciu)) allocate(symba_netcdf_parameters :: param%nciu) - class default - if (.not.allocated(system%cb%info)) allocate(swiftest_particle_info :: system%cb%info) - if (.not.allocated(param%nciu)) allocate(netcdf_parameters :: param%nciu) - end select - return end subroutine setup_construct_system @@ -144,9 +135,45 @@ module subroutine setup_initialize_particle_info_system(self, param) implicit none ! Arguments class(swiftest_nbody_system), intent(inout) :: self !! 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 + logical :: ltrack_origin + integer(I4B) :: i associate(cb => self%cb, pl => self%pl, npl => self%pl%nbody, tp => self%tp, ntp => self%tp%nbody) + select type(param) + class is (symba_parameters) + param%nciu%ltrack_origin = param%lfragmentation + class default + param%nciu%ltrack_origin = .false. + end select + + select type(param) + class is (symba_parameters) + ltrack_origin = param%lfragmentation + class default + ltrack_origin = .false. + end select + + if (ltrack_origin) then + cb%info%origin_type = "Initial conditions" + cb%info%origin_time = param%t0 + cb%info%origin_xh(:) = 0.0_DP + cb%info%origin_vh(:) = 0.0_DP + do i = 1, self%pl%nbody + pl%info(i)%origin_type = "Initial conditions" + pl%info(i)%origin_time = param%t0 + pl%info(i)%origin_xh(:) = self%pl%xh(:,i) + pl%info(i)%origin_vh(:) = self%pl%vh(:,i) + end do + do i = 1, self%tp%nbody + tp%info(i)%origin_type = "Initial conditions" + tp%info(i)%origin_time = param%t0 + tp%info(i)%origin_xh(:) = self%tp%xh(:,i) + tp%info(i)%origin_vh(:) = self%tp%vh(:,i) + end do + end if + cb%info%particle_type = CB_TYPE_NAME call cb%dump_particle_info(param) if (npl > 0) then @@ -157,6 +184,7 @@ module subroutine setup_initialize_particle_info_system(self, param) tp%info(1:ntp)%particle_type = TP_TYPE_NAME call tp%dump_particle_info(param) end if + end associate return diff --git a/src/symba/symba_collision.f90 b/src/symba/symba_collision.f90 index b4505741b..3f5ebadc3 100644 --- a/src/symba/symba_collision.f90 +++ b/src/symba/symba_collision.f90 @@ -839,120 +839,109 @@ subroutine symba_collision_mergeaddsub(system, param, family, id_frag, Ip_frag, class is (symba_pl) select type(pl_discards => system%pl_discards) class is (symba_merger) - select type(info => pl%info) - class is (symba_particle_info) - associate(pl_adds => system%pl_adds, cb => system%cb) - - ! Add the family bodies to the subtraction list - nfamily = size(family(:)) - nfrag = size(m_frag(:)) - lmask(:) = .false. - lmask(family(:)) = .true. - pl%status(family(:)) = MERGED - nstart = pl_discards%nbody + 1 - nend = pl_discards%nbody + nfamily - call pl_discards%append(pl, lmask) - pl%ldiscard(family(:)) = .true. - pl%lcollision(family(:)) = .true. - - ! Record how many bodies were subtracted in this event - pl_discards%ncomp(nstart:nend) = nfamily - - ! Setup new bodies - allocate(plnew, mold=pl) - call plnew%setup(nfrag, param) - ibiggest = family(maxloc(pl%Gmass(family(:)), dim=1)) + associate(info => pl%info, pl_adds => system%pl_adds, cb => system%cb) + ! Add the family bodies to the subtraction list + nfamily = size(family(:)) + nfrag = size(m_frag(:)) + lmask(:) = .false. + lmask(family(:)) = .true. + pl%status(family(:)) = MERGED + nstart = pl_discards%nbody + 1 + nend = pl_discards%nbody + nfamily + call pl_discards%append(pl, lmask) + pl%ldiscard(family(:)) = .true. + pl%lcollision(family(:)) = .true. - ! Copy over identification, information, and physical properties of the new bodies from the fragment list - plnew%id(1:nfrag) = id_frag(1:nfrag) - param%maxid = param%maxid + nfrag - plnew%xb(:, 1:nfrag) = xb_frag(:, 1:nfrag) - plnew%vb(:, 1:nfrag) = vb_frag(:, 1:nfrag) + ! Record how many bodies were subtracted in this event + pl_discards%ncomp(nstart:nend) = nfamily + + ! Setup new bodies + allocate(plnew, mold=pl) + call plnew%setup(nfrag, param) + ibiggest = family(maxloc(pl%Gmass(family(:)), dim=1)) + + ! Copy over identification, information, and physical properties of the new bodies from the fragment list + plnew%id(1:nfrag) = id_frag(1:nfrag) + param%maxid = param%maxid + nfrag + plnew%xb(:, 1:nfrag) = xb_frag(:, 1:nfrag) + plnew%vb(:, 1:nfrag) = vb_frag(:, 1:nfrag) + do i = 1, nfrag + plnew%xh(:,i) = xb_frag(:, i) - cb%xb(:) + plnew%vh(:,i) = vb_frag(:, i) - cb%vb(:) + end do + plnew%mass(1:nfrag) = m_frag(1:nfrag) + plnew%Gmass(1:nfrag) = param%GU * m_frag(1:nfrag) + plnew%radius(1:nfrag) = rad_frag(1:nfrag) + plnew%density(1:nfrag) = m_frag(1:nfrag) / rad_frag(1:nfrag) + + select case(status) + case(DISRUPTION) + plnew%info(1:nfrag)%origin_type = "Disruption" + plnew%status(1:nfrag) = NEW_PARTICLE + plnew%info(1:nfrag)%origin_time = param%t + do i = 1, nfrag + write(info(i)%name, FRAGFMT) id_frag(i) + plnew%info(i)%origin_xh(:) = plnew%xh(:,i) + plnew%info(i)%origin_vh(:) = plnew%vh(:,i) + end do + case(SUPERCATASTROPHIC) + plnew%info(1:nfrag)%origin_type = "Supercatastrophic" + plnew%status(1:nfrag) = NEW_PARTICLE + plnew%info(1:nfrag)%origin_time = param%t do i = 1, nfrag - plnew%xh(:,i) = xb_frag(:, i) - cb%xb(:) - plnew%vh(:,i) = vb_frag(:, i) - cb%vb(:) + write(info(i)%name, FRAGFMT) id_frag(i) + plnew%info(i)%origin_xh(:) = plnew%xh(:,i) + plnew%info(i)%origin_vh(:) = plnew%vh(:,i) + end do + case(HIT_AND_RUN_DISRUPT) + plnew%info(1)%name = pl%info(ibiggest)%name + plnew%info(1)%origin_type = pl%info(ibiggest)%origin_type + plnew%info(1)%origin_xh(:) = pl%info(ibiggest)%origin_xh(:) + plnew%info(1)%origin_vh(:) = pl%info(ibiggest)%origin_vh(:) + plnew%status(1) = OLD_PARTICLE + plnew%status(2:nfrag) = NEW_PARTICLE + plnew%info(2:nfrag)%origin_type = "Hit and run fragment" + plnew%info(2:nfrag)%origin_time = param%t + do i = 2, nfrag + write(info(i)%name, FRAGFMT) id_frag(i) + plnew%info(i)%origin_xh(:) = plnew%xh(:,i) + plnew%info(i)%origin_vh(:) = plnew%vh(:,i) end do - plnew%mass(1:nfrag) = m_frag(1:nfrag) - plnew%Gmass(1:nfrag) = param%GU * m_frag(1:nfrag) - plnew%radius(1:nfrag) = rad_frag(1:nfrag) - plnew%density(1:nfrag) = m_frag(1:nfrag) / rad_frag(1:nfrag) + case(MERGED) + plnew%info(1)%name = pl%info(ibiggest)%name + plnew%info(1)%origin_type = pl%info(ibiggest)%origin_type + plnew%info(1)%origin_xh(:) = pl%info(ibiggest)%origin_xh(:) + plnew%info(1)%origin_vh(:) = pl%info(ibiggest)%origin_vh(:) + plnew%status(1) = OLD_PARTICLE + end select - select type(info => plnew%info) - class is (symba_particle_info) - select case(status) - case(DISRUPTION) - info(1:nfrag)%origin_type = "Disruption" - plnew%status(1:nfrag) = NEW_PARTICLE - info(1:nfrag)%origin_time = param%t - do i = 1, nfrag - write(info(i)%name, FRAGFMT) id_frag(i) - info(i)%origin_xh(:) = plnew%xh(:,i) - info(i)%origin_vh(:) = plnew%vh(:,i) - end do - case(SUPERCATASTROPHIC) - info(1:nfrag)%origin_type = "Supercatastrophic" - plnew%status(1:nfrag) = NEW_PARTICLE - info(1:nfrag)%origin_time = param%t - do i = 1, nfrag - write(info(i)%name, FRAGFMT) id_frag(i) - info(i)%origin_xh(:) = plnew%xh(:,i) - info(i)%origin_vh(:) = plnew%vh(:,i) - end do - case(HIT_AND_RUN_DISRUPT) - select type(plinfo => pl%info) - class is (symba_particle_info) - info(1)%name = plinfo(ibiggest)%name - info(1)%origin_xh(:) = plinfo(ibiggest)%origin_xh(:) - info(1)%origin_vh(:) = plinfo(ibiggest)%origin_vh(:) - end select - plnew%status(1) = OLD_PARTICLE - plnew%status(2:nfrag) = NEW_PARTICLE - info(2:nfrag)%origin_type = "Hit and run fragment" - info(2:nfrag)%origin_time = param%t - do i = 2, nfrag - write(info(i)%name, FRAGFMT) id_frag(i) - info(i)%origin_xh(:) = plnew%xh(:,i) - info(i)%origin_vh(:) = plnew%vh(:,i) - end do - case(MERGED) - select type(plinfo => pl%info) - class is (symba_particle_info) - info(1)%name = plinfo(ibiggest)%name - info(1)%origin_xh(:) = plinfo(ibiggest)%origin_xh(:) - info(1)%origin_vh(:) = plinfo(ibiggest)%origin_vh(:) - end select - plnew%status(1) = OLD_PARTICLE - end select - end select - - if (param%lrotation) then - plnew%Ip(:, 1:nfrag) = Ip_frag(:, 1:nfrag) - plnew%rot(:, 1:nfrag) = rot_frag(:, 1:nfrag) - end if - - if (param%ltides) then - plnew%Q = pl%Q(ibiggest) - plnew%k2 = pl%k2(ibiggest) - plnew%tlag = pl%tlag(ibiggest) - end if + if (param%lrotation) then + plnew%Ip(:, 1:nfrag) = Ip_frag(:, 1:nfrag) + plnew%rot(:, 1:nfrag) = rot_frag(:, 1:nfrag) + end if + + if (param%ltides) then + plnew%Q = pl%Q(ibiggest) + plnew%k2 = pl%k2(ibiggest) + plnew%tlag = pl%tlag(ibiggest) + end if - call plnew%set_mu(cb) - !Copy over or set integration parameters for new bodies - plnew%lcollision(1:nfrag) = .false. - plnew%ldiscard(1:nfrag) = .false. - plnew%levelg(1:nfrag) = pl%levelg(ibiggest) - plnew%levelm(1:nfrag) = pl%levelm(ibiggest) - - ! Append the new merged body to the list and record how many we made - nstart = pl_adds%nbody + 1 - nend = pl_adds%nbody + plnew%nbody - call pl_adds%append(plnew, lsource_mask=[(.true., i=1, plnew%nbody)]) - pl_adds%ncomp(nstart:nend) = plnew%nbody - - call plnew%setup(0, param) - deallocate(plnew) - end associate - end select + call plnew%set_mu(cb) + !Copy over or set integration parameters for new bodies + plnew%lcollision(1:nfrag) = .false. + plnew%ldiscard(1:nfrag) = .false. + plnew%levelg(1:nfrag) = pl%levelg(ibiggest) + plnew%levelm(1:nfrag) = pl%levelm(ibiggest) + + ! Append the new merged body to the list and record how many we made + nstart = pl_adds%nbody + 1 + nend = pl_adds%nbody + plnew%nbody + call pl_adds%append(plnew, lsource_mask=[(.true., i=1, plnew%nbody)]) + pl_adds%ncomp(nstart:nend) = plnew%nbody + + call plnew%setup(0, param) + deallocate(plnew) + end associate end select end select diff --git a/src/symba/symba_io.f90 b/src/symba/symba_io.f90 index 281fe7cdb..8b64950e9 100644 --- a/src/symba/symba_io.f90 +++ b/src/symba/symba_io.f90 @@ -2,30 +2,6 @@ use swiftest contains - module subroutine symba_io_dump_particle_info(self, iu) - !! author: David A. Minton - !! - !! Reads in particle information object information from an open file unformatted file - implicit none - ! Arguments - class(symba_particle_info), intent(in) :: self !! Particle metadata information object - integer(I4B), intent(in) :: iu !! Open file unit number - ! Internals - character(STRMAX) :: errmsg - - write(iu, err = 667, iomsg = errmsg) self%origin_type - write(iu, err = 667, iomsg = errmsg) self%origin_time - write(iu, err = 667, iomsg = errmsg) self%origin_xh(:) - write(iu, err = 667, iomsg = errmsg) self%origin_vh(:) - - return - - 667 continue - write(*,*) "Error writing particle metadata information from file: " // trim(adjustl(errmsg)) - call util_exit(FAILURE) - end subroutine symba_io_dump_particle_info - - module subroutine symba_io_param_reader(self, unit, iotype, v_list, iostat, iomsg) !! author: The Purdue Swiftest Team - David A. Minton, Carlisle A. Wishard, Jennifer L.L. Pouplin, and Jacob R. Elliott !! @@ -203,31 +179,6 @@ module subroutine symba_io_param_writer(self, unit, iotype, v_list, iostat, ioms end subroutine symba_io_param_writer - module subroutine symba_io_read_in_particle_info(self, iu) - !! author: David A. Minton - !! - !! Reads in particle information object information from an open file unformatted file - implicit none - ! Arguments - class(symba_particle_info), intent(inout) :: self !! Particle metadata information object - integer(I4B), intent(in) :: iu !! Open file unit number - ! Internals - character(STRMAX) :: errmsg - - call io_read_in_particle_info(self, iu) - read(iu, err = 667, iomsg = errmsg) self%origin_type - read(iu, err = 667, iomsg = errmsg) self%origin_time - read(iu, err = 667, iomsg = errmsg) self%origin_xh(:) - read(iu, err = 667, iomsg = errmsg) self%origin_vh(:) - - return - - 667 continue - write(*,*) "Error reading particle metadata information from file: " // trim(adjustl(errmsg)) - call util_exit(FAILURE) - end subroutine symba_io_read_in_particle_info - - module subroutine symba_io_write_discard(self, param) implicit none class(symba_nbody_system), intent(inout) :: self !! SyMBA nbody system object diff --git a/src/symba/symba_netcdf.f90 b/src/symba/symba_netcdf.f90 deleted file mode 100644 index a3ef5cec0..000000000 --- a/src/symba/symba_netcdf.f90 +++ /dev/null @@ -1,206 +0,0 @@ -submodule (symba_classes) s_symba_netcdf - use swiftest - use netcdf -contains - - subroutine check(status) - !! author: Carlisle A. Wishard, Dana Singh, and David A. Minton - !! - !! Checks the status of all NetCDF operations to catch errors - implicit none - ! Arguments - integer, intent (in) :: status - - if(status /= nf90_noerr) then - write(*,*) trim(nf90_strerror(status)) - call util_exit(FAILURE) - end if - - return - end subroutine check - - module subroutine symba_netcdf_initialize_output(self, param) - !! author: Carlisle A. Wishard, Dana Singh, and David A. Minton - !! - !! Initialize a NetCDF file system and defines all variables. - implicit none - ! Arguments - class(symba_netcdf_parameters), intent(inout) :: self !! Parameters used to identify a particular NetCDF dataset - class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters - - - call netcdf_initialize_output(self, param) - - ! Define the variables - call check( nf90_def_var(self%ncid, ORIGIN_TYPE_VARNAME, NF90_CHAR, [self%str_dimid, self%id_dimid], self%origin_type_varid) ) - call check( nf90_def_var(self%ncid, ORIGIN_TIME_VARNAME, self%out_type, self%id_dimid, self%origin_time_varid) ) - call check( nf90_def_var(self%ncid, ORIGIN_XHX_VARNAME, self%out_type, self%id_dimid, self%origin_xhx_varid) ) - call check( nf90_def_var(self%ncid, ORIGIN_XHY_VARNAME, self%out_type, self%id_dimid, self%origin_xhy_varid) ) - call check( nf90_def_var(self%ncid, ORIGIN_XHZ_VARNAME, self%out_type, self%id_dimid, self%origin_xhz_varid) ) - call check( nf90_def_var(self%ncid, ORIGIN_VHX_VARNAME, self%out_type, self%id_dimid, self%origin_vhx_varid) ) - call check( nf90_def_var(self%ncid, ORIGIN_VHY_VARNAME, self%out_type, self%id_dimid, self%origin_vhy_varid) ) - call check( nf90_def_var(self%ncid, ORIGIN_VHZ_VARNAME, self%out_type, self%id_dimid, self%origin_vhz_varid) ) - - return - - end subroutine symba_netcdf_initialize_output - - - module subroutine symba_netcdf_open(self, param) - !! author: Carlisle A. Wishard, Dana Singh, and David A. Minton - !! - !! Opens a NetCDF file and does the variable inquiries to activate variable ids - implicit none - ! Arguments - class(symba_netcdf_parameters), intent(inout) :: self !! Parameters used to identify a particular NetCDF dataset - class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters - ! Internals - integer(I4B) :: old_mode - - call netcdf_open(self, param) - - call check( nf90_inq_varid(self%ncid, ORIGIN_TYPE_VARNAME, self%origin_type_varid)) - call check( nf90_inq_varid(self%ncid, ORIGIN_TIME_VARNAME, self%origin_time_varid)) - call check( nf90_inq_varid(self%ncid, ORIGIN_XHX_VARNAME, self%origin_xhx_varid)) - call check( nf90_inq_varid(self%ncid, ORIGIN_XHY_VARNAME, self%origin_xhy_varid)) - call check( nf90_inq_varid(self%ncid, ORIGIN_XHZ_VARNAME, self%origin_xhz_varid)) - call check( nf90_inq_varid(self%ncid, ORIGIN_VHX_VARNAME, self%origin_vhx_varid)) - call check( nf90_inq_varid(self%ncid, ORIGIN_VHY_VARNAME, self%origin_vhy_varid)) - call check( nf90_inq_varid(self%ncid, ORIGIN_VHZ_VARNAME, self%origin_vhz_varid)) - - return - end subroutine symba_netcdf_open - - module subroutine symba_netcdf_write_frame_cb(self, iu, param) - !! author: Carlisle A. Wishard, Dana Singh, and David A. Minton - !! - !! Write a frame of output of a SyMBA massive body data to the binary output file - !! Note: If outputting to orbital elements, but sure that the conversion is done prior to calling this method - implicit none - ! Arguments - class(symba_cb), intent(in) :: self !! SyMBA central body object - class(netcdf_parameters), intent(inout) :: iu !! Parameters used to identify a particular NetCDF dataset - class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters - ! Internals - integer(I4B) :: strlen, idslot - character(len=:), allocatable :: charstring - - call netcdf_write_frame_base(self, iu, param) - select type(iu) - class is (symba_netcdf_parameters) - select type(info => self%info) - class is (symba_particle_info) - idslot = self%id + 1 - - charstring = trim(adjustl(info%origin_type)) - strlen = len(charstring) - call check( nf90_put_var(iu%ncid, iu%origin_type_varid, charstring, start=[1, idslot], count=[strlen, 1]) ) - call check( nf90_put_var(iu%ncid, iu%origin_time_varid, info%origin_time, start=[idslot]) ) - call check( nf90_put_var(iu%ncid, iu%origin_xhx_varid, info%origin_xh(1), start=[idslot]) ) - call check( nf90_put_var(iu%ncid, iu%origin_xhy_varid, info%origin_xh(2), start=[idslot]) ) - call check( nf90_put_var(iu%ncid, iu%origin_xhz_varid, info%origin_xh(3), start=[idslot]) ) - call check( nf90_put_var(iu%ncid, iu%origin_vhx_varid, info%origin_vh(1), start=[idslot]) ) - call check( nf90_put_var(iu%ncid, iu%origin_vhy_varid, info%origin_vh(2), start=[idslot]) ) - call check( nf90_put_var(iu%ncid, iu%origin_vhz_varid, info%origin_vh(3), start=[idslot]) ) - end select - end select - - return - end subroutine symba_netcdf_write_frame_cb - - - module subroutine symba_netcdf_write_frame_pl(self, iu, param) - !! author: Carlisle A. Wishard, Dana Singh, and David A. Minton - !! - !! Write a frame of output of a SyMBA massive body data to the binary output file - !! Note: If outputting to orbital elements, but sure that the conversion is done prior to calling this method - implicit none - ! Arguments - class(symba_pl), intent(in) :: self !! SyMBA massive body object - class(netcdf_parameters), intent(inout) :: iu !! Parameters used to identify a particular NetCDF dataset - class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters - ! Internals - integer(I4B) :: i, j, strlen, idslot - integer(I4B), dimension(:), allocatable :: ind - character(len=:), allocatable :: charstring - - call netcdf_write_frame_base(self, iu, param) - select type(iu) - class is (symba_netcdf_parameters) - associate(npl => self%nbody) - if (npl == 0) return - allocate(ind(npl)) - call util_sort(self%id(1:npl), ind(1:npl)) - select type(info => self%info) - class is (symba_particle_info) - do i = 1, npl - j = ind(i) - idslot = self%id(j) + 1 - - charstring = trim(adjustl(info(j)%origin_type)) - strlen = len(charstring) - call check( nf90_put_var(iu%ncid, iu%origin_type_varid, charstring, start=[1, idslot], count=[strlen, 1]) ) - call check( nf90_put_var(iu%ncid, iu%origin_time_varid, info(j)%origin_time, start=[idslot]) ) - call check( nf90_put_var(iu%ncid, iu%origin_xhx_varid, info(j)%origin_xh(1), start=[idslot]) ) - call check( nf90_put_var(iu%ncid, iu%origin_xhy_varid, info(j)%origin_xh(2), start=[idslot]) ) - call check( nf90_put_var(iu%ncid, iu%origin_xhz_varid, info(j)%origin_xh(3), start=[idslot]) ) - call check( nf90_put_var(iu%ncid, iu%origin_vhx_varid, info(j)%origin_vh(1), start=[idslot]) ) - call check( nf90_put_var(iu%ncid, iu%origin_vhy_varid, info(j)%origin_vh(2), start=[idslot]) ) - call check( nf90_put_var(iu%ncid, iu%origin_vhz_varid, info(j)%origin_vh(3), start=[idslot]) ) - end do - end select - end associate - - end select - - return - end subroutine symba_netcdf_write_frame_pl - - - module subroutine symba_netcdf_write_frame_tp(self, iu, param) - !! author: Carlisle A. Wishard, Dana Singh, and David A. Minton - !! - !! Write a frame of output of a SyMBA massive body data to the binary output file - !! Note: If outputting to orbital elements, but sure that the conversion is done prior to calling this method - implicit none - ! Arguments - class(symba_tp), intent(in) :: self !! SyMBA test particle - class(netcdf_parameters), intent(inout) :: iu !! Parameters used to identify a particular NetCDF dataset - class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters - ! Internals - integer(I4B) :: i, j, strlen, idslot - integer(I4B), dimension(:), allocatable :: ind - character(len=:), allocatable :: charstring - - call netcdf_write_frame_base(self, iu, param) - select type(iu) - class is (symba_netcdf_parameters) - associate(ntp => self%nbody) - if (ntp == 0) return - allocate(ind(ntp)) - call util_sort(self%id(1:ntp), ind(1:ntp)) - select type(info => self%info) - class is (symba_particle_info) - do i = 1, ntp - j = ind(i) - idslot = self%id(j) + 1 - - charstring = trim(adjustl(info(j)%origin_type)) - strlen = len(charstring) - call check( nf90_put_var(iu%ncid, iu%origin_type_varid, charstring, start=[1, idslot], count=[strlen, 1]) ) - call check( nf90_put_var(iu%ncid, iu%origin_time_varid, info(j)%origin_time, start=[idslot]) ) - call check( nf90_put_var(iu%ncid, iu%origin_xhx_varid, info(j)%origin_xh(1), start=[idslot]) ) - call check( nf90_put_var(iu%ncid, iu%origin_xhy_varid, info(j)%origin_xh(2), start=[idslot]) ) - call check( nf90_put_var(iu%ncid, iu%origin_xhz_varid, info(j)%origin_xh(3), start=[idslot]) ) - call check( nf90_put_var(iu%ncid, iu%origin_vhx_varid, info(j)%origin_vh(1), start=[idslot]) ) - call check( nf90_put_var(iu%ncid, iu%origin_vhy_varid, info(j)%origin_vh(2), start=[idslot]) ) - call check( nf90_put_var(iu%ncid, iu%origin_vhz_varid, info(j)%origin_vh(3), start=[idslot]) ) - end do - end select - end associate - - end select - - return - end subroutine symba_netcdf_write_frame_tp -end submodule s_symba_netcdf \ No newline at end of file diff --git a/src/symba/symba_setup.f90 b/src/symba/symba_setup.f90 index f7cc82024..9eff6bf6c 100644 --- a/src/symba/symba_setup.f90 +++ b/src/symba/symba_setup.f90 @@ -2,50 +2,6 @@ use swiftest contains - module subroutine symba_setup_initialize_particle_info_system(self, param) - !! author: David A. Minton - !! - !! Initializes a new particle information data structure with initial conditions recorded - implicit none - ! Argumets - class(symba_nbody_system), intent(inout) :: self !! SyMBA nbody system object - class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters - ! Internals - integer(I4B) :: i - - select type(cbinfo => self%cb%info) - class is (symba_particle_info) - cbinfo%origin_type = "Initial conditions" - cbinfo%origin_time = param%t0 - cbinfo%origin_xh(:) = 0.0_DP - cbinfo%origin_vh(:) = 0.0_DP - end select - - select type(plinfo => self%pl%info) - class is (symba_particle_info) - do i = 1, self%pl%nbody - plinfo(i)%origin_type = "Initial conditions" - plinfo(i)%origin_time = param%t0 - plinfo(i)%origin_xh(:) = self%pl%xh(:,i) - plinfo(i)%origin_vh(:) = self%pl%vh(:,i) - end do - end select - - select type(tpinfo => self%tp%info) - class is (symba_particle_info) - do i = 1, self%tp%nbody - tpinfo(i)%origin_type = "Initial conditions" - tpinfo(i)%origin_time = param%t0 - tpinfo(i)%origin_xh(:) = self%tp%xh(:,i) - tpinfo(i)%origin_vh(:) = self%tp%vh(:,i) - end do - end select - call setup_initialize_particle_info_system(self, param) - - return - end subroutine symba_setup_initialize_particle_info_system - - module subroutine symba_setup_initialize_system(self, param) !! author: David A. Minton !! @@ -116,7 +72,6 @@ module subroutine symba_setup_pl(self, n, param) if (n <= 0) return - if (allocated(self%info)) deallocate(self%info) if (allocated(self%lcollision)) deallocate(self%lcollision) if (allocated(self%lencounter)) deallocate(self%lencounter) if (allocated(self%lmtiny)) deallocate(self%lmtiny) @@ -128,9 +83,7 @@ module subroutine symba_setup_pl(self, n, param) 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(symba_particle_info :: self%info(n)) allocate(self%lcollision(n)) allocate(self%lencounter(n)) allocate(self%lmtiny(n)) diff --git a/src/util/util_append.f90 b/src/util/util_append.f90 index 98a98ac0a..9722e4059 100644 --- a/src/util/util_append.f90 +++ b/src/util/util_append.f90 @@ -122,41 +122,23 @@ module subroutine util_append_arr_info(arr, source, nold, nsrc, lsource_mask) !! 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 - class(swiftest_particle_info), dimension(:), allocatable, intent(inout) :: arr !! Destination array - class(swiftest_particle_info), dimension(:), allocatable, intent(in) :: source !! Array to append - integer(I4B), intent(in) :: nold, nsrc !! Extend of the old array and the source array, respectively - logical, dimension(:), intent(in) :: lsource_mask !! Logical mask indicating which elements to append to + type(swiftest_particle_info), dimension(:), allocatable, intent(inout) :: arr !! Destination array + type(swiftest_particle_info), dimension(:), allocatable, intent(in) :: source !! Array to append + integer(I4B), intent(in) :: nold, nsrc !! Extend of the old array and the source array, respectively + logical, dimension(:), intent(in) :: lsource_mask !! Logical mask indicating which elements to append to ! Internals integer(I4B) :: nnew - class(swiftest_particle_info), dimension(:), allocatable :: arr_tmp, source_tmp if (.not. allocated(source)) return nnew = count(lsource_mask(1:nsrc)) + if (.not.allocated(arr)) then + allocate(arr(nold+nnew)) + else + call util_resize(arr, nold + nnew) + end if - select type(source) - class is (symba_particle_info) - allocate(symba_particle_info :: arr_tmp(nold+nnew)) - if (nold > 0) then - arr_tmp(1:nold) = arr(1:nold) - deallocate(arr) - end if - class is (swiftest_particle_info) - allocate(swiftest_particle_info :: arr_tmp(nold+nnew)) - if (nold > 0) then - arr_tmp(1:nold) = arr(1:nold) - deallocate(arr) - end if - end select - - select type(source) - class is (symba_particle_info) - arr_tmp(nold + 1:nold + nnew) = pack(source(1:nsrc), lsource_mask(1:nsrc)) - class is (swiftest_particle_info) - arr_tmp(nold + 1:nold + nnew) = pack(source(1:nsrc), lsource_mask(1:nsrc)) - end select - - call move_alloc(arr_tmp, arr) + arr(nold + 1:nold + nnew) = pack(source(1:nsrc), lsource_mask(1:nsrc)) return end subroutine util_append_arr_info diff --git a/src/util/util_fill.f90 b/src/util/util_fill.f90 index f3f6a3a95..7009e3688 100644 --- a/src/util/util_fill.f90 +++ b/src/util/util_fill.f90 @@ -90,37 +90,18 @@ module subroutine util_fill_arr_info(keeps, inserts, lfill_list) !! This is the inverse of a spill operation implicit none ! Arguments - class(swiftest_particle_info), dimension(:), allocatable, intent(inout) :: keeps !! Array of values to keep - class(swiftest_particle_info), dimension(:), allocatable, intent(in) :: inserts !! Array of values to insert into keep + type(swiftest_particle_info), dimension(:), allocatable, intent(inout) :: keeps !! Array of values to keep + type(swiftest_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 ! Internals - class(swiftest_particle_info), dimension(:), allocatable :: ktmp, itmp - integer(I4B) :: nk, ni + type(swiftest_particle_info), dimension(:), allocatable :: ktmp, itmp - if (.not.allocated(keeps) .or. .not.allocated(inserts)) return - - nk = size(keeps) - ni = size(inserts) - - select type(keeps) - class is (symba_particle_info) - allocate(symba_particle_info :: ktmp(nk)) - class is (swiftest_particle_info) - allocate(swiftest_particle_info :: ktmp(nk)) - end select - select type(inserts) - class is (symba_particle_info) - allocate(symba_particle_info :: itmp(ni)) - class is (swiftest_particle_info) - allocate(swiftest_particle_info :: itmp(ni)) - end select + if (.not.allocated(keeps) .or. .not.allocated(inserts)) return - ktmp(:) = unpack(ktmp(:), .not.lfill_list(:), ktmp(:)) - ktmp(:) = unpack(itmp(:), lfill_list(:), ktmp(:)) + keeps(:) = unpack(keeps(:), .not.lfill_list(:), keeps(:)) + keeps(:) = unpack(inserts(:), lfill_list(:), keeps(:)) - keeps(:) = ktmp(:) - return end subroutine util_fill_arr_info diff --git a/src/util/util_resize.f90 b/src/util/util_resize.f90 index 7ba7e19df..d43d0b879 100644 --- a/src/util/util_resize.f90 +++ b/src/util/util_resize.f90 @@ -138,28 +138,21 @@ module subroutine util_resize_arr_I4B(arr, nnew) end subroutine util_resize_arr_I4B - module subroutine 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 - class(swiftest_particle_info), dimension(:), allocatable, intent(inout) :: arr !! Array to resize + type(swiftest_particle_info), dimension(:), allocatable, intent(inout) :: arr !! Array to resize integer(I4B), intent(in) :: nnew !! New size ! Internals - class(swiftest_particle_info), dimension(:), allocatable :: tmp !! Temporary storage array in case the input array is already allocated + type(swiftest_particle_info), dimension(:), allocatable :: tmp !! Temporary storage array in case the input array is already allocated integer(I4B) :: nold !! Old size logical :: is_symba if (.not. allocated(arr) .or. nnew < 0) return - select type(arr) - class is (symba_particle_info) - is_symba = .true. - class default - is_symba = .false. - end select nold = size(arr) if (nnew == nold) return @@ -167,12 +160,8 @@ module subroutine util_resize_arr_info(arr, nnew) deallocate(arr) return end if - - if (is_symba) then - allocate(symba_particle_info :: tmp(nnew)) - else - allocate(swiftest_particle_info :: tmp(nnew)) - end if + + allocate(tmp(nnew)) if (nnew > nold) then tmp(1:nold) = arr(1:nold) else diff --git a/src/util/util_sort.f90 b/src/util/util_sort.f90 index 4364aa02a..218e49ef3 100644 --- a/src/util/util_sort.f90 +++ b/src/util/util_sort.f90 @@ -465,22 +465,18 @@ module subroutine util_sort_rearrange_arr_info(arr, ind, n) !! Rearrange a single array of particle information type in-place from an index list. implicit none ! Arguments - class(swiftest_particle_info), dimension(:), allocatable, intent(inout) :: arr !! Destination array + type(swiftest_particle_info), dimension(:), allocatable, intent(inout) :: arr !! Destination array integer(I4B), dimension(:), intent(in) :: ind !! Index to rearrange against integer(I4B), intent(in) :: n !! Number of elements in arr and ind to rearrange ! Internals - class(swiftest_particle_info), dimension(:), allocatable :: tmp !! Temporary copy of array used during rearrange operation + type(swiftest_particle_info), dimension(:), allocatable :: tmp !! Temporary copy of array used during rearrange operation integer(I4B) :: i + if (.not. allocated(arr) .or. n <= 0) return - select type(arr) - class is (symba_particle_info) - allocate(symba_particle_info :: tmp(n)) - class is (swiftest_particle_info) - allocate(swiftest_particle_info :: tmp(n)) - end select + allocate(tmp, mold=arr) tmp(1:n) = arr(ind(1:n)) - arr(1:n) = tmp(1:n) + call move_alloc(tmp, arr) return end subroutine util_sort_rearrange_arr_info diff --git a/src/util/util_spill.f90 b/src/util/util_spill.f90 index 66e5d22d8..84391f168 100644 --- a/src/util/util_spill.f90 +++ b/src/util/util_spill.f90 @@ -208,8 +208,8 @@ module subroutine util_spill_arr_info(keeps, discards, lspill_list, ldestructive !! This is the inverse of a spill operation implicit none ! Arguments - class(swiftest_particle_info), dimension(:), allocatable, intent(inout) :: keeps !! Array of values to keep - class(swiftest_particle_info), dimension(:), allocatable, intent(inout) :: discards !! Array of discards + type(swiftest_particle_info), dimension(:), allocatable, intent(inout) :: keeps !! Array of values to keep + type(swiftest_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 ! Internals From aa003bf7e730e906c43b3cbc7fe4344207bae1ee Mon Sep 17 00:00:00 2001 From: David A Minton Date: Sat, 28 Aug 2021 09:18:25 -0400 Subject: [PATCH 081/154] Initialized info variables. Still not behaving properly, but at least it can be analyzed --- examples/symba_mars_disk/param.in | 2 +- examples/symba_mars_disk/testnetcdf.ipynb | 422 ++++++++++++++++++++-- src/setup/setup.f90 | 10 +- 3 files changed, 402 insertions(+), 32 deletions(-) diff --git a/examples/symba_mars_disk/param.in b/examples/symba_mars_disk/param.in index 725927f1b..122d1a9d7 100644 --- a/examples/symba_mars_disk/param.in +++ b/examples/symba_mars_disk/param.in @@ -1,6 +1,6 @@ !Parameter file for the SyMBA-RINGMOONS test T0 0.0 -TSTOP 60000.0 +TSTOP 10000.0 DT 600.0 CB_IN cb.in PL_IN mars.in diff --git a/examples/symba_mars_disk/testnetcdf.ipynb b/examples/symba_mars_disk/testnetcdf.ipynb index a6d21ec0e..0b274f44b 100644 --- a/examples/symba_mars_disk/testnetcdf.ipynb +++ b/examples/symba_mars_disk/testnetcdf.ipynb @@ -35,30 +35,9 @@ "text": [ "Reading Swiftest file param.in\n", "\n", - "Creating Dataset\n" - ] - }, - { - "ename": "UnicodeDecodeError", - "evalue": "'utf-8' codec can't decode byte 0x80 in position 0: invalid start byte", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mUnicodeDecodeError\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[0msim\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.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[0msim\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 172\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 173\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--> 174\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 175\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 176\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 697\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[1;32m 698\u001b[0m \u001b[0mds\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mxr\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mopen_dataset\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mparam\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'BIN_OUT'\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--> 699\u001b[0;31m \u001b[0mds\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mclean_string_values\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mparam\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mds\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 700\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 701\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34mf\"Error encountered. OUT_TYPE {param['OUT_TYPE']} not recognized.\"\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;36mclean_string_values\u001b[0;34m(param, ds)\u001b[0m\n\u001b[1;32m 719\u001b[0m \u001b[0mds\u001b[0m \u001b[0;34m:\u001b[0m \u001b[0mxarray\u001b[0m \u001b[0mdataset\u001b[0m \u001b[0;32mwith\u001b[0m \u001b[0mthe\u001b[0m \u001b[0mstrings\u001b[0m \u001b[0mcleaned\u001b[0m \u001b[0mup\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 720\u001b[0m \"\"\" \n\u001b[0;32m--> 721\u001b[0;31m \u001b[0mds\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'name'\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mds\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'name'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mstr\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdecode\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mencoding\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'utf-8'\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 722\u001b[0m \u001b[0mds\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'particle_type'\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mds\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'particle_type'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mstr\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdecode\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mencoding\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'utf-8'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 723\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;34m'origin_type'\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mds\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/accessor_str.py\u001b[0m in \u001b[0;36mdecode\u001b[0;34m(self, encoding, errors)\u001b[0m\n\u001b[1;32m 2545\u001b[0m \u001b[0mdecoder\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mcodecs\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mgetdecoder\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mencoding\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2546\u001b[0m \u001b[0mfunc\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mlambda\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mdecoder\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0merrors\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[0m\n\u001b[0;32m-> 2547\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_apply\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfunc\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mfunc\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdtype\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mstr_\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 2548\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2549\u001b[0m def encode(\n", - "\u001b[0;32m~/.conda/envs/cent7/2020.02-py37/swiftestOOF/lib/python3.7/site-packages/xarray/core/accessor_str.py\u001b[0m in \u001b[0;36m_apply\u001b[0;34m(self, func, dtype, output_core_dims, output_sizes, func_args, func_kwargs)\u001b[0m\n\u001b[1;32m 239\u001b[0m \u001b[0moutput_sizes\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0moutput_sizes\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 240\u001b[0m \u001b[0mfunc_args\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mfunc_args\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 241\u001b[0;31m \u001b[0mfunc_kwargs\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mfunc_kwargs\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 242\u001b[0m )\n\u001b[1;32m 243\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/accessor_str.py\u001b[0m in \u001b[0;36m_apply_str_ufunc\u001b[0;34m(func, obj, dtype, output_core_dims, output_sizes, func_args, func_kwargs)\u001b[0m\n\u001b[1;32m 136\u001b[0m \u001b[0moutput_core_dims\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0moutput_core_dims\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 137\u001b[0m \u001b[0mdask_gufunc_kwargs\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mdask_gufunc_kwargs\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 138\u001b[0;31m \u001b[0;34m**\u001b[0m\u001b[0mfunc_kwargs\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 139\u001b[0m )\n\u001b[1;32m 140\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/computation.py\u001b[0m in \u001b[0;36mapply_ufunc\u001b[0;34m(func, input_core_dims, output_core_dims, exclude_dims, vectorize, join, dataset_join, dataset_fill_value, keep_attrs, kwargs, dask, output_dtypes, output_sizes, meta, dask_gufunc_kwargs, *args)\u001b[0m\n\u001b[1;32m 1142\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[1;32m 1143\u001b[0m \u001b[0mexclude_dims\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mexclude_dims\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1144\u001b[0;31m \u001b[0mkeep_attrs\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mkeep_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 1145\u001b[0m )\n\u001b[1;32m 1146\u001b[0m \u001b[0;31m# feed Variables directly through apply_variable_ufunc\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/computation.py\u001b[0m in \u001b[0;36mapply_dataarray_vfunc\u001b[0;34m(func, signature, join, exclude_dims, keep_attrs, *args)\u001b[0m\n\u001b[1;32m 269\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 270\u001b[0m \u001b[0mdata_vars\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0mgetattr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ma\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m\"variable\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0ma\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0ma\u001b[0m \u001b[0;32min\u001b[0m \u001b[0margs\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 271\u001b[0;31m \u001b[0mresult_var\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mfunc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0mdata_vars\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 272\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 273\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0msignature\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnum_outputs\u001b[0m \u001b[0;34m>\u001b[0m \u001b[0;36m1\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/computation.py\u001b[0m in \u001b[0;36mapply_variable_ufunc\u001b[0;34m(func, signature, exclude_dims, dask, output_dtypes, vectorize, keep_attrs, dask_gufunc_kwargs, *args)\u001b[0m\n\u001b[1;32m 722\u001b[0m )\n\u001b[1;32m 723\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 724\u001b[0;31m \u001b[0mresult_data\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mfunc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0minput_data\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 725\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 726\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0msignature\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnum_outputs\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/.local/lib/python3.7/site-packages/numpy/lib/function_base.py\u001b[0m in \u001b[0;36m__call__\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m 2111\u001b[0m \u001b[0mvargs\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mextend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0m_n\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0m_n\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mnames\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 2112\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 2113\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_vectorize_call\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfunc\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mfunc\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0margs\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mvargs\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 2114\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2115\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m_get_ufunc_and_otypes\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfunc\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0margs\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~/.local/lib/python3.7/site-packages/numpy/lib/function_base.py\u001b[0m in \u001b[0;36m_vectorize_call\u001b[0;34m(self, func, args)\u001b[0m\n\u001b[1;32m 2195\u001b[0m for a in args]\n\u001b[1;32m 2196\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 2197\u001b[0;31m \u001b[0moutputs\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mufunc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0minputs\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 2198\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2199\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mufunc\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnout\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;36m1\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/accessor_str.py\u001b[0m in \u001b[0;36m\u001b[0;34m(x)\u001b[0m\n\u001b[1;32m 2541\u001b[0m \"\"\"\n\u001b[1;32m 2542\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mencoding\u001b[0m \u001b[0;32min\u001b[0m \u001b[0m_cpython_optimized_decoders\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 2543\u001b[0;31m \u001b[0mfunc\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mlambda\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdecode\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mencoding\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0merrors\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 2544\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2545\u001b[0m \u001b[0mdecoder\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mcodecs\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mgetdecoder\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mencoding\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mUnicodeDecodeError\u001b[0m: 'utf-8' codec can't decode byte 0x80 in position 0: invalid start byte" + "Creating Dataset\n", + "Successfully converted 2 output frames.\n", + "Swiftest simulation data stored as xarray DataSet .ds\n" ] } ], @@ -67,6 +46,389 @@ "sim.bin2xr()\n" ] }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
<xarray.DataArray 'name' (id: 1521)>\n",
+       "array(['Mars', 'Body2', 'Body3', ..., 'UNNAMED', 'UNNAMED', 'UNNAMED'],\n",
+       "      dtype='<U15')\n",
+       "Coordinates:\n",
+       "  * id       (id) int32 0 1 2 3 4 5 6 7 ... 1514 1515 1516 1517 1518 1519 1520
" + ], + "text/plain": [ + "\n", + "array(['Mars', 'Body2', 'Body3', ..., 'UNNAMED', 'UNNAMED', 'UNNAMED'],\n", + " dtype='
<xarray.DataArray 'name' ()>\n",
-       "array(b'UNNAMED', dtype='|S32')\n",
+       "array(b'1322', dtype='|S32')\n",
        "Coordinates:\n",
-       "    id       int32 1885
" + " id int32 1321" ], "text/plain": [ "\n", - "array(b'UNNAMED', dtype='|S32')\n", + "array(b'1322', dtype='|S32')\n", "Coordinates:\n", - " id int32 1885" + " id int32 1321" ] }, - "execution_count": 18, + "execution_count": 4, "metadata": {}, "output_type": "execute_result" } diff --git a/src/setup/setup.f90 b/src/setup/setup.f90 index c87aea559..342818672 100644 --- a/src/setup/setup.f90 +++ b/src/setup/setup.f90 @@ -237,7 +237,8 @@ module subroutine setup_body(self, n, param) 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 - + ! Internals + integer(I4B) :: i self%nbody = n if (n <= 0) return self%lfirst = .true. @@ -270,6 +271,13 @@ module subroutine setup_body(self, n, param) self%id(:) = 0 self%info(:)%name = "UNNAMED" + self%info(:)%particle_type = "UKNOWN" + self%info(:)%origin_type = "UNKNOWN" + self%info(:)%origin_time = -1.0_DP + do i = 1, n + self%info(i)%origin_xh(:) = 0.0_DP + self%info(i)%origin_vh(:) = 0.0_DP + end do self%status(:) = INACTIVE self%lmask(:) = .false. self%ldiscard(:) = .false. From 76ddac98a6a7e9cef5506ef3fbbef0a13e5fce38 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Sat, 28 Aug 2021 12:56:51 -0400 Subject: [PATCH 082/154] Fixed problems involving fill, spill, append, and resize methods on particle info objects using a set of new copy subroutines. Testing seems to indicate that it is finally working --- examples/symba_mars_disk/mars.in | 2992 ++++++++++----------- examples/symba_mars_disk/param.in | 2 +- examples/symba_mars_disk/testnetcdf.ipynb | 33 +- src/modules/swiftest_classes.f90 | 64 +- src/symba/symba_collision.f90 | 22 +- src/util/util_append.f90 | 15 +- src/util/util_copy.f90 | 115 +- src/util/util_fill.f90 | 15 +- src/util/util_resize.f90 | 5 +- src/util/util_sort.f90 | 9 +- src/util/util_spill.f90 | 46 +- 11 files changed, 1717 insertions(+), 1601 deletions(-) diff --git a/examples/symba_mars_disk/mars.in b/examples/symba_mars_disk/mars.in index 9fbb1ef1a..188eb3c6e 100644 --- a/examples/symba_mars_disk/mars.in +++ b/examples/symba_mars_disk/mars.in @@ -23,8977 +23,8977 @@ Body5 1.44988335e+05 1.52187807e+04 ! particle number mass Rhill 9.82512278e+02 1.42576317e+03 8.88854207e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -6 3.78500932e+05 1.43710361e+04 ! particle number mass Rhill +Body6 3.78500932e+05 1.43710361e+04 ! particle number mass Rhill 7.50714229e+03 !particle radius in AU -9.39611249e+06 3.86341011e+06 4.12677461e+04 ! x y z -8.05714130e+02 -1.87378063e+03 1.44571432e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -7 4.22792487e+05 1.91833939e+04 ! particle number mass Rhill +Body7 4.22792487e+05 1.91833939e+04 ! particle number mass Rhill 7.78923399e+03 !particle radius in AU -4.75251420e+06 -1.21243281e+07 -4.63584868e+04 ! x y z 1.67483168e+03 -6.72935315e+02 -2.51894419e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -8 7.71745838e+05 2.46689817e+04 ! particle number mass Rhill +Body8 7.71745838e+05 2.46689817e+04 ! particle number mass Rhill 9.51941869e+03 !particle radius in AU -1.85450966e+06 -1.34716389e+07 8.25492639e+04 ! x y z 1.75187299e+03 -2.73602528e+02 -3.13786565e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -9 9.61893115e+05 2.40394481e+04 ! particle number mass Rhill +Body9 9.61893115e+05 2.40394481e+04 ! particle number mass Rhill 1.02445905e+04 !particle radius in AU 1.23514674e+07 2.68920661e+05 1.39262437e+04 ! x y z -5.46299990e+01 1.85637492e+03 8.88156878e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -10 9.05777402e+05 1.85084324e+04 ! particle number mass Rhill +Body10 9.05777402e+05 1.85084324e+04 ! particle number mass Rhill 1.00413666e+04 !particle radius in AU -3.23931710e+06 -9.01689172e+06 -4.12799209e+04 ! x y z 2.01018172e+03 -6.80970287e+02 7.47887585e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -11 7.45490873e+05 1.85936744e+04 ! particle number mass Rhill +Body11 7.45490873e+05 1.85936744e+04 ! particle number mass Rhill 9.41021993e+03 !particle radius in AU -8.22383274e+06 6.53912283e+06 -4.14927827e+04 ! x y z -1.24361728e+03 -1.57101590e+03 1.15408315e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -12 1.62561944e+05 1.74719338e+04 ! particle number mass Rhill +Body12 1.62561944e+05 1.74719338e+04 ! particle number mass Rhill 5.66402670e+03 !particle radius in AU 1.08162501e+06 1.60434368e+07 -1.90513596e+05 ! x y z -1.63320995e+03 9.41371249e+01 -1.08583324e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -13 2.53914705e+05 1.18629878e+04 ! particle number mass Rhill +Body13 2.53914705e+05 1.18629878e+04 ! particle number mass Rhill 9.68422654e+03 !particle radius in AU 8.87638562e+06 -3.42494393e+06 3.77051239e+04 ! x y z 7.17031490e+02 1.98991002e+03 1.65715407e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -14 4.49497062e+05 1.80709533e+04 ! particle number mass Rhill +Body14 4.49497062e+05 1.80709533e+04 ! particle number mass Rhill 1.17150625e+04 !particle radius in AU 8.43240423e+06 -8.47557599e+06 9.53685695e+04 ! x y z 1.37244856e+03 1.29766742e+03 6.52389482e-01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -15 1.26801801e+06 2.59747860e+04 ! particle number mass Rhill +Body15 1.26801801e+06 2.59747860e+04 ! particle number mass Rhill 1.12329581e+04 !particle radius in AU 9.22664947e+06 8.30989011e+06 -5.74831096e+04 ! x y z -1.25111883e+03 1.34059241e+03 8.55955292e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -16 9.75352347e+05 2.91597894e+04 ! particle number mass Rhill +Body16 9.75352347e+05 2.91597894e+04 ! particle number mass Rhill 1.02921516e+04 !particle radius in AU -4.08982641e+06 1.42813091e+07 2.62466604e+04 ! x y z -1.63050329e+03 -4.70983328e+02 5.42658810e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -17 5.40910752e+04 7.00056187e+03 ! particle number mass Rhill +Body17 5.40910752e+04 7.00056187e+03 ! particle number mass Rhill 3.92489041e+03 !particle radius in AU 8.28836769e+06 -4.56966319e+06 -1.00925184e+04 ! x y z 1.01075458e+03 1.85603564e+03 9.12767608e-01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -18 1.99689612e+06 3.23933078e+04 ! particle number mass Rhill +Body18 1.99689612e+06 3.23933078e+04 ! particle number mass Rhill 1.30688534e+04 !particle radius in AU -7.36104027e+06 -1.05891946e+07 7.75267384e+04 ! x y z 1.50650168e+03 -1.03626339e+03 6.92830281e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -19 1.15056094e+06 2.84099265e+04 ! particle number mass Rhill +Body19 1.15056094e+06 2.84099265e+04 ! particle number mass Rhill 1.08748232e+04 !particle radius in AU -1.16432549e+07 7.04896042e+06 1.31826777e+04 ! x y z -9.22639859e+02 -1.52066967e+03 -1.15982407e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -20 9.02282771e+04 1.44052969e+04 ! particle number mass Rhill +Body20 9.02282771e+04 1.44052969e+04 ! particle number mass Rhill 4.65478777e+03 !particle radius in AU 1.54278872e+07 -4.66477914e+06 2.89150511e+04 ! x y z 4.74802657e+02 1.56436208e+03 1.16558658e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -21 2.52706341e+05 1.13089015e+04 ! particle number mass Rhill +Body21 2.52706341e+05 1.13089015e+04 ! particle number mass Rhill 6.56131734e+03 !particle radius in AU 8.25405514e+06 -3.99894087e+06 -1.03017471e+05 ! x y z 9.55530709e+02 1.91876743e+03 -2.12478228e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -22 3.44014800e+05 1.39895248e+04 ! particle number mass Rhill +Body22 3.44014800e+05 1.39895248e+04 ! particle number mass Rhill 7.27184654e+03 !particle radius in AU -1.01048660e+07 -7.25267430e+05 3.72763878e+04 ! x y z 1.50338830e+02 -2.04513843e+03 -6.64737882e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -23 2.72301402e+04 6.52734935e+03 ! particle number mass Rhill +Body23 2.72301402e+04 6.52734935e+03 ! particle number mass Rhill 4.60100051e+03 !particle radius in AU 1.08085981e+07 8.91343848e+05 -8.59837690e+04 ! x y z -1.73598988e+02 1.98921090e+03 7.39675166e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -24 1.88387060e+06 4.79739567e+04 ! particle number mass Rhill +Body24 1.88387060e+06 4.79739567e+04 ! particle number mass Rhill 1.28174811e+04 !particle radius in AU -1.95760874e+07 2.13874411e+06 9.87141675e+04 ! x y z -1.78019032e+02 -1.46067517e+03 7.47552271e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -25 1.99552106e+06 3.51994254e+04 ! particle number mass Rhill +Body25 1.99552106e+06 3.51994254e+04 ! particle number mass Rhill 1.30658530e+04 !particle radius in AU -5.15587895e+06 1.31093030e+07 2.34999443e+04 ! x y z -1.60915655e+03 -6.75665775e+02 -1.41401807e-02 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -26 9.80460627e+05 2.82973543e+04 ! particle number mass Rhill +Body26 9.80460627e+05 2.82973543e+04 ! particle number mass Rhill 1.03100883e+04 !particle radius in AU -1.04206598e+07 1.04694469e+07 3.71773715e+04 ! x y z -1.22193412e+03 -1.15184993e+03 -7.42970615e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -27 2.99657072e+05 1.52153060e+04 ! particle number mass Rhill +Body27 2.99657072e+05 1.52153060e+04 ! particle number mass Rhill 1.02339628e+04 !particle radius in AU -8.37104048e+06 -7.31013791e+06 1.37822827e+05 ! x y z 1.31083458e+03 -1.50225202e+03 1.24188931e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -28 5.82137831e+05 2.49711445e+04 ! particle number mass Rhill +Body28 5.82137831e+05 2.49711445e+04 ! particle number mass Rhill 8.66551286e+03 !particle radius in AU -1.37026179e+07 6.52187486e+06 4.74483726e+04 ! x y z -7.21171063e+02 -1.51233609e+03 4.06777653e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -29 1.10612525e+06 1.96262714e+04 ! particle number mass Rhill +Body29 1.10612525e+06 1.96262714e+04 ! particle number mass Rhill 1.07329828e+04 !particle radius in AU 7.27063487e+05 9.63835599e+06 7.97365647e+04 ! x y z -2.09031891e+03 1.45245810e+02 -8.30488647e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -30 7.84395275e+05 1.87003585e+04 ! particle number mass Rhill +Body30 7.84395275e+05 1.87003585e+04 ! particle number mass Rhill 9.57114700e+03 !particle radius in AU 7.25596696e+06 -7.23053656e+06 1.87472853e+03 ! x y z 1.43916819e+03 1.45132061e+03 9.58485615e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -31 6.50793385e+04 1.12167591e+04 ! particle number mass Rhill +Body31 6.50793385e+04 1.12167591e+04 ! particle number mass Rhill 6.15153311e+03 !particle radius in AU -7.29036745e+06 1.20321492e+07 2.47342157e+04 ! x y z -1.50263763e+03 -8.87670849e+02 -4.72544240e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -32 1.21978955e+06 2.36695934e+04 ! particle number mass Rhill +Body32 1.21978955e+06 2.36695934e+04 ! particle number mass Rhill 1.10887000e+04 !particle radius in AU -4.85214384e+06 9.94913086e+06 -1.36593449e+05 ! x y z -1.77462439e+03 -8.70796881e+02 -4.04772339e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -33 6.39027490e+04 8.29271375e+03 ! particle number mass Rhill +Body33 6.39027490e+04 8.29271375e+03 ! particle number mass Rhill 6.11423561e+03 !particle radius in AU -8.57362843e+06 -5.69257679e+06 -1.86992418e+04 ! x y z 1.16808481e+03 -1.69357760e+03 1.48289207e-01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -34 1.08790745e+05 9.99433624e+03 ! particle number mass Rhill +Body34 1.08790745e+05 9.99433624e+03 ! particle number mass Rhill 4.95430775e+03 !particle radius in AU -1.19543227e+04 1.04662309e+07 -2.75529146e+04 ! x y z -2.03252516e+03 -1.02408335e+01 -9.64298816e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -35 8.08651729e+05 1.70555918e+04 ! particle number mass Rhill +Body35 8.08651729e+05 1.70555918e+04 ! particle number mass Rhill 9.66880578e+03 !particle radius in AU -1.68361528e+06 9.15840339e+06 -9.34661786e+04 ! x y z -2.10432868e+03 -3.67110160e+02 2.17992849e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -36 5.50682707e+05 1.64680955e+04 ! particle number mass Rhill +Body36 5.50682707e+05 1.64680955e+04 ! particle number mass Rhill 8.50653728e+03 !particle radius in AU 7.61819019e+06 6.79194080e+06 -4.97100639e+04 ! x y z -1.37259731e+03 1.51157244e+03 2.28319862e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -37 1.31696234e+06 2.34161781e+04 ! particle number mass Rhill +Body37 1.31696234e+06 2.34161781e+04 ! particle number mass Rhill 1.13756647e+04 !particle radius in AU -8.27002578e+05 -1.07584936e+07 -8.18905340e+04 ! x y z 1.98624835e+03 -1.45613526e+02 -2.22634090e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -38 1.67567536e+06 4.67762262e+04 ! particle number mass Rhill +Body38 1.67567536e+06 4.67762262e+04 ! particle number mass Rhill 1.23267605e+04 !particle radius in AU 8.40661307e+06 -1.79965632e+07 -1.83341147e+05 ! x y z 1.32267980e+03 6.38873327e+02 -4.32228630e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -39 7.50288390e+05 1.88489715e+04 ! particle number mass Rhill +Body39 7.50288390e+05 1.88489715e+04 ! particle number mass Rhill 9.43036290e+03 !particle radius in AU 7.47325276e+06 7.65731082e+06 2.72651622e+04 ! x y z -1.39038210e+03 1.40779235e+03 -7.40097961e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -40 4.23539126e+05 1.37958364e+04 ! particle number mass Rhill +Body40 4.23539126e+05 1.37958364e+04 ! particle number mass Rhill 7.79381648e+03 !particle radius in AU -9.14822275e+06 5.65579867e+05 1.54779239e+04 ! x y z -1.53215921e+02 -2.16863876e+03 -1.41098203e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -41 4.39861439e+05 1.66151277e+04 ! particle number mass Rhill +Body41 4.39861439e+05 1.66151277e+04 ! particle number mass Rhill 1.16307473e+04 !particle radius in AU -5.60611609e+06 9.45764489e+06 -1.08254759e+05 ! x y z -1.70147881e+03 -1.00583116e+03 -1.54758662e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -42 9.44211643e+05 3.38129666e+04 ! particle number mass Rhill +Body42 9.44211643e+05 3.38129666e+04 ! particle number mass Rhill 1.01814300e+04 !particle radius in AU -1.66612775e+07 5.22172921e+06 -2.86187005e+04 ! x y z -4.30163112e+02 -1.50298858e+03 1.29664314e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -43 5.37130817e+05 1.63663901e+04 ! particle number mass Rhill +Body43 5.37130817e+05 1.63663901e+04 ! particle number mass Rhill 1.24316568e+04 !particle radius in AU 3.27505920e+06 -9.55860249e+06 -5.64452508e+04 ! x y z 1.95132421e+03 6.74732817e+02 -1.39202732e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -44 5.34406540e+04 6.72719292e+03 ! particle number mass Rhill +Body44 5.34406540e+04 6.72719292e+03 ! particle number mass Rhill 3.90909524e+03 !particle radius in AU 1.52951536e+06 -8.90157648e+06 -8.46439916e+04 ! x y z 2.14907459e+03 3.37495875e+02 -8.51148141e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -45 2.61985808e+04 5.30869821e+03 ! particle number mass Rhill +Body45 2.61985808e+04 5.30869821e+03 ! particle number mass Rhill 4.54215111e+03 !particle radius in AU 8.06820634e+06 -4.23727397e+06 -3.35114261e+04 ! x y z 1.02022988e+03 1.90034431e+03 -4.99905529e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -46 1.73774454e+05 1.01624840e+04 ! particle number mass Rhill +Body46 1.73774454e+05 1.01624840e+04 ! particle number mass Rhill 8.53422917e+03 !particle radius in AU -8.77755612e+06 2.67256349e+06 2.67913370e+04 ! x y z -6.14674972e+02 -2.07327300e+03 8.52604410e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -47 3.73597392e+05 1.46814986e+04 ! particle number mass Rhill +Body47 3.73597392e+05 1.46814986e+04 ! particle number mass Rhill 1.10146390e+04 !particle radius in AU 2.70600522e+06 -9.90290693e+06 3.76996678e+04 ! x y z 1.96230063e+03 5.74973963e+02 -1.26240524e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -48 8.11545355e+04 7.79257078e+03 ! particle number mass Rhill +Body48 8.11545355e+04 7.79257078e+03 ! particle number mass Rhill 6.62124902e+03 !particle radius in AU -6.67312956e+06 6.21207172e+06 -4.02351915e+03 ! x y z -1.48608180e+03 -1.57249051e+03 1.60424143e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -49 4.45404571e+04 7.26261410e+03 ! particle number mass Rhill +Body49 4.45404571e+04 7.26261410e+03 ! particle number mass Rhill 5.42109743e+03 !particle radius in AU -6.18076768e+06 8.34028857e+06 6.32429656e+04 ! x y z -1.63237248e+03 -1.20222734e+03 4.88968977e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -50 1.31861988e+06 3.91995883e+04 ! particle number mass Rhill +Body50 1.31861988e+06 3.91995883e+04 ! particle number mass Rhill 1.13804352e+04 !particle radius in AU 5.85188296e+06 1.72848338e+07 9.71123353e+04 ! x y z -1.44962394e+03 4.67717479e+02 -1.00039018e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -51 1.12893377e+05 1.01290663e+04 ! particle number mass Rhill +Body51 1.12893377e+05 1.01290663e+04 ! particle number mass Rhill 5.01581856e+03 !particle radius in AU 7.64956565e+06 7.07155375e+06 1.22619349e+05 ! x y z -1.38177043e+03 1.50469594e+03 5.48084097e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -52 1.68334006e+04 5.06310814e+03 ! particle number mass Rhill +Body52 1.68334006e+04 5.06310814e+03 ! particle number mass Rhill 3.91946036e+03 !particle radius in AU 8.19731246e+06 5.46984950e+06 3.09134904e+04 ! x y z -1.14400536e+03 1.75729614e+03 -1.68472307e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -53 1.54365101e+05 1.04942587e+04 ! particle number mass Rhill +Body53 1.54365101e+05 1.04942587e+04 ! particle number mass Rhill 5.56718137e+03 !particle radius in AU -7.08694323e+06 6.97654393e+06 1.57444613e+04 ! x y z -1.43699629e+03 -1.48696944e+03 1.09569025e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -54 9.06762984e+05 1.88988951e+04 ! particle number mass Rhill +Body54 9.06762984e+05 1.88988951e+04 ! particle number mass Rhill 1.00450073e+04 !particle radius in AU 8.33364079e+06 -4.88517773e+06 7.16288059e+04 ! x y z 1.11170923e+03 1.81264092e+03 6.00546346e-01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -55 2.55655491e+05 1.62270080e+04 ! particle number mass Rhill +Body55 2.55655491e+05 1.62270080e+04 ! particle number mass Rhill 6.58674280e+03 !particle radius in AU -9.33769960e+06 9.14931622e+06 -1.61970964e+04 ! x y z -1.24590275e+03 -1.29664452e+03 6.60457748e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -56 1.99590731e+05 1.09981608e+04 ! particle number mass Rhill +Body56 1.99590731e+05 1.09981608e+04 ! particle number mass Rhill 8.93749433e+03 !particle radius in AU -9.38351744e+06 2.21172448e+06 -6.82548828e+04 ! x y z -4.82800182e+02 -2.03545597e+03 -5.73581498e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -57 7.37782104e+04 7.34813900e+03 ! particle number mass Rhill +Body57 7.37782104e+04 7.34813900e+03 ! particle number mass Rhill 4.35272973e+03 !particle radius in AU 1.87895940e+06 -8.56248718e+06 -3.00496615e+04 ! x y z 2.17444079e+03 4.47176832e+02 -1.19261276e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -58 1.25041873e+06 2.28348345e+04 ! particle number mass Rhill +Body58 1.25041873e+06 2.28348345e+04 ! particle number mass Rhill 1.11807470e+04 !particle radius in AU 8.32914883e+06 6.99509139e+06 3.96475596e+03 ! x y z -1.25015649e+03 1.51958279e+03 -4.03731794e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -59 1.37171779e+05 1.41766211e+04 ! particle number mass Rhill +Body59 1.37171779e+05 1.41766211e+04 ! particle number mass Rhill 5.35230171e+03 !particle radius in AU 1.40169380e+07 1.14833336e+06 8.97154952e+04 ! x y z -1.67134532e+02 1.72504621e+03 -4.99628204e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -60 8.80288489e+05 1.70052916e+04 ! particle number mass Rhill +Body60 8.80288489e+05 1.70052916e+04 ! particle number mass Rhill 9.94627977e+03 !particle radius in AU 6.25929466e+06 6.41436879e+06 2.03611835e+04 ! x y z -1.56963361e+03 1.52043093e+03 1.04032604e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -61 1.96125392e+06 2.29947859e+04 ! particle number mass Rhill +Body61 1.96125392e+06 2.29947859e+04 ! particle number mass Rhill 1.29906317e+04 !particle radius in AU 6.59380692e+06 6.26136699e+06 5.26920752e+02 ! x y z -1.52860150e+03 1.56995044e+03 -5.04992194e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -62 1.49347785e+05 9.80816768e+03 ! particle number mass Rhill +Body62 1.49347785e+05 9.80816768e+03 ! particle number mass Rhill 5.50619929e+03 !particle radius in AU -3.18458810e+06 8.95887994e+06 6.14079574e+04 ! x y z -1.98254651e+03 -6.98894893e+02 -6.28253660e-01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -63 8.45892929e+05 1.77429946e+04 ! particle number mass Rhill +Body63 8.45892929e+05 1.77429946e+04 ! particle number mass Rhill 9.81501110e+03 !particle radius in AU 3.21556801e+06 8.85736420e+06 1.68758030e+04 ! x y z -2.01862696e+03 7.01940495e+02 -7.77962553e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -64 3.38627248e+05 2.06919676e+04 ! particle number mass Rhill +Body64 3.38627248e+05 2.06919676e+04 ! particle number mass Rhill 7.23368562e+03 !particle radius in AU 6.87944610e+06 1.31239767e+07 8.47895296e+04 ! x y z -1.52033935e+03 7.81668854e+02 8.53929151e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -65 7.52641233e+04 8.62006715e+03 ! particle number mass Rhill +Body65 7.52641233e+04 8.62006715e+03 ! particle number mass Rhill 4.38175744e+03 !particle radius in AU -7.12317437e+06 7.79679451e+06 1.14295538e+05 ! x y z -1.45772671e+03 -1.35257658e+03 -8.92909999e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -66 7.51283556e+04 7.45534608e+03 ! particle number mass Rhill +Body66 7.51283556e+04 7.45534608e+03 ! particle number mass Rhill 6.45312806e+03 !particle radius in AU -7.50346488e+06 4.59614758e+06 -1.78561776e+04 ! x y z -1.17484683e+03 -1.88471092e+03 2.06051741e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -67 3.58863940e+04 7.06699862e+03 ! particle number mass Rhill +Body67 3.58863940e+04 7.06699862e+03 ! particle number mass Rhill 5.04443190e+03 !particle radius in AU -9.72849273e+06 -4.49090647e+06 9.42367849e+04 ! x y z 8.55743475e+02 -1.81695360e+03 -2.08602456e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -68 5.39050973e+05 1.89939454e+04 ! particle number mass Rhill +Body68 5.39050973e+05 1.89939454e+04 ! particle number mass Rhill 1.24464529e+04 !particle radius in AU -9.38461254e+06 6.94991468e+06 -5.96507119e+04 ! x y z -1.15295098e+03 -1.53950357e+03 3.51558529e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -69 5.55731862e+05 1.63025647e+04 ! particle number mass Rhill +Body69 5.55731862e+05 1.63025647e+04 ! particle number mass Rhill 1.25735358e+04 !particle radius in AU -7.41691843e+05 -1.00833740e+07 -5.60539800e+04 ! x y z 2.04132497e+03 -1.60740204e+02 -2.66722707e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -70 1.85893859e+05 1.93787863e+04 ! particle number mass Rhill +Body70 1.85893859e+05 1.93787863e+04 ! particle number mass Rhill 8.72818623e+03 !particle radius in AU -1.55585013e+07 -7.11561291e+06 3.93194543e+03 ! x y z 6.65437196e+02 -1.43702009e+03 -7.23293961e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -71 4.73221481e+05 1.37788592e+04 ! particle number mass Rhill +Body71 4.73221481e+05 1.37788592e+04 ! particle number mass Rhill 8.08736691e+03 !particle radius in AU -3.34597213e+06 -8.19414991e+06 6.06177774e+04 ! x y z 2.03861032e+03 -8.50240184e+02 5.81078899e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -72 4.28389242e+05 1.47467226e+04 ! particle number mass Rhill +Body72 4.28389242e+05 1.47467226e+04 ! particle number mass Rhill 1.15287399e+04 !particle radius in AU 1.97016279e+06 -9.71556312e+06 -9.30987397e+03 ! x y z 2.03815672e+03 3.86141142e+02 -6.70148607e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -73 8.19004993e+05 3.14203696e+04 ! particle number mass Rhill +Body73 8.19004993e+05 3.14203696e+04 ! particle number mass Rhill 9.70989454e+03 !particle radius in AU -1.23610305e+07 -1.14674155e+07 1.26044785e+04 ! x y z 1.08318223e+03 -1.17487397e+03 -3.70767753e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -74 3.22247799e+04 9.40603276e+03 ! particle number mass Rhill +Body74 3.22247799e+04 9.40603276e+03 ! particle number mass Rhill 4.86667460e+03 !particle radius in AU 6.60995348e+06 1.33054967e+07 -1.05591305e+03 ! x y z -1.53012251e+03 7.44076876e+02 -1.33826451e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -75 9.47076576e+05 1.85861891e+04 ! particle number mass Rhill +Body75 9.47076576e+05 1.85861891e+04 ! particle number mass Rhill 1.01917171e+04 !particle radius in AU 7.08025559e+06 6.63712140e+06 8.28590703e+04 ! x y z -1.43411418e+03 1.51197736e+03 -1.05467488e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -76 2.03239039e+05 1.20174065e+04 ! particle number mass Rhill +Body76 2.03239039e+05 1.20174065e+04 ! particle number mass Rhill 8.99162185e+03 !particle radius in AU -7.28273678e+06 -7.57343022e+06 -3.32239292e+04 ! x y z 1.43763945e+03 -1.39069870e+03 1.98407302e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -77 9.88331069e+05 1.79814862e+04 ! particle number mass Rhill +Body77 9.88331069e+05 1.79814862e+04 ! particle number mass Rhill 1.03376021e+04 !particle radius in AU 9.90338765e+05 -9.02823668e+06 -1.20306983e+04 ! x y z 2.16293198e+03 2.29403632e+02 1.02563280e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -78 1.34673785e+06 2.07165732e+04 ! particle number mass Rhill +Body78 1.34673785e+06 2.07165732e+04 ! particle number mass Rhill 1.14607582e+04 !particle radius in AU 7.24980777e+06 6.13973485e+06 4.31080507e+04 ! x y z -1.36304394e+03 1.62331327e+03 -1.35525280e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -79 1.57656876e+05 1.82922097e+04 ! particle number mass Rhill +Body79 1.57656876e+05 1.82922097e+04 ! particle number mass Rhill 5.60647602e+03 !particle radius in AU 1.67269227e+07 2.38546079e+06 3.97527319e+04 ! x y z -2.22376967e+02 1.58567381e+03 -8.67277559e-01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -80 1.28010472e+05 1.07789892e+04 ! particle number mass Rhill +Body80 1.28010472e+05 1.07789892e+04 ! particle number mass Rhill 5.23039108e+03 !particle radius in AU 1.04063991e+07 -2.47414364e+06 2.55875518e+04 ! x y z 4.41751921e+02 1.96103152e+03 -4.73452379e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -81 8.50795985e+05 2.19859152e+04 ! particle number mass Rhill +Body81 8.50795985e+05 2.19859152e+04 ! particle number mass Rhill 9.83393818e+03 !particle radius in AU 6.53964743e+06 -9.91913737e+06 9.96407478e+04 ! x y z 1.55366935e+03 1.06687009e+03 -2.02851694e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -82 8.53308237e+04 7.87999685e+03 ! particle number mass Rhill +Body82 8.53308237e+04 7.87999685e+03 ! particle number mass Rhill 6.73293314e+03 !particle radius in AU 7.88901212e+06 4.39968813e+06 4.59555939e+04 ! x y z -1.07086350e+03 1.89616918e+03 7.27266270e-01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -83 1.65011172e+06 2.23190317e+04 ! particle number mass Rhill +Body83 1.65011172e+06 2.23190317e+04 ! particle number mass Rhill 1.22637545e+04 !particle radius in AU -3.20114591e+05 9.47888835e+06 9.88766449e+03 ! x y z -2.12931637e+03 -7.10990071e+01 1.07017003e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -84 9.21412796e+04 1.13373705e+04 ! particle number mass Rhill +Body84 9.21412796e+04 1.13373705e+04 ! particle number mass Rhill 6.90749219e+03 !particle radius in AU 9.14219160e+06 8.75278019e+06 -4.92172540e+04 ! x y z -1.29548970e+03 1.30726587e+03 -1.50278883e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -85 5.44801725e+05 2.52683195e+04 ! particle number mass Rhill +Body85 5.44801725e+05 2.52683195e+04 ! particle number mass Rhill 8.47614716e+03 !particle radius in AU -1.38612397e+07 6.86502447e+06 -1.61982632e+04 ! x y z -7.48338598e+02 -1.49504839e+03 1.44565317e-01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -86 1.69208498e+05 1.34853045e+04 ! particle number mass Rhill +Body86 1.69208498e+05 1.34853045e+04 ! particle number mass Rhill 5.74019158e+03 !particle radius in AU 1.25478256e+07 -2.77052958e+05 1.12717341e+03 ! x y z 4.85806635e+01 1.82811230e+03 -1.79057921e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -87 4.14083301e+04 7.99285727e+03 ! particle number mass Rhill +Body87 4.14083301e+04 7.99285727e+03 ! particle number mass Rhill 5.29092447e+03 !particle radius in AU 1.40993545e+06 1.16245820e+07 -3.61782966e+04 ! x y z -1.89457813e+03 2.30174579e+02 1.28253693e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -88 2.73242366e+05 1.69259201e+04 ! particle number mass Rhill +Body88 2.73242366e+05 1.69259201e+04 ! particle number mass Rhill 9.92395993e+03 !particle radius in AU 1.00651315e+07 -8.63755855e+06 -2.94583233e+04 ! x y z 1.16408014e+03 1.36020820e+03 -5.13543123e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -89 1.56636842e+06 2.89028940e+04 ! particle number mass Rhill +Body89 1.56636842e+06 2.89028940e+04 ! particle number mass Rhill 1.20526803e+04 !particle radius in AU 2.98890445e+06 1.22541433e+07 2.56056735e+04 ! x y z -1.78538758e+03 4.40494099e+02 -2.21749367e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -90 7.41360614e+04 8.74086990e+03 ! particle number mass Rhill +Body90 7.41360614e+04 8.74086990e+03 ! particle number mass Rhill 4.35975582e+03 !particle radius in AU 5.19540663e+06 -9.11850659e+06 6.55061213e+04 ! x y z 1.75856318e+03 9.95618038e+02 1.03697665e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -91 1.42161293e+05 1.27069754e+04 ! particle number mass Rhill +Body91 1.42161293e+05 1.27069754e+04 ! particle number mass Rhill 5.41642563e+03 !particle radius in AU 4.97139511e+06 -1.11941305e+07 -1.40627719e+05 ! x y z 1.71256583e+03 7.58315920e+02 -4.27199322e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -92 9.13995149e+04 1.13361519e+04 ! particle number mass Rhill +Body92 9.13995149e+04 1.13361519e+04 ! particle number mass Rhill 6.88890644e+03 !particle radius in AU 1.25156536e+07 -1.83009831e+06 -1.83401376e+04 ! x y z 2.71538728e+02 1.82389745e+03 -1.16128548e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -93 1.07044868e+05 1.17021442e+04 ! particle number mass Rhill +Body93 1.07044868e+05 1.17021442e+04 ! particle number mass Rhill 4.92766241e+03 !particle radius in AU -4.24848440e+06 -1.14141124e+07 -3.56440379e+04 ! x y z 1.77145707e+03 -6.72445172e+02 -1.27477365e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -94 3.76989280e+04 5.87655474e+03 ! particle number mass Rhill +Body94 3.76989280e+04 5.87655474e+03 ! particle number mass Rhill 5.12796820e+03 !particle radius in AU -2.67257221e+06 8.24864699e+06 -3.60351703e+04 ! x y z -2.13740103e+03 -6.84795253e+02 -6.19432137e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -95 5.61798767e+04 1.27352327e+04 ! particle number mass Rhill +Body95 5.61798767e+04 1.27352327e+04 ! particle number mass Rhill 3.97477538e+03 !particle radius in AU 3.38794467e+06 -1.65102444e+07 1.31352407e+05 ! x y z 1.55800648e+03 3.20903339e+02 1.95779030e-01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -96 1.57775071e+05 1.10562884e+04 ! particle number mass Rhill +Body96 1.57775071e+05 1.10562884e+04 ! particle number mass Rhill 5.60787672e+03 !particle radius in AU 3.25966423e+06 9.75900867e+06 3.76712868e+04 ! x y z -1.92824453e+03 6.78004645e+02 2.13894611e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -97 1.13795601e+05 8.57940062e+03 ! particle number mass Rhill +Body97 1.13795601e+05 8.57940062e+03 ! particle number mass Rhill 5.02914497e+03 !particle radius in AU -8.82496169e+06 1.17570086e+06 -2.77994253e+03 ! x y z -3.06986654e+02 -2.17589269e+03 -3.00417185e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -98 1.79190724e+06 2.82629939e+04 ! particle number mass Rhill +Body98 1.79190724e+06 2.82629939e+04 ! particle number mass Rhill 1.26054254e+04 !particle radius in AU -8.96181392e+06 -8.08537511e+06 -9.49567974e+03 ! x y z 1.24755669e+03 -1.37614946e+03 4.00147116e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -99 5.03967422e+04 7.85179385e+03 ! particle number mass Rhill +Body99 5.03967422e+04 7.85179385e+03 ! particle number mass Rhill 3.83342071e+03 !particle radius in AU 1.05138352e+07 -2.53028835e+06 -2.47118873e+04 ! x y z 4.70010064e+02 1.92569661e+03 -1.14250111e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -100 1.70139143e+06 2.25402503e+04 ! particle number mass Rhill +Body100 1.70139143e+06 2.25402503e+04 ! particle number mass Rhill 1.23894990e+04 !particle radius in AU -8.86717935e+06 -3.01884801e+06 5.43577921e+03 ! x y z 6.99055272e+02 -2.04010264e+03 8.96596820e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -101 1.45480563e+05 1.54210016e+04 ! particle number mass Rhill +Body101 1.45480563e+05 1.54210016e+04 ! particle number mass Rhill 8.04335643e+03 !particle radius in AU 1.42373839e+07 3.02611132e+06 -1.43164181e+04 ! x y z -4.03733107e+02 1.68169148e+03 7.10932541e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -102 6.69285233e+05 1.80640179e+04 ! particle number mass Rhill +Body102 6.69285233e+05 1.80640179e+04 ! particle number mass Rhill 9.07798396e+03 !particle radius in AU -6.09504895e+06 8.50655715e+06 -5.34991934e+04 ! x y z -1.62687481e+03 -1.19574157e+03 5.21976127e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -103 5.54045810e+04 7.41916597e+03 ! particle number mass Rhill +Body103 5.54045810e+04 7.41916597e+03 ! particle number mass Rhill 3.95640633e+03 !particle radius in AU 3.72306724e+06 9.02743458e+06 4.19786502e+04 ! x y z -1.94834474e+03 7.84745897e+02 -7.86691937e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -104 3.37361939e+05 1.43866451e+04 ! particle number mass Rhill +Body104 3.37361939e+05 1.43866451e+04 ! particle number mass Rhill 1.06463568e+04 !particle radius in AU 5.64202715e+06 -8.82003156e+06 9.37432782e+03 ! x y z 1.69914027e+03 1.09005087e+03 8.81006839e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -105 5.14662528e+04 8.81661114e+03 ! particle number mass Rhill +Body105 5.14662528e+04 8.81661114e+03 ! particle number mass Rhill 5.68865819e+03 !particle radius in AU -1.08304546e+07 -5.16566260e+06 -4.58380354e+04 ! x y z 8.08725156e+02 -1.70426515e+03 -1.40809084e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -106 3.39041970e+05 1.37464490e+04 ! particle number mass Rhill +Body106 3.39041970e+05 1.37464490e+04 ! particle number mass Rhill 1.06640002e+04 !particle radius in AU 9.97312286e+06 -1.70160094e+06 4.10359397e+04 ! x y z 3.34859938e+02 2.01251950e+03 -1.05202781e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -107 1.35309181e+05 1.06647393e+04 ! particle number mass Rhill +Body107 1.35309181e+05 1.06647393e+04 ! particle number mass Rhill 7.85135736e+03 !particle radius in AU 7.03958663e+06 7.71716479e+06 -8.94733922e+03 ! x y z -1.49839830e+03 1.36772144e+03 -1.09915777e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -108 1.53942820e+04 6.17971607e+03 ! particle number mass Rhill +Body108 1.53942820e+04 6.17971607e+03 ! particle number mass Rhill 3.80442303e+03 !particle radius in AU 1.15617458e+07 -4.37264141e+06 4.98550747e+04 ! x y z 6.45606485e+02 1.75989881e+03 1.00504151e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -109 1.20359498e+05 1.03531982e+04 ! particle number mass Rhill +Body109 1.20359498e+05 1.03531982e+04 ! particle number mass Rhill 7.55084889e+03 !particle radius in AU 6.33009492e+06 8.26456632e+06 4.39267321e+04 ! x y z -1.63555236e+03 1.22749817e+03 -2.79591207e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -110 4.02306238e+04 1.19594172e+04 ! particle number mass Rhill +Body110 4.02306238e+04 1.19594172e+04 ! particle number mass Rhill 5.24028103e+03 !particle radius in AU -1.23116789e+06 -1.76328069e+07 4.15688915e+04 ! x y z 1.54978172e+03 -1.14789962e+02 3.52623567e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -111 1.16809933e+06 1.85947433e+04 ! particle number mass Rhill +Body111 1.16809933e+06 1.85947433e+04 ! particle number mass Rhill 1.09298010e+04 !particle radius in AU 5.03800785e+06 7.38464714e+06 6.56936601e+04 ! x y z -1.79789878e+03 1.24241563e+03 -1.87814487e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -112 2.13493317e+04 6.39192868e+03 ! particle number mass Rhill +Body112 2.13493317e+04 6.39192868e+03 ! particle number mass Rhill 4.24258369e+03 !particle radius in AU -1.16819556e+07 2.21702225e+06 -1.76770966e+03 ! x y z -3.36108070e+02 -1.84613620e+03 1.27905806e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -113 3.22629364e+05 1.43521784e+04 ! particle number mass Rhill +Body113 3.22629364e+05 1.43521784e+04 ! particle number mass Rhill 1.04890693e+04 !particle radius in AU 1.00037167e+07 3.61161669e+06 -5.98746596e+04 ! x y z -7.04121449e+02 1.87165808e+03 1.87226479e-01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -114 8.52184752e+04 7.73707972e+03 ! particle number mass Rhill +Body114 8.52184752e+04 7.73707972e+03 ! particle number mass Rhill 6.72997694e+03 !particle radius in AU -8.02245740e+06 -4.15017483e+06 1.94427373e+04 ! x y z 9.95701473e+02 -1.91465293e+03 9.55414968e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -115 7.51189622e+04 7.51337067e+03 ! particle number mass Rhill +Body115 7.51189622e+04 7.51337067e+03 ! particle number mass Rhill 4.37893861e+03 !particle radius in AU -4.99256633e+06 7.35143538e+06 -6.25201967e+04 ! x y z -1.82686822e+03 -1.23953720e+03 -3.37208923e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -116 8.34114020e+05 1.81150613e+04 ! particle number mass Rhill +Body116 8.34114020e+05 1.81150613e+04 ! particle number mass Rhill 9.76924055e+03 !particle radius in AU -2.12824530e+06 9.48297181e+06 4.56720468e+03 ! x y z -2.04325211e+03 -4.78944866e+02 1.39609484e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -117 1.95998225e+04 8.19893214e+03 ! particle number mass Rhill +Body117 1.95998225e+04 8.19893214e+03 ! particle number mass Rhill 4.12337692e+03 !particle radius in AU -1.42745447e+07 -5.79867689e+06 -1.70313904e+04 ! x y z 6.32626042e+02 -1.53908540e+03 1.67461109e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -118 6.08576822e+05 1.79320915e+04 ! particle number mass Rhill +Body118 6.08576822e+05 1.79320915e+04 ! particle number mass Rhill 8.79476284e+03 !particle radius in AU 3.38987773e+06 1.01890371e+07 3.97150856e+04 ! x y z -1.89204657e+03 6.21657437e+02 -2.83215087e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -119 1.01047065e+05 1.52544192e+04 ! particle number mass Rhill +Body119 1.01047065e+05 1.52544192e+04 ! particle number mass Rhill 4.83385440e+03 !particle radius in AU 1.36440026e+07 -9.23862046e+06 -5.31108803e+04 ! x y z 9.02323684e+02 1.33920162e+03 1.66233464e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -120 4.81434848e+05 2.46431320e+04 ! particle number mass Rhill +Body120 4.81434848e+05 2.46431320e+04 ! particle number mass Rhill 8.13388768e+03 !particle radius in AU -3.69977113e+06 -1.52467920e+07 -1.34829610e+05 ! x y z 1.61925599e+03 -3.72623284e+02 7.50289619e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -121 2.29549348e+05 2.35874873e+04 ! particle number mass Rhill +Body121 2.29549348e+05 2.35874873e+04 ! particle number mass Rhill 9.36399150e+03 !particle radius in AU 1.82794011e+07 6.84958710e+06 1.41781869e+04 ! x y z -5.47821288e+02 1.37308430e+03 -7.00506636e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -122 8.52767653e+04 1.58219602e+04 ! particle number mass Rhill +Body122 8.52767653e+04 1.58219602e+04 ! particle number mass Rhill 4.56803304e+03 !particle radius in AU 1.18968647e+07 1.33707826e+07 -1.11221176e+05 ! x y z -1.16553280e+03 1.03288779e+03 1.42253495e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -123 2.86399056e+04 1.20730103e+04 ! particle number mass Rhill +Body123 2.86399056e+04 1.20730103e+04 ! particle number mass Rhill 4.67906973e+03 !particle radius in AU -1.96455999e+07 -2.60429318e+06 -9.25749294e+04 ! x y z 1.97567654e+02 -1.46047680e+03 3.96763228e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -124 3.14094760e+05 1.35352736e+04 ! particle number mass Rhill +Body124 3.14094760e+05 1.35352736e+04 ! particle number mass Rhill 7.05460271e+03 !particle radius in AU -2.68241356e+06 9.67860718e+06 -3.52723705e+04 ! x y z -1.98385491e+03 -5.75973374e+02 4.82531781e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -125 3.55357461e+05 1.52795593e+04 ! particle number mass Rhill +Body125 3.55357461e+05 1.52795593e+04 ! particle number mass Rhill 7.35090499e+03 !particle radius in AU -1.66338998e+06 1.06654130e+07 -1.15436526e+05 ! x y z -1.97394994e+03 -3.24337570e+02 1.49148403e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -126 1.38842935e+06 1.99818510e+04 ! particle number mass Rhill +Body126 1.38842935e+06 1.99818510e+04 ! particle number mass Rhill 1.15778235e+04 !particle radius in AU 5.73133232e+06 -6.88742280e+06 -9.91791004e+03 ! x y z 1.69108314e+03 1.40100447e+03 8.39576992e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -127 8.28665485e+05 3.13608293e+04 ! particle number mass Rhill +Body127 8.28665485e+05 3.13608293e+04 ! particle number mass Rhill 9.74792278e+03 !particle radius in AU 1.16505540e+07 1.24190497e+07 3.29845083e+04 ! x y z -1.14848373e+03 1.08164128e+03 1.94732937e-01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -128 1.54764054e+05 1.01037906e+04 ! particle number mass Rhill +Body128 1.54764054e+05 1.01037906e+04 ! particle number mass Rhill 5.57197333e+03 !particle radius in AU -9.45920013e+06 -1.21129886e+06 4.53752885e+04 ! x y z 2.60756743e+02 -2.09880469e+03 -1.84679906e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -129 6.02399124e+05 1.62531984e+04 ! particle number mass Rhill +Body129 6.02399124e+05 1.62531984e+04 ! particle number mass Rhill 1.29160713e+04 !particle radius in AU 8.30827394e+06 4.94291767e+06 9.57082698e+03 ! x y z -1.06905700e+03 1.81887550e+03 -1.59783959e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -130 2.22342896e+05 1.18675483e+04 ! particle number mass Rhill +Body130 2.22342896e+05 1.18675483e+04 ! particle number mass Rhill 6.28724063e+03 !particle radius in AU 9.92654375e+06 -1.39802998e+06 4.49817877e+02 ! x y z 2.59014431e+02 2.03619473e+03 -1.49038139e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -131 1.76284582e+04 5.29944629e+03 ! particle number mass Rhill +Body131 1.76284582e+04 5.29944629e+03 ! particle number mass Rhill 3.98022020e+03 !particle radius in AU 2.81061041e+06 9.89835484e+06 -9.78582159e+04 ! x y z -1.95518409e+03 5.78271402e+02 1.18622238e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -132 5.38538955e+04 8.44113186e+03 ! particle number mass Rhill +Body132 5.38538955e+04 8.44113186e+03 ! particle number mass Rhill 5.77530198e+03 !particle radius in AU -5.58547024e+06 -9.86469957e+06 6.83294173e+04 ! x y z 1.69539459e+03 -9.41024851e+02 -1.14165406e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -133 2.20314045e+05 1.27238656e+04 ! particle number mass Rhill +Body133 2.20314045e+05 1.27238656e+04 ! particle number mass Rhill 6.26805874e+03 !particle radius in AU 8.08999866e+06 6.84273025e+06 1.04867849e+03 ! x y z -1.27946500e+03 1.55545684e+03 8.91891880e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -134 8.27723183e+05 1.98929693e+04 ! particle number mass Rhill +Body134 8.27723183e+05 1.98929693e+04 ! particle number mass Rhill 9.74422649e+03 !particle radius in AU 9.18575665e+06 -5.49644544e+06 -5.52894905e+03 ! x y z 1.01968981e+03 1.71970787e+03 -3.39617822e-01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -135 2.27994929e+04 5.23645068e+03 ! particle number mass Rhill +Body135 2.27994929e+04 5.23645068e+03 ! particle number mass Rhill 4.33654694e+03 !particle radius in AU 1.80833036e+06 -9.23065450e+06 4.90226701e+04 ! x y z 2.08275022e+03 4.17014758e+02 6.63087350e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -136 2.58206907e+05 1.51042021e+04 ! particle number mass Rhill +Body136 2.58206907e+05 1.51042021e+04 ! particle number mass Rhill 6.60858198e+03 !particle radius in AU 1.18507627e+07 2.26553726e+06 2.21133096e+03 ! x y z -3.50610095e+02 1.84373395e+03 -2.60885445e-01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -137 1.01432201e+05 2.15204041e+04 ! particle number mass Rhill +Body137 1.01432201e+05 2.15204041e+04 ! particle number mass Rhill 7.13226721e+03 !particle radius in AU 2.21659927e+07 -6.92493598e+06 -4.28421451e+04 ! x y z 4.19436458e+02 1.29376942e+03 -6.14053149e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -138 1.48483324e+05 1.01288412e+04 ! particle number mass Rhill +Body138 1.48483324e+05 1.01288412e+04 ! particle number mass Rhill 8.09831906e+03 !particle radius in AU -6.92437867e+06 -6.69629009e+06 -5.72228921e+04 ! x y z 1.49689718e+03 -1.48846576e+03 -1.37808252e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -139 9.42427088e+05 1.92839992e+04 ! particle number mass Rhill +Body139 9.42427088e+05 1.92839992e+04 ! particle number mass Rhill 1.01750117e+04 !particle radius in AU -6.66985595e+06 -7.23797041e+06 -1.53286702e+04 ! x y z 1.53320998e+03 -1.42766264e+03 2.90451170e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -140 5.54442544e+05 1.45796646e+04 ! particle number mass Rhill +Body140 5.54442544e+05 1.45796646e+04 ! particle number mass Rhill 1.25638046e+04 !particle radius in AU -8.86868024e+06 7.20105731e+05 -2.22950048e+03 ! x y z -1.95841451e+02 -2.19258513e+03 -3.67523850e-01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -141 1.55124183e+06 2.70665333e+04 ! particle number mass Rhill +Body141 1.55124183e+06 2.70665333e+04 ! particle number mass Rhill 1.20137567e+04 !particle radius in AU 5.67690574e+06 -1.03162373e+07 -9.41350622e+04 ! x y z 1.67246075e+03 9.20785969e+02 -1.99251255e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -142 1.28173318e+05 1.54093909e+04 ! particle number mass Rhill +Body142 1.28173318e+05 1.54093909e+04 ! particle number mass Rhill 5.23260806e+03 !particle radius in AU 5.50551593e+06 -1.45584653e+07 5.27718687e+04 ! x y z 1.54616130e+03 5.79954533e+02 7.51811204e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -143 1.57882645e+06 2.19970603e+04 ! particle number mass Rhill +Body143 1.57882645e+06 2.19970603e+04 ! particle number mass Rhill 1.20845494e+04 !particle radius in AU -3.47796098e+06 -8.90927004e+06 9.65028764e+03 ! x y z 1.97386652e+03 -7.53987246e+02 -3.28779531e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -144 1.29809111e+05 9.78824459e+03 ! particle number mass Rhill +Body144 1.29809111e+05 9.78824459e+03 ! particle number mass Rhill 7.74350141e+03 !particle radius in AU 7.74574172e+06 5.95714791e+06 -1.05471596e+04 ! x y z -1.25035431e+03 1.67733844e+03 -1.65757527e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -145 6.10792333e+04 1.61950813e+04 ! particle number mass Rhill +Body145 6.10792333e+04 1.61950813e+04 ! particle number mass Rhill 4.08711498e+03 !particle radius in AU -1.98199827e+07 7.29300766e+06 -1.29061581e+05 ! x y z -4.89201522e+02 -1.32406236e+03 8.40261667e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -146 8.14321833e+05 3.15390616e+04 ! particle number mass Rhill +Body146 8.14321833e+05 3.15390616e+04 ! particle number mass Rhill 9.69135174e+03 !particle radius in AU 1.13588614e+07 1.27104515e+07 1.21608339e+05 ! x y z -1.17212059e+03 1.06703576e+03 1.25962854e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -147 1.12573910e+06 1.92039195e+04 ! particle number mass Rhill +Body147 1.12573910e+06 1.92039195e+04 ! particle number mass Rhill 1.07960507e+04 !particle radius in AU -6.88558621e+06 6.34193128e+06 -5.71723545e+04 ! x y z -1.41834644e+03 -1.59442296e+03 3.00905420e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -148 5.89994915e+04 1.23743739e+04 ! particle number mass Rhill +Body148 5.89994915e+04 1.23743739e+04 ! particle number mass Rhill 5.95367439e+03 !particle radius in AU 2.58947797e+06 1.59613455e+07 1.59042158e+05 ! x y z -1.60287570e+03 2.41814174e+02 -1.67580989e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -149 1.61092891e+05 1.43346162e+04 ! particle number mass Rhill +Body149 1.61092891e+05 1.43346162e+04 ! particle number mass Rhill 5.64691333e+03 !particle radius in AU 1.27274825e+07 3.00655471e+06 8.98397391e+03 ! x y z -4.31699175e+02 1.77274933e+03 -1.26354778e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -150 3.67253358e+04 6.76660973e+03 ! particle number mass Rhill +Body150 3.67253358e+04 6.76660973e+03 ! particle number mass Rhill 5.08343859e+03 !particle radius in AU -7.10630600e+06 -7.28840877e+06 -2.23411110e+03 ! x y z 1.47897945e+03 -1.43505611e+03 -2.71839174e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -151 2.79688721e+04 5.63429227e+03 ! particle number mass Rhill +Body151 2.79688721e+04 5.63429227e+03 ! particle number mass Rhill 4.64223699e+03 !particle radius in AU 6.38222762e+06 -6.74069777e+06 8.75842881e+04 ! x y z 1.60375261e+03 1.44358800e+03 -9.05519600e-01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -152 1.49726912e+05 1.72153700e+04 ! particle number mass Rhill +Body152 1.49726912e+05 1.72153700e+04 ! particle number mass Rhill 8.12086478e+03 !particle radius in AU -1.56702566e+07 4.26618807e+06 5.21823445e+04 ! x y z -4.05029139e+02 -1.57894139e+03 2.53582968e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -153 2.25272127e+05 1.26178768e+04 ! particle number mass Rhill +Body153 2.25272127e+05 1.26178768e+04 ! particle number mass Rhill 9.30546634e+03 !particle radius in AU -8.73094270e+06 5.67791265e+06 2.17614432e+04 ! x y z -1.10821669e+03 -1.70422433e+03 2.11567045e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -154 1.52669889e+05 1.08283241e+04 ! particle number mass Rhill +Body154 1.52669889e+05 1.08283241e+04 ! particle number mass Rhill 5.54672703e+03 !particle radius in AU -1.01683371e+07 1.10819821e+06 1.64139763e+04 ! x y z -2.62188936e+02 -2.02918021e+03 8.77276633e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -155 5.79689563e+04 8.97148278e+03 ! particle number mass Rhill +Body155 5.79689563e+04 8.97148278e+03 ! particle number mass Rhill 4.01652823e+03 !particle radius in AU 4.35525820e+06 1.08005096e+07 7.15657051e+04 ! x y z -1.78452573e+03 7.14211418e+02 1.85217607e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -156 4.99028875e+05 2.13357770e+04 ! particle number mass Rhill +Body156 4.99028875e+05 2.13357770e+04 ! particle number mass Rhill 8.23178885e+03 !particle radius in AU 1.33640503e+06 -1.35991318e+07 1.26981224e+05 ! x y z 1.75325272e+03 1.99801637e+02 9.12185103e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -157 3.21480613e+05 1.20647069e+04 ! particle number mass Rhill +Body157 3.21480613e+05 1.20647069e+04 ! particle number mass Rhill 7.10947055e+03 !particle radius in AU -6.82381137e+06 5.53567185e+06 7.84751624e+03 ! x y z -1.38395700e+03 -1.73645326e+03 7.57405795e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -158 9.91529953e+04 1.07918343e+04 ! particle number mass Rhill +Body158 9.91529953e+04 1.07918343e+04 ! particle number mass Rhill 4.80346108e+03 !particle radius in AU 3.89840794e+06 1.10854924e+07 3.76242516e+03 ! x y z -1.80675419e+03 6.21051875e+02 -1.71817477e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -159 2.52237740e+05 1.14363942e+04 ! particle number mass Rhill +Body159 2.52237740e+05 1.14363942e+04 ! particle number mass Rhill 6.55725922e+03 !particle radius in AU -1.97874775e+06 -8.77567582e+06 -2.75052193e+03 ! x y z 2.14929146e+03 -4.63042632e+02 1.42528242e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -160 1.01739958e+06 1.88523697e+04 ! particle number mass Rhill +Body160 1.01739958e+06 1.88523697e+04 ! particle number mass Rhill 1.04379733e+04 !particle radius in AU -3.69568353e+06 8.70958011e+06 1.23991773e+02 ! x y z -1.95889951e+03 -8.30413409e+02 3.23324109e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -161 6.26561099e+04 9.13946042e+03 ! particle number mass Rhill +Body161 6.26561099e+04 9.13946042e+03 ! particle number mass Rhill 4.12198879e+03 !particle radius in AU -7.46635757e+06 8.75996756e+06 -3.38546703e+04 ! x y z -1.47538097e+03 -1.25605788e+03 1.14970804e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -162 4.03320233e+05 1.69943586e+04 ! particle number mass Rhill +Body162 4.03320233e+05 1.69943586e+04 ! particle number mass Rhill 7.66776863e+03 !particle radius in AU 5.08163706e+06 1.05043562e+07 -2.49011889e+04 ! x y z -1.73355443e+03 8.04079694e+02 -1.88007028e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -163 2.79645719e+04 5.40884610e+03 ! particle number mass Rhill +Body163 2.79645719e+04 5.40884610e+03 ! particle number mass Rhill 4.64199906e+03 !particle radius in AU 4.39449717e+06 -7.93852417e+06 4.36583437e+04 ! x y z 1.88869963e+03 1.05420912e+03 5.50586344e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -164 1.10906394e+06 2.35480158e+04 ! particle number mass Rhill +Body164 1.10906394e+06 2.35480158e+04 ! particle number mass Rhill 1.07424793e+04 !particle radius in AU 8.63623502e+06 -7.74644884e+06 1.85384542e+04 ! x y z 1.26494539e+03 1.43300151e+03 7.04221650e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -165 8.56685180e+05 2.78909446e+04 ! particle number mass Rhill +Body165 8.56685180e+05 2.78909446e+04 ! particle number mass Rhill 9.85657615e+03 !particle radius in AU -6.15368525e+05 1.49121598e+07 -4.67932565e+04 ! x y z -1.68745762e+03 -4.92212694e+01 -1.94039771e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -166 3.06525474e+05 1.36922172e+04 ! particle number mass Rhill +Body166 3.06525474e+05 1.36922172e+04 ! particle number mass Rhill 6.99747229e+03 !particle radius in AU 8.64904319e+06 5.91192747e+06 -6.14206652e+04 ! x y z -1.13126693e+03 1.64851790e+03 -1.89192778e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -167 5.93049281e+05 1.52051655e+04 ! particle number mass Rhill +Body167 5.93049281e+05 1.52051655e+04 ! particle number mass Rhill 8.71931949e+03 !particle radius in AU -7.78414392e+06 4.96208659e+06 -1.63838108e+04 ! x y z -1.12672930e+03 -1.82241793e+03 -5.96425105e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -168 2.12666894e+04 5.40531233e+03 ! particle number mass Rhill +Body168 2.12666894e+04 5.40531233e+03 ! particle number mass Rhill 4.23710232e+03 !particle radius in AU 9.85857087e+06 -4.25461587e+05 -7.76455058e+04 ! x y z 8.06687493e+01 2.07960003e+03 3.28242575e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -169 2.85652780e+05 2.95720311e+04 ! particle number mass Rhill +Body169 2.85652780e+05 2.95720311e+04 ! particle number mass Rhill 1.00719866e+04 !particle radius in AU -3.92871528e+06 -2.24319020e+07 2.77551401e+04 ! x y z 1.34770576e+03 -2.35192176e+02 -6.19147736e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -170 3.39019670e+05 1.79553101e+04 ! particle number mass Rhill +Body170 3.39019670e+05 1.79553101e+04 ! particle number mass Rhill 7.23647883e+03 !particle radius in AU -9.85059665e+06 -8.52205655e+06 -5.48573039e+04 ! x y z 1.18464366e+03 -1.37030272e+03 9.99031014e-01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -171 8.89113305e+05 2.71542359e+04 ! particle number mass Rhill +Body171 8.89113305e+05 2.71542359e+04 ! particle number mass Rhill 9.97940619e+03 !particle radius in AU -1.95744716e+06 -1.40658438e+07 -8.96628033e+04 ! x y z 1.72553028e+03 -2.22255484e+02 -2.68715792e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -172 8.29370571e+05 3.54463172e+04 ! particle number mass Rhill +Body172 8.29370571e+05 3.54463172e+04 ! particle number mass Rhill 9.75068673e+03 !particle radius in AU -1.83887109e+07 -4.94937710e+06 4.13740137e+04 ! x y z 4.02207087e+02 -1.44472494e+03 7.82771281e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -173 1.48238892e+06 2.27550464e+04 ! particle number mass Rhill +Body173 1.48238892e+06 2.27550464e+04 ! particle number mass Rhill 1.18333139e+04 !particle radius in AU 6.28107583e+06 -7.96489519e+06 1.00181104e+05 ! x y z 1.61474462e+03 1.25899281e+03 3.25360113e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -174 8.27798949e+04 7.81570962e+03 ! particle number mass Rhill +Body174 8.27798949e+04 7.81570962e+03 ! particle number mass Rhill 6.66516052e+03 !particle radius in AU 8.57815199e+06 2.93408991e+06 1.00482256e+04 ! x y z -7.00269987e+02 2.05582007e+03 1.47496098e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -175 3.84709230e+05 1.86262292e+04 ! particle number mass Rhill +Body175 3.84709230e+05 1.86262292e+04 ! particle number mass Rhill 7.54796479e+03 !particle radius in AU 3.89386447e+06 -1.18916453e+07 4.75801024e+03 ! x y z 1.79017897e+03 5.72333272e+02 1.35429336e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -176 5.66577675e+04 1.78767974e+04 ! particle number mass Rhill +Body176 5.66577675e+04 1.78767974e+04 ! particle number mass Rhill 5.87384040e+03 !particle radius in AU -1.12819097e+07 -2.03828249e+07 -4.17849171e+04 ! x y z 1.20129982e+03 -6.40831904e+02 -7.21062138e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -177 2.07013798e+05 1.69695724e+04 ! particle number mass Rhill +Body177 2.07013798e+05 1.69695724e+04 ! particle number mass Rhill 9.04694786e+03 !particle radius in AU -3.48844270e+06 -1.39807096e+07 -9.80376409e+04 ! x y z 1.67545999e+03 -4.23493775e+02 9.57144799e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -178 1.75307559e+05 1.09646651e+04 ! particle number mass Rhill +Body178 1.75307559e+05 1.09646651e+04 ! particle number mass Rhill 5.80834687e+03 !particle radius in AU -6.99241637e+06 -6.97891492e+06 1.17078416e+04 ! x y z 1.45466387e+03 -1.49110516e+03 -7.97644872e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -179 1.07781085e+05 2.17561846e+04 ! particle number mass Rhill +Body179 1.07781085e+05 2.17561846e+04 ! particle number mass Rhill 7.27807466e+03 !particle radius in AU 2.29671869e+07 -4.77992661e+06 -2.29056888e+05 ! x y z 2.66633595e+02 1.31300250e+03 8.11268595e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -180 3.59388467e+05 1.77616131e+04 ! particle number mass Rhill +Body180 3.59388467e+05 1.77616131e+04 ! particle number mass Rhill 7.37859561e+03 !particle radius in AU 1.12799199e+07 -5.64371881e+06 -4.86158248e+04 ! x y z 8.25574521e+02 1.64707498e+03 1.79426055e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -181 8.43345605e+04 7.88595165e+03 ! particle number mass Rhill +Body181 8.43345605e+04 7.88595165e+03 ! particle number mass Rhill 4.55114695e+03 !particle radius in AU -8.97901930e+06 1.40018499e+06 -1.17315967e+04 ! x y z -3.50813576e+02 -2.14111191e+03 1.58430709e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -182 2.54722186e+05 1.61693513e+04 ! particle number mass Rhill +Body182 2.54722186e+05 1.61693513e+04 ! particle number mass Rhill 9.69448137e+03 !particle radius in AU -1.27934972e+07 5.80764481e+05 -6.60656959e+04 ! x y z -8.73661010e+01 -1.83147573e+03 9.29252102e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -183 5.21033114e+05 3.12442397e+04 ! particle number mass Rhill +Body183 5.21033114e+05 3.12442397e+04 ! particle number mass Rhill 1.23062037e+04 !particle radius in AU -6.51355993e+06 -1.80095300e+07 -1.28499713e+05 ! x y z 1.42185635e+03 -5.15444029e+02 4.71976246e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -184 5.21637824e+05 1.66907755e+04 ! particle number mass Rhill +Body184 5.21637824e+05 1.66907755e+04 ! particle number mass Rhill 1.23109627e+04 !particle radius in AU -1.35063597e+06 1.04263703e+07 -1.65523047e+04 ! x y z -1.99638943e+03 -2.63418025e+02 -1.41194780e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -185 4.58205528e+04 6.92591943e+03 ! particle number mass Rhill +Body185 4.58205528e+04 6.92591943e+03 ! particle number mass Rhill 3.71369106e+03 !particle radius in AU -9.22486496e+06 2.96866634e+06 -1.89865927e+03 ! x y z -6.64441635e+02 -2.00340641e+03 -1.17076646e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -186 2.23433612e+05 1.26670941e+04 ! particle number mass Rhill +Body186 2.23433612e+05 1.26670941e+04 ! particle number mass Rhill 6.29750468e+03 !particle radius in AU 7.10721350e+06 7.67585026e+06 -3.24513481e+03 ! x y z -1.50133478e+03 1.36725034e+03 -1.87929113e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -187 1.79931401e+05 1.04373831e+04 ! particle number mass Rhill +Body187 1.79931401e+05 1.04373831e+04 ! particle number mass Rhill 8.63385286e+03 !particle radius in AU -3.50855266e+06 -8.47958104e+06 5.43121964e+04 ! x y z 2.01378047e+03 -8.30225015e+02 -6.42928682e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -188 5.90097791e+04 1.34524769e+04 ! particle number mass Rhill +Body188 5.90097791e+04 1.34524769e+04 ! particle number mass Rhill 5.95402041e+03 !particle radius in AU -1.71845688e+07 2.92835680e+06 1.80160654e+04 ! x y z -2.68908847e+02 -1.54460993e+03 5.60740384e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -189 7.79086515e+05 1.85386656e+04 ! particle number mass Rhill +Body189 7.79086515e+05 1.85386656e+04 ! particle number mass Rhill 9.54950570e+03 !particle radius in AU -9.06623165e+06 -4.20136967e+06 -2.06364196e+04 ! x y z 8.54458713e+02 -1.90544528e+03 6.22285906e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -190 1.53125034e+06 2.34513451e+04 ! particle number mass Rhill +Body190 1.53125034e+06 2.34513451e+04 ! particle number mass Rhill 1.19619247e+04 !particle radius in AU 5.25849667e+06 8.80426419e+06 1.08815572e+04 ! x y z -1.77864099e+03 1.00939651e+03 -2.77090468e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -191 8.59567645e+04 1.28327108e+04 ! particle number mass Rhill +Body191 8.59567645e+04 1.28327108e+04 ! particle number mass Rhill 6.74935610e+03 !particle radius in AU 4.62808704e+06 1.40254648e+07 2.62029474e+04 ! x y z -1.61136420e+03 5.34010697e+02 -6.77858294e-01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -192 1.26242051e+05 1.99101289e+04 ! particle number mass Rhill +Body192 1.26242051e+05 1.99101289e+04 ! particle number mass Rhill 5.20619396e+03 !particle radius in AU 2.01424278e+07 3.41792942e+05 1.94882104e+05 ! x y z -2.93420884e+01 1.45364435e+03 -7.07412419e-01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -193 1.08024301e+06 4.02623073e+04 ! particle number mass Rhill +Body193 1.08024301e+06 4.02623073e+04 ! particle number mass Rhill 1.06486075e+04 !particle radius in AU 8.37083337e+06 -1.79540915e+07 -5.91009347e+04 ! x y z 1.33428010e+03 6.17563374e+02 2.42512024e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -194 3.59813883e+04 6.03118811e+03 ! particle number mass Rhill +Body194 3.59813883e+04 6.03118811e+03 ! particle number mass Rhill 5.04887899e+03 !particle radius in AU 9.18834937e+06 4.09046541e+05 5.54581813e+03 ! x y z -7.23751549e+01 2.15950913e+03 6.85354866e-01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -195 7.21130805e+04 1.15218555e+04 ! particle number mass Rhill +Body195 7.21130805e+04 1.15218555e+04 ! particle number mass Rhill 6.36561457e+03 !particle radius in AU 2.40599869e+06 -1.36259877e+07 7.24745280e+03 ! x y z 1.74094787e+03 3.07239990e+02 8.10516402e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -196 5.22433041e+04 8.56706323e+03 ! particle number mass Rhill +Body196 5.22433041e+04 8.56706323e+03 ! particle number mass Rhill 3.87967973e+03 !particle radius in AU -1.16034100e+07 -1.77480486e+06 -1.62127720e+04 ! x y z 2.83834839e+02 -1.87461386e+03 5.96638672e-01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -197 2.88195987e+05 1.92280928e+04 ! particle number mass Rhill +Body197 2.88195987e+05 1.92280928e+04 ! particle number mass Rhill 6.85511860e+03 !particle radius in AU 1.47515573e+07 -2.57581761e+05 -5.23662055e+04 ! x y z 1.10532093e+01 1.70024862e+03 8.28609927e-01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -198 5.20744357e+05 2.19617843e+04 ! particle number mass Rhill +Body198 5.20744357e+05 2.19617843e+04 ! particle number mass Rhill 1.23039299e+04 !particle radius in AU 1.13163190e+07 -7.84357347e+06 1.03407930e+04 ! x y z 1.01120595e+03 1.44577732e+03 -5.19143023e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -199 1.70548241e+05 1.09436379e+04 ! particle number mass Rhill +Body199 1.70548241e+05 1.09436379e+04 ! particle number mass Rhill 5.75530148e+03 !particle radius in AU -3.32812125e+06 -9.44533791e+06 -4.90376566e+04 ! x y z 1.95676637e+03 -6.51606826e+02 -5.70434278e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -200 5.42504766e+05 1.91588733e+04 ! particle number mass Rhill +Body200 5.42504766e+05 1.91588733e+04 ! particle number mass Rhill 1.24729785e+04 !particle radius in AU 1.06811374e+07 -4.93512180e+06 -2.54549899e+04 ! x y z 7.94618978e+02 1.74255873e+03 -9.79841366e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -201 1.45214473e+06 2.51148062e+04 ! particle number mass Rhill +Body201 1.45214473e+06 2.51148062e+04 ! particle number mass Rhill 1.17522845e+04 !particle radius in AU 1.08275316e+07 3.16975354e+06 -1.83616872e+04 ! x y z -5.71210349e+02 1.85480914e+03 -5.53165520e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -202 4.79031773e+05 1.39791861e+04 ! particle number mass Rhill +Body202 4.79031773e+05 1.39791861e+04 ! particle number mass Rhill 1.19662231e+04 !particle radius in AU -8.93938095e+06 -1.07672320e+06 2.20211931e+02 ! x y z 2.21513596e+02 -2.17140814e+03 -5.31579057e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -203 9.35672463e+04 1.18188273e+04 ! particle number mass Rhill +Body203 9.35672463e+04 1.18188273e+04 ! particle number mass Rhill 6.94294309e+03 !particle radius in AU -1.11274091e+07 6.99042019e+06 4.20463158e+03 ! x y z -9.73175474e+02 -1.52053333e+03 -7.28310775e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -204 2.35662743e+05 1.60773575e+04 ! particle number mass Rhill +Body204 2.35662743e+05 1.60773575e+04 ! particle number mass Rhill 9.44639204e+03 !particle radius in AU 4.40522655e+06 -1.23917208e+07 -1.61713907e+04 ! x y z 1.70009079e+03 6.02493125e+02 -3.82502681e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -205 2.38678835e+05 1.29738033e+04 ! particle number mass Rhill +Body205 2.38678835e+05 1.29738033e+04 ! particle number mass Rhill 6.43759473e+03 !particle radius in AU 8.84972010e+06 5.65746303e+06 4.89598915e+04 ! x y z -1.07695732e+03 1.71417278e+03 -2.68488868e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -206 5.70545769e+04 8.09831867e+03 ! particle number mass Rhill +Body206 5.70545769e+04 8.09831867e+03 ! particle number mass Rhill 5.88752122e+03 !particle radius in AU -5.79952078e+06 8.88645462e+06 -2.44580541e+04 ! x y z -1.68074658e+03 -1.10169885e+03 -6.29194406e-01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -207 5.51731540e+05 1.45509165e+04 ! particle number mass Rhill +Body207 5.51731540e+05 1.45509165e+04 ! particle number mass Rhill 1.25432938e+04 !particle radius in AU -8.14410389e+06 -3.97016042e+06 -9.88813618e+04 ! x y z 9.01368103e+02 -1.96430805e+03 -4.40735560e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -208 1.01063925e+06 1.76831218e+04 ! particle number mass Rhill +Body208 1.01063925e+06 1.76831218e+04 ! particle number mass Rhill 1.04148028e+04 !particle radius in AU 7.46448044e+06 -4.58544507e+06 1.76340315e+04 ! x y z 1.15401750e+03 1.90545254e+03 -7.27693077e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -209 4.01306668e+05 1.56153596e+04 ! particle number mass Rhill +Body209 4.01306668e+05 1.56153596e+04 ! particle number mass Rhill 1.12804852e+04 !particle radius in AU -2.08884933e+06 -1.02835429e+07 6.42079933e+03 ! x y z 1.99534972e+03 -4.16589585e+02 -4.18338876e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -210 1.16893367e+05 9.97596895e+03 ! particle number mass Rhill +Body210 1.16893367e+05 9.97596895e+03 ! particle number mass Rhill 7.47765824e+03 !particle radius in AU 3.36937988e+06 -9.91809680e+06 5.89060808e+04 ! x y z 1.88421155e+03 6.84396854e+02 -2.08220150e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -211 6.63716790e+05 2.02872172e+04 ! particle number mass Rhill +Body211 6.63716790e+05 2.02872172e+04 ! particle number mass Rhill 9.05273758e+03 !particle radius in AU -7.24117471e+06 -9.21469921e+06 -3.61410851e+04 ! x y z 1.49902224e+03 -1.18897591e+03 9.80133706e-01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -212 5.54059774e+05 1.44580726e+04 ! particle number mass Rhill +Body212 5.54059774e+05 1.44580726e+04 ! particle number mass Rhill 1.25609127e+04 !particle radius in AU -3.74450435e+06 -8.15891931e+06 2.77691948e+04 ! x y z 1.97501199e+03 -9.06036575e+02 -2.45381289e-01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -213 1.69304746e+05 1.85389651e+04 ! particle number mass Rhill +Body213 1.69304746e+05 1.85389651e+04 ! particle number mass Rhill 8.46042215e+03 !particle radius in AU 7.14052519e+06 1.53102112e+07 1.62981971e+05 ! x y z -1.44016584e+03 6.81333291e+02 -1.60906032e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -214 1.99811184e+06 2.54044580e+04 ! particle number mass Rhill +Body214 1.99811184e+06 2.54044580e+04 ! particle number mass Rhill 1.30715050e+04 !particle radius in AU -1.03399269e+07 2.85213950e+05 -3.22137865e+04 ! x y z -5.00043408e+01 -2.01781826e+03 1.16086899e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -215 1.89676101e+06 2.19318980e+04 ! particle number mass Rhill +Body215 1.89676101e+06 2.19318980e+04 ! particle number mass Rhill 1.28466493e+04 !particle radius in AU 4.61126913e+06 7.68167619e+06 3.21015460e+03 ! x y z -1.87745924e+03 1.11654918e+03 8.74586750e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -216 9.08573084e+05 1.81400916e+04 ! particle number mass Rhill +Body216 9.08573084e+05 1.81400916e+04 ! particle number mass Rhill 1.00516869e+04 !particle radius in AU -7.63901209e+05 9.38473527e+06 2.09296480e+04 ! x y z -2.13149182e+03 -1.53874003e+02 1.07619871e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -217 8.11071077e+04 1.14592741e+04 ! particle number mass Rhill +Body217 8.11071077e+04 1.14592741e+04 ! particle number mass Rhill 4.49233328e+03 !particle radius in AU -3.50142507e+06 1.29584846e+07 4.99036110e+03 ! x y z -1.71988301e+03 -4.67120020e+02 -1.52874482e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -218 5.45414263e+04 7.39602861e+03 ! particle number mass Rhill +Body218 5.45414263e+04 7.39602861e+03 ! particle number mass Rhill 3.93575293e+03 !particle radius in AU 2.89549121e+05 9.73817170e+06 7.30475924e+03 ! x y z -2.10637979e+03 6.28009545e+01 2.73575242e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -219 1.53455069e+05 9.67803209e+03 ! particle number mass Rhill +Body219 1.53455069e+05 9.67803209e+03 ! particle number mass Rhill 5.55621969e+03 !particle radius in AU -8.69236370e+06 2.60571730e+06 1.87543471e+04 ! x y z -6.41047725e+02 -2.08196126e+03 -9.78180600e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -220 1.44525955e+06 2.58764089e+04 ! particle number mass Rhill +Body220 1.44525955e+06 2.58764089e+04 ! particle number mass Rhill 1.17336811e+04 !particle radius in AU 1.16999055e+07 -8.45214750e+05 -1.23088793e+04 ! x y z 1.51868140e+02 1.88990987e+03 5.91582506e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -221 1.68319374e+06 2.90907579e+04 ! particle number mass Rhill +Body221 1.68319374e+06 2.90907579e+04 ! particle number mass Rhill 1.23451688e+04 !particle radius in AU 1.04932440e+07 6.34593749e+06 -5.14735307e+04 ! x y z -9.55788059e+02 1.61305183e+03 7.38311147e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -222 6.64548027e+05 2.09776961e+04 ! particle number mass Rhill +Body222 6.64548027e+05 2.09776961e+04 ! particle number mass Rhill 9.05651521e+03 !particle radius in AU -1.00872411e+07 -7.19383413e+06 1.02683109e+05 ! x y z 1.09632503e+03 -1.47708699e+03 2.53571970e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -223 5.28873267e+05 2.56064519e+04 ! particle number mass Rhill +Body223 5.28873267e+05 2.56064519e+04 ! particle number mass Rhill 8.39272259e+03 !particle radius in AU -1.29868607e+07 9.20702284e+06 -1.02202794e+05 ! x y z -9.58764873e+02 -1.33478274e+03 7.40636311e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -224 9.96994641e+05 1.92471528e+04 ! particle number mass Rhill +Body224 9.96994641e+05 1.92471528e+04 ! particle number mass Rhill 1.03677203e+04 !particle radius in AU 2.69271095e+06 9.12085234e+06 -6.31280178e+04 ! x y z -2.04468399e+03 6.49763127e+02 -6.41633267e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -225 2.38653594e+05 1.32999920e+04 ! particle number mass Rhill +Body225 2.38653594e+05 1.32999920e+04 ! particle number mass Rhill 9.48618629e+03 !particle radius in AU -1.04843536e+07 -2.82530322e+06 -6.63351271e+03 ! x y z 5.35179489e+02 -1.90917831e+03 -8.89095603e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -226 1.40349329e+06 2.00598103e+04 ! particle number mass Rhill +Body226 1.40349329e+06 2.00598103e+04 ! particle number mass Rhill 1.16195447e+04 !particle radius in AU 8.55294018e+06 -2.42617769e+06 2.52020611e+04 ! x y z 6.43758212e+02 2.11770030e+03 -2.00995235e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -227 1.68803614e+06 2.29017916e+04 ! particle number mass Rhill +Body227 1.68803614e+06 2.29017916e+04 ! particle number mass Rhill 1.23569961e+04 !particle radius in AU 9.56160063e+06 2.03876951e+05 -1.15187717e+04 ! x y z -2.08727307e+01 2.13182274e+03 -6.37368295e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -228 4.94409683e+04 7.07324355e+03 ! particle number mass Rhill +Body228 4.94409683e+04 7.07324355e+03 ! particle number mass Rhill 3.80903228e+03 !particle radius in AU 8.39735110e+06 -4.64919497e+06 -4.03636604e+04 ! x y z 1.02402689e+03 1.86350550e+03 3.48961376e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -229 1.23732338e+05 1.15801183e+04 ! particle number mass Rhill +Body229 1.23732338e+05 1.15801183e+04 ! particle number mass Rhill 7.62073270e+03 !particle radius in AU 1.14766676e+07 -2.46673442e+06 -6.18541161e+03 ! x y z 3.81520272e+02 1.87089502e+03 -6.28495237e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -230 3.07739150e+04 5.83154047e+03 ! particle number mass Rhill +Body230 3.07739150e+04 5.83154047e+03 ! particle number mass Rhill 4.79251234e+03 !particle radius in AU 7.65927810e+06 5.58691775e+06 6.38708550e+04 ! x y z -1.24261883e+03 1.71209694e+03 -6.95777672e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -231 6.25152932e+05 1.58916481e+04 ! particle number mass Rhill +Body231 6.25152932e+05 1.58916481e+04 ! particle number mass Rhill 8.87389776e+03 !particle radius in AU -8.21586374e+06 -4.28792953e+06 2.41010139e+04 ! x y z 1.01581225e+03 -1.90933511e+03 -2.60449634e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -232 1.02687634e+05 1.54462392e+04 ! particle number mass Rhill +Body232 1.02687634e+05 1.54462392e+04 ! particle number mass Rhill 4.85987440e+03 !particle radius in AU 1.62736579e+07 2.82256969e+06 3.66384128e+04 ! x y z -2.71027694e+02 1.59383670e+03 4.71948132e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -233 1.09055822e+05 8.97093718e+03 ! particle number mass Rhill +Body233 1.09055822e+05 8.97093718e+03 ! particle number mass Rhill 7.30665510e+03 !particle radius in AU -2.08216759e+06 -9.23350326e+06 -8.76611629e+04 ! x y z 2.08240223e+03 -4.40249465e+02 -1.27767388e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -234 4.21950076e+04 6.13798078e+03 ! particle number mass Rhill +Body234 4.21950076e+04 6.13798078e+03 ! particle number mass Rhill 5.32422025e+03 !particle radius in AU 8.73066827e+06 -2.21328634e+05 -3.34004359e+04 ! x y z 4.79166308e+01 2.23450529e+03 -9.11532147e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -235 1.49350824e+06 3.81141945e+04 ! particle number mass Rhill +Body235 1.49350824e+06 3.81141945e+04 ! particle number mass Rhill 1.18628272e+04 !particle radius in AU 1.62631471e+07 4.67259161e+06 2.64032894e+04 ! x y z -4.50841052e+02 1.52122597e+03 1.13312253e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -236 3.07566841e+05 2.10233787e+04 ! particle number mass Rhill +Body236 3.07566841e+05 2.10233787e+04 ! particle number mass Rhill 7.00538757e+03 !particle radius in AU 5.98003979e+05 -1.57345854e+07 -2.89481346e+04 ! x y z 1.64606847e+03 7.79210619e+01 -6.19029962e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -237 3.73535334e+05 1.38613380e+04 ! particle number mass Rhill +Body237 3.73535334e+05 1.38613380e+04 ! particle number mass Rhill 7.47416865e+03 !particle radius in AU -8.48106759e+06 4.91431093e+06 -8.66403288e+04 ! x y z -1.03310578e+03 -1.80626108e+03 1.07091841e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -238 1.60082213e+06 4.30874135e+04 ! particle number mass Rhill +Body238 1.60082213e+06 4.30874135e+04 ! particle number mass Rhill 1.21404101e+04 !particle radius in AU -1.84578837e+07 9.47798697e+05 -1.11240327e+05 ! x y z -8.38856040e+01 -1.52441650e+03 -4.87143776e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -239 1.46188745e+06 2.54964357e+04 ! particle number mass Rhill +Body239 1.46188745e+06 2.54964357e+04 ! particle number mass Rhill 1.17785087e+04 !particle radius in AU -5.76687798e+06 9.89435129e+06 4.39168015e+04 ! x y z -1.66547278e+03 -9.63693666e+02 4.18572107e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -240 1.57915313e+05 9.48646514e+03 ! particle number mass Rhill +Body240 1.57915313e+05 9.48646514e+03 ! particle number mass Rhill 5.60953779e+03 !particle radius in AU -1.82862969e+06 8.61926907e+06 -1.75357465e+04 ! x y z -2.15498233e+03 -4.93004829e+02 7.64196538e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -241 1.28341909e+05 1.09511933e+04 ! particle number mass Rhill +Body241 1.28341909e+05 1.09511933e+04 ! particle number mass Rhill 7.71421647e+03 !particle radius in AU 3.76525777e+06 -1.03931378e+07 -7.52318459e+04 ! x y z 1.83850823e+03 6.78500036e+02 -6.89947122e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -242 5.79588811e+05 1.46154362e+04 ! particle number mass Rhill +Body242 5.79588811e+05 1.46154362e+04 ! particle number mass Rhill 8.65284640e+03 !particle radius in AU -6.33335198e+06 -5.98167685e+06 -3.08011537e+04 ! x y z 1.53763163e+03 -1.62109001e+03 -2.47037358e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -243 2.16869732e+05 1.24291427e+04 ! particle number mass Rhill +Body243 2.16869732e+05 1.24291427e+04 ! particle number mass Rhill 6.23522281e+03 !particle radius in AU 9.90333087e+06 -4.01192277e+06 6.04079611e+04 ! x y z 7.43355257e+02 1.83366572e+03 -1.58715640e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -244 6.18926402e+05 2.04985663e+04 ! particle number mass Rhill +Body244 6.18926402e+05 2.04985663e+04 ! particle number mass Rhill 1.30331280e+04 !particle radius in AU -5.98502411e+06 1.07946936e+07 4.97027123e+03 ! x y z -1.61657634e+03 -8.93801164e+02 -1.07876442e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -245 7.99727184e+05 2.41966314e+04 ! particle number mass Rhill +Body245 7.99727184e+05 2.41966314e+04 ! particle number mass Rhill 9.63310475e+03 !particle radius in AU -6.59615203e+06 -1.12304386e+07 9.72528165e+04 ! x y z 1.57957874e+03 -9.09183472e+02 3.54133115e-01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -246 2.80300938e+05 1.19230190e+04 ! particle number mass Rhill +Body246 2.80300938e+05 1.19230190e+04 ! particle number mass Rhill 6.79194010e+03 !particle radius in AU 8.96651461e+06 1.05824022e+06 -2.00386304e+04 ! x y z -2.80453416e+02 2.17973889e+03 1.20973693e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -247 6.93860397e+05 2.71014582e+04 ! particle number mass Rhill +Body247 6.93860397e+05 2.71014582e+04 ! particle number mass Rhill 9.18776116e+03 !particle radius in AU 1.47368687e+06 1.52540290e+07 1.91344142e+05 ! x y z -1.67085873e+03 1.59690705e+02 -2.30924434e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -248 2.21045128e+05 1.62927419e+04 ! particle number mass Rhill +Body248 2.21045128e+05 1.62927419e+04 ! particle number mass Rhill 9.24689597e+03 !particle radius in AU -1.31122397e+06 1.35322324e+07 5.51107975e+04 ! x y z -1.76733822e+03 -1.66895030e+02 1.40149353e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -249 1.57513562e+05 9.70901785e+03 ! particle number mass Rhill +Body249 1.57513562e+05 9.70901785e+03 ! particle number mass Rhill 8.25926956e+03 !particle radius in AU 6.67718106e+06 -6.31157792e+06 2.26609344e+04 ! x y z 1.50456951e+03 1.52943679e+03 8.18042830e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -250 3.40949521e+05 1.56136944e+04 ! particle number mass Rhill +Body250 3.40949521e+05 1.56136944e+04 ! particle number mass Rhill 1.06839624e+04 !particle radius in AU -9.16360265e+06 6.32922451e+06 2.58199480e+03 ! x y z -1.14874981e+03 -1.60466496e+03 1.97944632e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -251 2.67400890e+05 1.60281390e+04 ! particle number mass Rhill +Body251 2.67400890e+05 1.60281390e+04 ! particle number mass Rhill 6.68610634e+03 !particle radius in AU -1.15940056e+07 4.46540148e+06 -5.91615241e+04 ! x y z -6.61054922e+02 -1.74552414e+03 3.85473780e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -252 1.90980773e+05 1.02400192e+04 ! particle number mass Rhill +Body252 1.90980773e+05 1.02400192e+04 ! particle number mass Rhill 5.97652691e+03 !particle radius in AU 7.27954173e+05 8.98873006e+06 3.22170920e+04 ! x y z -2.16869199e+03 1.52559195e+02 -7.62441611e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -253 8.81577356e+05 2.66619325e+04 ! particle number mass Rhill +Body253 8.81577356e+05 2.66619325e+04 ! particle number mass Rhill 9.95113166e+03 !particle radius in AU -7.91834556e+06 1.12541780e+07 -7.01445845e+04 ! x y z -1.45888232e+03 -1.02209811e+03 -1.64204126e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -254 1.74268386e+05 1.73117817e+04 ! particle number mass Rhill +Body254 1.74268386e+05 1.73117817e+04 ! particle number mass Rhill 5.79684738e+03 !particle radius in AU -1.33826547e+07 -7.97098248e+06 5.10482753e+03 ! x y z 8.38898161e+02 -1.43447217e+03 1.26393376e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -255 7.87919903e+04 9.41855233e+03 ! particle number mass Rhill +Body255 7.87919903e+04 9.41855233e+03 ! particle number mass Rhill 6.55636334e+03 !particle radius in AU 1.00439607e+07 -4.85348750e+06 1.01261466e+05 ! x y z 8.20741840e+02 1.77276708e+03 -5.85913488e-01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -256 2.69480282e+05 1.23931951e+04 ! particle number mass Rhill +Body256 2.69480282e+05 1.23931951e+04 ! particle number mass Rhill 6.70339268e+03 !particle radius in AU 2.04930949e+06 -9.32239452e+06 -2.24373576e+04 ! x y z 2.07456592e+03 4.98065963e+02 1.20751769e-02 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -257 2.46903228e+05 2.89142381e+04 ! particle number mass Rhill +Body257 2.46903228e+05 2.89142381e+04 ! particle number mass Rhill 6.51070352e+03 !particle radius in AU -2.17215478e+07 -8.78835015e+06 -4.01495560e+04 ! x y z 5.14278406e+02 -1.24501793e+03 7.48973214e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -258 1.23878170e+06 2.56018645e+04 ! particle number mass Rhill +Body258 1.23878170e+06 2.56018645e+04 ! particle number mass Rhill 1.11459543e+04 !particle radius in AU 1.20260148e+07 1.50890452e+06 -8.61170776e+04 ! x y z -2.28727670e+02 1.85884268e+03 1.03561533e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -259 2.00656446e+05 1.10598095e+04 ! particle number mass Rhill +Body259 2.00656446e+05 1.10598095e+04 ! particle number mass Rhill 8.95337335e+03 !particle radius in AU 6.77964628e+06 6.80088173e+06 3.59640048e+04 ! x y z -1.51037716e+03 1.46534327e+03 4.36610744e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -260 1.07191143e+05 1.87922625e+04 ! particle number mass Rhill +Body260 1.07191143e+05 1.87922625e+04 ! particle number mass Rhill 7.26477146e+03 !particle radius in AU 1.93741347e+07 4.35856951e+06 -7.05507935e+02 ! x y z -2.95958141e+02 1.44257652e+03 3.98161720e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -261 4.58808583e+05 2.25128613e+04 ! particle number mass Rhill +Body261 4.58808583e+05 2.25128613e+04 ! particle number mass Rhill 1.17954044e+04 !particle radius in AU -1.36515521e+07 5.47808328e+06 2.30862197e+04 ! x y z -6.21116352e+02 -1.59076755e+03 -4.14797264e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -262 2.90655410e+05 1.74532512e+04 ! particle number mass Rhill +Body262 2.90655410e+05 1.74532512e+04 ! particle number mass Rhill 1.01304435e+04 !particle radius in AU 1.29557484e+07 -3.33144253e+06 5.90527945e+04 ! x y z 4.53468556e+02 1.72544679e+03 8.55651480e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -263 7.08997716e+04 1.09670527e+04 ! particle number mass Rhill +Body263 7.08997716e+04 1.09670527e+04 ! particle number mass Rhill 4.29537029e+03 !particle radius in AU 1.22881970e+07 4.73181161e+06 8.31929270e+04 ! x y z -6.58468588e+02 1.69384960e+03 -1.28940832e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -264 1.34411988e+05 1.57738727e+04 ! particle number mass Rhill +Body264 1.34411988e+05 1.57738727e+04 ! particle number mass Rhill 5.31616352e+03 !particle radius in AU 1.42705581e+07 -5.59919890e+06 -1.20173006e+04 ! x y z 6.15518752e+02 1.56633732e+03 -3.00095341e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -265 6.21292858e+05 2.92546564e+04 ! particle number mass Rhill +Body265 6.21292858e+05 2.92546564e+04 ! particle number mass Rhill 1.30497175e+04 !particle radius in AU 1.22157187e+07 1.21158385e+07 -1.89187958e+04 ! x y z -1.13185306e+03 1.10567360e+03 -1.20248978e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -266 4.37332958e+04 6.44253036e+03 ! particle number mass Rhill +Body266 4.37332958e+04 6.44253036e+03 ! particle number mass Rhill 5.38815059e+03 !particle radius in AU 3.95878049e+06 -8.23148660e+06 5.75314545e+04 ! x y z 1.96980210e+03 9.25868395e+02 1.73432582e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -267 1.43659648e+06 2.53518437e+04 ! particle number mass Rhill +Body267 1.43659648e+06 2.53518437e+04 ! particle number mass Rhill 1.17101897e+04 !particle radius in AU -3.77919432e+06 1.07609723e+07 -5.23499337e+04 ! x y z -1.82204789e+03 -6.43288095e+02 1.18800083e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -268 8.39702253e+04 1.22379070e+04 ! particle number mass Rhill +Body268 8.39702253e+04 1.22379070e+04 ! particle number mass Rhill 6.69695574e+03 !particle radius in AU -1.05319563e+07 9.02628865e+06 7.76373874e+04 ! x y z -1.14418489e+03 -1.35282145e+03 -8.67554957e-01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -269 6.87209763e+04 9.36137706e+03 ! particle number mass Rhill +Body269 6.87209763e+04 9.36137706e+03 ! particle number mass Rhill 4.25091189e+03 !particle radius in AU 1.11472461e+07 3.88496928e+06 2.24744875e+04 ! x y z -6.24929449e+02 1.77558367e+03 1.82397206e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -270 8.93056834e+05 2.02090263e+04 ! particle number mass Rhill +Body270 8.93056834e+05 2.02090263e+04 ! particle number mass Rhill 9.99413848e+03 !particle radius in AU 7.13225296e+06 7.84741088e+06 7.08528372e+04 ! x y z -1.47773160e+03 1.36033625e+03 -6.05338364e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -271 7.72395853e+04 1.53049462e+04 ! particle number mass Rhill +Body271 7.72395853e+04 1.53049462e+04 ! particle number mass Rhill 4.41976293e+03 !particle radius in AU 1.57340361e+07 -9.25306632e+06 1.05005348e+05 ! x y z 7.63951994e+02 1.32212390e+03 -5.72592279e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -272 1.17326453e+05 1.78660442e+04 ! particle number mass Rhill +Body272 1.17326453e+05 1.78660442e+04 ! particle number mass Rhill 7.48688169e+03 !particle radius in AU 1.78996895e+07 -3.23122702e+06 -8.50474408e+04 ! x y z 2.79448983e+02 1.51858349e+03 1.07776473e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -273 2.64759082e+05 1.14529225e+04 ! particle number mass Rhill +Body273 2.64759082e+05 1.14529225e+04 ! particle number mass Rhill 9.82017615e+03 !particle radius in AU -1.25291109e+06 8.92261901e+06 6.19393261e+04 ! x y z -2.15215968e+03 -3.42916287e+02 5.69467556e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -274 9.28436033e+04 1.03254647e+04 ! particle number mass Rhill +Body274 9.28436033e+04 1.03254647e+04 ! particle number mass Rhill 6.92499799e+03 !particle radius in AU 3.17829891e+06 -1.10142305e+07 -2.69804501e+04 ! x y z 1.85575994e+03 5.54347759e+02 -8.57029148e-01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -275 1.28358389e+05 1.04813501e+04 ! particle number mass Rhill +Body275 1.28358389e+05 1.04813501e+04 ! particle number mass Rhill 7.71454664e+03 !particle radius in AU -1.52137099e+06 1.03039110e+07 -2.28129443e+04 ! x y z -2.01239392e+03 -3.00583105e+02 1.82997128e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -276 1.71849481e+06 2.43554180e+04 ! particle number mass Rhill +Body276 1.71849481e+06 2.43554180e+04 ! particle number mass Rhill 1.24308761e+04 !particle radius in AU 7.58255782e+06 -6.89244058e+06 -4.22200409e+04 ! x y z 1.36574672e+03 1.52351062e+03 -3.42663337e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -277 1.76580097e+06 2.81722435e+04 ! particle number mass Rhill +Body277 1.76580097e+06 2.81722435e+04 ! particle number mass Rhill 1.25439096e+04 !particle radius in AU -8.20564828e+06 8.24671241e+06 -1.78987991e+05 ! x y z -1.37211179e+03 -1.35613094e+03 5.81977986e-01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -278 2.66657642e+05 1.86850925e+04 ! particle number mass Rhill +Body278 2.66657642e+05 1.86850925e+04 ! particle number mass Rhill 9.84359343e+03 !particle radius in AU 8.14883976e+06 -1.20311130e+07 2.81646262e+04 ! x y z 1.42418230e+03 9.71290645e+02 -1.65557105e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -279 1.67849030e+06 2.16729264e+04 ! particle number mass Rhill +Body279 1.67849030e+06 2.16729264e+04 ! particle number mass Rhill 1.23336592e+04 !particle radius in AU 2.74582126e+06 -8.71763630e+06 6.44092995e+04 ! x y z 2.06453659e+03 6.75538119e+02 -1.84554482e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -280 3.33306167e+05 1.37489654e+04 ! particle number mass Rhill +Body280 3.33306167e+05 1.37489654e+04 ! particle number mass Rhill 1.06035211e+04 !particle radius in AU 7.67980194e+06 -6.41178879e+06 9.39794316e+04 ! x y z 1.32508200e+03 1.58960541e+03 -1.68646923e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -281 2.90036427e+05 1.42298817e+04 ! particle number mass Rhill +Body281 2.90036427e+05 1.42298817e+04 ! particle number mass Rhill 1.01232471e+04 !particle radius in AU 1.08862914e+07 -1.69171267e+06 1.06890002e+04 ! x y z 2.66940523e+02 1.93825037e+03 -3.17829482e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -282 2.08854812e+05 2.58329628e+04 ! particle number mass Rhill +Body282 2.08854812e+05 2.58329628e+04 ! particle number mass Rhill 9.07368751e+03 !particle radius in AU -2.12855771e+07 -6.22047593e+06 4.09709267e+04 ! x y z 3.86441604e+02 -1.32836590e+03 2.12243761e-02 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -283 1.09299260e+06 1.84417787e+04 ! particle number mass Rhill +Body283 1.09299260e+06 1.84417787e+04 ! particle number mass Rhill 1.06903372e+04 !particle radius in AU 1.19425206e+06 -8.91233794e+06 3.55973631e+04 ! x y z 2.17359618e+03 2.49148190e+02 5.23202275e-01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -284 1.46324679e+04 4.71419267e+03 ! particle number mass Rhill +Body284 1.46324679e+04 4.71419267e+03 ! particle number mass Rhill 3.74060212e+03 !particle radius in AU 9.56786350e+06 4.49949446e+05 3.82232625e+04 ! x y z -9.15404876e+01 2.12884256e+03 -8.93875847e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -285 1.40182455e+05 9.14605142e+03 ! particle number mass Rhill +Body285 1.40182455e+05 9.14605142e+03 ! particle number mass Rhill 7.94450563e+03 !particle radius in AU 2.52449139e+06 -8.63435263e+06 3.47588448e+03 ! x y z 2.08621300e+03 5.91911411e+02 -3.57309299e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -286 1.06034598e+05 1.24338277e+04 ! particle number mass Rhill +Body286 1.06034598e+05 1.24338277e+04 ! particle number mass Rhill 4.91211126e+03 !particle radius in AU 1.30335501e+07 -9.18110749e+05 -5.93800312e+04 ! x y z 1.10189733e+02 1.82033941e+03 -1.02966654e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -287 3.46450949e+05 1.43804817e+04 ! particle number mass Rhill +Body287 3.46450949e+05 1.43804817e+04 ! particle number mass Rhill 1.07411202e+04 !particle radius in AU -8.43406318e+06 -5.93404434e+06 2.36715133e+04 ! x y z 1.16500133e+03 -1.67478526e+03 9.48734166e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -288 1.56983400e+05 1.31094123e+04 ! particle number mass Rhill +Body288 1.56983400e+05 1.31094123e+04 ! particle number mass Rhill 5.59848141e+03 !particle radius in AU 1.45797657e+06 -1.20421345e+07 -3.75037404e+04 ! x y z 1.87575411e+03 2.26832585e+02 1.21113356e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -289 2.48666520e+05 1.14701907e+04 ! particle number mass Rhill +Body289 2.48666520e+05 1.14701907e+04 ! particle number mass Rhill 9.61704013e+03 !particle radius in AU 7.82736208e+06 -4.81216442e+06 6.09982286e+04 ! x y z 1.09482209e+03 1.86309298e+03 2.82110626e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -290 5.65388384e+05 2.38333682e+04 ! particle number mass Rhill +Body290 5.65388384e+05 2.38333682e+04 ! particle number mass Rhill 1.26459448e+04 !particle radius in AU -1.04983951e+07 -9.78210039e+06 4.04999757e+04 ! x y z 1.16976801e+03 -1.28733444e+03 3.36107675e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -291 4.58299747e+05 1.37934417e+04 ! particle number mass Rhill +Body291 4.58299747e+05 1.37934417e+04 ! particle number mass Rhill 8.00145320e+03 !particle radius in AU -8.88059070e+06 -1.48350388e+06 -3.65798996e+04 ! x y z 3.63914783e+02 -2.15370844e+03 -4.03870858e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -292 2.30030563e+04 6.14927674e+03 ! particle number mass Rhill +Body292 2.30030563e+04 6.14927674e+03 ! particle number mass Rhill 4.34941489e+03 !particle radius in AU 1.71799482e+06 -1.11150786e+07 -1.11600323e+04 ! x y z 1.89156931e+03 3.37161187e+02 -5.00763335e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -293 7.08749007e+04 1.18059055e+04 ! particle number mass Rhill +Body293 7.08749007e+04 1.18059055e+04 ! particle number mass Rhill 4.29486797e+03 !particle radius in AU 1.22676746e+07 -7.93082840e+06 -7.55901444e+04 ! x y z 9.10780310e+02 1.43519257e+03 -9.59182854e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -294 1.21450320e+06 2.13409537e+04 ! particle number mass Rhill +Body294 1.21450320e+06 2.13409537e+04 ! particle number mass Rhill 1.10726580e+04 !particle radius in AU 6.08378238e+06 -7.87148142e+06 -2.39812665e+04 ! x y z 1.65441655e+03 1.27707568e+03 -1.18584893e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -295 4.34793722e+05 1.91206475e+04 ! particle number mass Rhill +Body295 4.34793722e+05 1.91206475e+04 ! particle number mass Rhill 1.15859081e+04 !particle radius in AU 5.05198031e+06 1.16964703e+07 1.98330665e+04 ! x y z -1.69333923e+03 7.02450436e+02 2.04857518e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -296 5.88218517e+05 2.95301840e+04 ! particle number mass Rhill +Body296 5.88218517e+05 2.95301840e+04 ! particle number mass Rhill 8.69558011e+03 !particle radius in AU -2.23024582e+06 1.75885326e+07 3.84168836e+04 ! x y z -1.54534740e+03 -1.88777263e+02 1.39357869e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -297 8.46851500e+04 1.21295826e+04 ! particle number mass Rhill +Body297 8.46851500e+04 1.21295826e+04 ! particle number mass Rhill 6.71590808e+03 !particle radius in AU 1.11164532e+07 8.01001814e+06 1.06625699e+05 ! x y z -1.04365443e+03 1.44565605e+03 2.11662748e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -298 1.24155519e+06 2.60986227e+04 ! particle number mass Rhill +Body298 1.24155519e+06 2.60986227e+04 ! particle number mass Rhill 1.11542662e+04 !particle radius in AU -1.17258082e+06 -1.22657889e+07 4.54924052e+04 ! x y z 1.84907037e+03 -1.95731556e+02 1.04424396e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -299 5.36470228e+04 6.78707710e+03 ! particle number mass Rhill +Body299 5.36470228e+04 6.78707710e+03 ! particle number mass Rhill 5.76789746e+03 !particle radius in AU 8.87472318e+06 -1.41477847e+06 9.96850714e+03 ! x y z 3.48170496e+02 2.16686116e+03 6.86996341e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -300 2.28532347e+05 1.30656897e+04 ! particle number mass Rhill +Body300 2.28532347e+05 1.30656897e+04 ! particle number mass Rhill 9.35014220e+03 !particle radius in AU -1.06755868e+07 -2.26215221e+06 -1.03098190e+04 ! x y z 4.22938170e+02 -1.92356457e+03 -6.44322506e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -301 7.16670668e+04 9.43142814e+03 ! particle number mass Rhill +Body301 7.16670668e+04 9.43142814e+03 ! particle number mass Rhill 6.35246381e+03 !particle radius in AU -1.15286614e+07 6.85922305e+05 -2.50421030e+03 ! x y z -1.47622259e+02 -1.91263388e+03 -2.66811177e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -302 3.41791273e+05 1.66815993e+04 ! particle number mass Rhill +Body302 3.41791273e+05 1.66815993e+04 ! particle number mass Rhill 7.25614557e+03 !particle radius in AU -1.14907610e+07 3.12025122e+06 -5.05043492e+04 ! x y z -4.96419350e+02 -1.84148364e+03 1.23574710e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -303 3.02600957e+05 1.57068129e+04 ! particle number mass Rhill +Body303 3.02600957e+05 1.57068129e+04 ! particle number mass Rhill 1.02673671e+04 !particle radius in AU 3.52540674e+06 1.12335432e+07 5.00575123e+04 ! x y z -1.81448873e+03 5.96787301e+02 1.05390435e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -304 1.24634953e+05 1.85683375e+04 ! particle number mass Rhill +Body304 1.24634953e+05 1.85683375e+04 ! particle number mass Rhill 7.63921866e+03 !particle radius in AU -1.63903863e+07 9.01968445e+06 -1.03768934e+05 ! x y z -7.30657688e+02 -1.32744569e+03 -3.28089387e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -305 1.06580756e+06 2.24671215e+04 ! particle number mass Rhill +Body305 1.06580756e+06 2.24671215e+04 ! particle number mass Rhill 1.06009616e+04 !particle radius in AU 1.01396523e+07 -4.81960415e+06 4.30193977e+03 ! x y z 8.23199841e+02 1.75908251e+03 4.33811421e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -306 1.05002762e+06 2.40980448e+04 ! particle number mass Rhill +Body306 1.05002762e+06 2.40980448e+04 ! particle number mass Rhill 1.05483834e+04 !particle radius in AU 1.06454895e+07 5.05879867e+06 5.08283132e+04 ! x y z -8.22304047e+02 1.73567086e+03 1.93532669e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -307 4.27056844e+05 2.36784291e+04 ! particle number mass Rhill +Body307 4.27056844e+05 2.36784291e+04 ! particle number mass Rhill 7.81533428e+03 !particle radius in AU -1.60755914e+07 -7.66558706e+05 1.42941147e+04 ! x y z 6.22982075e+01 -1.61863536e+03 -1.60725073e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -308 1.39222251e+06 1.99143819e+04 ! particle number mass Rhill +Body308 1.39222251e+06 1.99143819e+04 ! particle number mass Rhill 1.15883574e+04 !particle radius in AU -1.46060477e+06 -8.99385191e+06 -3.08209444e+04 ! x y z 2.13011898e+03 -3.25298595e+02 2.80216541e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -309 1.27802909e+06 1.93841179e+04 ! particle number mass Rhill +Body309 1.27802909e+06 1.93841179e+04 ! particle number mass Rhill 1.12624422e+04 !particle radius in AU -1.41660966e+06 8.99035717e+06 1.40528615e+04 ! x y z -2.12617696e+03 -3.75024767e+02 -9.07028597e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -310 1.60563896e+06 2.27299762e+04 ! particle number mass Rhill +Body310 1.60563896e+06 2.27299762e+04 ! particle number mass Rhill 1.21525746e+04 !particle radius in AU 8.84712919e+06 3.96421798e+06 1.13803740e+04 ! x y z -8.83218100e+02 1.91945493e+03 3.31259998e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -311 1.63391111e+05 1.36375912e+04 ! particle number mass Rhill +Body311 1.63391111e+05 1.36375912e+04 ! particle number mass Rhill 5.67364039e+03 !particle radius in AU 6.88657663e+06 -1.05966202e+07 1.71451160e+03 ! x y z 1.56481452e+03 9.63079720e+02 1.94534764e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -312 3.67336673e+05 1.47597955e+04 ! particle number mass Rhill +Body312 3.67336673e+05 1.47597955e+04 ! particle number mass Rhill 7.43259427e+03 !particle radius in AU -8.85269678e+06 5.44905716e+06 -5.60825695e+04 ! x y z -1.07596431e+03 -1.72186966e+03 1.77805310e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -313 4.77242503e+05 2.18809563e+04 ! particle number mass Rhill +Body313 4.77242503e+05 2.18809563e+04 ! particle number mass Rhill 1.19513059e+04 !particle radius in AU 3.11450797e+06 -1.37495078e+07 -3.57099214e+04 ! x y z 1.70202965e+03 3.85543507e+02 -4.49001111e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -314 3.74348891e+05 1.43810422e+04 ! particle number mass Rhill +Body314 3.74348891e+05 1.43810422e+04 ! particle number mass Rhill 1.10220195e+04 !particle radius in AU -9.00924085e+06 4.66367866e+06 1.26574464e+04 ! x y z -9.50214730e+02 -1.81339232e+03 -1.20100516e-01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -315 1.15108819e+05 1.05231234e+04 ! particle number mass Rhill +Body315 1.15108819e+05 1.05231234e+04 ! particle number mass Rhill 5.04841672e+03 !particle radius in AU -1.08865724e+07 1.89436312e+06 -5.35372336e+04 ! x y z -3.54360414e+02 -1.92451382e+03 8.24540973e-02 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -316 2.00402722e+04 9.01916105e+03 ! particle number mass Rhill +Body316 2.00402722e+04 9.01916105e+03 ! particle number mass Rhill 4.15403541e+03 !particle radius in AU 1.55751438e+07 6.03420204e+06 -2.57378814e+04 ! x y z -5.81737732e+02 1.49479237e+03 -7.62983212e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -317 1.36478455e+06 2.35917682e+04 ! particle number mass Rhill +Body317 1.36478455e+06 2.35917682e+04 ! particle number mass Rhill 1.15117238e+04 !particle radius in AU 1.06056911e+07 8.74976261e+04 -1.72290821e+03 ! x y z -1.77150357e+01 2.02140459e+03 -2.31012980e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -318 1.25503882e+06 2.69799096e+04 ! particle number mass Rhill +Body318 1.25503882e+06 2.69799096e+04 ! particle number mass Rhill 1.11945004e+04 !particle radius in AU -6.72042968e+06 -1.07531738e+07 5.09281015e+04 ! x y z 1.56397473e+03 -9.57368328e+02 -1.25364327e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -319 3.83212506e+05 1.74228564e+04 ! particle number mass Rhill +Body319 3.83212506e+05 1.74228564e+04 ! particle number mass Rhill 7.53816353e+03 !particle radius in AU 4.10458407e+06 -1.13623664e+07 -9.48469623e+04 ! x y z 1.78215300e+03 6.13680096e+02 -7.93502985e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -320 1.19861178e+05 1.06361705e+04 ! particle number mass Rhill +Body320 1.19861178e+05 1.06361705e+04 ! particle number mass Rhill 7.54041364e+03 !particle radius in AU 8.42747503e+06 -6.97349936e+06 -2.15671129e+04 ! x y z 1.26552336e+03 1.51523836e+03 2.12892191e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -321 2.76964902e+05 1.82031961e+04 ! particle number mass Rhill +Body321 2.76964902e+05 1.82031961e+04 ! particle number mass Rhill 6.76488745e+03 !particle radius in AU -1.31213742e+07 -4.58561120e+06 1.53600301e+04 ! x y z 5.82359194e+02 -1.66882713e+03 1.14079207e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -322 7.97652582e+04 8.90232552e+03 ! particle number mass Rhill +Body322 7.97652582e+04 8.90232552e+03 ! particle number mass Rhill 6.58324849e+03 !particle radius in AU -7.56393159e+06 7.09659926e+06 -4.65315976e+04 ! x y z -1.36862256e+03 -1.51081343e+03 1.13488899e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -323 1.71360917e+05 1.02338425e+04 ! particle number mass Rhill +Body323 1.71360917e+05 1.02338425e+04 ! particle number mass Rhill 8.49453445e+03 !particle radius in AU 4.46247777e+06 -8.10645059e+06 1.43618351e+04 ! x y z 1.90934802e+03 1.00293881e+03 8.21819949e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -324 8.86224252e+04 9.60497307e+03 ! particle number mass Rhill +Body324 8.86224252e+04 9.60497307e+03 ! particle number mass Rhill 6.81841660e+03 !particle radius in AU -9.96034566e+06 4.35537723e+06 -1.20286093e+04 ! x y z -7.67471215e+02 -1.83079175e+03 -1.31980560e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -325 3.61520873e+05 1.66400018e+04 ! particle number mass Rhill +Body325 3.61520873e+05 1.66400018e+04 ! particle number mass Rhill 1.08946542e+04 !particle radius in AU -1.14760721e+07 3.70943531e+06 -9.49844421e+04 ! x y z -5.95286906e+02 -1.76496467e+03 3.00728950e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -326 1.75021180e+06 3.81751240e+04 ! particle number mass Rhill +Body326 1.75021180e+06 3.81751240e+04 ! particle number mass Rhill 1.25068862e+04 !particle radius in AU -1.57425262e+07 -1.71485068e+06 5.83418789e+04 ! x y z 1.83396886e+02 -1.64215306e+03 1.76834645e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -327 1.32994897e+06 2.00857686e+04 ! particle number mass Rhill +Body327 1.32994897e+06 2.00857686e+04 ! particle number mass Rhill 1.14129344e+04 !particle radius in AU -5.50533612e+06 -7.29539312e+06 -4.19582765e+04 ! x y z 1.70576164e+03 -1.34793657e+03 3.36918899e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -328 1.21855656e+05 9.07633350e+03 ! particle number mass Rhill +Body328 1.21855656e+05 9.07633350e+03 ! particle number mass Rhill 7.58200769e+03 !particle radius in AU -1.84334893e+06 9.13437442e+06 -6.98626074e+03 ! x y z -2.09435634e+03 -4.13549777e+02 1.31091798e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -329 1.40955037e+06 2.89016258e+04 ! particle number mass Rhill +Body329 1.40955037e+06 2.89016258e+04 ! particle number mass Rhill 1.16362363e+04 !particle radius in AU -8.24556722e+05 1.30406598e+07 9.22800110e+04 ! x y z -1.80291385e+03 -1.14208577e+02 5.06777815e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -330 1.58828247e+05 1.37321216e+04 ! particle number mass Rhill +Body330 1.58828247e+05 1.37321216e+04 ! particle number mass Rhill 8.28218455e+03 !particle radius in AU -9.92787386e+06 7.89436638e+06 5.47155159e+04 ! x y z -1.15186100e+03 -1.44221325e+03 -1.43299470e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -331 1.65396738e+05 2.50325908e+04 ! particle number mass Rhill +Body331 1.65396738e+05 2.50325908e+04 ! particle number mass Rhill 5.69676070e+03 !particle radius in AU -1.72820033e+07 -1.54859445e+07 -1.76600870e+05 ! x y z 9.00952544e+02 -1.00938815e+03 5.52976287e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -332 4.50908324e+05 1.60135274e+04 ! particle number mass Rhill +Body332 4.50908324e+05 1.60135274e+04 ! particle number mass Rhill 1.17273100e+04 !particle radius in AU 7.54874149e+06 -7.34865635e+06 1.58691383e+04 ! x y z 1.40447688e+03 1.44745232e+03 -1.19902506e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -333 3.88265588e+05 1.76282129e+04 ! particle number mass Rhill +Body333 3.88265588e+05 1.76282129e+04 ! particle number mass Rhill 7.57115197e+03 !particle radius in AU 6.70925482e+06 1.02233476e+07 -8.94168570e+04 ! x y z -1.57673538e+03 1.00346927e+03 -1.54449677e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -334 3.44291979e+05 1.32450561e+04 ! particle number mass Rhill +Body334 3.44291979e+05 1.32450561e+04 ! particle number mass Rhill 1.07187619e+04 !particle radius in AU -9.38875782e+06 -1.03278172e+06 4.07424683e+04 ! x y z 2.57699240e+02 -2.12423408e+03 -1.75552004e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -335 1.35334256e+05 1.01627003e+04 ! particle number mass Rhill +Body335 1.35334256e+05 1.01627003e+04 ! particle number mass Rhill 7.85184231e+03 !particle radius in AU 9.27514180e+06 3.60605892e+06 -8.97298126e+03 ! x y z -7.45316219e+02 1.94032830e+03 2.50725751e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -336 5.49037875e+04 6.70694447e+03 ! particle number mass Rhill +Body336 5.49037875e+04 6.70694447e+03 ! particle number mass Rhill 5.81259090e+03 !particle radius in AU 2.84715606e+05 -8.96387040e+06 -7.61793089e+04 ! x y z 2.17642987e+03 7.44775849e+01 5.43474351e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -337 1.06085076e+06 1.97907369e+04 ! particle number mass Rhill +Body337 1.06085076e+06 1.97907369e+04 ! particle number mass Rhill 1.05845019e+04 !particle radius in AU 4.23618089e+06 8.82455069e+06 -3.58009197e+04 ! x y z -1.88592236e+03 9.06205367e+02 -1.32060735e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -338 2.06072803e+05 1.29338641e+04 ! particle number mass Rhill +Body338 2.06072803e+05 1.29338641e+04 ! particle number mass Rhill 9.03321920e+03 !particle radius in AU 8.99412766e+06 -6.25093595e+06 5.78854309e+04 ! x y z 1.13268666e+03 1.63171487e+03 -3.80887879e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -339 1.09138269e+06 2.10029891e+04 ! particle number mass Rhill +Body339 1.09138269e+06 2.10029891e+04 ! particle number mass Rhill 1.06850859e+04 !particle radius in AU 8.95756676e+06 -5.04120234e+06 4.46604404e+04 ! x y z 9.97476295e+02 1.78291720e+03 1.83929026e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -340 1.18742709e+06 2.48211822e+04 ! particle number mass Rhill +Body340 1.18742709e+06 2.48211822e+04 ! particle number mass Rhill 1.09897543e+04 !particle radius in AU -6.88398435e+06 -9.59185877e+06 5.44110030e+04 ! x y z 1.53704986e+03 -1.12804795e+03 1.33934445e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -341 8.61407126e+04 8.77159648e+03 ! particle number mass Rhill +Body341 8.61407126e+04 8.77159648e+03 ! particle number mass Rhill 6.75416723e+03 !particle radius in AU 4.06115845e+06 9.20664592e+06 1.44995295e+04 ! x y z -1.87321421e+03 8.55264917e+02 4.54558328e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -342 6.83606027e+04 1.06731784e+04 ! particle number mass Rhill +Body342 6.83606027e+04 1.06731784e+04 ! particle number mass Rhill 4.24346826e+03 !particle radius in AU 5.83709056e+06 1.18773019e+07 -1.78313453e+04 ! x y z -1.60438748e+03 8.04911839e+02 7.87147192e-01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -343 5.80242151e+05 1.62202808e+04 ! particle number mass Rhill +Body343 5.80242151e+05 1.62202808e+04 ! particle number mass Rhill 1.27557328e+04 !particle radius in AU -9.82331264e+06 -1.72475014e+06 -4.50474397e+04 ! x y z 3.80035552e+02 -2.02006276e+03 1.41607704e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -344 8.02642827e+04 8.37530219e+03 ! particle number mass Rhill +Body344 8.02642827e+04 8.37530219e+03 ! particle number mass Rhill 6.59694858e+03 !particle radius in AU -9.75150606e+06 1.14173962e+06 1.90738112e+04 ! x y z -2.44986733e+02 -2.07228361e+03 4.28819137e-01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -345 1.76055567e+06 2.24567768e+04 ! particle number mass Rhill +Body345 1.76055567e+06 2.24567768e+04 ! particle number mass Rhill 1.25314767e+04 !particle radius in AU 8.89271698e+06 -2.80889036e+06 -9.05088712e+04 ! x y z 6.43083392e+02 2.05152117e+03 5.84263642e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -346 1.47293265e+05 9.27562637e+03 ! particle number mass Rhill +Body346 1.47293265e+05 9.27562637e+03 ! particle number mass Rhill 5.48083372e+03 !particle radius in AU 5.55138431e+05 8.96699891e+06 -2.02907914e+03 ! x y z -2.16543193e+03 1.17824020e+02 1.89028293e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -347 9.25475148e+05 2.45394415e+04 ! particle number mass Rhill +Body347 9.25475148e+05 2.45394415e+04 ! particle number mass Rhill 1.01136344e+04 !particle radius in AU 1.08689498e+07 6.77891019e+06 -1.57957399e+05 ! x y z -9.58257682e+02 1.54874788e+03 -4.38996175e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -348 1.53116579e+06 2.57152347e+04 ! particle number mass Rhill +Body348 1.53116579e+06 2.57152347e+04 ! particle number mass Rhill 1.19617045e+04 !particle radius in AU -3.46641057e+06 1.06366697e+07 -4.89091419e+04 ! x y z -1.87369781e+03 -5.85557096e+02 2.64347289e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -349 6.04551146e+05 1.51365545e+04 ! particle number mass Rhill +Body349 6.04551146e+05 1.51365545e+04 ! particle number mass Rhill 1.29314335e+04 !particle radius in AU 7.28383532e+06 5.25991927e+06 -2.74032882e+04 ! x y z -1.28268765e+03 1.77447224e+03 6.54106986e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -350 1.48886859e+05 1.63747204e+04 ! particle number mass Rhill +Body350 1.48886859e+05 1.63747204e+04 ! particle number mass Rhill 5.50052892e+03 !particle radius in AU -4.06177152e+06 -1.52948510e+07 1.69121808e+05 ! x y z 1.57226331e+03 -4.40552105e+02 -4.07139830e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -351 9.88917517e+04 8.68942842e+03 ! particle number mass Rhill +Body351 9.88917517e+04 8.68942842e+03 ! particle number mass Rhill 4.79923872e+03 !particle radius in AU -9.47543528e+06 -9.79695598e+05 -1.53056931e+04 ! x y z 2.01324530e+02 -2.10617058e+03 -1.48150840e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -352 5.31761522e+05 2.89128345e+04 ! particle number mass Rhill +Body352 5.31761522e+05 2.89128345e+04 ! particle number mass Rhill 8.40797283e+03 !particle radius in AU -1.79473215e+07 9.78097521e+05 5.91571461e+04 ! x y z -1.10933113e+02 -1.54125298e+03 1.80243489e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -353 5.93800400e+05 3.46771236e+04 ! particle number mass Rhill +Body353 5.93800400e+05 3.46771236e+04 ! particle number mass Rhill 8.72299905e+03 !particle radius in AU -4.10705239e+06 2.02615072e+07 8.49438827e+04 ! x y z -1.41774938e+03 -2.76831824e+02 -8.09634112e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -354 2.16009390e+04 6.17472898e+03 ! particle number mass Rhill +Body354 2.16009390e+04 6.17472898e+03 ! particle number mass Rhill 4.25918528e+03 !particle radius in AU 9.20347813e+05 1.11635810e+07 4.32283845e+04 ! x y z -1.94746867e+03 1.65365528e+02 5.45495799e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -355 1.24618540e+06 2.22772636e+04 ! particle number mass Rhill +Body355 1.24618540e+06 2.22772636e+04 ! particle number mass Rhill 1.11681152e+04 !particle radius in AU 1.02476212e+07 1.57307556e+06 1.24769819e+04 ! x y z -3.20593926e+02 2.01506970e+03 6.12888669e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -356 2.53529332e+05 1.20865993e+04 ! particle number mass Rhill +Body356 2.53529332e+05 1.20865993e+04 ! particle number mass Rhill 9.67932473e+03 !particle radius in AU -9.41529174e+06 -1.45196651e+06 -3.72716178e+03 ! x y z 3.30034223e+02 -2.10697891e+03 -9.10557070e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -357 3.29029712e+05 1.83883747e+04 ! particle number mass Rhill +Body357 3.29029712e+05 1.83883747e+04 ! particle number mass Rhill 7.16468942e+03 !particle radius in AU 9.63405331e+06 9.48657460e+06 -1.16765431e+05 ! x y z -1.25212013e+03 1.25762974e+03 -8.79471164e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -358 2.17221291e+05 1.52159954e+04 ! particle number mass Rhill +Body358 2.17221291e+05 1.52159954e+04 ! particle number mass Rhill 6.23859022e+03 !particle radius in AU 1.28395429e+07 1.67358191e+05 3.52526511e+04 ! x y z -4.79000239e+01 1.82109236e+03 -7.08024284e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -359 3.25443529e+05 1.78234223e+04 ! particle number mass Rhill +Body359 3.25443529e+05 1.78234223e+04 ! particle number mass Rhill 1.05194783e+04 !particle radius in AU 1.69906243e+05 1.31567065e+07 -2.83802597e+04 ! x y z -1.79852464e+03 -2.60855891e+01 1.09479469e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -360 6.21375843e+05 1.72987397e+04 ! particle number mass Rhill +Body360 6.21375843e+05 1.72987397e+04 ! particle number mass Rhill 1.30502985e+04 !particle radius in AU -8.71409354e+06 -5.07378044e+06 -2.89973508e+04 ! x y z 1.01955016e+03 -1.80816198e+03 1.72703995e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -361 1.19625108e+06 3.45202092e+04 ! particle number mass Rhill +Body361 1.19625108e+06 3.45202092e+04 ! particle number mass Rhill 1.10169094e+04 !particle radius in AU -1.32773676e+07 9.58326159e+06 1.68929446e+04 ! x y z -9.40100121e+02 -1.31837280e+03 -1.11767857e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -362 7.85243061e+05 1.82848577e+04 ! particle number mass Rhill +Body362 7.85243061e+05 1.82848577e+04 ! particle number mass Rhill 9.57459397e+03 !particle radius in AU -8.40811158e+06 5.08930784e+06 5.82263133e+04 ! x y z -1.10041478e+03 -1.79532449e+03 1.45771724e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -363 5.65328014e+04 9.14731336e+03 ! particle number mass Rhill +Body363 5.65328014e+04 9.14731336e+03 ! particle number mass Rhill 3.98308125e+03 !particle radius in AU 1.04113372e+07 -6.20697428e+06 -4.84867208e+03 ! x y z 9.45840262e+02 1.61620978e+03 2.47832189e-01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -364 6.87138794e+05 1.67675123e+04 ! particle number mass Rhill +Body364 6.87138794e+05 1.67675123e+04 ! particle number mass Rhill 9.15799677e+03 !particle radius in AU -8.01518815e+06 -5.01852324e+06 5.17503273e+04 ! x y z 1.12426091e+03 -1.82440187e+03 2.07206048e-02 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -365 3.35461131e+05 1.25266942e+04 ! particle number mass Rhill +Body365 3.35461131e+05 1.25266942e+04 ! particle number mass Rhill 7.21107035e+03 !particle radius in AU 2.07944449e+06 8.94904149e+06 4.13797547e+04 ! x y z -2.09851241e+03 4.60858305e+02 2.54918811e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -366 1.00962284e+05 9.73161122e+03 ! particle number mass Rhill +Body366 1.00962284e+05 9.73161122e+03 ! particle number mass Rhill 7.12123600e+03 !particle radius in AU 9.71543544e+06 -3.75196256e+06 7.97368753e+04 ! x y z 7.42718545e+02 1.90076456e+03 1.83014984e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -367 1.83317034e+05 2.12530285e+04 ! particle number mass Rhill +Body367 1.83317034e+05 2.12530285e+04 ! particle number mass Rhill 8.68766895e+03 !particle radius in AU 1.76238307e+07 7.35273671e+06 8.70758386e+04 ! x y z -5.77591306e+02 1.37259271e+03 3.08504041e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -368 4.69470359e+05 2.23837382e+04 ! particle number mass Rhill +Body368 4.69470359e+05 2.23837382e+04 ! particle number mass Rhill 1.18860727e+04 !particle radius in AU 1.05252406e+07 1.01023349e+07 1.18854193e+04 ! x y z -1.19069656e+03 1.22779101e+03 7.21918511e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -369 1.04756800e+06 2.13183481e+04 ! particle number mass Rhill +Body369 1.04756800e+06 2.13183481e+04 ! particle number mass Rhill 1.05401406e+04 !particle radius in AU -2.44589262e+06 9.98155585e+06 -7.16098465e+04 ! x y z -2.01199959e+03 -4.94158200e+02 1.76332595e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -370 4.18223358e+05 2.54418848e+04 ! particle number mass Rhill +Body370 4.18223358e+05 2.54418848e+04 ! particle number mass Rhill 1.14368147e+04 !particle radius in AU -1.71313810e+07 1.65684524e+05 7.09374774e+04 ! x y z -1.73247831e+01 -1.58285349e+03 5.23281867e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -371 1.20015465e+06 2.17095629e+04 ! particle number mass Rhill +Body371 1.20015465e+06 2.17095629e+04 ! particle number mass Rhill 1.10288797e+04 !particle radius in AU 5.96055313e+06 8.26822848e+06 -6.95116782e+04 ! x y z -1.67280349e+03 1.20494456e+03 -5.49043884e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -372 2.26102763e+04 5.41804252e+03 ! particle number mass Rhill +Body372 2.26102763e+04 5.41804252e+03 ! particle number mass Rhill 4.32451704e+03 !particle radius in AU -4.58351543e+06 8.68653626e+06 -2.19181580e+04 ! x y z -1.82145003e+03 -9.87506692e+02 -1.02913863e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -373 5.78093803e+04 1.24595443e+04 ! particle number mass Rhill +Body373 5.78093803e+04 1.24595443e+04 ! particle number mass Rhill 5.91337055e+03 !particle radius in AU 1.46092641e+06 1.62085257e+07 9.35785200e+04 ! x y z -1.61693894e+03 1.23715914e+02 1.88035614e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -374 2.95683963e+05 1.17235659e+04 ! particle number mass Rhill +Body374 2.95683963e+05 1.17235659e+04 ! particle number mass Rhill 6.91398214e+03 !particle radius in AU 8.37967759e+06 2.86987872e+06 4.97540416e+02 ! x y z -6.79497178e+02 2.09457077e+03 -7.48586459e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -375 4.12889379e+05 1.59172907e+04 ! particle number mass Rhill +Body375 4.12889379e+05 1.59172907e+04 ! particle number mass Rhill 7.72793689e+03 !particle radius in AU 1.00544998e+07 -4.23649556e+06 1.69842871e+04 ! x y z 7.79559289e+02 1.80935311e+03 -9.45690780e-01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -376 1.50756339e+05 9.79244978e+03 ! particle number mass Rhill +Body376 1.50756339e+05 9.79244978e+03 ! particle number mass Rhill 5.52345548e+03 !particle radius in AU 4.97012699e+06 7.77763306e+06 -1.08049137e+05 ! x y z -1.81754065e+03 1.16817211e+03 7.93709072e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -377 4.43444272e+05 1.35175167e+04 ! particle number mass Rhill +Body377 4.43444272e+05 1.35175167e+04 ! particle number mass Rhill 1.16622408e+04 !particle radius in AU -8.56556120e+06 -3.00745478e+06 2.68959103e+04 ! x y z 7.41957227e+02 -2.02442760e+03 5.97293652e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -378 5.12222480e+04 7.36091792e+03 ! particle number mass Rhill +Body378 5.12222480e+04 7.36091792e+03 ! particle number mass Rhill 3.85423811e+03 !particle radius in AU -9.89914954e+06 1.64381375e+06 1.86441037e+04 ! x y z -3.29902217e+02 -2.03621690e+03 -1.49125925e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -379 2.56717090e+05 2.83997991e+04 ! particle number mass Rhill +Body379 2.56717090e+05 2.83997991e+04 ! particle number mass Rhill 9.71972363e+03 !particle radius in AU -1.33296527e+07 -1.79984260e+07 -6.91244815e+03 ! x y z 1.12052368e+03 -8.18620884e+02 -1.17030012e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -380 4.75536554e+05 1.67281272e+04 ! particle number mass Rhill +Body380 4.75536554e+05 1.67281272e+04 ! particle number mass Rhill 8.10053368e+03 !particle radius in AU 2.47744290e+05 1.08515872e+07 8.05332988e+04 ! x y z -1.98242921e+03 4.60702324e+01 -8.10883988e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -381 2.04638999e+05 1.26959685e+04 ! particle number mass Rhill +Body381 2.04638999e+05 1.26959685e+04 ! particle number mass Rhill 9.01222011e+03 !particle radius in AU -1.04485761e+07 -3.19315171e+06 -6.87163868e+04 ! x y z 5.84305730e+02 -1.88680612e+03 1.24994521e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -382 3.60539072e+05 1.69503875e+04 ! particle number mass Rhill +Body382 3.60539072e+05 1.69503875e+04 ! particle number mass Rhill 7.38646156e+03 !particle radius in AU -4.30915405e+06 1.13988191e+07 -1.87898899e+03 ! x y z -1.74153886e+03 -6.58302615e+02 5.64269794e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -383 1.79551829e+04 9.04731795e+03 ! particle number mass Rhill +Body383 1.79551829e+04 9.04731795e+03 ! particle number mass Rhill 4.00465955e+03 !particle radius in AU 1.07629692e+07 1.37789153e+07 5.87066489e+04 ! x y z -1.23476438e+03 9.58354279e+02 -1.51457433e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -384 4.98876102e+05 3.47845056e+04 ! particle number mass Rhill +Body384 4.98876102e+05 3.47845056e+04 ! particle number mass Rhill 8.23094873e+03 !particle radius in AU -2.26919155e+06 -2.23065641e+07 1.71429522e+05 ! x y z 1.36729685e+03 -1.26785143e+02 1.53512073e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -385 3.30264323e+04 5.95784944e+03 ! particle number mass Rhill +Body385 3.30264323e+04 5.95784944e+03 ! particle number mass Rhill 4.90670043e+03 !particle radius in AU -8.76057602e+06 -2.98488729e+06 3.16441575e+04 ! x y z 7.01564230e+02 -2.04784374e+03 6.54428080e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -386 4.63310633e+05 2.64600689e+04 ! particle number mass Rhill +Body386 4.63310633e+05 2.64600689e+04 ! particle number mass Rhill 1.18338596e+04 !particle radius in AU 7.33432561e+06 1.58195231e+07 -1.25526941e+05 ! x y z -1.41716350e+03 6.50084435e+02 1.99363998e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -387 4.19368635e+04 6.95684327e+03 ! particle number mass Rhill +Body387 4.19368635e+04 6.95684327e+03 ! particle number mass Rhill 5.31334038e+03 !particle radius in AU 9.67909368e+06 -3.14679172e+06 1.01149877e+04 ! x y z 6.30534017e+02 1.94451859e+03 1.40841719e-01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -388 2.57496102e+05 1.15319903e+04 ! particle number mass Rhill +Body388 2.57496102e+05 1.15319903e+04 ! particle number mass Rhill 6.60251226e+03 !particle radius in AU 3.58575623e+06 -8.28340933e+06 2.06786831e+04 ! x y z 2.01251169e+03 8.71048387e+02 4.13835680e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -389 4.88910847e+05 2.92163767e+04 ! particle number mass Rhill +Body389 4.88910847e+05 2.92163767e+04 ! particle number mass Rhill 8.17577418e+03 !particle radius in AU -1.59444867e+07 -9.43202143e+06 -1.03432964e+05 ! x y z 7.76368044e+02 -1.31648260e+03 -1.97011404e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -390 5.40974116e+04 7.11908202e+03 ! particle number mass Rhill +Body390 5.40974116e+04 7.11908202e+03 ! particle number mass Rhill 3.92504366e+03 !particle radius in AU 8.15294773e+06 -4.83168922e+06 -2.23196035e+04 ! x y z 1.12438877e+03 1.80730928e+03 -9.96110137e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -391 1.52957016e+05 1.22293609e+04 ! particle number mass Rhill +Body391 1.52957016e+05 1.22293609e+04 ! particle number mass Rhill 5.55020210e+03 !particle radius in AU 1.15608807e+07 -1.72289132e+06 8.78681619e+04 ! x y z 2.64558251e+02 1.88351104e+03 -1.22676546e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -392 1.16028835e+05 1.00480378e+04 ! particle number mass Rhill +Body392 1.16028835e+05 1.00480378e+04 ! particle number mass Rhill 7.45917792e+03 !particle radius in AU 5.94153104e+05 1.04675287e+07 -7.76838952e+04 ! x y z -2.01022149e+03 1.00791259e+02 2.73869669e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -393 2.82021040e+05 1.40688004e+04 ! particle number mass Rhill +Body393 2.82021040e+05 1.40688004e+04 ! particle number mass Rhill 6.80580498e+03 !particle radius in AU 9.10704389e+06 5.66556444e+06 -1.21395685e+05 ! x y z -1.06310456e+03 1.70305461e+03 1.52195271e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -394 3.98007972e+05 2.07887076e+04 ! particle number mass Rhill +Body394 3.98007972e+05 2.07887076e+04 ! particle number mass Rhill 7.63395485e+03 !particle radius in AU -6.14994249e+06 -1.27900562e+07 -1.88907757e+04 ! x y z 1.55814359e+03 -7.78224426e+02 2.73440877e-01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -395 9.71117259e+04 8.84618676e+03 ! particle number mass Rhill +Body395 9.71117259e+04 8.84618676e+03 ! particle number mass Rhill 7.02952878e+03 !particle radius in AU -8.80385560e+06 3.77151207e+06 -1.21818940e+05 ! x y z -8.47944944e+02 -1.95313347e+03 -1.70763192e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -396 4.85180076e+05 1.88181431e+04 ! particle number mass Rhill +Body396 4.85180076e+05 1.88181431e+04 ! particle number mass Rhill 1.20172005e+04 !particle radius in AU 1.08664166e+07 5.36923937e+06 -8.13196573e+04 ! x y z -8.16624638e+02 1.69027839e+03 8.34673628e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -397 2.32920343e+05 1.16940572e+04 ! particle number mass Rhill +Body397 2.32920343e+05 1.16940572e+04 ! particle number mass Rhill 6.38540043e+03 !particle radius in AU -5.47268707e+06 7.90131264e+06 3.38529547e+04 ! x y z -1.73122732e+03 -1.20437649e+03 1.62011748e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -398 1.41454261e+06 2.84156620e+04 ! particle number mass Rhill +Body398 1.41454261e+06 2.84156620e+04 ! particle number mass Rhill 1.16499575e+04 !particle radius in AU 1.10121047e+07 -6.14561995e+06 5.51425169e+04 ! x y z 8.91208138e+02 1.62668641e+03 -4.00812310e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -399 1.73697324e+05 1.64478571e+04 ! particle number mass Rhill +Body399 1.73697324e+05 1.64478571e+04 ! particle number mass Rhill 5.79050854e+03 !particle radius in AU -3.82515764e+06 1.42902315e+07 -2.47878060e+04 ! x y z -1.63598310e+03 -4.85341065e+02 -2.82331478e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -400 1.55709181e+06 2.18057129e+04 ! particle number mass Rhill +Body400 1.55709181e+06 2.18057129e+04 ! particle number mass Rhill 1.20288397e+04 !particle radius in AU -1.84053839e+06 9.22666914e+06 -1.87382012e+04 ! x y z -2.10070573e+03 -4.25824187e+02 -2.45200413e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -401 2.07330430e+05 1.42389392e+04 ! particle number mass Rhill +Body401 2.07330430e+05 1.42389392e+04 ! particle number mass Rhill 6.14242713e+03 !particle radius in AU -7.35737221e+06 -9.68920345e+06 5.93390680e+04 ! x y z 1.50053722e+03 -1.12338599e+03 -1.30933156e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -402 2.66341603e+05 1.31577788e+04 ! particle number mass Rhill +Body402 2.66341603e+05 1.31577788e+04 ! particle number mass Rhill 9.83970306e+03 !particle radius in AU -8.70682368e+06 5.56356570e+06 -6.56478138e+04 ! x y z -1.11346390e+03 -1.70326053e+03 1.28466204e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -403 1.90092636e+05 1.78825398e+04 ! particle number mass Rhill +Body403 1.90092636e+05 1.78825398e+04 ! particle number mass Rhill 5.96724810e+03 !particle radius in AU 7.02500514e+06 -1.38238984e+07 6.74566304e+04 ! x y z 1.48675948e+03 7.65020748e+02 8.19788003e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -404 4.48638932e+05 1.53496689e+04 ! particle number mass Rhill +Body404 4.48638932e+05 1.53496689e+04 ! particle number mass Rhill 1.17076027e+04 !particle radius in AU -9.79856030e+06 2.12372760e+06 1.89480336e+04 ! x y z -4.48830087e+02 -2.02736841e+03 -1.23694959e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -405 1.73398341e+05 2.54379577e+04 ! particle number mass Rhill +Body405 1.73398341e+05 2.54379577e+04 ! particle number mass Rhill 8.52806763e+03 !particle radius in AU -1.01558817e+07 -2.10873547e+07 -2.03636345e+05 ! x y z 1.20616652e+03 -5.87121724e+02 -4.30533916e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -406 5.83945240e+05 2.67498480e+04 ! particle number mass Rhill +Body406 5.83945240e+05 2.67498480e+04 ! particle number mass Rhill 8.67447176e+03 !particle radius in AU 1.10980559e+07 1.19228306e+07 -2.89204661e+04 ! x y z -1.18553044e+03 1.09632262e+03 8.12769922e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -407 2.44311266e+05 1.21893974e+04 ! particle number mass Rhill +Body407 2.44311266e+05 1.21893974e+04 ! particle number mass Rhill 6.48784045e+03 !particle radius in AU 1.00683282e+07 -1.06678967e+05 -7.08192900e+04 ! x y z 7.59653606e-01 2.03836538e+03 -2.00978691e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -408 2.68758985e+05 1.15689067e+04 ! particle number mass Rhill +Body408 2.68758985e+05 1.15689067e+04 ! particle number mass Rhill 9.86938263e+03 !particle radius in AU 8.35393830e+06 3.60269502e+06 -6.29338444e+04 ! x y z -8.43508227e+02 1.99248181e+03 2.35695291e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -409 2.09880806e+05 2.76842944e+04 ! particle number mass Rhill +Body409 2.09880806e+05 2.76842944e+04 ! particle number mass Rhill 9.08852133e+03 !particle radius in AU 7.15716844e+06 2.23969109e+07 -2.43128655e+05 ! x y z -1.28744111e+03 4.04784490e+02 -9.98522887e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -410 4.53834965e+05 1.88574756e+04 ! particle number mass Rhill +Body410 4.53834965e+05 1.88574756e+04 ! particle number mass Rhill 7.97538482e+03 !particle radius in AU 9.79101038e+06 -7.57582171e+06 -6.16544234e+03 ! x y z 1.14324704e+03 1.46779509e+03 -4.09524183e-01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -411 4.95608775e+05 3.36478551e+04 ! particle number mass Rhill +Body411 4.95608775e+05 3.36478551e+04 ! particle number mass Rhill 1.21026921e+04 !particle radius in AU 1.92900217e+07 -9.92716086e+06 -8.71066703e+04 ! x y z 6.46615886e+02 1.23877023e+03 -8.06944804e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -412 4.02159459e+05 1.51756172e+04 ! particle number mass Rhill +Body412 4.02159459e+05 1.51756172e+04 ! particle number mass Rhill 1.12884701e+04 !particle radius in AU 7.63578761e+05 -1.05163176e+07 -1.40125740e+03 ! x y z 1.99506811e+03 1.28492643e+02 -1.21964426e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -413 1.16363900e+06 2.46877619e+04 ! particle number mass Rhill +Body413 1.16363900e+06 2.46877619e+04 ! particle number mass Rhill 1.09158716e+04 !particle radius in AU 6.16240208e+05 1.16898273e+07 -2.31871163e+03 ! x y z -1.92072024e+03 1.14544858e+02 -1.24842975e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -414 1.07497381e+05 1.07118523e+04 ! particle number mass Rhill +Body414 1.07497381e+05 1.07118523e+04 ! particle number mass Rhill 4.93459624e+03 !particle radius in AU 1.03595473e+07 -4.35809471e+06 -5.55598025e+04 ! x y z 7.59957188e+02 1.81039627e+03 -9.27171494e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -415 7.20978833e+05 2.10625708e+04 ! particle number mass Rhill +Body415 7.20978833e+05 2.10625708e+04 ! particle number mass Rhill 9.30593115e+03 !particle radius in AU -8.58951099e+05 1.20741593e+07 8.58096722e+03 ! x y z -1.85656009e+03 -1.31659982e+02 -7.07088670e-01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -416 1.28427470e+05 1.34925228e+04 ! particle number mass Rhill +Body416 1.28427470e+05 1.34925228e+04 ! particle number mass Rhill 7.71593034e+03 !particle radius in AU 1.34936412e+07 9.22411406e+05 -1.28097766e+05 ! x y z -1.21347788e+02 1.77352752e+03 6.09816980e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -417 1.87301701e+04 5.21024920e+03 ! particle number mass Rhill +Body417 1.87301701e+04 5.21024920e+03 ! particle number mass Rhill 4.06146670e+03 !particle radius in AU 8.93667242e+06 -4.37387871e+06 4.75249766e+04 ! x y z 9.07116732e+02 1.86034352e+03 -2.16160032e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -418 1.18868346e+05 1.13624133e+04 ! particle number mass Rhill +Body418 1.18868346e+05 1.13624133e+04 ! particle number mass Rhill 5.10279049e+03 !particle radius in AU 2.97443729e+06 1.12987732e+07 -7.15478904e+04 ! x y z -1.84937662e+03 4.88975049e+02 -1.62129744e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -419 8.52470325e+05 2.51851270e+04 ! particle number mass Rhill +Body419 8.52470325e+05 2.51851270e+04 ! particle number mass Rhill 9.84038492e+03 !particle radius in AU -1.20782110e+07 5.42799080e+06 -2.14298463e+04 ! x y z -7.60124760e+02 -1.64210069e+03 1.17910321e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -420 4.92630611e+05 2.65246208e+04 ! particle number mass Rhill +Body420 4.92630611e+05 2.65246208e+04 ! particle number mass Rhill 8.19645631e+03 !particle radius in AU -1.66687778e+07 3.40131310e+06 -8.13780785e+04 ! x y z -3.27574668e+02 -1.54958699e+03 7.60005752e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -421 1.21279031e+06 2.36838042e+04 ! particle number mass Rhill +Body421 1.21279031e+06 2.36838042e+04 ! particle number mass Rhill 1.10674500e+04 !particle radius in AU 8.04465463e+06 7.94262975e+06 3.50880055e+04 ! x y z -1.38047284e+03 1.36038061e+03 9.60840796e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -422 2.26966144e+05 1.07078719e+04 ! particle number mass Rhill +Body422 2.26966144e+05 1.07078719e+04 ! particle number mass Rhill 9.32873342e+03 !particle radius in AU 8.72948534e+06 2.25552201e+06 -6.67651980e+03 ! x y z -5.17110071e+02 2.09745799e+03 -1.26305103e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -423 5.60894834e+04 1.28408323e+04 ! particle number mass Rhill +Body423 5.60894834e+04 1.28408323e+04 ! particle number mass Rhill 3.97264243e+03 !particle radius in AU 1.59911238e+07 -5.78123234e+06 -4.96452199e+04 ! x y z 5.52053054e+02 1.48435519e+03 -7.76218367e-02 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -424 2.74792847e+05 1.16703384e+04 ! particle number mass Rhill +Body424 2.74792847e+05 1.16703384e+04 ! particle number mass Rhill 9.94269530e+03 !particle radius in AU -7.16058601e+06 5.68697632e+06 2.50735615e+04 ! x y z -1.32041167e+03 -1.70209713e+03 -5.51776816e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -425 1.03592686e+06 1.97323119e+04 ! particle number mass Rhill +Body425 1.03592686e+06 1.97323119e+04 ! particle number mass Rhill 1.05009525e+04 !particle radius in AU -1.96591682e+06 -9.56765462e+06 -5.49582524e+04 ! x y z 2.05754068e+03 -4.30221705e+02 -6.52205972e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -426 1.55296659e+05 1.56025405e+04 ! particle number mass Rhill +Body426 1.55296659e+05 1.56025405e+04 ! particle number mass Rhill 8.22033835e+03 !particle radius in AU -1.32036875e+07 -6.42805082e+06 -2.13137156e+04 ! x y z 7.40576713e+02 -1.53667373e+03 -1.66122663e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -427 1.89421380e+06 3.06783506e+04 ! particle number mass Rhill +Body427 1.89421380e+06 3.06783506e+04 ! particle number mass Rhill 1.28408960e+04 !particle radius in AU 7.26511252e+06 1.02544271e+07 -1.28126970e+04 ! x y z -1.50567288e+03 1.06151555e+03 -1.91621752e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -428 4.66109388e+04 7.82343589e+03 ! particle number mass Rhill +Body428 4.66109388e+04 7.82343589e+03 ! particle number mass Rhill 5.50382909e+03 !particle radius in AU -9.70398421e+06 5.43301598e+06 -7.10765156e+04 ! x y z -9.66770489e+02 -1.69237365e+03 -3.28188506e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -429 1.90146495e+06 2.33121169e+04 ! particle number mass Rhill +Body429 1.90146495e+06 2.33121169e+04 ! particle number mass Rhill 1.28572603e+04 !particle radius in AU 2.96216400e+05 -9.44659905e+06 6.39430618e+04 ! x y z 2.13334160e+03 5.10827881e+01 -3.06567932e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -430 4.61962305e+04 6.63727442e+03 ! particle number mass Rhill +Body430 4.61962305e+04 6.63727442e+03 ! particle number mass Rhill 3.72381283e+03 !particle radius in AU -7.59639515e+06 5.48032752e+06 -2.40679326e+03 ! x y z -1.21575451e+03 -1.75481888e+03 -1.69366205e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -431 6.71482788e+04 7.73769019e+03 ! particle number mass Rhill +Body431 6.71482788e+04 7.73769019e+03 ! particle number mass Rhill 6.21604216e+03 !particle radius in AU 4.26014597e+06 8.47244148e+06 -4.52841666e+04 ! x y z -1.89773381e+03 9.86947142e+02 2.27005651e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -432 3.12766116e+05 1.22096765e+04 ! particle number mass Rhill +Body432 3.12766116e+05 1.22096765e+04 ! particle number mass Rhill 7.04464148e+03 !particle radius in AU 5.86869928e+06 6.95435059e+06 -3.04780435e+04 ! x y z -1.65434811e+03 1.39969038e+03 3.34387968e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -433 4.30468140e+05 1.48164986e+04 ! particle number mass Rhill +Body433 4.30468140e+05 1.48164986e+04 ! particle number mass Rhill 1.15473588e+04 !particle radius in AU -8.24315322e+06 -5.69586696e+06 2.20302861e+04 ! x y z 1.15852208e+03 -1.69773981e+03 2.26551767e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -434 2.67293742e+04 5.47730098e+03 ! particle number mass Rhill +Body434 2.67293742e+04 5.47730098e+03 ! particle number mass Rhill 4.57262149e+03 !particle radius in AU -2.90925512e+06 8.79933915e+06 6.42165783e+04 ! x y z -2.03971713e+03 -6.70860975e+02 7.91657343e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -435 6.11118104e+05 1.81074363e+04 ! particle number mass Rhill +Body435 6.11118104e+05 1.81074363e+04 ! particle number mass Rhill 1.29780877e+04 !particle radius in AU 9.24506088e+06 5.42020869e+06 3.55011834e+04 ! x y z -9.90032731e+02 1.74244918e+03 -6.84359361e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -436 4.63405803e+04 1.11333435e+04 ! particle number mass Rhill +Body436 4.63405803e+04 1.11333435e+04 ! particle number mass Rhill 3.72768740e+03 !particle radius in AU 1.49390033e+07 5.03002569e+06 -6.08660675e+04 ! x y z -5.02338251e+02 1.56332178e+03 -1.67781569e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -437 3.25218696e+05 1.69362297e+04 ! particle number mass Rhill +Body437 3.25218696e+05 1.69362297e+04 ! particle number mass Rhill 1.05170553e+04 !particle radius in AU 1.23161243e+07 1.68843020e+06 2.12877558e+04 ! x y z -2.39425053e+02 1.84057327e+03 1.32413609e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -438 1.84457438e+06 2.16659606e+04 ! particle number mass Rhill +Body438 1.84457438e+06 2.16659606e+04 ! particle number mass Rhill 1.27277329e+04 !particle radius in AU 8.91889708e+06 -5.54747107e+05 4.66922419e+04 ! x y z 1.62589921e+02 2.18077019e+03 -1.86548050e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -439 6.44421975e+05 1.54647739e+04 ! particle number mass Rhill +Body439 6.44421975e+05 1.54647739e+04 ! particle number mass Rhill 8.96414991e+03 !particle radius in AU -5.82188250e+06 -6.93015474e+06 8.83731418e+03 ! x y z 1.65500621e+03 -1.40856285e+03 -4.08918572e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -440 1.00366062e+06 2.04312159e+04 ! particle number mass Rhill +Body440 1.00366062e+06 2.04312159e+04 ! particle number mass Rhill 1.03907754e+04 !particle radius in AU -7.35080590e+06 -7.29055125e+06 -1.20861111e+03 ! x y z 1.39392385e+03 -1.47392682e+03 -1.29937331e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -441 1.07492900e+05 1.20693239e+04 ! particle number mass Rhill +Body441 1.07492900e+05 1.20693239e+04 ! particle number mass Rhill 4.93452768e+03 !particle radius in AU -1.22300071e+07 4.00505750e+06 -4.82429747e+04 ! x y z -5.99234873e+02 -1.71878148e+03 -9.59996458e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -442 4.00127188e+04 1.04048251e+04 ! particle number mass Rhill +Body442 4.00127188e+04 1.04048251e+04 ! particle number mass Rhill 5.23080275e+03 !particle radius in AU 1.90445756e+06 1.53190995e+07 1.28393938e+05 ! x y z -1.65070889e+03 1.86078304e+02 1.21713635e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -443 1.72835996e+04 4.91695733e+03 ! particle number mass Rhill +Body443 1.72835996e+04 4.91695733e+03 ! particle number mass Rhill 3.95409460e+03 !particle radius in AU 1.16512710e+06 9.58806430e+06 6.00184281e+03 ! x y z -2.08431325e+03 2.50023373e+02 -4.86726355e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -444 3.64491164e+04 6.19302531e+03 ! particle number mass Rhill +Body444 3.64491164e+04 6.19302531e+03 ! particle number mass Rhill 5.07066194e+03 !particle radius in AU 2.90940058e+06 8.85967621e+06 -3.67911262e+04 ! x y z -2.05184488e+03 6.57972025e+02 3.77722174e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -445 9.66027161e+05 2.03395398e+04 ! particle number mass Rhill +Body445 9.66027161e+05 2.03395398e+04 ! particle number mass Rhill 1.02592460e+04 !particle radius in AU 1.02030674e+07 -2.25656251e+06 -2.42931768e+04 ! x y z 4.02033391e+02 1.97779610e+03 -4.56432654e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -446 2.22544479e+04 4.96458922e+03 ! particle number mass Rhill +Body446 2.22544479e+04 4.96458922e+03 ! particle number mass Rhill 4.30171134e+03 !particle radius in AU -2.21966207e+06 -8.53462824e+06 5.98951302e+03 ! x y z 2.13957370e+03 -5.72879766e+02 -9.73511724e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -447 8.51272363e+05 1.92265349e+04 ! particle number mass Rhill +Body447 8.51272363e+05 1.92265349e+04 ! particle number mass Rhill 9.83577325e+03 !particle radius in AU -5.82677409e+06 -8.25640044e+06 -1.85310721e+04 ! x y z 1.68912824e+03 -1.20023426e+03 -1.46688747e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -448 2.32140349e+05 1.29036607e+04 ! particle number mass Rhill +Body448 2.32140349e+05 1.29036607e+04 ! particle number mass Rhill 9.39909127e+03 !particle radius in AU -4.15446158e+05 -1.04064911e+07 -6.01445752e+04 ! x y z 2.04307655e+03 -9.44888304e+01 -1.29270899e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -449 1.28498831e+05 1.39952129e+04 ! particle number mass Rhill +Body449 1.28498831e+05 1.39952129e+04 ! particle number mass Rhill 5.23703394e+03 !particle radius in AU 1.44949245e+06 -1.38726585e+07 1.28983420e+04 ! x y z 1.74524417e+03 1.89418829e+02 -1.27510818e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -450 8.56861708e+04 1.01449417e+04 ! particle number mass Rhill +Body450 8.56861708e+04 1.01449417e+04 ! particle number mass Rhill 6.74226629e+03 !particle radius in AU -1.02673257e+07 5.51832525e+06 7.68510549e+04 ! x y z -9.09826047e+02 -1.68325012e+03 -9.74521738e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -451 1.33577416e+06 3.21447068e+04 ! particle number mass Rhill +Body451 1.33577416e+06 3.21447068e+04 ! particle number mass Rhill 1.14295731e+04 !particle radius in AU 9.99103043e+06 1.06885708e+07 7.94231343e+04 ! x y z -1.28100100e+03 1.14298665e+03 7.74179187e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -452 1.29793646e+06 2.15081615e+04 ! particle number mass Rhill +Body452 1.29793646e+06 2.15081615e+04 ! particle number mass Rhill 1.13206181e+04 !particle radius in AU 4.41133703e+06 8.86113052e+06 -4.90493478e+04 ! x y z -1.86573176e+03 9.32322270e+02 -1.20417460e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -453 3.52625005e+05 1.46757322e+04 ! particle number mass Rhill +Body453 3.52625005e+05 1.46757322e+04 ! particle number mass Rhill 7.33201534e+03 !particle radius in AU -1.05312274e+07 1.06309083e+06 -3.40508748e+04 ! x y z -2.12025256e+02 -1.99070933e+03 2.76988985e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -454 8.65462312e+04 8.10394938e+03 ! particle number mass Rhill +Body454 8.65462312e+04 8.10394938e+03 ! particle number mass Rhill 6.76474935e+03 !particle radius in AU -9.13190511e+06 -9.87045448e+05 4.65363249e+04 ! x y z 2.72813658e+02 -2.14939314e+03 -6.89232508e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -455 5.62433674e+05 1.67093031e+04 ! particle number mass Rhill +Body455 5.62433674e+05 1.67093031e+04 ! particle number mass Rhill 8.56661866e+03 !particle radius in AU -9.55165901e+06 3.32037562e+06 -5.74639097e+04 ! x y z -7.05014643e+02 -1.94468153e+03 -9.68692941e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -456 5.46940517e+05 2.51399946e+04 ! particle number mass Rhill +Body456 5.46940517e+05 2.51399946e+04 ! particle number mass Rhill 8.48722461e+03 !particle radius in AU -2.79080237e+06 -1.49534280e+07 6.61250908e+04 ! x y z 1.66874204e+03 -2.93565278e+02 -6.04868304e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -457 8.86959726e+04 8.09465350e+03 ! particle number mass Rhill +Body457 8.86959726e+04 8.09465350e+03 ! particle number mass Rhill 6.82030227e+03 !particle radius in AU 1.76076614e+06 -8.89107995e+06 4.77043786e+04 ! x y z 2.14748256e+03 4.04932388e+02 -1.26152318e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -458 9.68803238e+05 1.76061812e+04 ! particle number mass Rhill +Body458 9.68803238e+05 1.76061812e+04 ! particle number mass Rhill 1.02690639e+04 !particle radius in AU 8.52637393e+06 2.63618253e+06 -5.22911736e+04 ! x y z -6.60976767e+02 2.09577153e+03 3.42675226e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -459 1.37575237e+05 1.11544680e+04 ! particle number mass Rhill +Body459 1.37575237e+05 1.11544680e+04 ! particle number mass Rhill 5.35754408e+03 !particle radius in AU 1.08528417e+07 5.02794391e+05 -2.76918530e+04 ! x y z -1.27726381e+02 1.98516729e+03 -1.12360782e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -460 1.48998220e+06 2.18747787e+04 ! particle number mass Rhill +Body460 1.48998220e+06 2.18747787e+04 ! particle number mass Rhill 1.18534842e+04 !particle radius in AU -7.11955030e+06 6.48411163e+06 -1.64876744e+04 ! x y z -1.43123341e+03 -1.55444238e+03 -1.21086898e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -461 6.74728805e+05 1.62968820e+04 ! particle number mass Rhill +Body461 6.74728805e+05 1.62968820e+04 ! particle number mass Rhill 9.10252919e+03 !particle radius in AU 7.73539416e+06 4.91837100e+06 3.79759434e+04 ! x y z -1.16029500e+03 1.85248711e+03 2.31086993e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -462 2.99651592e+05 1.21722314e+04 ! particle number mass Rhill +Body462 2.99651592e+05 1.21722314e+04 ! particle number mass Rhill 1.02339004e+04 !particle radius in AU 8.76407090e+06 -2.02266717e+06 -1.17355053e+04 ! x y z 4.87045225e+02 2.14976445e+03 -1.12592644e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -463 4.45840740e+05 1.45174622e+04 ! particle number mass Rhill +Body463 4.45840740e+05 1.45174622e+04 ! particle number mass Rhill 1.16832115e+04 !particle radius in AU -5.85624077e+06 -7.65100688e+06 -6.81073848e+04 ! x y z 1.69101430e+03 -1.25110313e+03 -1.69620610e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -464 2.77600737e+04 7.85191483e+03 ! particle number mass Rhill +Body464 2.77600737e+04 7.85191483e+03 ! particle number mass Rhill 4.63065609e+03 !particle radius in AU -4.73064294e+06 1.23174391e+07 -1.15616945e+05 ! x y z -1.67622870e+03 -6.40214154e+02 -2.40259531e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -465 2.75389964e+05 1.70205112e+04 ! particle number mass Rhill +Body465 2.75389964e+05 1.70205112e+04 ! particle number mass Rhill 6.75204041e+03 !particle radius in AU 1.21865621e+07 4.96824670e+06 1.38201935e+04 ! x y z -6.90512507e+02 1.66991832e+03 1.81886433e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -466 2.75903056e+05 1.73578977e+04 ! particle number mass Rhill +Body466 2.75903056e+05 1.73578977e+04 ! particle number mass Rhill 9.95606737e+03 !particle radius in AU 1.16681691e+07 6.27755146e+06 -9.89757611e+04 ! x y z -8.82483897e+02 1.58231102e+03 -7.45315405e-01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -467 6.02190482e+04 9.10996020e+03 ! particle number mass Rhill +Body467 6.02190482e+04 9.10996020e+03 ! particle number mass Rhill 5.99441701e+03 !particle radius in AU -9.82574233e+06 -6.12952303e+06 1.96949177e+04 ! x y z 1.01952580e+03 -1.64506613e+03 1.17311172e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -468 4.42759837e+05 1.56527672e+04 ! particle number mass Rhill +Body468 4.42759837e+05 1.56527672e+04 ! particle number mass Rhill 1.16562377e+04 !particle radius in AU -7.66867450e+06 -6.71467472e+06 1.82936899e+04 ! x y z 1.37697709e+03 -1.54141508e+03 -1.04916179e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -469 3.36720172e+05 1.96306197e+04 ! particle number mass Rhill +Body469 3.36720172e+05 1.96306197e+04 ! particle number mass Rhill 7.22008053e+03 !particle radius in AU 6.68731996e+06 1.21566043e+07 -5.02348380e+04 ! x y z -1.55626881e+03 8.62955881e+02 7.13319505e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -470 2.58940449e+04 7.82575799e+03 ! particle number mass Rhill +Body470 2.58940449e+04 7.82575799e+03 ! particle number mass Rhill 4.52448294e+03 !particle radius in AU 5.58226973e+05 -1.33893338e+07 3.23944444e+04 ! x y z 1.78341617e+03 5.70175526e+01 2.01164673e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -471 1.45256608e+05 9.66608592e+03 ! particle number mass Rhill +Body471 1.45256608e+05 9.66608592e+03 ! particle number mass Rhill 8.03922694e+03 !particle radius in AU 2.69184570e+06 8.96128856e+06 -1.43912663e+04 ! x y z -2.03943626e+03 6.16982327e+02 1.53458951e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -472 1.15877026e+06 3.68429014e+04 ! particle number mass Rhill +Body472 1.15877026e+06 3.68429014e+04 ! particle number mass Rhill 1.09006261e+04 !particle radius in AU -1.76847286e+07 -6.05601018e+05 1.06870104e+04 ! x y z 8.13556990e+01 -1.55405464e+03 1.07736989e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -473 1.89629066e+05 1.08509311e+04 ! particle number mass Rhill +Body473 1.89629066e+05 1.08509311e+04 ! particle number mass Rhill 5.96239346e+03 !particle radius in AU -4.46692197e+06 -8.22773588e+06 -3.36712950e+04 ! x y z 1.90929541e+03 -1.00567083e+03 1.30091738e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -474 5.15337334e+04 1.59115247e+04 ! particle number mass Rhill +Body474 5.15337334e+04 1.59115247e+04 ! particle number mass Rhill 3.86203494e+03 !particle radius in AU 1.09873618e+07 1.89353789e+07 1.37058307e+05 ! x y z -1.20089709e+03 6.97166990e+02 -1.15971142e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -475 1.57230937e+06 2.05829163e+04 ! particle number mass Rhill +Body475 1.57230937e+06 2.05829163e+04 ! particle number mass Rhill 1.20678989e+04 !particle radius in AU 8.92466133e+06 -1.21792450e+06 3.61100410e+04 ! x y z 3.10051974e+02 2.14937296e+03 -1.41043166e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -476 6.33227061e+05 1.83648511e+04 ! particle number mass Rhill +Body476 6.33227061e+05 1.83648511e+04 ! particle number mass Rhill 8.91193791e+03 !particle radius in AU -5.85289838e+05 1.08674619e+07 3.13865857e+04 ! x y z -1.97212405e+03 -1.17677554e+02 -3.37938196e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -477 7.35347415e+04 7.85278044e+03 ! particle number mass Rhill +Body477 7.35347415e+04 7.85278044e+03 ! particle number mass Rhill 6.40717392e+03 !particle radius in AU 2.71862051e+06 -9.05514497e+06 -5.54339403e+02 ! x y z 2.04451063e+03 5.93924832e+02 -2.26401878e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -478 2.95966865e+05 1.22630751e+04 ! particle number mass Rhill +Body478 2.95966865e+05 1.22630751e+04 ! particle number mass Rhill 1.01917795e+04 !particle radius in AU -4.06364003e+06 8.41274452e+06 3.61206264e+04 ! x y z -1.92276154e+03 -9.27433732e+02 1.11784546e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -479 9.71859875e+04 1.13295872e+04 ! particle number mass Rhill +Body479 9.71859875e+04 1.13295872e+04 ! particle number mass Rhill 7.03132016e+03 !particle radius in AU -1.19933178e+07 -3.73131347e+06 1.49826992e+03 ! x y z 5.46200488e+02 -1.75445228e+03 -4.43292318e-01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -480 1.81399777e+04 1.22864947e+04 ! particle number mass Rhill +Body480 1.81399777e+04 1.22864947e+04 ! particle number mass Rhill 4.01835133e+03 !particle radius in AU -2.24454214e+07 -7.37433557e+06 5.58803594e+04 ! x y z 4.48331646e+02 -1.26886747e+03 -5.97172099e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -481 8.06531544e+04 8.77644669e+03 ! particle number mass Rhill +Body481 8.06531544e+04 8.77644669e+03 ! particle number mass Rhill 4.48393645e+03 !particle radius in AU -1.00569236e+07 1.52027585e+06 5.50467478e+04 ! x y z -2.73653938e+02 -2.04195337e+03 2.77105641e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -482 2.97181135e+04 5.68599691e+03 ! particle number mass Rhill +Body482 2.97181135e+04 5.68599691e+03 ! particle number mass Rhill 4.73706563e+03 !particle radius in AU 1.42492815e+06 -9.15917062e+06 -2.25858696e+04 ! x y z 2.12298306e+03 3.34049377e+02 1.00298878e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -483 4.23222409e+04 7.28278576e+03 ! particle number mass Rhill +Body483 4.23222409e+04 7.28278576e+03 ! particle number mass Rhill 5.32956636e+03 !particle radius in AU -7.74886856e+06 6.98419572e+06 4.81094824e+02 ! x y z -1.36287826e+03 -1.51437942e+03 -1.68752883e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -484 2.03031340e+05 1.37443509e+04 ! particle number mass Rhill +Body484 2.03031340e+05 1.37443509e+04 ! particle number mass Rhill 8.98855782e+03 !particle radius in AU -9.13222067e+06 7.31343022e+06 -3.08093425e+04 ! x y z -1.21046156e+03 -1.49256909e+03 -3.15355485e-01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -485 6.08047440e+04 8.91637215e+03 ! particle number mass Rhill +Body485 6.08047440e+04 8.91637215e+03 ! particle number mass Rhill 6.01378842e+03 !particle radius in AU 6.06087158e+06 -9.69417839e+06 6.23119551e+04 ! x y z 1.63826093e+03 1.03252872e+03 -8.91138112e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -486 8.86921034e+04 1.25973681e+04 ! particle number mass Rhill +Body486 8.86921034e+04 1.25973681e+04 ! particle number mass Rhill 4.62821986e+03 !particle radius in AU 1.42036863e+07 3.21005959e+05 -1.52147935e+05 ! x y z -2.29346938e+01 1.73911536e+03 2.41934076e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -487 9.52577096e+05 1.72967606e+04 ! particle number mass Rhill +Body487 9.52577096e+05 1.72967606e+04 ! particle number mass Rhill 1.02114099e+04 !particle radius in AU 2.47060933e+06 -8.49038937e+06 -1.64092125e+04 ! x y z 2.11333925e+03 6.27764025e+02 3.26978709e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -488 5.18391704e+05 2.71580514e+04 ! particle number mass Rhill +Body488 5.18391704e+05 2.71580514e+04 ! particle number mass Rhill 1.22853727e+04 !particle radius in AU -1.70653039e+07 2.72173559e+06 1.07972032e+05 ! x y z -2.36876536e+02 -1.54619144e+03 -7.91920171e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -489 4.36645660e+05 1.45363957e+04 ! particle number mass Rhill +Body489 4.36645660e+05 1.45363957e+04 ! particle number mass Rhill 7.87339511e+03 !particle radius in AU 9.29964742e+06 2.61866241e+06 1.18151327e+04 ! x y z -6.01432781e+02 2.01893065e+03 -9.18340859e-01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -490 3.24205564e+05 1.34006277e+04 ! particle number mass Rhill +Body490 3.24205564e+05 1.34006277e+04 ! particle number mass Rhill 1.05061229e+04 !particle radius in AU 5.46329309e+06 -8.17615351e+06 3.23278517e+03 ! x y z 1.73194521e+03 1.16682128e+03 -2.32849453e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -491 6.63821774e+04 1.05636781e+04 ! particle number mass Rhill +Body491 6.63821774e+04 1.05636781e+04 ! particle number mass Rhill 4.20213010e+03 !particle radius in AU -9.38612532e+06 8.96174000e+06 1.24251608e+04 ! x y z -1.26134064e+03 -1.32562137e+03 -9.16926524e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -492 1.48737769e+05 1.42832047e+04 ! particle number mass Rhill +Body492 1.48737769e+05 1.42832047e+04 ! particle number mass Rhill 5.49869230e+03 !particle radius in AU 1.34404207e+06 -1.34982267e+07 -9.98145158e+04 ! x y z 1.77251874e+03 1.58186229e+02 -1.18233653e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -493 4.27953152e+04 1.09683126e+04 ! particle number mass Rhill +Body493 4.27953152e+04 1.09683126e+04 ! particle number mass Rhill 5.34935064e+03 !particle radius in AU 1.59657590e+07 -1.84107184e+06 7.91634963e+04 ! x y z 1.77740752e+02 1.61004155e+03 -8.76452331e-01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -494 1.55605997e+04 9.97417601e+03 ! particle number mass Rhill +Body494 1.55605997e+04 9.97417601e+03 ! particle number mass Rhill 3.81807480e+03 !particle radius in AU -1.95422324e+07 4.27225532e+06 -1.15437134e+04 ! x y z -3.47390066e+02 -1.42742043e+03 -9.37392480e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -495 1.07612435e+05 9.82215943e+03 ! particle number mass Rhill +Body495 1.07612435e+05 9.82215943e+03 ! particle number mass Rhill 7.27427657e+03 !particle radius in AU -8.32827018e+06 6.50246828e+06 1.07863935e+04 ! x y z -1.19572995e+03 -1.60254308e+03 1.23423582e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -496 5.96462922e+05 1.86294653e+04 ! particle number mass Rhill +Body496 5.96462922e+05 1.86294653e+04 ! particle number mass Rhill 8.73601721e+03 !particle radius in AU -1.07074688e+07 2.34621575e+06 5.93641138e+04 ! x y z -4.22982902e+02 -1.94965020e+03 -1.96471998e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -497 4.30903278e+05 2.02800538e+04 ! particle number mass Rhill +Body497 4.30903278e+05 2.02800538e+04 ! particle number mass Rhill 1.15512484e+04 !particle radius in AU 4.51979494e+06 1.22520862e+07 -1.38847489e+04 ! x y z -1.72593078e+03 6.48260700e+02 -7.40684356e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -498 2.62273130e+05 1.74445137e+04 ! particle number mass Rhill +Body498 2.62273130e+05 1.74445137e+04 ! particle number mass Rhill 6.64309194e+03 !particle radius in AU 2.92552013e+06 -1.35219163e+07 -7.24169872e+04 ! x y z 1.71212479e+03 3.82693746e+02 1.13508153e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -499 9.47984404e+05 2.08482098e+04 ! particle number mass Rhill +Body499 9.47984404e+05 2.08482098e+04 ! particle number mass Rhill 1.01949726e+04 !particle radius in AU 8.44057923e+05 -1.07213279e+07 5.42825433e+04 ! x y z 1.98524585e+03 1.59641509e+02 -2.17308444e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -500 1.71702832e+06 3.33526891e+04 ! particle number mass Rhill +Body500 1.71702832e+06 3.33526891e+04 ! particle number mass Rhill 1.24273391e+04 !particle radius in AU -5.70564751e+06 -1.28061077e+07 7.89815585e+04 ! x y z 1.59615438e+03 -7.17950030e+02 -1.60355758e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -501 2.72234422e+05 1.15106750e+04 ! particle number mass Rhill +Body501 2.72234422e+05 1.15106750e+04 ! particle number mass Rhill 9.91174230e+03 !particle radius in AU 6.42542385e+06 -6.26831304e+06 -8.52096344e+03 ! x y z 1.51047048e+03 1.57585291e+03 1.26849618e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -502 1.23522546e+05 1.28533789e+04 ! particle number mass Rhill +Body502 1.23522546e+05 1.28533789e+04 ! particle number mass Rhill 7.61642321e+03 !particle radius in AU -1.26986567e+07 2.05439645e+06 4.23816010e+04 ! x y z -3.17593598e+02 -1.80836332e+03 1.37317505e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -503 1.79476667e+05 1.06554012e+04 ! particle number mass Rhill +Body503 1.79476667e+05 1.06554012e+04 ! particle number mass Rhill 5.85403069e+03 !particle radius in AU 3.89723404e+06 -8.71939773e+06 -1.59555101e+04 ! x y z 1.92484978e+03 8.78585634e+02 3.76576757e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -504 8.12308648e+05 1.77510996e+04 ! particle number mass Rhill +Body504 8.12308648e+05 1.77510996e+04 ! particle number mass Rhill 9.68335876e+03 !particle radius in AU 9.58403819e+06 -1.00242938e+06 4.12991678e+04 ! x y z 2.21630062e+02 2.09275016e+03 1.75085392e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -505 9.52125066e+05 2.49408408e+04 ! particle number mass Rhill +Body505 9.52125066e+05 2.49408408e+04 ! particle number mass Rhill 1.02097944e+04 !particle radius in AU -2.44297176e+05 1.26729604e+07 2.03607439e+04 ! x y z -1.84680295e+03 -1.82730822e+01 -2.91252739e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -506 4.64738988e+04 6.53761969e+03 ! particle number mass Rhill +Body506 4.64738988e+04 6.53761969e+03 ! particle number mass Rhill 5.49842989e+03 !particle radius in AU -8.96004039e+06 4.09560494e+05 -3.60456167e+04 ! x y z -1.02191608e+02 -2.20756190e+03 -2.24493109e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -507 5.74538635e+05 1.72816119e+04 ! particle number mass Rhill +Body507 5.74538635e+05 1.72816119e+04 ! particle number mass Rhill 1.27138008e+04 !particle radius in AU -6.81541514e+06 -7.94063477e+06 -7.18748605e+04 ! x y z 1.54316120e+03 -1.31237150e+03 -1.15079245e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -508 6.06350829e+05 2.46184244e+04 ! particle number mass Rhill +Body508 6.06350829e+05 2.46184244e+04 ! particle number mass Rhill 8.78402686e+03 !particle radius in AU -9.08822325e+06 1.13954530e+07 -2.08875223e+04 ! x y z -1.34302030e+03 -1.07504367e+03 -1.24686872e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -509 1.36687504e+06 2.39325427e+04 ! particle number mass Rhill +Body509 1.36687504e+06 2.39325427e+04 ! particle number mass Rhill 1.15175985e+04 !particle radius in AU -1.06157252e+07 1.57779393e+06 -6.65867787e+03 ! x y z -2.87369206e+02 -1.99101003e+03 7.20690801e-01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -510 6.62491872e+05 1.93909693e+04 ! particle number mass Rhill +Body510 6.62491872e+05 1.93909693e+04 ! particle number mass Rhill 9.04716508e+03 !particle radius in AU 7.17906044e+06 8.87425909e+06 -3.25181785e+04 ! x y z -1.49406264e+03 1.20724214e+03 6.21002078e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -511 1.47316882e+05 1.36578017e+04 ! particle number mass Rhill +Body511 1.47316882e+05 1.36578017e+04 ! particle number mass Rhill 5.48112664e+03 !particle radius in AU -1.21003843e+06 -1.29422942e+07 -7.40239219e+04 ! x y z 1.81002624e+03 -1.79331834e+02 1.25932266e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -512 1.70937828e+05 1.02401788e+04 ! particle number mass Rhill +Body512 1.70937828e+05 1.02401788e+04 ! particle number mass Rhill 8.48753771e+03 !particle radius in AU -6.99463389e+06 -6.47905900e+06 9.60433255e+04 ! x y z 1.43760545e+03 -1.52260892e+03 -8.56316812e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -513 1.81406130e+06 3.13505650e+04 ! particle number mass Rhill +Body513 1.81406130e+06 3.13505650e+04 ! particle number mass Rhill 1.26571613e+04 !particle radius in AU 6.31211278e+06 1.15740500e+07 2.93359231e+04 ! x y z -1.56035950e+03 8.72608400e+02 2.02164700e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -514 2.10541334e+04 8.90662069e+03 ! particle number mass Rhill +Body514 2.10541334e+04 8.90662069e+03 ! particle number mass Rhill 4.22293872e+03 !particle radius in AU -1.14209193e+07 -1.19005899e+07 4.72825184e+04 ! x y z 1.16096797e+03 -1.10215252e+03 -1.73463799e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -515 2.17159803e+05 1.07749747e+04 ! particle number mass Rhill +Body515 2.17159803e+05 1.07749747e+04 ! particle number mass Rhill 9.19239764e+03 !particle radius in AU -1.91436849e+06 -8.75500915e+06 -5.63789360e+04 ! x y z 2.13513923e+03 -5.15505302e+02 8.14672797e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -516 7.30928133e+04 7.84250334e+03 ! particle number mass Rhill +Body516 7.30928133e+04 7.84250334e+03 ! particle number mass Rhill 6.39431287e+03 !particle radius in AU -7.76033426e+06 5.83903373e+06 1.45914082e+04 ! x y z -1.24659220e+03 -1.65602207e+03 2.58792993e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -517 9.83999051e+04 1.16580527e+04 ! particle number mass Rhill +Body517 9.83999051e+04 1.16580527e+04 ! particle number mass Rhill 7.06047440e+03 !particle radius in AU 6.04175168e+06 -1.13300829e+07 -2.21833258e+04 ! x y z 1.60126812e+03 8.64183750e+02 2.07897641e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -518 5.97934335e+04 7.15900578e+03 ! particle number mass Rhill +Body518 5.97934335e+04 7.15900578e+03 ! particle number mass Rhill 5.98026121e+03 !particle radius in AU 7.56777600e+06 -5.38164192e+06 4.82260182e+04 ! x y z 1.23384783e+03 1.75131178e+03 1.39050720e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -519 5.71894876e+04 8.55975767e+03 ! particle number mass Rhill +Body519 5.71894876e+04 8.55975767e+03 ! particle number mass Rhill 5.89215810e+03 !particle radius in AU 2.24109885e+06 -1.09795024e+07 -3.90720695e+03 ! x y z 1.91472479e+03 3.97948512e+02 1.96668988e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -520 1.48754762e+06 2.05963996e+04 ! particle number mass Rhill +Body520 1.48754762e+06 2.05963996e+04 ! particle number mass Rhill 1.18470246e+04 !particle radius in AU -1.60346956e+06 8.94982575e+06 -4.55491048e+04 ! x y z -2.13610180e+03 -3.93853083e+02 6.45999458e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -521 3.51821464e+05 2.32804021e+04 ! particle number mass Rhill +Body521 3.51821464e+05 2.32804021e+04 ! particle number mass Rhill 1.07963370e+04 !particle radius in AU 1.33407792e+07 -9.60353157e+06 -4.36975900e+04 ! x y z 9.42437149e+02 1.32281900e+03 -2.80741977e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -522 7.65767425e+05 1.68127024e+04 ! particle number mass Rhill +Body522 7.65767425e+05 1.68127024e+04 ! particle number mass Rhill 9.49477387e+03 !particle radius in AU 5.43228414e+06 -7.41736135e+06 -2.66812088e+04 ! x y z 1.72722717e+03 1.31007512e+03 -7.34912008e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -523 4.89668862e+04 9.49351088e+03 ! particle number mass Rhill +Body523 4.89668862e+04 9.49351088e+03 ! particle number mass Rhill 3.79681841e+03 !particle radius in AU 1.54005009e+06 1.28774959e+07 5.16246471e+04 ! x y z -1.81371335e+03 2.12824688e+02 -9.20646953e-01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -524 1.25229074e+06 2.76881585e+04 ! particle number mass Rhill +Body524 1.25229074e+06 2.76881585e+04 ! particle number mass Rhill 1.11863238e+04 !particle radius in AU 1.67931493e+06 1.31306619e+07 -2.70431013e+03 ! x y z -1.76941688e+03 1.91845464e+02 5.05532665e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -525 3.32931200e+05 1.90744628e+04 ! particle number mass Rhill +Body525 3.32931200e+05 1.90744628e+04 ! particle number mass Rhill 1.05995433e+04 !particle radius in AU -1.32214307e+07 4.59727104e+06 -3.96485583e+04 ! x y z -5.86090985e+02 -1.64093893e+03 -8.60481037e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -526 1.39271951e+05 1.22980473e+04 ! particle number mass Rhill +Body526 1.39271951e+05 1.22980473e+04 ! particle number mass Rhill 7.92726804e+03 !particle radius in AU -1.18927692e+07 -9.15865717e+05 -4.39369369e+04 ! x y z 1.82263225e+02 -1.88987287e+03 9.03561914e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -527 2.99878480e+05 1.71185236e+04 ! particle number mass Rhill +Body527 2.99878480e+05 1.71185236e+04 ! particle number mass Rhill 1.02364827e+04 !particle radius in AU -9.62033211e+06 8.56620033e+06 -2.00428889e+04 ! x y z -1.21101074e+03 -1.36584173e+03 3.97879960e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -528 6.64110630e+04 1.57261442e+04 ! particle number mass Rhill +Body528 6.64110630e+04 1.57261442e+04 ! particle number mass Rhill 4.20273952e+03 !particle radius in AU 9.89301751e+06 1.68175777e+07 -1.13308431e+05 ! x y z -1.27501202e+03 7.61202373e+02 3.42051019e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -529 5.96535091e+04 8.89858147e+03 ! particle number mass Rhill +Body529 5.96535091e+04 8.89858147e+03 ! particle number mass Rhill 5.97559270e+03 !particle radius in AU 5.37606728e+06 1.01483084e+07 -2.42832542e+04 ! x y z -1.69155568e+03 9.33567602e+02 8.03539638e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -530 1.99075266e+05 1.02852963e+04 ! particle number mass Rhill +Body530 1.99075266e+05 1.02852963e+04 ! particle number mass Rhill 8.92979367e+03 !particle radius in AU 1.14205826e+06 -8.87516936e+06 2.93174632e+04 ! x y z 2.16370189e+03 2.71790476e+02 -6.44072560e-04 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -531 1.87862294e+06 4.29417274e+04 ! particle number mass Rhill +Body531 1.87862294e+06 4.29417274e+04 ! particle number mass Rhill 1.28055687e+04 !particle radius in AU 1.43504952e+07 -1.05282252e+07 1.08842756e+04 ! x y z 8.96217918e+02 1.25350160e+03 -1.10361539e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -532 2.46464658e+04 7.69853715e+03 ! particle number mass Rhill +Body532 2.46464658e+04 7.69853715e+03 ! particle number mass Rhill 4.45062026e+03 !particle radius in AU -1.23862731e+07 -4.56645846e+06 6.19786286e+04 ! x y z 6.35830463e+02 -1.69613094e+03 6.10556298e-01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -533 1.21726161e+06 1.98509313e+04 ! particle number mass Rhill +Body533 1.21726161e+06 1.98509313e+04 ! particle number mass Rhill 1.10810345e+04 !particle radius in AU -9.06340320e+06 2.47989940e+06 5.29566882e+03 ! x y z -6.09939224e+02 -2.04449772e+03 -8.32106226e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -534 1.71375734e+06 2.36594524e+04 ! particle number mass Rhill +Body534 1.71375734e+06 2.36594524e+04 ! particle number mass Rhill 1.24194426e+04 !particle radius in AU 4.49134220e+06 -8.88004412e+06 6.17280318e+04 ! x y z 1.84761935e+03 9.49659970e+02 -1.91054187e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -535 1.17792587e+05 8.88177891e+03 ! particle number mass Rhill +Body535 1.17792587e+05 8.88177891e+03 ! particle number mass Rhill 7.49678363e+03 !particle radius in AU -8.88023220e+06 1.94417194e+06 -7.43854396e+03 ! x y z -4.59587086e+02 -2.12797895e+03 1.62261707e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -536 1.47383712e+06 2.67711289e+04 ! particle number mass Rhill +Body536 1.47383712e+06 2.67711289e+04 ! particle number mass Rhill 1.18105148e+04 !particle radius in AU -6.23830061e+06 1.01163011e+07 8.19444776e+04 ! x y z -1.60793851e+03 -1.00726817e+03 7.79908055e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -537 6.43756917e+05 3.31715734e+04 ! particle number mass Rhill +Body537 6.43756917e+05 3.31715734e+04 ! particle number mass Rhill 8.96106511e+03 !particle radius in AU 1.33415164e+07 1.42367071e+07 9.29022826e+04 ! x y z -1.09778034e+03 9.88101471e+02 9.22779390e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -538 6.99959191e+04 7.79605421e+03 ! particle number mass Rhill +Body538 6.99959191e+04 7.79605421e+03 ! particle number mass Rhill 6.30269894e+03 !particle radius in AU 6.77890172e+06 -6.80689243e+06 -5.36873514e+04 ! x y z 1.47893463e+03 1.49784044e+03 1.58118524e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -539 9.63466589e+05 1.73728715e+04 ! particle number mass Rhill +Body539 9.63466589e+05 1.73728715e+04 ! particle number mass Rhill 1.02501735e+04 !particle radius in AU 8.06725141e+06 -3.62262126e+06 -3.66507377e+04 ! x y z 8.67780530e+02 2.02709545e+03 1.28504792e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -540 1.06796090e+06 2.10987598e+04 ! particle number mass Rhill +Body540 1.06796090e+06 2.10987598e+04 ! particle number mass Rhill 1.06080961e+04 !particle radius in AU -1.02130792e+07 -1.98178118e+06 -1.09127341e+03 ! x y z 3.87020460e+02 -1.99318523e+03 -1.70944891e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -541 1.69193115e+05 1.74469576e+04 ! particle number mass Rhill +Body541 1.69193115e+05 1.74469576e+04 ! particle number mass Rhill 8.45856229e+03 !particle radius in AU -2.71890650e+06 -1.56230331e+07 9.11371828e+04 ! x y z 1.62029295e+03 -2.93846410e+02 -2.71565573e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -542 4.08448966e+05 1.69427746e+04 ! particle number mass Rhill +Body542 4.08448966e+05 1.69427746e+04 ! particle number mass Rhill 7.70013366e+03 !particle radius in AU 4.47583128e+06 -1.06559052e+07 4.54196507e+04 ! x y z 1.76732893e+03 7.56289214e+02 -9.51753793e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -543 4.21097966e+04 8.34723114e+03 ! particle number mass Rhill +Body543 4.21097966e+04 8.34723114e+03 ! particle number mass Rhill 5.32063382e+03 !particle radius in AU -2.17375021e+06 -1.18877181e+07 -8.95951928e+04 ! x y z 1.85620755e+03 -3.25350325e+02 -7.40810642e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -544 4.35969753e+05 1.55004244e+04 ! particle number mass Rhill +Body544 4.35969753e+05 1.55004244e+04 ! particle number mass Rhill 7.86933046e+03 !particle radius in AU -1.01016093e+07 1.38884267e+06 9.80998719e+04 ! x y z -2.82476358e+02 -2.04196683e+03 -1.00530560e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -545 1.74468920e+06 3.91496158e+04 ! particle number mass Rhill +Body545 1.74468920e+06 3.91496158e+04 ! particle number mass Rhill 1.24937177e+04 !particle radius in AU 1.39598489e+07 -8.85744354e+06 2.03839682e+05 ! x y z 8.43657382e+02 1.36375070e+03 -3.55497456e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -546 1.53945922e+05 1.61343327e+04 ! particle number mass Rhill +Body546 1.53945922e+05 1.61343327e+04 ! particle number mass Rhill 5.56213757e+03 !particle radius in AU -1.43847009e+07 -4.33966476e+06 1.92096630e+04 ! x y z 4.81764822e+02 -1.62800637e+03 4.41101277e-01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -547 2.88269639e+05 1.83429356e+04 ! particle number mass Rhill +Body547 2.88269639e+05 1.83429356e+04 ! particle number mass Rhill 6.85570252e+03 !particle radius in AU 1.40885725e+06 -1.39890777e+07 -6.21160422e+04 ! x y z 1.73532137e+03 1.58882387e+02 -4.19228752e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -548 2.40639954e+05 1.17835112e+04 ! particle number mass Rhill +Body548 2.40639954e+05 1.17835112e+04 ! particle number mass Rhill 6.45517829e+03 !particle radius in AU -6.30237830e+06 -7.45548810e+06 1.19792411e+04 ! x y z 1.58465709e+03 -1.33550387e+03 2.64893502e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -549 2.81080705e+05 2.68807908e+04 ! particle number mass Rhill +Body549 2.81080705e+05 2.68807908e+04 ! particle number mass Rhill 6.79823242e+03 !particle radius in AU 1.78118521e+07 -1.09119093e+07 2.70244768e+04 ! x y z 7.41554271e+02 1.21779793e+03 9.15237602e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -550 7.67656205e+05 1.68827066e+04 ! particle number mass Rhill +Body550 7.67656205e+05 1.68827066e+04 ! particle number mass Rhill 9.50257381e+03 !particle radius in AU -2.89743663e+06 8.86128251e+06 -6.58120111e+04 ! x y z -2.02979747e+03 -6.82073189e+02 -2.28176534e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -551 1.84065446e+05 1.04243205e+04 ! particle number mass Rhill +Body551 1.84065446e+05 1.04243205e+04 ! particle number mass Rhill 8.69947568e+03 !particle radius in AU 8.83702217e+06 -2.90376077e+06 7.27788768e+04 ! x y z 6.85075467e+02 2.02703778e+03 7.97245500e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -552 4.34671660e+05 1.94276836e+04 ! particle number mass Rhill +Body552 4.34671660e+05 1.94276836e+04 ! particle number mass Rhill 7.86151243e+03 !particle radius in AU -1.21931564e+07 4.86524046e+06 -2.08324531e+04 ! x y z -6.82318390e+02 -1.65856508e+03 -6.74090912e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -553 1.46171434e+05 1.10945190e+04 ! particle number mass Rhill +Body553 1.46171434e+05 1.10945190e+04 ! particle number mass Rhill 5.46688367e+03 !particle radius in AU -1.05680658e+07 -7.72400524e+05 -4.19566380e+03 ! x y z 1.61680595e+02 -2.00721546e+03 9.15915016e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -554 6.46892370e+05 1.81986063e+04 ! particle number mass Rhill +Body554 6.46892370e+05 1.81986063e+04 ! particle number mass Rhill 8.97559000e+03 !particle radius in AU 4.91698619e+06 9.43759555e+06 8.61311530e+04 ! x y z -1.79363820e+03 8.94192612e+02 3.28487627e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -555 8.66972170e+05 2.98836776e+04 ! particle number mass Rhill +Body555 8.66972170e+05 2.98836776e+04 ! particle number mass Rhill 9.89587154e+03 !particle radius in AU 5.50899609e+06 1.48985993e+07 2.75915152e+04 ! x y z -1.53604421e+03 5.70661142e+02 -8.63285634e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -556 1.94853540e+06 2.93655044e+04 ! particle number mass Rhill +Body556 1.94853540e+06 2.93655044e+04 ! particle number mass Rhill 1.29624899e+04 !particle radius in AU 3.19801044e+06 -1.13772802e+07 7.80535196e+04 ! x y z 1.85228574e+03 4.55890151e+02 8.36932683e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -557 3.43146591e+05 1.41106093e+04 ! particle number mass Rhill +Body557 3.43146591e+05 1.41106093e+04 ! particle number mass Rhill 1.07068623e+04 !particle radius in AU -2.15573271e+06 -1.00993578e+07 2.69595119e+04 ! x y z 1.97403251e+03 -4.33189618e+02 1.83241184e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -558 6.08262401e+04 7.76105781e+03 ! particle number mass Rhill +Body558 6.08262401e+04 7.76105781e+03 ! particle number mass Rhill 6.01449701e+03 !particle radius in AU -9.90249159e+06 1.50849384e+06 7.56908853e+04 ! x y z -3.34511747e+02 -2.03461346e+03 1.09006280e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -559 5.33911205e+05 1.50688239e+04 ! particle number mass Rhill +Body559 5.33911205e+05 1.50688239e+04 ! particle number mass Rhill 8.41928754e+03 !particle radius in AU -8.12226421e+06 -4.86915559e+06 1.48785398e+04 ! x y z 1.08601808e+03 -1.81594814e+03 -1.05069846e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -560 3.36343620e+04 8.37603659e+03 ! particle number mass Rhill +Body560 3.36343620e+04 8.37603659e+03 ! particle number mass Rhill 4.93662404e+03 !particle radius in AU 1.04182881e+07 7.90957341e+06 -2.69933355e+04 ! x y z -1.12996754e+03 1.41480511e+03 -6.50919824e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -561 5.78392305e+05 1.80846634e+04 ! particle number mass Rhill +Body561 5.78392305e+05 1.80846634e+04 ! particle number mass Rhill 8.64688797e+03 !particle radius in AU -8.48425655e+06 7.30611767e+06 -2.97358583e+04 ! x y z -1.27983291e+03 -1.45019242e+03 -1.41707765e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -562 4.38625267e+05 1.60791218e+04 ! particle number mass Rhill +Body562 4.38625267e+05 1.60791218e+04 ! particle number mass Rhill 1.16198415e+04 !particle radius in AU -8.65184164e+06 6.24864145e+06 -3.92875079e+04 ! x y z -1.16032314e+03 -1.63406999e+03 1.01313500e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -563 2.74034207e+05 1.29317245e+04 ! particle number mass Rhill +Body563 2.74034207e+05 1.29317245e+04 ! particle number mass Rhill 9.93353704e+03 !particle radius in AU 8.34883939e+06 5.63589901e+06 -3.07212153e+04 ! x y z -1.13165810e+03 1.72056724e+03 2.87270046e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -564 1.14992402e+05 2.05068778e+04 ! particle number mass Rhill +Body564 1.14992402e+05 2.05068778e+04 ! particle number mass Rhill 7.43690165e+03 !particle radius in AU 9.21633433e+06 -1.93093666e+07 -2.54318164e+04 ! x y z 1.26419057e+03 6.27050448e+02 3.30035390e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -565 4.05431060e+05 1.30553285e+04 ! particle number mass Rhill +Body565 4.05431060e+05 1.30553285e+04 ! particle number mass Rhill 7.68112210e+03 !particle radius in AU 3.80685718e+06 -7.94695887e+06 -6.90041243e+04 ! x y z 2.01235665e+03 9.27723235e+02 1.23111874e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -566 4.60325019e+05 2.56439114e+04 ! particle number mass Rhill +Body566 4.60325019e+05 2.56439114e+04 ! particle number mass Rhill 1.18083853e+04 !particle radius in AU -1.32805505e+07 -9.89987589e+06 1.89561964e+05 ! x y z 9.51950860e+02 -1.30762258e+03 -3.09155476e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -567 1.87989321e+05 1.07137061e+04 ! particle number mass Rhill +Body567 1.87989321e+05 1.07137061e+04 ! particle number mass Rhill 5.94515785e+03 !particle radius in AU 7.49508147e+05 9.39060182e+06 -2.98793685e+03 ! x y z -2.12842500e+03 1.60409656e+02 -2.35936034e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -568 2.16431915e+05 1.10103187e+04 ! particle number mass Rhill +Body568 2.16431915e+05 1.10103187e+04 ! particle number mass Rhill 9.18211562e+03 !particle radius in AU 1.66945874e+06 -9.11271704e+06 -1.05228493e+04 ! x y z 2.11017159e+03 4.07672310e+02 4.86502364e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -569 1.49318229e+05 1.04005379e+04 ! particle number mass Rhill +Body569 1.49318229e+05 1.04005379e+04 ! particle number mass Rhill 5.50583603e+03 !particle radius in AU -4.36738498e+06 -8.73103534e+06 3.44651531e+03 ! x y z 1.86828307e+03 -9.77585967e+02 3.81224965e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -570 6.11004170e+04 1.82167732e+04 ! particle number mass Rhill +Body570 6.11004170e+04 1.82167732e+04 ! particle number mass Rhill 4.08758743e+03 !particle radius in AU -1.94040314e+07 1.29480928e+07 -6.30516410e+04 ! x y z -7.60734575e+02 -1.12192654e+03 2.15504297e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -571 1.74760567e+06 2.27605806e+04 ! particle number mass Rhill +Body571 1.74760567e+06 2.27605806e+04 ! particle number mass Rhill 1.25006754e+04 !particle radius in AU -2.30041587e+06 -9.09389672e+06 2.95714152e+04 ! x y z 2.09036388e+03 -5.21147635e+02 -8.12618749e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -572 2.53385422e+05 1.12224764e+04 ! particle number mass Rhill +Body572 2.53385422e+05 1.12224764e+04 ! particle number mass Rhill 6.56718935e+03 !particle radius in AU -8.45167174e+06 3.53866282e+06 8.15293748e+03 ! x y z -8.17977533e+02 -1.97338441e+03 3.10707851e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -573 3.56711320e+05 1.72654191e+04 ! particle number mass Rhill +Body573 3.56711320e+05 1.72654191e+04 ! particle number mass Rhill 1.08461254e+04 !particle radius in AU -1.10837839e+05 -1.22760495e+07 9.98243029e+04 ! x y z 1.86849744e+03 1.94461008e+01 1.19094336e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -574 1.71714492e+06 3.11539445e+04 ! particle number mass Rhill +Body574 1.71714492e+06 3.11539445e+04 ! particle number mass Rhill 1.24276204e+04 !particle radius in AU -2.16572849e+06 -1.29271292e+07 8.07671116e+04 ! x y z 1.79349978e+03 -2.38674951e+02 -1.98965270e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -575 6.02542390e+05 1.49657344e+04 ! particle number mass Rhill +Body575 6.02542390e+05 1.49657344e+04 ! particle number mass Rhill 1.29170951e+04 !particle radius in AU -2.12394299e+06 8.55999084e+06 1.53741130e+04 ! x y z -2.16066071e+03 -5.04790442e+02 1.96131475e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -576 1.94414111e+05 1.17556573e+04 ! particle number mass Rhill +Body576 1.94414111e+05 1.17556573e+04 ! particle number mass Rhill 8.85954838e+03 !particle radius in AU 1.01810115e+07 -3.37487969e+05 -2.68884911e+04 ! x y z 8.19073631e+01 2.05446062e+03 -7.35333556e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -577 7.08349066e+05 1.99157790e+04 ! particle number mass Rhill +Body577 7.08349066e+05 1.99157790e+04 ! particle number mass Rhill 9.25127176e+03 !particle radius in AU -4.23808016e+06 1.06041798e+07 1.34318994e+05 ! x y z -1.79220969e+03 -7.00369186e+02 1.28815476e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -578 1.81168126e+05 1.06805439e+04 ! particle number mass Rhill +Body578 1.81168126e+05 1.06805439e+04 ! particle number mass Rhill 5.87236346e+03 !particle radius in AU -7.46862356e+06 5.99931350e+06 -2.30141523e+03 ! x y z -1.36280521e+03 -1.60905358e+03 6.63931385e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -579 3.61584621e+04 8.02944821e+03 ! particle number mass Rhill +Body579 3.61584621e+04 8.02944821e+03 ! particle number mass Rhill 5.05714772e+03 !particle radius in AU -1.11448733e+07 5.00947275e+06 -4.68801561e+04 ! x y z -7.74415285e+02 -1.70766691e+03 -3.61919201e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -580 2.03415997e+05 1.20229466e+04 ! particle number mass Rhill +Body580 2.03415997e+05 1.20229466e+04 ! particle number mass Rhill 6.10352459e+03 !particle radius in AU -3.19024158e+06 9.81483389e+06 5.84486975e+04 ! x y z -1.93912156e+03 -6.23690422e+02 1.23117054e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -581 1.40326198e+06 5.19405721e+04 ! particle number mass Rhill +Body581 1.40326198e+06 5.19405721e+04 ! particle number mass Rhill 1.16189063e+04 !particle radius in AU -2.24603747e+07 6.26030145e+06 -3.01506892e+04 ! x y z -3.65393394e+02 -1.30811994e+03 1.11405519e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -582 1.03623455e+06 2.78342563e+04 ! particle number mass Rhill +Body582 1.03623455e+06 2.78342563e+04 ! particle number mass Rhill 1.05019921e+04 !particle radius in AU -1.12701774e+07 -7.80948644e+06 -6.84666678e+04 ! x y z 9.99713905e+02 -1.47048211e+03 2.44750306e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -583 7.92234060e+04 8.27125360e+03 ! particle number mass Rhill +Body583 7.92234060e+04 8.27125360e+03 ! particle number mass Rhill 6.56830775e+03 !particle radius in AU -1.36712830e+06 9.67813820e+06 -6.74480903e+04 ! x y z -2.06604712e+03 -2.98384524e+02 -5.50167062e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -584 1.51550857e+06 3.51961262e+04 ! particle number mass Rhill +Body584 1.51550857e+06 3.51961262e+04 ! particle number mass Rhill 1.19207925e+04 !particle radius in AU 7.73867408e+06 1.33759604e+07 3.56063208e+04 ! x y z -1.44506269e+03 8.28074701e+02 1.84054191e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -585 5.49400267e+05 1.52237938e+04 ! particle number mass Rhill +Body585 5.49400267e+05 1.52237938e+04 ! particle number mass Rhill 8.49992876e+03 !particle radius in AU -7.77453358e+06 -5.02677399e+06 3.78389790e+04 ! x y z 1.16536090e+03 -1.82463232e+03 -7.04505898e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -586 1.12395540e+05 9.88134833e+03 ! particle number mass Rhill +Body586 1.12395540e+05 9.88134833e+03 ! particle number mass Rhill 7.38049260e+03 !particle radius in AU 7.38262528e+06 7.34984552e+06 -2.24885801e+04 ! x y z -1.42099662e+03 1.43499436e+03 1.07378124e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -587 1.14927250e+06 2.54087794e+04 ! particle number mass Rhill +Body587 1.14927250e+06 2.54087794e+04 ! particle number mass Rhill 1.08707623e+04 !particle radius in AU -1.19920742e+07 -2.80217215e+06 -5.59313271e+04 ! x y z 4.17941960e+02 -1.81181182e+03 1.45497492e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -588 1.94869968e+05 1.38427149e+04 ! particle number mass Rhill +Body588 1.94869968e+05 1.38427149e+04 ! particle number mass Rhill 6.01682391e+03 !particle radius in AU -9.55988426e+06 -7.31862699e+06 -2.64957060e+04 ! x y z 1.16610080e+03 -1.48362062e+03 -6.94255903e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -589 1.38090127e+05 1.95791379e+04 ! particle number mass Rhill +Body589 1.38090127e+05 1.95791379e+04 ! particle number mass Rhill 5.36421948e+03 !particle radius in AU 1.02276231e+07 -1.62862349e+07 -9.70147988e+04 ! x y z 1.26937242e+03 7.76347306e+02 4.03225256e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -590 5.23014408e+04 6.86509893e+03 ! particle number mass Rhill +Body590 5.23014408e+04 6.86509893e+03 ! particle number mass Rhill 5.71926483e+03 !particle radius in AU -5.16420660e+06 -7.78596130e+06 4.36962776e+04 ! x y z 1.78489031e+03 -1.16625555e+03 -2.90708635e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -591 1.97559266e+05 1.25161752e+04 ! particle number mass Rhill +Body591 1.97559266e+05 1.25161752e+04 ! particle number mass Rhill 8.90706847e+03 !particle radius in AU -7.45989489e+06 7.86823113e+06 2.30718801e+04 ! x y z -1.45305114e+03 -1.35662728e+03 1.14450554e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -592 1.32884443e+06 2.77085745e+04 ! particle number mass Rhill +Body592 1.32884443e+06 2.77085745e+04 ! particle number mass Rhill 1.14097740e+04 !particle radius in AU -7.21533013e+06 1.04550999e+07 5.75058243e+04 ! x y z -1.49719620e+03 -1.06522065e+03 9.45819576e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -593 9.09171415e+04 9.17387085e+03 ! particle number mass Rhill +Body593 9.09171415e+04 9.17387085e+03 ! particle number mass Rhill 6.87676601e+03 !particle radius in AU 6.25358173e+06 -8.48267668e+06 1.86642486e+04 ! x y z 1.59879201e+03 1.18862345e+03 -8.19507037e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -594 3.68814962e+04 7.83261170e+03 ! particle number mass Rhill +Body594 3.68814962e+04 7.83261170e+03 ! particle number mass Rhill 5.09063352e+03 !particle radius in AU -7.19321718e+06 -9.25718484e+06 1.26289010e+05 ! x y z 1.51012765e+03 -1.19137905e+03 -2.08075301e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -595 4.29012281e+05 1.53363892e+04 ! particle number mass Rhill +Body595 4.29012281e+05 1.53363892e+04 ! particle number mass Rhill 1.15343262e+04 !particle radius in AU 9.77355514e+06 -3.06014377e+06 -1.91679922e+04 ! x y z 6.16624498e+02 1.95214553e+03 8.76866120e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -596 1.67151812e+06 2.61804288e+04 ! particle number mass Rhill +Body596 1.67151812e+06 2.61804288e+04 ! particle number mass Rhill 1.23165581e+04 !particle radius in AU 9.85520768e+06 5.11039151e+06 2.67592384e+04 ! x y z -9.36821649e+02 1.72971850e+03 9.58489099e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -597 2.96497244e+05 2.95918505e+04 ! particle number mass Rhill +Body597 2.96497244e+05 2.95918505e+04 ! particle number mass Rhill 1.01978639e+04 !particle radius in AU 2.25000304e+07 2.97587658e+06 1.11207983e+05 ! x y z -2.07470373e+02 1.34869606e+03 9.35124053e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -598 4.99711716e+04 8.09133863e+03 ! particle number mass Rhill +Body598 4.99711716e+04 8.09133863e+03 ! particle number mass Rhill 3.82259987e+03 !particle radius in AU 9.72912370e+06 4.89272799e+06 4.72049901e+04 ! x y z -8.59138858e+02 1.80693327e+03 1.59854908e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -599 6.13445666e+05 3.80459797e+04 ! particle number mass Rhill +Body599 6.13445666e+05 3.80459797e+04 ! particle number mass Rhill 1.29945434e+04 !particle radius in AU 8.58212362e+06 2.09155798e+07 -8.24274997e+04 ! x y z -1.27328941e+03 5.22122914e+02 2.97251817e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -600 3.65124112e+04 8.18474194e+03 ! particle number mass Rhill +Body600 3.65124112e+04 8.18474194e+03 ! particle number mass Rhill 5.07359536e+03 !particle radius in AU 1.25914809e+07 -1.54064226e+06 -2.42309046e+04 ! x y z 2.41941616e+02 1.80407714e+03 -4.95095821e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -601 2.49679566e+05 1.13272687e+04 ! particle number mass Rhill +Body601 2.49679566e+05 1.13272687e+04 ! particle number mass Rhill 9.63008210e+03 !particle radius in AU -9.08598960e+06 5.01876430e+05 -5.56896042e+04 ! x y z -1.04300102e+02 -2.16453693e+03 -3.87670808e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -602 2.98598310e+04 5.98525472e+03 ! particle number mass Rhill +Body602 2.98598310e+04 5.98525472e+03 ! particle number mass Rhill 4.74458362e+03 !particle radius in AU 8.60778725e+06 4.52935761e+06 2.36936302e+04 ! x y z -9.88264993e+02 1.85248346e+03 -3.75174148e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -603 3.14009599e+04 5.61935630e+03 ! particle number mass Rhill +Body603 3.14009599e+04 5.61935630e+03 ! particle number mass Rhill 4.82484424e+03 !particle radius in AU -8.51705861e+06 -3.00987013e+06 -6.10335808e+04 ! x y z 7.24297619e+02 -2.04790563e+03 -9.17975560e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -604 1.50689193e+06 4.63163678e+04 ! particle number mass Rhill +Body604 1.50689193e+06 4.63163678e+04 ! particle number mass Rhill 1.18981571e+04 !particle radius in AU -2.02348638e+07 -1.68672863e+06 -1.06729108e+05 ! x y z 1.27546784e+02 -1.44981480e+03 -2.13046543e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -605 3.08427266e+04 8.13697460e+03 ! particle number mass Rhill +Body605 3.08427266e+04 8.13697460e+03 ! particle number mass Rhill 4.79608176e+03 !particle radius in AU 9.64800303e+06 8.51584872e+06 1.81571159e+04 ! x y z -1.21061246e+03 1.38578498e+03 -1.32836513e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -606 1.05761949e+05 1.13464200e+04 ! particle number mass Rhill +Body606 1.05761949e+05 1.13464200e+04 ! particle number mass Rhill 4.90789744e+03 !particle radius in AU 9.13818695e+06 -7.70452976e+06 2.69452399e+04 ! x y z 1.22812984e+03 1.45658692e+03 -6.73843496e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -607 6.83351496e+05 1.64381768e+04 ! particle number mass Rhill +Body607 6.83351496e+05 1.64381768e+04 ! particle number mass Rhill 9.14114041e+03 !particle radius in AU -1.09145671e+06 9.34973420e+06 5.18642883e+03 ! x y z -2.11998407e+03 -2.42766889e+02 -9.89092405e-01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -608 1.58743711e+05 2.35809946e+04 ! particle number mass Rhill +Body608 1.58743711e+05 2.35809946e+04 ! particle number mass Rhill 8.28071491e+03 !particle radius in AU 1.92010196e+07 1.03149047e+07 5.09869779e+04 ! x y z -6.74338417e+02 1.23568504e+03 -2.88434162e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -609 4.85097547e+05 1.47521599e+04 ! particle number mass Rhill +Body609 4.85097547e+05 1.47521599e+04 ! particle number mass Rhill 8.15446281e+03 !particle radius in AU 9.58051429e+06 -4.62318632e+05 6.35849025e+04 ! x y z 9.06335255e+01 2.09825906e+03 -7.35742647e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -610 1.16601211e+06 2.73042222e+04 ! particle number mass Rhill +Body610 1.16601211e+06 2.73042222e+04 ! particle number mass Rhill 1.09232871e+04 !particle radius in AU -1.30847754e+07 -1.20838009e+05 2.79768532e+04 ! x y z 3.82034000e+01 -1.80937386e+03 2.83422576e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -611 2.36220533e+05 1.51727636e+04 ! particle number mass Rhill +Body611 2.36220533e+05 1.51727636e+04 ! particle number mass Rhill 9.45383905e+03 !particle radius in AU -5.32926260e+06 1.08809045e+07 2.85451712e+04 ! x y z -1.71920333e+03 -8.10618635e+02 -1.48118539e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -612 1.53212486e+05 1.16720318e+04 ! particle number mass Rhill +Body612 1.53212486e+05 1.16720318e+04 ! particle number mass Rhill 8.18339867e+03 !particle radius in AU 1.07932378e+07 -2.40071483e+06 1.38428017e+04 ! x y z 4.19588126e+02 1.91854962e+03 1.35266288e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -613 2.15032649e+05 1.38289963e+04 ! particle number mass Rhill +Body613 2.15032649e+05 1.38289963e+04 ! particle number mass Rhill 9.16228488e+03 !particle radius in AU -6.86193518e+06 -9.36770363e+06 8.70674895e+04 ! x y z 1.55612467e+03 -1.13081122e+03 -1.76373653e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -614 3.57192885e+05 1.39240117e+04 ! particle number mass Rhill +Body614 3.57192885e+05 1.39240117e+04 ! particle number mass Rhill 7.36353909e+03 !particle radius in AU 5.38169569e+06 -8.48107525e+06 -8.38982677e+03 ! x y z 1.73578647e+03 1.09143169e+03 9.09587252e-01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -615 1.51298142e+05 9.39126242e+03 ! particle number mass Rhill +Body615 1.51298142e+05 9.39126242e+03 ! particle number mass Rhill 8.14917269e+03 !particle radius in AU 7.81574277e+06 4.66176951e+06 -2.35259182e+04 ! x y z -1.08169242e+03 1.85148012e+03 8.40529015e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -616 1.65258517e+06 2.26178964e+04 ! particle number mass Rhill +Body616 1.65258517e+06 2.26178964e+04 ! particle number mass Rhill 1.22698790e+04 !particle radius in AU 6.77476212e+06 6.99394577e+06 -8.71906448e+03 ! x y z -1.48799386e+03 1.46547457e+03 -6.43335853e-01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -617 9.43780075e+04 8.08500600e+03 ! particle number mass Rhill +Body617 9.43780075e+04 8.08500600e+03 ! particle number mass Rhill 4.72508108e+03 !particle radius in AU -2.14192792e+06 -8.68107380e+06 -3.97684760e+04 ! x y z 2.13766548e+03 -4.81639501e+02 9.54765001e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -618 5.20613559e+04 7.11254070e+03 ! particle number mass Rhill +Body618 5.20613559e+04 7.11254070e+03 ! particle number mass Rhill 5.71050016e+03 !particle radius in AU 9.36808365e+06 1.90217107e+06 2.99198598e+04 ! x y z -4.46020774e+02 2.07539296e+03 -7.66300380e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -619 3.53322004e+05 1.27856154e+04 ! particle number mass Rhill +Body619 3.53322004e+05 1.27856154e+04 ! particle number mass Rhill 7.33684298e+03 !particle radius in AU 7.27614119e+06 5.72024594e+06 2.49831464e+04 ! x y z -1.34304944e+03 1.66116310e+03 2.15485187e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -620 3.01485598e+04 9.63815331e+03 ! particle number mass Rhill +Body620 3.01485598e+04 9.63815331e+03 ! particle number mass Rhill 4.75982712e+03 !particle radius in AU 9.58921336e+06 -1.24222677e+07 -1.97472656e+05 ! x y z 1.32022081e+03 9.87424842e+02 4.32249357e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -621 1.15454217e+06 2.88150349e+04 ! particle number mass Rhill +Body621 1.15454217e+06 2.88150349e+04 ! particle number mass Rhill 1.08873520e+04 !particle radius in AU -7.88989019e+06 -1.13885470e+07 -2.56937402e+04 ! x y z 1.46586529e+03 -9.71985942e+02 -3.51396551e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -622 1.78730679e+04 5.13980334e+03 ! particle number mass Rhill +Body622 1.78730679e+04 5.13980334e+03 ! particle number mass Rhill 3.99854533e+03 !particle radius in AU 3.87292376e+06 9.21006941e+06 -6.39624708e+04 ! x y z -1.89793804e+03 8.09142969e+02 -6.59781953e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -623 1.77312636e+05 9.87874797e+03 ! particle number mass Rhill +Body623 1.77312636e+05 9.87874797e+03 ! particle number mass Rhill 5.83040726e+03 !particle radius in AU 7.50695786e+06 -4.65362052e+06 -7.10126403e+03 ! x y z 1.18139098e+03 1.86471888e+03 -3.95167658e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -624 8.05498659e+04 1.29509945e+04 ! particle number mass Rhill +Body624 8.05498659e+04 1.29509945e+04 ! particle number mass Rhill 4.48202152e+03 !particle radius in AU -1.39144844e+07 5.81363011e+06 3.85998049e+04 ! x y z -6.70071502e+02 -1.54974548e+03 4.74922131e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -625 1.59716194e+06 2.34638970e+04 ! particle number mass Rhill +Body625 1.59716194e+06 2.34638970e+04 ! particle number mass Rhill 1.21311502e+04 !particle radius in AU 9.87837438e+06 2.55551323e+06 -1.36596041e+03 ! x y z -4.90308025e+02 1.98176510e+03 -1.01037674e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -626 6.72346518e+05 2.60337621e+04 ! particle number mass Rhill +Body626 6.72346518e+05 2.60337621e+04 ! particle number mass Rhill 9.09180370e+03 !particle radius in AU 1.45341700e+07 -4.27619608e+06 5.93941868e+04 ! x y z 4.77328962e+02 1.60335894e+03 -4.97370028e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -627 1.41726204e+06 2.54448913e+04 ! particle number mass Rhill +Body627 1.41726204e+06 2.54448913e+04 ! particle number mass Rhill 1.16574183e+04 !particle radius in AU 2.05268573e+06 -1.13741606e+07 4.03903250e+04 ! x y z 1.88573928e+03 3.30474062e+02 -1.50298053e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -628 1.10954319e+05 1.02376716e+04 ! particle number mass Rhill +Body628 1.10954319e+05 1.02376716e+04 ! particle number mass Rhill 7.34881070e+03 !particle radius in AU -1.02805752e+07 -3.59154998e+06 7.79568952e+04 ! x y z 6.27919253e+02 -1.86780226e+03 9.15877947e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -629 8.01558993e+05 1.82236275e+04 ! particle number mass Rhill +Body629 8.01558993e+05 1.82236275e+04 ! particle number mass Rhill 9.64045416e+03 !particle radius in AU 1.00209373e+07 1.06957570e+06 -9.24601092e+04 ! x y z -1.95870916e+02 2.03366838e+03 -1.10087708e-01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -630 1.75219955e+04 8.28328926e+03 ! particle number mass Rhill +Body630 1.75219955e+04 8.28328926e+03 ! particle number mass Rhill 3.97219150e+03 !particle radius in AU -1.39517485e+07 8.21883388e+06 7.67623281e+03 ! x y z -8.12327248e+02 -1.40338294e+03 4.18222867e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -631 2.70985262e+05 1.55395340e+04 ! particle number mass Rhill +Body631 2.70985262e+05 1.55395340e+04 ! particle number mass Rhill 6.71584845e+03 !particle radius in AU 1.02605370e+07 -6.40538450e+06 2.46021664e+04 ! x y z 9.77968382e+02 1.60990669e+03 -4.31601474e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -632 1.87758694e+05 1.26002769e+04 ! particle number mass Rhill +Body632 1.87758694e+05 1.26002769e+04 ! particle number mass Rhill 8.75727541e+03 !particle radius in AU 1.06053206e+07 3.44385915e+06 5.77152912e+04 ! x y z -5.52774107e+02 1.87621696e+03 -1.29609706e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -633 1.91365423e+05 1.35546510e+04 ! particle number mass Rhill +Body633 1.91365423e+05 1.35546510e+04 ! particle number mass Rhill 5.98053661e+03 !particle radius in AU -9.64301945e+06 6.86746863e+06 -1.42533659e+05 ! x y z -1.09942559e+03 -1.55528445e+03 -9.72595405e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -634 1.92615451e+06 3.61432544e+04 ! particle number mass Rhill +Body634 1.92615451e+06 3.61432544e+04 ! particle number mass Rhill 1.29126696e+04 !particle radius in AU 1.05754125e+06 -1.47420174e+07 -1.54880877e+04 ! x y z 1.69143054e+03 1.16386287e+02 -1.26829716e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -635 1.14971495e+05 9.60186487e+03 ! particle number mass Rhill +Body635 1.14971495e+05 9.60186487e+03 ! particle number mass Rhill 5.04640834e+03 !particle radius in AU -3.03537890e+06 9.53552265e+06 9.73685659e+03 ! x y z -1.96823062e+03 -6.23463481e+02 -1.63952204e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -636 8.70999495e+04 8.89007814e+03 ! particle number mass Rhill +Body636 8.70999495e+04 8.89007814e+03 ! particle number mass Rhill 4.60035801e+03 !particle radius in AU -9.98694456e+06 -1.23492362e+06 -1.80480653e+04 ! x y z 2.38207036e+02 -2.05532674e+03 1.79734911e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -637 4.81902061e+05 1.55239091e+04 ! particle number mass Rhill +Body637 4.81902061e+05 1.55239091e+04 ! particle number mass Rhill 1.19900755e+04 !particle radius in AU -3.74835489e+06 9.22336598e+06 -1.11560816e+05 ! x y z -1.91843216e+03 -7.98271594e+02 2.02049490e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -638 1.73811384e+06 2.38459745e+04 ! particle number mass Rhill +Body638 1.73811384e+06 2.38459745e+04 ! particle number mass Rhill 1.24780025e+04 !particle radius in AU -6.68794780e+06 -7.54430362e+06 8.73782978e+03 ! x y z 1.55324620e+03 -1.34364314e+03 -6.31744671e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -639 1.76428878e+06 2.49234046e+04 ! particle number mass Rhill +Body639 1.76428878e+06 2.49234046e+04 ! particle number mass Rhill 1.25403278e+04 !particle radius in AU -1.03958383e+07 8.06724680e+05 2.41594570e+04 ! x y z -1.55899964e+02 -2.01914147e+03 9.33842265e-01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -640 6.25956859e+04 8.38753569e+03 ! particle number mass Rhill +Body640 6.25956859e+04 8.38753569e+03 ! particle number mass Rhill 4.12066331e+03 !particle radius in AU 9.33960040e+06 5.20047646e+06 3.07184995e+03 ! x y z -9.59952400e+02 1.75350496e+03 -9.51510094e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -641 1.32721741e+06 2.44443564e+04 ! particle number mass Rhill +Body641 1.32721741e+06 2.44443564e+04 ! particle number mass Rhill 1.14051155e+04 !particle radius in AU -4.55852771e+05 1.12982302e+07 1.97139798e+04 ! x y z -1.93821973e+03 -6.36299001e+01 1.52707202e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -642 2.04032003e+05 1.11593688e+04 ! particle number mass Rhill +Body642 2.04032003e+05 1.11593688e+04 ! particle number mass Rhill 9.00330067e+03 !particle radius in AU -9.39243710e+06 -4.13852649e+05 -1.20016794e+05 ! x y z 7.29189904e+01 -2.15146169e+03 7.46416116e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -643 8.59933873e+04 1.92500751e+04 ! particle number mass Rhill +Body643 8.59933873e+04 1.92500751e+04 ! particle number mass Rhill 6.75031451e+03 !particle radius in AU 1.55420118e+07 -1.56324574e+07 1.17450688e+05 ! x y z 9.80482478e+02 9.89380982e+02 -2.43164132e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -644 4.18672946e+05 1.53732676e+04 ! particle number mass Rhill +Body644 4.18672946e+05 1.53732676e+04 ! particle number mass Rhill 1.14409114e+04 !particle radius in AU 1.02533186e+07 8.01360601e+05 -1.49055635e+04 ! x y z -1.71963144e+02 2.04211236e+03 -5.41798226e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -645 3.97979113e+05 1.45162835e+04 ! particle number mass Rhill +Body645 3.97979113e+05 1.45162835e+04 ! particle number mass Rhill 7.63377033e+03 !particle radius in AU 1.42914142e+06 9.84981684e+06 2.93564167e+04 ! x y z -2.05268655e+03 3.05405042e+02 3.66863343e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -646 3.58897606e+05 1.28959174e+04 ! particle number mass Rhill +Body646 3.58897606e+05 1.28959174e+04 ! particle number mass Rhill 7.37523479e+03 !particle radius in AU 8.46677243e+06 -3.56936745e+06 -1.01092855e+05 ! x y z 8.46329328e+02 1.98233396e+03 -1.20626919e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -647 1.87305363e+05 1.22408175e+04 ! particle number mass Rhill +Body647 1.87305363e+05 1.22408175e+04 ! particle number mass Rhill 8.75022177e+03 !particle radius in AU -5.51541812e+06 -9.33328186e+06 -7.53076104e+04 ! x y z 1.69850130e+03 -1.02466912e+03 -1.16108091e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -648 8.78353527e+05 1.98218840e+04 ! particle number mass Rhill +Body648 8.78353527e+05 1.98218840e+04 ! particle number mass Rhill 9.93898678e+03 !particle radius in AU 7.91261034e+06 6.82977302e+06 4.78744592e+04 ! x y z -1.31937664e+03 1.53446068e+03 9.71586209e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -649 1.08320847e+06 2.42668498e+04 ! particle number mass Rhill +Body649 1.08320847e+06 2.42668498e+04 ! particle number mass Rhill 1.06583427e+04 !particle radius in AU 9.51054870e+06 7.22147752e+06 -1.16155344e+05 ! x y z -1.13247642e+03 1.51634128e+03 7.95619932e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -650 1.35270154e+05 1.12325034e+04 ! particle number mass Rhill +Body650 1.35270154e+05 1.12325034e+04 ! particle number mass Rhill 7.85060242e+03 !particle radius in AU 7.56958002e+06 8.18907830e+06 2.90934189e+04 ! x y z -1.41713137e+03 1.33985142e+03 -1.12168107e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -651 2.09089114e+05 1.17143131e+04 ! particle number mass Rhill +Body651 2.09089114e+05 1.17143131e+04 ! particle number mass Rhill 6.15974600e+03 !particle radius in AU -6.13341164e+06 7.98589804e+06 -2.27618169e+04 ! x y z -1.62649363e+03 -1.24985675e+03 2.06508812e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -652 1.29236474e+05 1.13728325e+04 ! particle number mass Rhill +Body652 1.29236474e+05 1.13728325e+04 ! particle number mass Rhill 5.24703584e+03 !particle radius in AU 6.47073981e+06 -9.41271204e+06 -2.22310124e+04 ! x y z 1.59958848e+03 1.08093374e+03 -3.51035905e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -653 4.13756669e+04 7.58921833e+03 ! particle number mass Rhill +Body653 4.13756669e+04 7.58921833e+03 ! particle number mass Rhill 5.28953293e+03 !particle radius in AU 7.87952728e+06 -7.74021482e+06 2.62244560e+04 ! x y z 1.39190993e+03 1.39669667e+03 7.19439783e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -654 5.94352115e+05 1.68404426e+04 ! particle number mass Rhill +Body654 5.94352115e+05 1.68404426e+04 ! particle number mass Rhill 8.72569980e+03 !particle radius in AU -7.78608816e+06 6.02791398e+06 3.71436614e+04 ! x y z -1.25856718e+03 -1.69668386e+03 -1.29605210e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -655 1.52103203e+05 1.25614339e+04 ! particle number mass Rhill +Body655 1.52103203e+05 1.25614339e+04 ! particle number mass Rhill 5.53985567e+03 !particle radius in AU -6.32210122e+06 -1.01415155e+07 4.88655736e+04 ! x y z 1.63018229e+03 -9.50923090e+02 9.77870783e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -656 2.64701944e+04 5.32014088e+03 ! particle number mass Rhill +Body656 2.64701944e+04 5.32014088e+03 ! particle number mass Rhill 4.55779408e+03 !particle radius in AU -6.23576444e+06 6.51367852e+06 -3.41989237e+04 ! x y z -1.58628947e+03 -1.49318367e+03 1.23405417e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -657 1.19869986e+06 2.89826147e+04 ! particle number mass Rhill +Body657 1.19869986e+06 2.89826147e+04 ! particle number mass Rhill 1.10244216e+04 !particle radius in AU -1.35500086e+07 -2.26040006e+06 1.32350391e+05 ! x y z 2.64719358e+02 -1.74789986e+03 -5.31947479e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -658 5.10809049e+05 2.07577403e+04 ! particle number mass Rhill +Body658 5.10809049e+05 2.07577403e+04 ! particle number mass Rhill 1.22251778e+04 !particle radius in AU 5.77929553e+06 -1.19535178e+07 -7.82666736e+04 ! x y z 1.59619208e+03 7.97360418e+02 -1.29583152e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -659 1.04888884e+05 1.56381634e+04 ! particle number mass Rhill +Body659 1.04888884e+05 1.56381634e+04 ! particle number mass Rhill 4.89435521e+03 !particle radius in AU -8.33458476e+06 1.42735479e+07 -3.35627654e+04 ! x y z -1.40045628e+03 -8.13740040e+02 1.03574303e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -660 4.01644782e+05 1.36548342e+04 ! particle number mass Rhill +Body660 4.01644782e+05 1.36548342e+04 ! particle number mass Rhill 1.12836524e+04 !particle radius in AU -1.47864055e+06 -9.12632464e+06 1.03294618e+05 ! x y z 2.12785802e+03 -3.89541043e+02 1.51865579e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -661 4.19477357e+05 1.59792919e+04 ! particle number mass Rhill +Body661 4.19477357e+05 1.59792919e+04 ! particle number mass Rhill 1.14482340e+04 !particle radius in AU 5.45407329e+06 9.28416293e+06 -1.51509372e+04 ! x y z -1.71334604e+03 1.02205340e+03 -7.65932607e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -662 1.36644703e+06 3.38563695e+04 ! particle number mass Rhill +Body662 1.36644703e+06 3.38563695e+04 ! particle number mass Rhill 1.15163962e+04 !particle radius in AU -1.39013045e+07 6.50213463e+06 -1.39734670e+05 ! x y z -7.22290359e+02 -1.50945570e+03 -8.90498950e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -663 1.87180624e+06 3.65317510e+04 ! particle number mass Rhill +Body663 1.87180624e+06 3.65317510e+04 ! particle number mass Rhill 1.27900613e+04 !particle radius in AU -9.89641528e+06 -1.11416999e+07 3.81985165e+04 ! x y z 1.26154170e+03 -1.13757778e+03 1.92574173e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -664 4.70045782e+04 8.19622142e+03 ! particle number mass Rhill +Body664 4.70045782e+04 8.19622142e+03 ! particle number mass Rhill 3.74540728e+03 !particle radius in AU -3.16815028e+06 1.11329600e+07 6.51690516e+03 ! x y z -1.85087911e+03 -4.88202334e+02 -1.01794725e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -665 4.61420620e+04 7.68428347e+03 ! particle number mass Rhill +Body665 4.61420620e+04 7.68428347e+03 ! particle number mass Rhill 3.72235677e+03 !particle radius in AU 1.00049376e+07 4.66630545e+06 -9.44413909e+04 ! x y z -7.94024833e+02 1.77983677e+03 -9.21818189e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -666 4.97025493e+04 1.27990672e+04 ! particle number mass Rhill +Body666 4.97025493e+04 1.27990672e+04 ! particle number mass Rhill 3.81573804e+03 !particle radius in AU -1.63493537e+07 6.57692006e+06 6.46813001e+04 ! x y z -5.79515939e+02 -1.44477767e+03 3.27352582e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -667 3.58378458e+05 2.51948596e+04 ! particle number mass Rhill +Body667 3.58378458e+05 2.51948596e+04 ! particle number mass Rhill 7.37167696e+03 !particle radius in AU 1.18807783e+07 1.34251951e+07 1.86898768e+05 ! x y z -1.17463975e+03 1.00294171e+03 -4.22564791e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -668 6.54992501e+05 1.99174163e+04 ! particle number mass Rhill +Body668 6.54992501e+05 1.99174163e+04 ! particle number mass Rhill 9.01289765e+03 !particle radius in AU 1.11171931e+07 2.90403753e+06 -9.01017188e+04 ! x y z -4.88090453e+02 1.87530119e+03 -9.57682232e-01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -669 2.59291252e+04 5.76238650e+03 ! particle number mass Rhill +Body669 2.59291252e+04 5.76238650e+03 ! particle number mass Rhill 4.52652522e+03 !particle radius in AU 9.73106602e+06 3.61005057e+04 5.94605185e+04 ! x y z -7.45471281e+01 2.10678631e+03 -2.14191842e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -670 4.44029167e+05 1.60304187e+04 ! particle number mass Rhill +Body670 4.44029167e+05 1.60304187e+04 ! particle number mass Rhill 1.16673660e+04 !particle radius in AU -2.74202504e+06 -1.01140650e+07 -7.39918641e+04 ! x y z 1.96547738e+03 -5.21963358e+02 1.77687487e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -671 1.56229802e+06 2.17388544e+04 ! particle number mass Rhill +Body671 1.56229802e+06 2.17388544e+04 ! particle number mass Rhill 1.20422311e+04 !particle radius in AU 8.00394990e+06 5.03858815e+06 -4.02327990e+04 ! x y z -1.10710067e+03 1.81715883e+03 -6.62734475e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -672 3.13410612e+04 6.63457360e+03 ! particle number mass Rhill +Body672 3.13410612e+04 6.63457360e+03 ! particle number mass Rhill 4.82177442e+03 !particle radius in AU 5.34986811e+06 9.22950468e+06 4.90186732e+04 ! x y z -1.74088881e+03 9.82932786e+02 -1.91216218e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -673 1.14711656e+06 2.11708889e+04 ! particle number mass Rhill +Body673 1.14711656e+06 2.11708889e+04 ! particle number mass Rhill 1.08639605e+04 !particle radius in AU -8.64795237e+06 5.41831010e+06 1.55017414e+04 ! x y z -1.07745389e+03 -1.74276883e+03 -5.97570489e-01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -674 1.33569056e+06 2.47878891e+04 ! particle number mass Rhill +Body674 1.33569056e+06 2.47878891e+04 ! particle number mass Rhill 1.14293347e+04 !particle radius in AU -1.11663224e+07 -4.36971602e+05 9.93397534e+04 ! x y z 6.60642469e+01 -1.97245979e+03 1.63719711e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -675 5.22768408e+05 1.76798501e+04 ! particle number mass Rhill +Body675 5.22768408e+05 1.76798501e+04 ! particle number mass Rhill 1.23198504e+04 !particle radius in AU -8.94315217e+06 -6.59985744e+06 1.41574538e+04 ! x y z 1.12488382e+03 -1.60471763e+03 9.42200485e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -676 9.22658485e+05 3.79266184e+04 ! particle number mass Rhill +Body676 9.22658485e+05 3.79266184e+04 ! particle number mass Rhill 1.01033638e+04 !particle radius in AU 1.92430034e+07 -3.89888242e+06 -5.57809830e+04 ! x y z 2.98708757e+02 1.44758503e+03 -4.72165311e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -677 5.75996691e+05 1.70233269e+04 ! particle number mass Rhill +Body677 5.75996691e+05 1.70233269e+04 ! particle number mass Rhill 1.27245467e+04 !particle radius in AU 8.73120403e+06 5.22305398e+06 7.59670115e+04 ! x y z -1.07719201e+03 1.76393373e+03 -6.61792923e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -678 5.71947858e+05 1.96600395e+04 ! particle number mass Rhill +Body678 5.71947858e+05 1.96600395e+04 ! particle number mass Rhill 1.26946618e+04 !particle radius in AU 1.09108942e+07 -4.65832942e+06 -4.02366251e+03 ! x y z 7.47562985e+02 1.75464824e+03 8.16488922e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -679 5.28161894e+05 1.94274851e+04 ! particle number mass Rhill +Body679 5.28161894e+05 1.94274851e+04 ! particle number mass Rhill 8.38895796e+03 !particle radius in AU 5.82034293e+06 1.07112512e+07 7.55785697e+03 ! x y z -1.63892001e+03 9.00112405e+02 -1.94858021e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -680 8.20834071e+05 2.14712890e+04 ! particle number mass Rhill +Body680 8.20834071e+05 2.14712890e+04 ! particle number mass Rhill 9.71711751e+03 !particle radius in AU 6.68559809e+06 9.37557356e+06 -1.92332279e+03 ! x y z -1.58295492e+03 1.11037420e+03 1.83307218e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -681 1.08447117e+06 2.11115029e+04 ! particle number mass Rhill +Body681 1.08447117e+06 2.11115029e+04 ! particle number mass Rhill 1.06624826e+04 !particle radius in AU -3.28943607e+06 9.87837716e+06 6.05814516e+04 ! x y z -1.92629942e+03 -6.22180329e+02 4.50728559e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -682 2.23235040e+05 1.56024415e+04 ! particle number mass Rhill +Body682 2.23235040e+05 1.56024415e+04 ! particle number mass Rhill 9.27733226e+03 !particle radius in AU -6.01449513e+06 1.14226051e+07 3.09092202e+04 ! x y z -1.62789379e+03 -8.28450934e+02 6.54251208e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -683 1.30254310e+06 3.24724800e+04 ! particle number mass Rhill +Body683 1.30254310e+06 3.24724800e+04 ! particle number mass Rhill 1.13339954e+04 !particle radius in AU 1.46501935e+07 3.52597046e+06 -1.53479325e+05 ! x y z -3.94464542e+02 1.63555361e+03 -6.95224479e-01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -684 1.95412793e+06 2.31733397e+04 ! particle number mass Rhill +Body684 1.95412793e+06 2.31733397e+04 ! particle number mass Rhill 1.29748793e+04 !particle radius in AU 7.30587232e+06 5.82342150e+06 -1.66262680e+04 ! x y z -1.33758368e+03 1.67374780e+03 1.03808342e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -685 1.68178718e+05 1.50274136e+04 ! particle number mass Rhill +Body685 1.68178718e+05 1.50274136e+04 ! particle number mass Rhill 5.72852320e+03 !particle radius in AU -8.28665070e+06 -1.08630233e+07 1.59771667e+04 ! x y z 1.42279548e+03 -1.06221837e+03 -1.00287654e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -686 1.56736892e+06 2.06563247e+04 ! particle number mass Rhill +Body686 1.56736892e+06 2.06563247e+04 ! particle number mass Rhill 1.20552459e+04 !particle radius in AU -8.85367709e+06 1.92824073e+06 -5.71899980e+04 ! x y z -4.56904898e+02 -2.11490226e+03 1.50573635e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -687 1.67530420e+06 4.40637058e+04 ! particle number mass Rhill +Body687 1.67530420e+06 4.40637058e+04 ! particle number mass Rhill 1.23258503e+04 !particle radius in AU -6.98192323e+06 -1.72685946e+07 7.38110386e+04 ! x y z 1.40350544e+03 -5.84590529e+02 -9.01131651e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -688 6.48230629e+04 1.15040206e+04 ! particle number mass Rhill +Body688 6.48230629e+04 1.15040206e+04 ! particle number mass Rhill 6.14344779e+03 !particle radius in AU 1.43686835e+07 2.23609646e+06 2.55670087e+04 ! x y z -2.46269150e+02 1.69322706e+03 -3.07491540e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -689 1.18006420e+05 1.31163742e+04 ! particle number mass Rhill +Body689 1.18006420e+05 1.31163742e+04 ! particle number mass Rhill 7.50131728e+03 !particle radius in AU 7.08335501e+06 1.12432588e+07 -7.04507229e+04 ! x y z -1.52929946e+03 9.66536263e+02 -2.79918979e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -690 5.89726347e+05 1.92317821e+04 ! particle number mass Rhill +Body690 5.89726347e+05 1.92317821e+04 ! particle number mass Rhill 8.70300381e+03 !particle radius in AU -4.60069395e+06 1.05653500e+07 1.04296802e+05 ! x y z -1.76684768e+03 -7.81938520e+02 -2.29915803e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -691 1.66067349e+05 9.76086023e+03 ! particle number mass Rhill +Body691 1.66067349e+05 9.76086023e+03 ! particle number mass Rhill 8.40614880e+03 !particle radius in AU 8.19262513e+06 -3.58191579e+06 -3.30652024e+04 ! x y z 8.70670545e+02 2.01088754e+03 -5.27792880e-01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -692 1.66578274e+06 2.28512672e+04 ! particle number mass Rhill +Body692 1.66578274e+06 2.28512672e+04 ! particle number mass Rhill 1.23024549e+04 !particle radius in AU 3.89494213e+06 9.08725205e+06 -2.39743102e+04 ! x y z -1.90805368e+03 7.88330663e+02 -9.72060594e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -693 2.75553436e+05 1.29675108e+04 ! particle number mass Rhill +Body693 2.75553436e+05 1.29675108e+04 ! particle number mass Rhill 6.75337616e+03 !particle radius in AU 2.21339346e+06 9.86538825e+06 -8.87149741e+04 ! x y z -2.00534067e+03 4.38594263e+02 1.01837964e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -694 1.58042369e+06 2.97786830e+04 ! particle number mass Rhill +Body694 1.58042369e+06 2.97786830e+04 ! particle number mass Rhill 1.20886232e+04 !particle radius in AU 4.10968486e+06 1.23907663e+07 5.33325146e+04 ! x y z -1.71807002e+03 5.39202987e+02 -6.19076268e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -695 1.17439408e+06 2.25449191e+04 ! particle number mass Rhill +Body695 1.17439408e+06 2.25449191e+04 ! particle number mass Rhill 1.09493990e+04 !particle radius in AU 1.04073429e+07 2.67129136e+06 9.54333931e+04 ! x y z -5.09495924e+02 1.93427487e+03 8.54877840e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -696 1.75679624e+04 5.32794441e+03 ! particle number mass Rhill +Body696 1.75679624e+04 5.32794441e+03 ! particle number mass Rhill 3.97566200e+03 !particle radius in AU -4.09255175e+06 -9.53753075e+06 -7.50959611e+04 ! x y z 1.86269642e+03 -8.02231358e+02 -1.43161769e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -697 8.69972966e+04 9.34087903e+03 ! particle number mass Rhill +Body697 8.69972966e+04 9.34087903e+03 ! particle number mass Rhill 4.59855003e+03 !particle radius in AU 4.36723976e+06 -9.66553779e+06 -1.64558916e+04 ! x y z 1.84776304e+03 7.98021641e+02 5.78355557e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -698 7.00972644e+05 1.56666319e+04 ! particle number mass Rhill +Body698 7.00972644e+05 1.56666319e+04 ! particle number mass Rhill 9.21904680e+03 !particle radius in AU 8.53951718e+06 -2.54525107e+06 -7.04047773e+04 ! x y z 6.28921216e+02 2.09901050e+03 1.15726955e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -699 1.85068625e+05 1.06514155e+04 ! particle number mass Rhill +Body699 1.85068625e+05 1.06514155e+04 ! particle number mass Rhill 8.71525146e+03 !particle radius in AU 7.32788955e+06 -5.94137181e+06 -9.04304047e+04 ! x y z 1.34115379e+03 1.65561581e+03 7.08036612e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -700 1.64555559e+06 2.75816878e+04 ! particle number mass Rhill +Body700 1.64555559e+06 2.75816878e+04 ! particle number mass Rhill 1.22524569e+04 !particle radius in AU 6.71737923e+06 9.71600170e+06 5.06660922e+04 ! x y z -1.56559808e+03 1.08107605e+03 -6.49532539e-03 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -701 4.44681643e+04 6.91447687e+03 ! particle number mass Rhill +Body701 4.44681643e+04 6.91447687e+03 ! particle number mass Rhill 5.41816288e+03 !particle radius in AU -7.03605741e+06 6.85389332e+06 -2.57563829e+04 ! x y z -1.44734013e+03 -1.50933987e+03 1.28526631e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -702 2.37900687e+05 2.57634462e+04 ! particle number mass Rhill +Body702 2.37900687e+05 2.57634462e+04 ! particle number mass Rhill 6.43059110e+03 !particle radius in AU 1.83405474e+07 1.00792626e+07 -9.20229382e+04 ! x y z -7.18799940e+02 1.23921438e+03 2.48945179e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -703 4.03986391e+05 2.67988920e+04 ! particle number mass Rhill +Body703 4.03986391e+05 2.67988920e+04 ! particle number mass Rhill 7.67198789e+03 !particle radius in AU 5.23940562e+06 1.75022888e+07 -5.98430417e+04 ! x y z -1.46565915e+03 4.46482377e+02 2.11785409e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -704 2.27436221e+05 2.00836512e+04 ! particle number mass Rhill +Body704 2.27436221e+05 2.00836512e+04 ! particle number mass Rhill 9.33516932e+03 !particle radius in AU 1.19175118e+07 -1.16543017e+07 5.30530426e+04 ! x y z 1.10958275e+03 1.15270442e+03 5.72450113e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -705 1.34616193e+05 9.58458254e+03 ! particle number mass Rhill +Body705 1.34616193e+05 9.58458254e+03 ! particle number mass Rhill 7.83793078e+03 !particle radius in AU -8.96838687e+06 2.63897043e+06 -2.17897557e+04 ! x y z -6.07622874e+02 -2.06310065e+03 -4.59651947e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -706 8.29093112e+04 7.90970502e+03 ! particle number mass Rhill +Body706 8.29093112e+04 7.90970502e+03 ! particle number mass Rhill 6.66863210e+03 !particle radius in AU -6.04898231e+06 -6.86358884e+06 5.57406610e+04 ! x y z 1.61956515e+03 -1.43598669e+03 -4.59300568e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -707 4.94658353e+05 2.13714758e+04 ! particle number mass Rhill +Body707 4.94658353e+05 2.13714758e+04 ! particle number mass Rhill 1.20949508e+04 !particle radius in AU 7.90216623e+06 -1.09814809e+07 5.19189450e+04 ! x y z 1.45343692e+03 1.03872925e+03 -2.28298311e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -708 5.59751529e+05 2.13961827e+04 ! particle number mass Rhill +Body708 5.59751529e+05 2.13961827e+04 ! particle number mass Rhill 1.26037782e+04 !particle radius in AU 9.57669296e+05 -1.30387879e+07 7.61951879e+04 ! x y z 1.80738232e+03 1.29379874e+02 -1.14266147e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -709 2.32161522e+05 1.09798583e+04 ! particle number mass Rhill +Body709 2.32161522e+05 1.09798583e+04 ! particle number mass Rhill 9.39937703e+03 !particle radius in AU -2.70230310e+06 8.62076168e+06 -2.22406079e+04 ! x y z -2.07446913e+03 -6.54424485e+02 -1.11116533e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -710 8.51578135e+05 3.19875457e+04 ! particle number mass Rhill +Body710 8.51578135e+05 3.19875457e+04 ! particle number mass Rhill 9.83695076e+03 !particle radius in AU -3.80463073e+06 -1.65753622e+07 1.47762416e+04 ! x y z 1.54780534e+03 -3.56129540e+02 4.67798248e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -711 5.54965655e+05 3.39543973e+04 ! particle number mass Rhill +Body711 5.54965655e+05 3.39543973e+04 ! particle number mass Rhill 1.25677546e+04 !particle radius in AU 1.97818140e+07 7.24503831e+06 4.34973562e+04 ! x y z -5.06413028e+02 1.32512350e+03 5.73956860e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -712 8.92177097e+04 1.22056341e+04 ! particle number mass Rhill +Body712 8.92177097e+04 1.22056341e+04 ! particle number mass Rhill 4.63734443e+03 !particle radius in AU -2.79050068e+06 -1.34910639e+07 4.33089266e+04 ! x y z 1.72889764e+03 -3.49089932e+02 -1.94775120e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -713 3.32358618e+05 2.30395556e+04 ! particle number mass Rhill +Body713 3.32358618e+05 2.30395556e+04 ! particle number mass Rhill 1.05934634e+04 !particle radius in AU 1.07844804e+07 1.29386712e+07 2.64893081e+04 ! x y z -1.21296556e+03 1.03104861e+03 -8.93637679e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -714 4.15254441e+05 2.22015490e+04 ! particle number mass Rhill +Body714 4.15254441e+05 2.22015490e+04 ! particle number mass Rhill 7.74266422e+03 !particle radius in AU -1.47784670e+07 -2.60738447e+06 1.11630430e+05 ! x y z 3.23911460e+02 -1.65880207e+03 4.54571842e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -715 1.73496502e+04 6.81252754e+03 ! particle number mass Rhill +Body715 1.73496502e+04 6.81252754e+03 ! particle number mass Rhill 3.95912515e+03 !particle radius in AU 5.07682372e+05 -1.30372405e+07 -1.85229557e+04 ! x y z 1.82615720e+03 7.82099311e+01 -4.18927265e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -716 3.20070305e+05 1.71800786e+04 ! particle number mass Rhill +Body716 3.20070305e+05 1.71800786e+04 ! particle number mass Rhill 7.09905909e+03 !particle radius in AU -1.18244362e+07 -4.31687046e+06 -7.18542331e+04 ! x y z 6.12658121e+02 -1.74672302e+03 1.21397025e-01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -717 2.16371552e+04 4.94621352e+03 ! particle number mass Rhill +Body717 2.16371552e+04 4.94621352e+03 ! particle number mass Rhill 4.26156427e+03 !particle radius in AU -3.54824820e+06 -8.30536307e+06 -8.90981624e+03 ! x y z 1.97998336e+03 -8.85057403e+02 -2.11344381e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -718 3.59986321e+05 1.29702906e+04 ! particle number mass Rhill +Body718 3.59986321e+05 1.29702906e+04 ! particle number mass Rhill 1.08792174e+04 !particle radius in AU 1.62346436e+06 -8.92811589e+06 -3.60195557e+03 ! x y z 2.15086991e+03 3.98636159e+02 2.48432648e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -719 1.81690903e+05 1.91798357e+04 ! particle number mass Rhill +Body719 1.81690903e+05 1.91798357e+04 ! particle number mass Rhill 5.87800644e+03 !particle radius in AU -1.15733556e+07 -1.25115260e+07 1.46624511e+04 ! x y z 1.15579598e+03 -1.08828537e+03 -2.12261933e-01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -720 6.36173833e+04 8.62559658e+03 ! particle number mass Rhill +Body720 6.36173833e+04 8.62559658e+03 ! particle number mass Rhill 4.14296182e+03 !particle radius in AU -1.08417724e+07 1.69081263e+06 7.24119490e+04 ! x y z -3.09034576e+02 -1.94519167e+03 -3.85658993e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -721 9.85820129e+04 1.07326421e+04 ! particle number mass Rhill +Body721 9.85820129e+04 1.07326421e+04 ! particle number mass Rhill 4.79422292e+03 !particle radius in AU 3.49544878e+05 1.19517692e+07 2.11344945e+04 ! x y z -1.87363529e+03 3.53402969e+01 5.71853498e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -722 8.86166379e+05 1.88205307e+04 ! particle number mass Rhill +Body722 8.86166379e+05 1.88205307e+04 ! particle number mass Rhill 9.96836855e+03 !particle radius in AU -6.32504194e+06 7.74988563e+06 -3.04663654e+04 ! x y z -1.60640404e+03 -1.28494821e+03 3.03961828e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -723 5.42657230e+05 3.02219608e+04 ! particle number mass Rhill +Body723 5.42657230e+05 3.02219608e+04 ! particle number mass Rhill 8.46501102e+03 !particle radius in AU -1.24177769e+07 -1.38486640e+07 -1.01520582e+04 ! x y z 1.15690921e+03 -9.88251041e+02 4.69156127e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -724 1.59565082e+06 2.53217734e+04 ! particle number mass Rhill +Body724 1.59565082e+06 2.53217734e+04 ! particle number mass Rhill 1.21273232e+04 !particle radius in AU 1.03771542e+07 -3.70291911e+06 1.08877147e+04 ! x y z 6.25781397e+02 1.86199758e+03 -8.89718339e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -725 3.81576526e+04 6.36454510e+03 ! particle number mass Rhill +Body725 3.81576526e+04 6.36454510e+03 ! particle number mass Rhill 5.14868362e+03 !particle radius in AU -4.66823976e+06 -8.26435407e+06 2.26583539e+04 ! x y z 1.84983887e+03 -1.05552707e+03 1.56706480e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -726 2.64710080e+04 5.28483057e+03 ! particle number mass Rhill +Body726 2.64710080e+04 5.28483057e+03 ! particle number mass Rhill 4.55784078e+03 !particle radius in AU 4.62468583e+06 7.54223542e+06 -1.61944374e+04 ! x y z -1.87648989e+03 1.17295601e+03 -5.20044045e-01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -727 1.71022032e+06 2.13948145e+04 ! particle number mass Rhill +Body727 1.71022032e+06 2.13948145e+04 ! particle number mass Rhill 1.24108926e+04 !particle radius in AU -8.12608230e+06 -4.37306608e+06 -9.62736144e+03 ! x y z 9.87984575e+02 -1.88769371e+03 1.06882012e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -728 7.56089690e+05 4.18623276e+04 ! particle number mass Rhill +Body728 7.56089690e+05 4.18623276e+04 ! particle number mass Rhill 9.45460600e+03 !particle radius in AU -2.34951111e+05 2.32053308e+07 -5.22036528e+04 ! x y z -1.35813181e+03 9.03958337e+00 -3.15567273e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -729 2.60550722e+05 1.37320616e+04 ! particle number mass Rhill +Body729 2.60550722e+05 1.37320616e+04 ! particle number mass Rhill 9.76786728e+03 !particle radius in AU -6.52967648e+06 8.82305239e+06 -1.26732573e+04 ! x y z -1.57282686e+03 -1.17622288e+03 1.39580799e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -730 3.33261162e+05 1.31329711e+04 ! particle number mass Rhill +Body730 3.33261162e+05 1.31329711e+04 ! particle number mass Rhill 1.06030438e+04 !particle radius in AU 1.77913234e+06 9.53045041e+06 3.10075017e+04 ! x y z -2.05302630e+03 3.75004563e+02 1.58931971e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -731 5.49460357e+05 1.66040779e+04 ! particle number mass Rhill +Body731 5.49460357e+05 1.66040779e+04 ! particle number mass Rhill 1.25260587e+04 !particle radius in AU 3.58717818e+06 9.36647195e+06 -1.97615013e+04 ! x y z -1.96178925e+03 7.11373199e+02 -1.26706515e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -732 4.50004217e+05 2.30855383e+04 ! particle number mass Rhill +Body732 4.50004217e+05 2.30855383e+04 ! particle number mass Rhill 7.95288174e+03 !particle radius in AU -2.59234296e+06 -1.50157233e+07 4.00646737e+04 ! x y z 1.65438833e+03 -2.60173941e+02 1.23164306e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -733 3.30247748e+05 1.24337133e+04 ! particle number mass Rhill +Body733 3.30247748e+05 1.24337133e+04 ! particle number mass Rhill 7.17351953e+03 !particle radius in AU 9.06239327e+06 9.91334627e+05 -4.75445475e+03 ! x y z -2.74588769e+02 2.14560267e+03 -4.58665348e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -734 6.14206894e+05 1.88121660e+04 ! particle number mass Rhill +Body734 6.14206894e+05 1.88121660e+04 ! particle number mass Rhill 1.29999162e+04 !particle radius in AU -1.32275910e+06 1.11815578e+07 -3.52932928e+04 ! x y z -1.92926562e+03 -2.26736828e+02 1.12692641e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -735 9.59808281e+05 2.28332821e+04 ! particle number mass Rhill +Body735 9.59808281e+05 2.28332821e+04 ! particle number mass Rhill 1.02371836e+04 !particle radius in AU -1.18507495e+07 5.08791326e+05 -4.16400253e+03 ! x y z -1.21704217e+02 -1.88175671e+03 1.06233149e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -736 1.34519144e+06 2.13695367e+04 ! particle number mass Rhill +Body736 1.34519144e+06 2.13695367e+04 ! particle number mass Rhill 1.14563699e+04 !particle radius in AU 9.66851157e+06 -1.73226908e+06 -1.69082214e+04 ! x y z 3.88627413e+02 2.04608590e+03 -8.98008156e-01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -737 5.80790318e+05 1.56482626e+04 ! particle number mass Rhill +Body737 5.80790318e+05 1.56482626e+04 ! particle number mass Rhill 8.65882148e+03 !particle radius in AU -2.00783480e+06 -9.30718645e+06 -7.65374580e+04 ! x y z 2.06366212e+03 -4.61769702e+02 1.50556810e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -738 6.02079310e+05 2.30422564e+04 ! particle number mass Rhill +Body738 6.02079310e+05 2.30422564e+04 ! particle number mass Rhill 1.29137852e+04 !particle radius in AU 5.63016627e+05 1.37971202e+07 -5.96323274e+04 ! x y z -1.75809500e+03 5.38503245e+01 5.31257797e-01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -739 5.42061151e+05 1.48525518e+04 ! particle number mass Rhill +Body739 5.42061151e+05 1.48525518e+04 ! particle number mass Rhill 1.24695778e+04 !particle radius in AU 9.16922325e+06 -9.63000174e+05 -3.41255650e+02 ! x y z 2.26283177e+02 2.14046849e+03 -4.83048073e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -740 2.78318107e+04 5.46611848e+03 ! particle number mass Rhill +Body740 2.78318107e+04 5.46611848e+03 ! particle number mass Rhill 4.63464147e+03 !particle radius in AU -8.86805151e+06 1.17556708e+06 5.29953219e+04 ! x y z -2.96347767e+02 -2.18707052e+03 -3.03941376e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -741 6.59733293e+05 1.67907799e+04 ! particle number mass Rhill +Body741 6.59733293e+05 1.67907799e+04 ! particle number mass Rhill 9.03459031e+03 !particle radius in AU 9.02199722e+06 -3.39632005e+06 -7.08544393e+04 ! x y z 7.55874214e+02 1.97860482e+03 5.10133054e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -742 2.80747909e+05 1.40507857e+04 ! particle number mass Rhill +Body742 2.80747909e+05 1.40507857e+04 ! particle number mass Rhill 6.79554835e+03 !particle radius in AU -3.33406678e+06 -1.03746123e+07 -4.13492713e+04 ! x y z 1.88884845e+03 -5.81374899e+02 2.44002419e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -743 2.28483670e+04 5.06103373e+03 ! particle number mass Rhill +Body743 2.28483670e+04 5.06103373e+03 ! particle number mass Rhill 4.33964341e+03 !particle radius in AU 8.47272017e+06 -3.29574857e+06 4.59089313e+04 ! x y z 8.07908043e+02 2.00285924e+03 2.30278431e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -744 9.46503858e+04 1.78360446e+04 ! particle number mass Rhill +Body744 9.46503858e+04 1.78360446e+04 ! particle number mass Rhill 6.96963100e+03 !particle radius in AU -1.10174017e+07 -1.65843431e+07 -7.81778692e+04 ! x y z 1.22711770e+03 -7.92668746e+02 1.28964786e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -745 3.24229460e+04 1.28254788e+04 ! particle number mass Rhill +Body745 3.24229460e+04 1.28254788e+04 ! particle number mass Rhill 4.87663009e+03 !particle radius in AU -6.99704994e+06 -1.88546711e+07 -8.81519961e+04 ! x y z 1.37622550e+03 -5.05609550e+02 1.32065962e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -746 6.21305241e+05 1.84865539e+04 ! particle number mass Rhill +Body746 6.21305241e+05 1.84865539e+04 ! particle number mass Rhill 8.85565460e+03 !particle radius in AU 3.37171440e+06 -1.03724491e+07 -2.05908462e+04 ! x y z 1.89249257e+03 5.96290076e+02 -1.16901986e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -747 8.17269222e+05 1.75757835e+04 ! particle number mass Rhill +Body747 8.17269222e+05 1.75757835e+04 ! particle number mass Rhill 9.70303009e+03 !particle radius in AU 8.68817648e+05 -9.37137391e+06 -9.78603362e+04 ! x y z 2.13443213e+03 1.77136355e+02 -1.05898656e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -748 2.98673667e+05 1.25389375e+04 ! particle number mass Rhill +Body748 2.98673667e+05 1.25389375e+04 ! particle number mass Rhill 1.02227553e+04 !particle radius in AU -8.20639456e+06 4.88393438e+06 3.93769452e+04 ! x y z -1.09602043e+03 -1.80139112e+03 -5.09189684e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -749 4.77953094e+05 2.64495594e+04 ! particle number mass Rhill +Body749 4.77953094e+05 2.64495594e+04 ! particle number mass Rhill 1.19572346e+04 !particle radius in AU -2.98729202e+06 -1.69982812e+07 -1.00361471e+02 ! x y z 1.54074333e+03 -2.84642833e+02 -7.12483576e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -750 1.21345497e+06 4.02215962e+04 ! particle number mass Rhill +Body750 1.21345497e+06 4.02215962e+04 ! particle number mass Rhill 1.10694715e+04 !particle radius in AU -1.87997669e+07 -2.87235850e+06 6.06981762e+04 ! x y z 2.30253048e+02 -1.48355775e+03 -3.20628055e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -751 1.43803514e+06 3.52381307e+04 ! particle number mass Rhill +Body751 1.43803514e+06 3.52381307e+04 ! particle number mass Rhill 1.17140974e+04 !particle radius in AU -1.67195966e+06 1.53840879e+07 1.17823799e+05 ! x y z -1.66924292e+03 -1.76106009e+02 2.19585908e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -752 1.81470570e+06 2.16051568e+04 ! particle number mass Rhill +Body752 1.81470570e+06 2.16051568e+04 ! particle number mass Rhill 1.26586599e+04 !particle radius in AU 7.45254418e+06 4.82823148e+06 -5.06675552e+03 ! x y z -1.22839592e+03 1.82946634e+03 -1.27029622e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -753 3.06193303e+05 1.20424743e+04 ! particle number mass Rhill +Body753 3.06193303e+05 1.20424743e+04 ! particle number mass Rhill 6.99494374e+03 !particle radius in AU 5.13959627e+06 7.44700588e+06 5.03758086e+04 ! x y z -1.79330931e+03 1.22535892e+03 -1.02427731e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -754 3.35631376e+05 1.54633731e+04 ! particle number mass Rhill +Body754 3.35631376e+05 1.54633731e+04 ! particle number mass Rhill 7.21229000e+03 !particle radius in AU 9.58649389e+06 5.81253530e+06 -4.39352546e+04 ! x y z -9.88086375e+02 1.68843459e+03 -9.34405959e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -755 3.34952432e+05 1.22268510e+04 ! particle number mass Rhill +Body755 3.34952432e+05 1.22268510e+04 ! particle number mass Rhill 1.06209501e+04 !particle radius in AU 5.07070035e+06 7.32312120e+06 7.18562589e+04 ! x y z -1.79677644e+03 1.25238618e+03 1.64235819e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -756 3.94174646e+05 1.59516652e+04 ! particle number mass Rhill +Body756 3.94174646e+05 1.59516652e+04 ! particle number mass Rhill 7.60936749e+03 !particle radius in AU 1.19404056e+06 1.08877947e+07 5.88658821e+03 ! x y z -1.96662575e+03 2.29281553e+02 -1.48568063e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -757 1.59693575e+06 2.44927303e+04 ! particle number mass Rhill +Body757 1.59693575e+06 2.44927303e+04 ! particle number mass Rhill 1.21305775e+04 !particle radius in AU -9.84021278e+06 -3.40002026e+06 -6.17065432e+04 ! x y z 7.02356760e+02 -1.91960378e+03 8.28806476e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -758 1.60650171e+05 1.45895772e+04 ! particle number mass Rhill +Body758 1.60650171e+05 1.45895772e+04 ! particle number mass Rhill 5.64173558e+03 !particle radius in AU 8.38364229e+06 -1.08052974e+07 -1.14971163e+05 ! x y z 1.41362762e+03 1.05030477e+03 1.33062848e-02 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -759 6.68743952e+04 7.54209796e+03 ! particle number mass Rhill +Body759 6.68743952e+04 7.54209796e+03 ! particle number mass Rhill 4.21249068e+03 !particle radius in AU 4.30913199e+06 8.44003978e+06 1.98375727e+04 ! x y z -1.87920775e+03 9.70144357e+02 7.68922870e-02 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -760 1.63778812e+05 1.25082506e+04 ! particle number mass Rhill +Body760 1.63778812e+05 1.25082506e+04 ! particle number mass Rhill 8.36735565e+03 !particle radius in AU 9.34254133e+06 -6.72471094e+06 3.04479801e+03 ! x y z 1.13048626e+03 1.56587434e+03 1.26328276e-01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -761 8.89219951e+04 7.98740603e+03 ! particle number mass Rhill +Body761 8.89219951e+04 7.98740603e+03 ! particle number mass Rhill 6.82609072e+03 !particle radius in AU -3.94216440e+06 -8.13811187e+06 -2.32415480e+03 ! x y z 1.94483188e+03 -9.74054123e+02 6.56681455e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -762 8.18294712e+05 1.67752433e+04 ! particle number mass Rhill +Body762 8.18294712e+05 1.67752433e+04 ! particle number mass Rhill 9.70708677e+03 !particle radius in AU 5.41429391e+06 -7.20522578e+06 5.41382285e+04 ! x y z 1.73021941e+03 1.33390146e+03 1.43673569e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -763 1.13372094e+06 2.57587973e+04 ! particle number mass Rhill +Body763 1.13372094e+06 2.57587973e+04 ! particle number mass Rhill 1.08215064e+04 !particle radius in AU -3.58069142e+06 -1.18639900e+07 -2.98112201e+04 ! x y z 1.80063833e+03 -4.84660340e+02 -1.10025267e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -764 9.88108923e+04 9.31725739e+03 ! particle number mass Rhill +Body764 9.88108923e+04 9.31725739e+03 ! particle number mass Rhill 7.07029058e+03 !particle radius in AU 5.06214806e+06 -8.79684921e+06 -6.69408163e+03 ! x y z 1.77899792e+03 1.03185242e+03 -6.99222338e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -765 2.18552963e+05 1.38592334e+04 ! particle number mass Rhill +Body765 2.18552963e+05 1.38592334e+04 ! particle number mass Rhill 6.25131279e+03 !particle radius in AU 2.20528884e+06 -1.13497157e+07 1.23709451e+05 ! x y z 1.88518956e+03 4.07847130e+02 -1.21144069e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -766 3.09768312e+05 1.34561528e+04 ! particle number mass Rhill +Body766 3.09768312e+05 1.34561528e+04 ! particle number mass Rhill 7.02206200e+03 !particle radius in AU 5.73341973e+06 -8.10327163e+06 -2.40301967e+04 ! x y z 1.67706223e+03 1.24499901e+03 -1.26631178e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -767 2.37144880e+05 1.11764593e+04 ! particle number mass Rhill +Body767 2.37144880e+05 1.11764593e+04 ! particle number mass Rhill 9.46615418e+03 !particle radius in AU -4.07741467e+06 -8.18369428e+06 -3.25211280e+04 ! x y z 1.94858682e+03 -9.33976298e+02 3.19344234e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -768 1.14893098e+06 1.92849652e+04 ! particle number mass Rhill +Body768 1.14893098e+06 1.92849652e+04 ! particle number mass Rhill 1.08696854e+04 !particle radius in AU 6.06888001e+06 6.98255626e+06 -6.90089903e+03 ! x y z -1.60191111e+03 1.44385639e+03 1.12490936e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -769 3.63529512e+05 1.26225183e+04 ! particle number mass Rhill +Body769 3.63529512e+05 1.26225183e+04 ! particle number mass Rhill 7.40682734e+03 !particle radius in AU -1.97618366e+06 8.86960314e+06 4.14824140e+04 ! x y z -2.09949361e+03 -4.69720145e+02 1.43384661e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -770 9.51810604e+05 2.27574150e+04 ! particle number mass Rhill +Body770 9.51810604e+05 2.27574150e+04 ! particle number mass Rhill 1.02086703e+04 !particle radius in AU -6.96997724e+05 1.14525501e+07 -2.14282591e+04 ! x y z -1.94508975e+03 -1.20495540e+02 -1.27425570e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -771 1.13010262e+06 1.89504819e+04 ! particle number mass Rhill +Body771 1.13010262e+06 1.89504819e+04 ! particle number mass Rhill 1.08099817e+04 !particle radius in AU 9.38021683e+06 3.42327658e+04 2.00501873e+04 ! x y z -3.65841924e+01 2.11334523e+03 -1.86694989e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -772 7.04130996e+04 8.31952330e+03 ! particle number mass Rhill +Body772 7.04130996e+04 8.31952330e+03 ! particle number mass Rhill 6.31519566e+03 !particle radius in AU 9.77614427e+06 2.18126141e+06 4.93063169e+04 ! x y z -4.63942946e+02 2.03097699e+03 3.68237367e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -773 7.20195884e+04 7.30450671e+03 ! particle number mass Rhill +Body773 7.20195884e+04 7.30450671e+03 ! particle number mass Rhill 6.36286244e+03 !particle radius in AU 1.03665232e+06 8.86346829e+06 1.05688800e+05 ! x y z -2.16165047e+03 3.02954637e+02 -2.55519521e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -774 9.64762143e+04 1.02616868e+04 ! particle number mass Rhill +Body774 9.64762143e+04 1.02616868e+04 ! particle number mass Rhill 7.01416117e+03 !particle radius in AU 1.03495591e+07 -4.25164616e+06 3.58740907e+04 ! x y z 7.33662495e+02 1.82348291e+03 -6.28887722e-01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -775 2.05974940e+05 1.14271818e+04 ! particle number mass Rhill +Body775 2.05974940e+05 1.14271818e+04 ! particle number mass Rhill 9.03178903e+03 !particle radius in AU -2.38406558e+06 9.62250108e+06 1.02937972e+05 ! x y z -2.01173579e+03 -4.55947194e+02 5.72154417e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -776 1.80872057e+05 1.20866729e+04 ! particle number mass Rhill +Body776 1.80872057e+05 1.20866729e+04 ! particle number mass Rhill 8.64887224e+03 !particle radius in AU -1.07734704e+07 -1.45075387e+06 -2.66041480e+04 ! x y z 2.65092409e+02 -1.95941508e+03 3.83593904e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -777 2.70682972e+04 7.76123367e+03 ! particle number mass Rhill +Body777 2.70682972e+04 7.76123367e+03 ! particle number mass Rhill 4.59186701e+03 !particle radius in AU 4.74101076e+06 -1.21984912e+07 3.79772198e+04 ! x y z 1.69258599e+03 6.30621386e+02 2.06381502e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -778 1.10059808e+06 1.92916524e+04 ! particle number mass Rhill +Body778 1.10059808e+06 1.92916524e+04 ! particle number mass Rhill 1.07150758e+04 !particle radius in AU 7.43989020e+06 -5.63873599e+06 -5.85929699e+04 ! x y z 1.31667387e+03 1.70317955e+03 9.52560643e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -779 5.98060539e+05 2.60997499e+04 ! particle number mass Rhill +Body779 5.98060539e+05 2.60997499e+04 ! particle number mass Rhill 1.28849886e+04 !particle radius in AU -5.38823915e+06 1.48268009e+07 -2.14296811e+04 ! x y z -1.54283155e+03 -5.57159624e+02 5.54783358e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -780 4.78664397e+05 1.40463790e+04 ! particle number mass Rhill +Body780 4.78664397e+05 1.40463790e+04 ! particle number mass Rhill 8.11825531e+03 !particle radius in AU 2.66724929e+06 -8.66471427e+06 1.00760731e+04 ! x y z 2.07447879e+03 6.47409518e+02 2.06301461e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -781 2.26409120e+05 1.13645899e+04 ! particle number mass Rhill +Body781 2.26409120e+05 1.13645899e+04 ! particle number mass Rhill 6.32533652e+03 !particle radius in AU -9.34887042e+06 -7.71203345e+05 -2.80106217e+04 ! x y z 1.56382920e+02 -2.13449580e+03 1.77972684e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -782 2.42808802e+05 2.65285810e+04 ! particle number mass Rhill +Body782 2.42808802e+05 2.65285810e+04 ! particle number mass Rhill 6.47451347e+03 !particle radius in AU 2.11853462e+06 2.14346842e+07 -1.31619878e+05 ! x y z -1.40220812e+03 1.23003628e+02 1.01803056e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -783 8.24349063e+05 1.69001386e+04 ! particle number mass Rhill +Body783 8.24349063e+05 1.69001386e+04 ! particle number mass Rhill 9.73096804e+03 !particle radius in AU 8.93418422e+06 -1.26163769e+06 -6.14650218e+03 ! x y z 2.70831749e+02 2.17084302e+03 -6.49066157e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -784 1.62394568e+06 2.16415199e+04 ! particle number mass Rhill +Body784 1.62394568e+06 2.16415199e+04 ! particle number mass Rhill 1.21985861e+04 !particle radius in AU -3.36304606e+06 -8.68475569e+06 4.22905473e+04 ! x y z 2.01382441e+03 -7.30247568e+02 -1.59257408e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -785 4.69991607e+05 1.42566569e+04 ! particle number mass Rhill +Body785 4.69991607e+05 1.42566569e+04 ! particle number mass Rhill 1.18904701e+04 !particle radius in AU 8.81465687e+06 -2.36248215e+06 6.67259873e+04 ! x y z 5.93111329e+02 2.09930862e+03 3.04112228e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -786 1.36960578e+06 2.05419684e+04 ! particle number mass Rhill +Body786 1.36960578e+06 2.05419684e+04 ! particle number mass Rhill 1.15252633e+04 !particle radius in AU -4.21295680e+06 -8.25900507e+06 -3.19234838e+03 ! x y z 1.92170180e+03 -9.79177619e+02 -8.10728388e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -787 5.69750598e+05 2.14044316e+04 ! particle number mass Rhill +Body787 5.69750598e+05 2.14044316e+04 ! particle number mass Rhill 8.60360757e+03 !particle radius in AU 9.93364443e+06 8.45966410e+06 -7.67940035e+04 ! x y z -1.17931717e+03 1.37394453e+03 -8.05856772e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -788 1.41313744e+06 2.40709892e+04 ! particle number mass Rhill +Body788 1.41313744e+06 2.40709892e+04 ! particle number mass Rhill 1.16460986e+04 !particle radius in AU 1.04612906e+06 1.07823989e+07 -7.20248309e+04 ! x y z -1.97918359e+03 1.84768969e+02 3.98691690e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -789 9.83280524e+04 1.63480170e+04 ! particle number mass Rhill +Body789 9.83280524e+04 1.63480170e+04 ! particle number mass Rhill 7.05875544e+03 !particle radius in AU -1.20383776e+07 -1.30487787e+07 -1.17822971e+05 ! x y z 1.15323425e+03 -1.04821079e+03 -2.09214306e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -790 5.14220791e+05 1.55882368e+04 ! particle number mass Rhill +Body790 5.14220791e+05 1.55882368e+04 ! particle number mass Rhill 1.22523351e+04 !particle radius in AU -6.25721631e+06 -7.48338074e+06 6.58872777e+04 ! x y z 1.60724089e+03 -1.35523949e+03 1.79073191e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -791 2.71366282e+05 1.50608481e+04 ! particle number mass Rhill +Body791 2.71366282e+05 1.50608481e+04 ! particle number mass Rhill 9.90119508e+03 !particle radius in AU -1.98852887e+06 -1.16234208e+07 3.45760659e+04 ! x y z 1.87230049e+03 -3.33072319e+02 1.96763510e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -792 2.34275345e+05 1.24361617e+04 ! particle number mass Rhill +Body792 2.34275345e+05 1.24361617e+04 ! particle number mass Rhill 6.39775874e+03 !particle radius in AU -1.83445389e+06 -1.01663777e+07 -2.16218566e+04 ! x y z 1.99731190e+03 -3.10283279e+02 -1.07270295e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -793 5.94051154e+05 2.02359843e+04 ! particle number mass Rhill +Body793 5.94051154e+05 2.02359843e+04 ! particle number mass Rhill 1.28561305e+04 !particle radius in AU -6.68458169e+06 -1.03038987e+07 1.06554338e+05 ! x y z 1.55802844e+03 -1.01074571e+03 -1.53515092e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -794 2.62427397e+05 1.23130985e+04 ! particle number mass Rhill +Body794 2.62427397e+05 1.23130985e+04 ! particle number mass Rhill 6.64439416e+03 !particle radius in AU -9.54428205e+06 -1.77688297e+06 -2.10926647e+04 ! x y z 3.75374809e+02 -2.06650760e+03 -1.22766897e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -795 2.46729383e+04 7.83698469e+03 ! particle number mass Rhill +Body795 2.46729383e+04 7.83698469e+03 ! particle number mass Rhill 4.45221314e+03 !particle radius in AU 3.13901663e+06 1.32731582e+07 -8.32687929e+04 ! x y z -1.71730983e+03 4.23145043e+02 4.63891808e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -796 1.99969482e+05 1.08806055e+04 ! particle number mass Rhill +Body796 1.99969482e+05 1.08806055e+04 ! particle number mass Rhill 8.94314414e+03 !particle radius in AU -2.33540859e+06 9.13065765e+06 7.06589924e+03 ! x y z -2.06497311e+03 -5.14043891e+02 1.51818535e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -797 2.62755853e+05 1.84176232e+04 ! particle number mass Rhill +Body797 2.62755853e+05 1.84176232e+04 ! particle number mass Rhill 9.79534618e+03 !particle radius in AU 1.36994576e+07 -4.67366094e+06 7.44829731e+04 ! x y z 5.44944889e+02 1.63399910e+03 -4.32898441e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -798 1.49407504e+04 4.39640938e+03 ! particle number mass Rhill +Body798 1.49407504e+04 4.39640938e+03 ! particle number mass Rhill 3.76668925e+03 !particle radius in AU -7.37395287e+06 5.09151414e+06 2.55133554e+04 ! x y z -1.23099773e+03 -1.81388400e+03 -6.90022105e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -799 3.37131645e+05 1.41467237e+04 ! particle number mass Rhill +Body799 3.37131645e+05 1.41467237e+04 ! particle number mass Rhill 1.06439337e+04 !particle radius in AU -4.36095303e+06 9.17263674e+06 5.77572160e+04 ! x y z -1.86099387e+03 -8.92089911e+02 1.33050454e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -800 9.30504002e+05 1.74198697e+04 ! particle number mass Rhill +Body800 9.30504002e+05 1.74198697e+04 ! particle number mass Rhill 1.01319198e+04 !particle radius in AU 6.09028041e+05 -9.05678858e+06 -3.59192636e+04 ! x y z 2.16064013e+03 1.12524119e+02 -1.28041635e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -801 6.21406053e+04 6.95048318e+03 ! particle number mass Rhill +Body801 6.21406053e+04 6.95048318e+03 ! particle number mass Rhill 4.11065306e+03 !particle radius in AU 8.74913197e+06 -1.47341693e+06 -9.62438055e+04 ! x y z 3.78746478e+02 2.16207809e+03 -2.44021093e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -802 1.98751717e+06 2.23872797e+04 ! particle number mass Rhill +Body802 1.98751717e+06 2.23872797e+04 ! particle number mass Rhill 1.30483609e+04 !particle radius in AU -8.58911286e+06 2.87403478e+06 1.58823639e+02 ! x y z -7.16776888e+02 -2.04412274e+03 5.09362192e-01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -803 1.10143987e+06 2.58396269e+04 ! particle number mass Rhill +Body803 1.10143987e+06 2.58396269e+04 ! particle number mass Rhill 1.07178069e+04 !particle radius in AU 8.48527058e+06 -9.20798638e+06 -1.02188880e+05 ! x y z 1.36994712e+03 1.25405390e+03 1.06840389e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -804 1.26088799e+06 1.92135468e+04 ! particle number mass Rhill +Body804 1.26088799e+06 1.92135468e+04 ! particle number mass Rhill 1.12118643e+04 !particle radius in AU -5.30902937e+06 7.21606500e+06 6.02327354e+04 ! x y z -1.77499753e+03 -1.28053606e+03 -3.40605365e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -805 1.09184787e+05 1.76365565e+04 ! particle number mass Rhill +Body805 1.09184787e+05 1.76365565e+04 ! particle number mass Rhill 4.96028208e+03 !particle radius in AU -1.77739170e+07 5.38979777e+06 1.55930024e+05 ! x y z -4.43393580e+02 -1.45455644e+03 -2.70314341e-01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -806 4.13158924e+04 7.88380749e+03 ! particle number mass Rhill +Body806 4.13158924e+04 7.88380749e+03 ! particle number mass Rhill 5.28698448e+03 !particle radius in AU -8.43967863e+06 -7.92404795e+06 -2.34275469e+04 ! x y z 1.33453164e+03 -1.37751924e+03 -2.53751841e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -807 9.05745195e+05 1.69381188e+04 ! particle number mass Rhill +Body807 9.05745195e+05 1.69381188e+04 ! particle number mass Rhill 1.00412476e+04 !particle radius in AU 4.71451819e+06 -7.46352121e+06 1.62287314e+03 ! x y z 1.84921224e+03 1.19850662e+03 1.99232615e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -808 1.43529731e+05 1.19160672e+04 ! particle number mass Rhill +Body808 1.43529731e+05 1.19160672e+04 ! particle number mass Rhill 5.43374958e+03 !particle radius in AU 1.87652013e+06 -1.11420807e+07 1.38944441e+05 ! x y z 1.93560918e+03 3.25150073e+02 2.51765258e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -809 5.54106512e+05 1.54471739e+04 ! particle number mass Rhill +Body809 5.54106512e+05 1.54471739e+04 ! particle number mass Rhill 1.25612659e+04 !particle radius in AU -9.29220692e+06 2.16599787e+06 -4.38900389e+04 ! x y z -4.87620074e+02 -2.05624014e+03 4.85721843e-01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -810 5.10481873e+05 1.62613830e+04 ! particle number mass Rhill +Body810 5.10481873e+05 1.62613830e+04 ! particle number mass Rhill 8.29428788e+03 !particle radius in AU 1.39531950e+06 1.01422470e+07 -9.71755919e+04 ! x y z -2.02592294e+03 3.03255899e+02 5.57961818e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -811 3.32058372e+05 1.63243972e+04 ! particle number mass Rhill +Body811 3.32058372e+05 1.63243972e+04 ! particle number mass Rhill 7.18660555e+03 !particle radius in AU 1.17947013e+07 7.40001699e+05 2.51672426e+04 ! x y z -1.17060805e+02 1.90660700e+03 5.44656130e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -812 3.98927657e+05 1.51211505e+04 ! particle number mass Rhill +Body812 3.98927657e+05 1.51211505e+04 ! particle number mass Rhill 1.12581502e+04 !particle radius in AU -7.90433536e+06 6.73266024e+06 -3.50969312e+04 ! x y z -1.30204874e+03 -1.55681461e+03 5.35229797e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -813 1.60520468e+05 1.50790564e+04 ! particle number mass Rhill +Body813 1.60520468e+05 1.50790564e+04 ! particle number mass Rhill 5.64021687e+03 !particle radius in AU 1.20372535e+07 -7.49092702e+06 6.74822230e+04 ! x y z 8.91458581e+02 1.47943776e+03 -9.74770857e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -814 9.51624011e+04 8.20610116e+03 ! particle number mass Rhill +Body814 9.51624011e+04 8.20610116e+03 ! particle number mass Rhill 6.98217592e+03 !particle radius in AU 6.85752801e+06 6.02181411e+06 3.38939759e+03 ! x y z -1.45444163e+03 1.59683746e+03 2.15463449e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -815 8.02969339e+05 3.23806232e+04 ! particle number mass Rhill +Body815 8.02969339e+05 3.23806232e+04 ! particle number mass Rhill 9.64610498e+03 !particle radius in AU 1.65844804e+07 4.81034890e+06 4.61229376e+04 ! x y z -4.20560106e+02 1.53234812e+03 -2.07164443e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -816 2.77573627e+05 1.52717801e+04 ! particle number mass Rhill +Body816 2.77573627e+05 1.52717801e+04 ! particle number mass Rhill 9.97612135e+03 !particle radius in AU -1.11130797e+07 -3.78359570e+06 -1.84960756e+03 ! x y z 5.85052492e+02 -1.82483094e+03 -5.22659903e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -817 1.29735147e+05 1.12854771e+04 ! particle number mass Rhill +Body817 1.29735147e+05 1.12854771e+04 ! particle number mass Rhill 7.74203039e+03 !particle radius in AU 4.58513442e+06 1.02699278e+07 -3.18341648e+04 ! x y z -1.77353935e+03 8.15172006e+02 -3.48615440e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -818 7.78047386e+05 1.63408344e+04 ! particle number mass Rhill +Body818 7.78047386e+05 1.63408344e+04 ! particle number mass Rhill 9.54525817e+03 !particle radius in AU 7.69154925e+06 -4.52108417e+06 1.90521640e+04 ! x y z 1.13843297e+03 1.87858469e+03 1.37511342e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -819 2.90221524e+05 1.58401533e+04 ! particle number mass Rhill +Body819 2.90221524e+05 1.58401533e+04 ! particle number mass Rhill 6.87114114e+03 !particle radius in AU -1.15969434e+07 3.52559239e+06 5.16907637e+04 ! x y z -5.69477663e+02 -1.78769915e+03 -1.33023745e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -820 9.19380223e+05 1.83471630e+04 ! particle number mass Rhill +Body820 9.19380223e+05 1.83471630e+04 ! particle number mass Rhill 1.00913836e+04 !particle radius in AU 5.95447776e+06 -7.82496208e+06 3.09991808e+04 ! x y z 1.65084498e+03 1.22028250e+03 -2.33382836e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -821 6.22104092e+04 9.73713866e+03 ! particle number mass Rhill +Body821 6.22104092e+04 9.73713866e+03 ! particle number mass Rhill 6.05977746e+03 !particle radius in AU -3.93089529e+06 1.17766068e+07 -6.72321552e+03 ! x y z -1.75059713e+03 -6.17947765e+02 -1.16753307e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -822 5.76697161e+05 1.55455865e+04 ! particle number mass Rhill +Body822 5.76697161e+05 1.55455865e+04 ! particle number mass Rhill 1.27297027e+04 !particle radius in AU -9.38145643e+06 5.61032393e+05 -2.62604457e+04 ! x y z -1.66051140e+02 -2.13147141e+03 -1.91808715e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -823 1.12193121e+06 2.15413897e+04 ! particle number mass Rhill +Body823 1.12193121e+06 2.15413897e+04 ! particle number mass Rhill 1.07838641e+04 !particle radius in AU -3.46243172e+06 -9.75229088e+06 -6.99128436e+04 ! x y z 1.92977079e+03 -6.78308349e+02 -2.04030914e-01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -824 3.77345686e+05 1.48917020e+04 ! particle number mass Rhill +Body824 3.77345686e+05 1.48917020e+04 ! particle number mass Rhill 7.49949684e+03 !particle radius in AU 2.14173079e+06 -1.00855853e+07 1.33615118e+04 ! x y z 2.00549502e+03 4.10286548e+02 1.33463171e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -825 2.84103902e+04 5.41642288e+03 ! particle number mass Rhill +Body825 2.84103902e+04 5.41642288e+03 ! particle number mass Rhill 4.66653709e+03 !particle radius in AU 2.97083227e+06 8.61004661e+06 -5.77896258e+04 ! x y z -2.03526397e+03 6.94270314e+02 -2.15105297e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -826 5.90646827e+04 1.08492229e+04 ! particle number mass Rhill +Body826 5.90646827e+04 1.08492229e+04 ! particle number mass Rhill 5.95586641e+03 !particle radius in AU -1.12041316e+07 8.43574386e+06 6.88522376e+04 ! x y z -1.04307644e+03 -1.40491020e+03 6.49036289e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -827 1.00753667e+05 9.63045427e+03 ! particle number mass Rhill +Body827 1.00753667e+05 9.63045427e+03 ! particle number mass Rhill 7.11632779e+03 !particle radius in AU -4.35495075e+06 9.47025259e+06 -5.09915025e+04 ! x y z -1.85819690e+03 -8.15466077e+02 4.09008068e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -828 1.54771456e+05 1.76232067e+04 ! particle number mass Rhill +Body828 1.54771456e+05 1.76232067e+04 ! particle number mass Rhill 5.57206216e+03 !particle radius in AU 4.78116976e+06 -1.59784331e+07 -5.36968327e+04 ! x y z 1.53329565e+03 4.46997350e+02 4.63714714e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -829 5.51349999e+05 1.59967890e+04 ! particle number mass Rhill +Body829 5.51349999e+05 1.59967890e+04 ! particle number mass Rhill 8.50997184e+03 !particle radius in AU 8.23993793e+06 -5.31139465e+06 6.29574603e+04 ! x y z 1.13278257e+03 1.76205209e+03 -8.47937534e-01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -830 5.59737681e+05 1.68391578e+04 ! particle number mass Rhill +Body830 5.59737681e+05 1.68391578e+04 ! particle number mass Rhill 1.26036743e+04 !particle radius in AU -9.63212471e+06 3.36590765e+06 -1.07062454e+04 ! x y z -6.84552644e+02 -1.94265665e+03 2.94400282e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -831 3.21463203e+04 7.65511916e+03 ! particle number mass Rhill +Body831 3.21463203e+04 7.65511916e+03 ! particle number mass Rhill 4.86272166e+03 !particle radius in AU 9.83116842e+06 6.61447762e+06 -5.12468956e+04 ! x y z -1.03243293e+03 1.62443233e+03 2.38757589e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -832 1.70396503e+05 1.11460376e+04 ! particle number mass Rhill +Body832 1.70396503e+05 1.11460376e+04 ! particle number mass Rhill 5.75359413e+03 !particle radius in AU 9.79171021e+06 -2.73890246e+06 8.20795285e+04 ! x y z 5.70999291e+02 1.96925843e+03 2.38407769e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -833 5.15198597e+05 1.63024335e+04 ! particle number mass Rhill +Body833 5.15198597e+05 1.63024335e+04 ! particle number mass Rhill 8.31975532e+03 !particle radius in AU -3.31575865e+06 9.74773076e+06 -6.68906771e+04 ! x y z -1.91945157e+03 -6.80055572e+02 7.05071034e-01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -834 3.88181682e+05 2.05972013e+04 ! particle number mass Rhill +Body834 3.88181682e+05 2.05972013e+04 ! particle number mass Rhill 1.11561412e+04 !particle radius in AU 2.59402712e+06 1.41195960e+07 7.65317352e+04 ! x y z -1.69390135e+03 3.03445651e+02 1.51567072e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -835 3.14976817e+05 1.81483086e+04 ! particle number mass Rhill +Body835 3.14976817e+05 1.81483086e+04 ! particle number mass Rhill 7.06120023e+03 !particle radius in AU -2.50324523e+06 1.33583355e+07 -1.06069614e+05 ! x y z -1.73502096e+03 -3.33244830e+02 -4.27813580e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -836 1.15397098e+06 2.54597499e+04 ! particle number mass Rhill +Body836 1.15397098e+06 2.54597499e+04 ! particle number mass Rhill 1.08855562e+04 !particle radius in AU -4.06673848e+06 -1.16023946e+07 4.08896853e+04 ! x y z 1.75606757e+03 -6.22462152e+02 1.70339271e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -837 5.52965161e+05 1.61939690e+04 ! particle number mass Rhill +Body837 5.52965161e+05 1.61939690e+04 ! particle number mass Rhill 8.51827363e+03 !particle radius in AU 4.61087222e+06 -8.97079451e+06 -2.30678380e+04 ! x y z 1.81563298e+03 9.45814603e+02 2.66915276e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -838 2.78212386e+05 1.51006367e+04 ! particle number mass Rhill +Body838 2.78212386e+05 1.51006367e+04 ! particle number mass Rhill 9.98376791e+03 !particle radius in AU 9.96934676e+06 5.38891014e+06 9.88781435e+04 ! x y z -9.81582718e+02 1.71074828e+03 -3.99838208e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -839 7.54969273e+04 7.54781766e+03 ! particle number mass Rhill +Body839 7.54969273e+04 7.54781766e+03 ! particle number mass Rhill 6.46366364e+03 !particle radius in AU 4.99758772e+06 -7.50759705e+06 -5.25299733e+04 ! x y z 1.80703397e+03 1.21678053e+03 1.90540898e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -840 1.70430363e+05 1.20590966e+04 ! particle number mass Rhill +Body840 1.70430363e+05 1.20590966e+04 ! particle number mass Rhill 8.47913036e+03 !particle radius in AU -6.69441800e+06 -8.86176278e+06 2.53388174e+04 ! x y z 1.56709902e+03 -1.16434302e+03 -9.30903825e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -841 7.11720571e+04 7.78997309e+03 ! particle number mass Rhill +Body841 7.11720571e+04 7.78997309e+03 ! particle number mass Rhill 6.33780436e+03 !particle radius in AU -4.38549443e+06 -8.30442031e+06 2.47931467e+04 ! x y z 1.89780640e+03 -1.00273544e+03 3.24648282e-01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -842 8.59823501e+04 1.41107806e+04 ! particle number mass Rhill +Body842 8.59823501e+04 1.41107806e+04 ! particle number mass Rhill 4.58059717e+03 !particle radius in AU 9.52295494e+06 -1.31453589e+07 -2.84882159e+04 ! x y z 1.32429236e+03 9.32305231e+02 -7.78758641e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -843 1.09544894e+05 8.49893572e+03 ! particle number mass Rhill +Body843 1.09544894e+05 8.49893572e+03 ! particle number mass Rhill 4.96572933e+03 !particle radius in AU 8.16032081e+06 -3.83914183e+06 -4.53668688e+04 ! x y z 9.48405336e+02 1.95482944e+03 -1.90024465e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -844 4.60029935e+05 1.51122850e+04 ! particle number mass Rhill +Body844 4.60029935e+05 1.51122850e+04 ! particle number mass Rhill 1.18058616e+04 !particle radius in AU 8.84185924e+06 4.91012210e+06 -4.89421191e+04 ! x y z -9.91478880e+02 1.77538667e+03 -7.79856416e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -845 8.45559558e+04 1.19563910e+04 ! particle number mass Rhill +Body845 8.45559558e+04 1.19563910e+04 ! particle number mass Rhill 4.55512603e+03 !particle radius in AU 1.32256008e+07 4.60711564e+06 3.20195320e+04 ! x y z -5.72824835e+02 1.63498483e+03 -8.94623266e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -846 7.22405721e+05 3.33574192e+04 ! particle number mass Rhill +Body846 7.22405721e+05 3.33574192e+04 ! particle number mass Rhill 9.31206622e+03 !particle radius in AU 1.83600084e+07 -3.67172737e+06 -1.03387529e+05 ! x y z 2.82478801e+02 1.48749998e+03 -3.61587063e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -847 1.13076745e+06 1.88034270e+04 ! particle number mass Rhill +Body847 1.13076745e+06 1.88034270e+04 ! particle number mass Rhill 1.08121011e+04 !particle radius in AU 5.50505051e+06 7.32332854e+06 3.97380095e+04 ! x y z -1.73540458e+03 1.27934877e+03 1.31767249e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -848 1.53792461e+06 3.36534328e+04 ! particle number mass Rhill +Body848 1.53792461e+06 3.36534328e+04 ! particle number mass Rhill 1.19792790e+04 !particle radius in AU -7.13326386e+06 1.32178302e+07 5.30241465e+04 ! x y z -1.47659146e+03 -7.82263656e+02 -2.09914908e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -849 2.18245755e+04 6.44870790e+03 ! particle number mass Rhill +Body849 2.18245755e+04 6.44870790e+03 ! particle number mass Rhill 4.27383343e+03 !particle radius in AU -4.61218845e+06 1.05730170e+07 -6.60200193e+04 ! x y z -1.78205321e+03 -7.56922993e+02 8.78119173e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -850 1.34790722e+06 2.73293396e+04 ! particle number mass Rhill +Body850 1.34790722e+06 2.73293396e+04 ! particle number mass Rhill 1.14640744e+04 !particle radius in AU -4.56090890e+06 1.14927598e+07 1.08391052e+05 ! x y z -1.73824893e+03 -6.90093039e+02 -9.72090948e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -851 1.63258167e+05 1.62209865e+04 ! particle number mass Rhill +Body851 1.63258167e+05 1.62209865e+04 ! particle number mass Rhill 5.67210117e+03 !particle radius in AU -1.26164008e+07 8.37507124e+06 -9.30825805e+04 ! x y z -9.25052993e+02 -1.39347287e+03 7.98354596e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -852 3.03238131e+05 1.22437010e+04 ! particle number mass Rhill +Body852 3.03238131e+05 1.22437010e+04 ! particle number mass Rhill 6.97236746e+03 !particle radius in AU 6.53000802e+05 -9.25877071e+06 7.96919181e+03 ! x y z 2.13254376e+03 1.58194267e+02 -3.04691883e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -853 2.86850115e+05 1.16833407e+04 ! particle number mass Rhill +Body853 2.86850115e+05 1.16833407e+04 ! particle number mass Rhill 1.00860395e+04 !particle radius in AU 7.29493071e+06 -5.15859210e+06 -4.34667082e+04 ! x y z 1.28346456e+03 1.77485302e+03 1.13165377e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -854 4.89303744e+04 6.65852454e+03 ! particle number mass Rhill +Body854 4.89303744e+04 6.65852454e+03 ! particle number mass Rhill 3.79587448e+03 !particle radius in AU -3.19192697e+06 -8.59789141e+06 9.38867695e+04 ! x y z 2.03734470e+03 -7.26452634e+02 -1.17305762e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -855 7.78837017e+05 1.74911407e+04 ! particle number mass Rhill +Body855 7.78837017e+05 1.74911407e+04 ! particle number mass Rhill 9.54848620e+03 !particle radius in AU 9.47082398e+06 -1.09607932e+06 4.83920593e+04 ! x y z 2.14821600e+02 2.11542107e+03 1.20322954e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -856 8.09963405e+05 1.65414086e+04 ! particle number mass Rhill +Body856 8.09963405e+05 1.65414086e+04 ! particle number mass Rhill 9.67403073e+03 !particle radius in AU -6.95192799e+06 -5.46206006e+06 2.82885807e+04 ! x y z 1.36201469e+03 -1.74685442e+03 2.47593903e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -857 2.42701981e+05 1.25706853e+04 ! particle number mass Rhill +Body857 2.42701981e+05 1.25706853e+04 ! particle number mass Rhill 6.47356387e+03 !particle radius in AU -3.08185810e+06 9.58349756e+06 6.94451226e+03 ! x y z -1.96338979e+03 -6.65837368e+02 -2.04503843e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -858 1.70493509e+06 4.29022384e+04 ! particle number mass Rhill +Body858 1.70493509e+06 4.29022384e+04 ! particle number mass Rhill 1.23980946e+04 !particle radius in AU 1.65978586e+07 7.58110647e+06 -7.73180642e+04 ! x y z -6.28856477e+02 1.39136938e+03 1.44879781e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -859 1.24913615e+06 2.04262263e+04 ! particle number mass Rhill +Body859 1.24913615e+06 2.04262263e+04 ! particle number mass Rhill 1.11769229e+04 !particle radius in AU -6.68285720e+06 6.69572721e+06 -2.14964381e+03 ! x y z -1.53479675e+03 -1.49178194e+03 -5.71100381e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -860 1.41825071e+05 1.34951826e+04 ! particle number mass Rhill +Body860 1.41825071e+05 1.34951826e+04 ! particle number mass Rhill 5.41215219e+03 !particle radius in AU -4.42591408e+06 -1.21925806e+07 -3.63637070e+04 ! x y z 1.69944504e+03 -6.60923085e+02 -1.17185754e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -861 2.32941748e+05 1.18357603e+04 ! particle number mass Rhill +Body861 2.32941748e+05 1.18357603e+04 ! particle number mass Rhill 9.40989476e+03 !particle radius in AU 9.48116594e+06 -3.86455243e+05 -1.03947327e+05 ! x y z 6.54406678e+01 2.14729925e+03 -2.03989342e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -862 8.31892099e+05 1.90259127e+04 ! particle number mass Rhill +Body862 8.31892099e+05 1.90259127e+04 ! particle number mass Rhill 9.76055838e+03 !particle radius in AU 9.75283383e+06 -3.26934404e+06 -6.67089834e+03 ! x y z 6.55184968e+02 1.92454684e+03 -2.06876177e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -863 2.65389001e+05 1.25607462e+04 ! particle number mass Rhill +Body863 2.65389001e+05 1.25607462e+04 ! particle number mass Rhill 9.82795810e+03 !particle radius in AU 7.92293154e+06 -5.92949642e+06 8.08421712e+04 ! x y z 1.22209539e+03 1.67954941e+03 6.77640716e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -864 1.19440089e+06 2.02897833e+04 ! particle number mass Rhill +Body864 1.19440089e+06 2.02897833e+04 ! particle number mass Rhill 1.10112267e+04 !particle radius in AU -9.44726757e+06 -1.72479642e+06 -5.06771776e+04 ! x y z 3.57081323e+02 -2.08684682e+03 -1.01697089e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -865 1.94180301e+05 1.09977241e+04 ! particle number mass Rhill +Body865 1.94180301e+05 1.09977241e+04 ! particle number mass Rhill 8.85599534e+03 !particle radius in AU -6.23129670e+06 7.19526623e+06 1.83941420e+04 ! x y z -1.59813509e+03 -1.40609078e+03 1.94595479e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -866 1.32317590e+06 2.00141699e+04 ! particle number mass Rhill +Body866 1.32317590e+06 2.00141699e+04 ! particle number mass Rhill 1.13935271e+04 !particle radius in AU -5.60132388e+06 -7.32299736e+06 -1.77571471e+04 ! x y z 1.71338179e+03 -1.30416800e+03 7.07200448e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -867 7.00538607e+05 3.57062222e+04 ! particle number mass Rhill +Body867 7.00538607e+05 3.57062222e+04 ! particle number mass Rhill 9.21714362e+03 !particle radius in AU 1.94866969e+07 6.41556967e+06 -8.78618223e+04 ! x y z -4.47022162e+02 1.36561417e+03 1.23555791e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -868 6.96093005e+05 2.84504578e+04 ! particle number mass Rhill +Body868 6.96093005e+05 2.84504578e+04 ! particle number mass Rhill 9.19760498e+03 !particle radius in AU 1.24313845e+07 -1.03009928e+07 2.91007895e+04 ! x y z 1.03299438e+03 1.26303931e+03 1.43272483e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -869 6.51350069e+04 1.52760208e+04 ! particle number mass Rhill +Body869 6.51350069e+04 1.52760208e+04 ! particle number mass Rhill 6.15328661e+03 !particle radius in AU -1.88463700e+07 3.02324922e+06 -1.45896688e+05 ! x y z -2.31662436e+02 -1.48292769e+03 2.63168505e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -870 1.30747026e+05 1.45819265e+04 ! particle number mass Rhill +Body870 1.30747026e+05 1.45819265e+04 ! particle number mass Rhill 7.76210648e+03 !particle radius in AU 1.40546567e+07 -3.88347486e+06 6.81896661e+04 ! x y z 4.43567006e+02 1.65056081e+03 4.01577354e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -871 6.71076966e+04 8.61160442e+03 ! particle number mass Rhill +Body871 6.71076966e+04 8.61160442e+03 ! particle number mass Rhill 4.21738363e+03 !particle radius in AU 1.78412490e+06 -1.05393977e+07 -1.79940495e+04 ! x y z 1.97327292e+03 3.39702264e+02 -1.56396341e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -872 1.71085269e+06 3.01722059e+04 ! particle number mass Rhill +Body872 1.71085269e+06 3.01722059e+04 ! particle number mass Rhill 1.24124221e+04 !particle radius in AU 3.48276485e+06 1.24683799e+07 5.71803206e+04 ! x y z -1.74011773e+03 4.74503606e+02 9.70062988e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -873 2.12621273e+05 1.22535537e+04 ! particle number mass Rhill +Body873 2.12621273e+05 1.22535537e+04 ! particle number mass Rhill 6.19423818e+03 !particle radius in AU 9.54521899e+06 -4.27421825e+06 -7.89921579e+04 ! x y z 8.34463883e+02 1.83314396e+03 -1.96687832e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -874 1.11434552e+06 2.11782232e+04 ! particle number mass Rhill +Body874 1.11434552e+06 2.11782232e+04 ! particle number mass Rhill 1.07595049e+04 !particle radius in AU -2.90897541e+06 -9.97345628e+06 4.60433948e+04 ! x y z 1.93634809e+03 -5.84664071e+02 -6.64958448e-01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -875 1.63374203e+06 2.84663610e+04 ! particle number mass Rhill +Body875 1.63374203e+06 2.84663610e+04 ! particle number mass Rhill 1.22230660e+04 !particle radius in AU 4.25415099e+06 -1.14325644e+07 5.00958816e+04 ! x y z 1.75951768e+03 6.44587122e+02 6.30692655e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -876 3.21448512e+05 2.38193850e+04 ! particle number mass Rhill +Body876 3.21448512e+05 2.38193850e+04 ! particle number mass Rhill 7.10923390e+03 !particle radius in AU -1.58007262e+07 -7.45105168e+06 -3.06690137e+04 ! x y z 6.82944765e+02 -1.41301363e+03 1.04453850e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -877 7.95360887e+04 7.85656320e+03 ! particle number mass Rhill +Body877 7.95360887e+04 7.85656320e+03 ! particle number mass Rhill 6.57693777e+03 !particle radius in AU 8.25741284e+06 4.39411348e+06 3.78949633e+04 ! x y z -9.99781284e+02 1.87441904e+03 -3.21699586e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -878 7.92129839e+04 1.88783439e+04 ! particle number mass Rhill +Body878 7.92129839e+04 1.88783439e+04 ! particle number mass Rhill 6.56801971e+03 !particle radius in AU 2.42332014e+06 2.17054415e+07 -5.36680055e+04 ! x y z -1.40455533e+03 1.37752686e+02 -3.67471579e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -879 1.02921195e+05 1.05249947e+04 ! particle number mass Rhill +Body879 1.02921195e+05 1.05249947e+04 ! particle number mass Rhill 7.16699767e+03 !particle radius in AU -1.11338384e+07 -2.20174819e+06 -5.08310388e+04 ! x y z 3.88427106e+02 -1.90213725e+03 -1.60447088e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -880 1.15170895e+06 3.80457220e+04 ! particle number mass Rhill +Body880 1.15170895e+06 3.80457220e+04 ! particle number mass Rhill 1.08784389e+04 !particle radius in AU -1.83729146e+07 1.19076985e+06 -1.72335144e+04 ! x y z -9.88243619e+01 -1.51803622e+03 2.27806536e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -881 1.02079633e+06 2.51296581e+04 ! particle number mass Rhill +Body881 1.02079633e+06 2.51296581e+04 ! particle number mass Rhill 1.04495767e+04 !particle radius in AU -6.50873442e+06 -1.07127054e+07 -3.34128129e+03 ! x y z 1.57607258e+03 -9.74525706e+02 1.08233475e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -882 1.10724006e+06 2.27598022e+04 ! particle number mass Rhill +Body882 1.10724006e+06 2.27598022e+04 ! particle number mass Rhill 1.07365873e+04 !particle radius in AU -2.66932388e+06 -1.08052729e+07 -7.29995052e+04 ! x y z 1.89275637e+03 -5.06517897e+02 -3.33939112e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -883 1.23514533e+06 2.71870351e+04 ! particle number mass Rhill +Body883 1.23514533e+06 2.71870351e+04 ! particle number mass Rhill 1.11350375e+04 !particle radius in AU -8.68309984e+06 8.73295385e+06 2.12890448e+04 ! x y z -1.33510513e+03 -1.35075217e+03 2.94732064e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -884 6.42357183e+04 8.63381056e+03 ! particle number mass Rhill +Body884 6.42357183e+04 8.63381056e+03 ! particle number mass Rhill 4.15634119e+03 !particle radius in AU -9.01680783e+06 -6.03891596e+06 -1.83491289e+04 ! x y z 1.08610553e+03 -1.66661637e+03 5.40990322e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -885 5.31967805e+05 1.46197870e+04 ! particle number mass Rhill +Body885 5.31967805e+05 1.46197870e+04 ! particle number mass Rhill 8.40905991e+03 !particle radius in AU 8.73703169e+06 -2.34962014e+06 8.87466208e+03 ! x y z 5.81838269e+02 2.10387535e+03 1.59910498e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -886 1.06591901e+06 1.91036572e+04 ! particle number mass Rhill +Body886 1.06591901e+06 1.91036572e+04 ! particle number mass Rhill 1.06013311e+04 !particle radius in AU -5.56657026e+06 -7.79387621e+06 -2.42457443e+04 ! x y z 1.72811494e+03 -1.19163725e+03 7.49315478e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -887 2.02044303e+05 1.75518766e+04 ! particle number mass Rhill +Body887 2.02044303e+05 1.75518766e+04 ! particle number mass Rhill 8.97396819e+03 !particle radius in AU -1.39814291e+07 5.67086599e+06 7.10670472e+04 ! x y z -6.38825478e+02 -1.55959492e+03 1.37992185e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -888 2.20300503e+05 1.26487217e+04 ! particle number mass Rhill +Body888 2.20300503e+05 1.26487217e+04 ! particle number mass Rhill 9.23650109e+03 !particle radius in AU -6.68069155e+05 -1.06256314e+07 1.03366197e+04 ! x y z 1.99524677e+03 -1.14341573e+02 7.10647594e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -889 1.81697506e+06 2.78836882e+04 ! particle number mass Rhill +Body889 1.81697506e+06 2.78836882e+04 ! particle number mass Rhill 1.26639344e+04 !particle radius in AU 4.44131372e+06 1.05243943e+07 -4.93210722e+04 ! x y z -1.78877447e+03 7.65306939e+02 -2.91348510e-01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -890 4.62182800e+04 8.76540290e+03 ! particle number mass Rhill +Body890 4.62182800e+04 8.76540290e+03 ! particle number mass Rhill 3.72440519e+03 !particle radius in AU 4.74513540e+06 -1.11521571e+07 1.99020178e+04 ! x y z 1.74857282e+03 7.32287072e+02 8.22196426e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -891 2.64052549e+05 1.12203260e+04 ! particle number mass Rhill +Body891 2.64052549e+05 1.12203260e+04 ! particle number mass Rhill 6.65808168e+03 !particle radius in AU 3.69231178e+06 8.07781861e+06 -4.84025537e+04 ! x y z -1.99534439e+03 9.00711444e+02 -7.96406279e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -892 2.59999466e+05 1.21745079e+04 ! particle number mass Rhill +Body892 2.59999466e+05 1.21745079e+04 ! particle number mass Rhill 9.76097367e+03 !particle radius in AU 7.96779900e+06 5.28681997e+06 4.51459562e+04 ! x y z -1.15797841e+03 1.77999708e+03 -1.86173466e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -893 1.67737402e+06 2.38355698e+04 ! particle number mass Rhill +Body893 1.67737402e+06 2.38355698e+04 ! particle number mass Rhill 1.23309244e+04 !particle radius in AU -4.76453798e+06 -8.80906879e+06 -7.02042625e+03 ! x y z 1.84339352e+03 -9.61915676e+02 -9.22717545e-02 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -894 1.37575479e+05 1.06778411e+04 ! particle number mass Rhill +Body894 1.37575479e+05 1.06778411e+04 ! particle number mass Rhill 7.89494909e+03 !particle radius in AU -1.01354200e+07 1.79029021e+06 5.81214752e+04 ! x y z -3.69721169e+02 -2.02078532e+03 -1.89093419e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -895 2.61034648e+05 1.11860226e+04 ! particle number mass Rhill +Body895 2.61034648e+05 1.11860226e+04 ! particle number mass Rhill 9.77391088e+03 !particle radius in AU 6.33480475e+06 -5.91857236e+06 -4.57999278e+04 ! x y z 1.55086475e+03 1.62084415e+03 -1.77397628e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -896 3.60957274e+05 1.87338359e+04 ! particle number mass Rhill +Body896 3.60957274e+05 1.87338359e+04 ! particle number mass Rhill 7.38931640e+03 !particle radius in AU -1.06493767e+07 7.82814577e+06 2.86358415e+04 ! x y z -1.05832791e+03 -1.46150005e+03 -5.49731072e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -897 5.62899921e+05 3.09693578e+04 ! particle number mass Rhill +Body897 5.62899921e+05 3.09693578e+04 ! particle number mass Rhill 1.26273646e+04 !particle radius in AU 7.65076109e+06 -1.70352283e+07 1.51301396e+04 ! x y z 1.39901314e+03 6.06223441e+02 4.14064364e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -898 4.46032399e+05 1.56971861e+04 ! particle number mass Rhill +Body898 4.46032399e+05 1.56971861e+04 ! particle number mass Rhill 1.16848854e+04 !particle radius in AU -6.95564135e+06 7.65404475e+06 -2.72421907e+04 ! x y z -1.52099853e+03 -1.35598646e+03 -9.21577263e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -899 1.52575316e+05 1.62545462e+04 ! particle number mass Rhill +Body899 1.52575316e+05 1.62545462e+04 ! particle number mass Rhill 5.54558146e+03 !particle radius in AU -5.49140677e+04 1.54446317e+07 -1.73043597e+04 ! x y z -1.66030895e+03 -1.12967723e+01 -2.73734027e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -900 2.78977890e+04 8.65543048e+03 ! particle number mass Rhill +Body900 2.78977890e+04 8.65543048e+03 ! particle number mass Rhill 4.63830089e+03 !particle radius in AU 5.28463967e+06 -1.36432294e+07 1.50949984e+05 ! x y z 1.58056809e+03 6.18784193e+02 2.19476691e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -901 1.42775206e+06 2.43769191e+04 ! particle number mass Rhill +Body901 1.42775206e+06 2.43769191e+04 ! particle number mass Rhill 1.16861089e+04 !particle radius in AU -6.87024799e+06 -8.49204530e+06 6.90721153e+04 ! x y z 1.52959279e+03 -1.25803812e+03 2.67976166e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -902 4.69852863e+05 1.45463044e+04 ! particle number mass Rhill +Body902 4.69852863e+05 1.45463044e+04 ! particle number mass Rhill 8.06813127e+03 !particle radius in AU -5.81437057e+06 -7.46625959e+06 3.98273573e+04 ! x y z 1.67686329e+03 -1.30572183e+03 -1.17212431e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -903 7.51681526e+04 1.28937189e+04 ! particle number mass Rhill +Body903 7.51681526e+04 1.28937189e+04 ! particle number mass Rhill 4.37989422e+03 !particle radius in AU -2.38298847e+06 -1.53195500e+07 2.60001847e+03 ! x y z 1.63293505e+03 -2.84649559e+02 -1.48524125e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -904 9.91305679e+05 2.50606865e+04 ! particle number mass Rhill +Body904 9.91305679e+05 2.50606865e+04 ! particle number mass Rhill 1.03479629e+04 !particle radius in AU 8.39690801e+06 9.44600671e+06 -3.53959311e+04 ! x y z -1.39463544e+03 1.20681438e+03 -1.20628234e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -905 1.77161305e+05 1.92271736e+04 ! particle number mass Rhill +Body905 1.77161305e+05 1.92271736e+04 ! particle number mass Rhill 5.82874810e+03 !particle radius in AU 1.01396678e+07 -1.41312986e+07 5.56406543e+04 ! x y z 1.26355281e+03 9.21806042e+02 1.06940044e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -906 1.43204042e+05 9.46035229e+03 ! particle number mass Rhill +Body906 1.43204042e+05 9.46035229e+03 ! particle number mass Rhill 5.42963650e+03 !particle radius in AU -5.21396669e+05 9.14782087e+06 -7.71915905e+03 ! x y z -2.15141308e+03 -1.66257020e+02 2.07412147e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -907 5.82582248e+05 1.59774603e+04 ! particle number mass Rhill +Body907 5.82582248e+05 1.59774603e+04 ! particle number mass Rhill 1.27728576e+04 !particle radius in AU -3.61884147e+05 9.58012066e+06 -6.32163221e+04 ! x y z -2.11988696e+03 -7.34599885e+01 -6.66237019e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -908 1.77222758e+06 3.99642317e+04 ! particle number mass Rhill +Body908 1.77222758e+06 3.99642317e+04 ! particle number mass Rhill 1.25591089e+04 !particle radius in AU -1.53596824e+07 6.40708086e+06 -1.04989342e+05 ! x y z -6.14876376e+02 -1.48301382e+03 1.26290046e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -909 3.69937337e+05 1.80154389e+04 ! particle number mass Rhill +Body909 3.69937337e+05 1.80154389e+04 ! particle number mass Rhill 1.09785515e+04 !particle radius in AU -6.50197885e+06 -1.10181249e+07 -6.62877770e+04 ! x y z 1.58080387e+03 -9.02970180e+02 -1.68313909e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -910 1.91277530e+05 1.12680358e+04 ! particle number mass Rhill +Body910 1.91277530e+05 1.12680358e+04 ! particle number mass Rhill 8.81164464e+03 !particle radius in AU 9.75396219e+06 -9.13807405e+05 -7.87078491e+04 ! x y z 2.02298152e+02 2.08890085e+03 -1.56193445e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -911 7.14924966e+04 1.06182194e+04 ! particle number mass Rhill +Body911 7.14924966e+04 1.06182194e+04 ! particle number mass Rhill 6.34730173e+03 !particle radius in AU 1.22059111e+07 -4.11569584e+06 4.51136993e+04 ! x y z 6.18155979e+02 1.71784899e+03 -1.45608490e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -912 1.55563555e+05 1.54568240e+04 ! particle number mass Rhill +Body912 1.55563555e+05 1.54568240e+04 ! particle number mass Rhill 8.22504486e+03 !particle radius in AU -1.39589249e+07 4.22706952e+06 1.42629172e+04 ! x y z -4.79490807e+02 -1.64034272e+03 -9.80150049e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -913 1.82993785e+05 1.31378262e+04 ! particle number mass Rhill +Body913 1.82993785e+05 1.31378262e+04 ! particle number mass Rhill 8.68255953e+03 !particle radius in AU -8.72337367e+06 7.89855612e+06 -1.46432428e+04 ! x y z -1.27359213e+03 -1.41072675e+03 -9.09643338e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -914 7.86241766e+04 1.03655056e+04 ! particle number mass Rhill +Body914 7.86241766e+04 1.03655056e+04 ! particle number mass Rhill 6.55170538e+03 !particle radius in AU -5.98689124e+06 -1.08278571e+07 -7.13966053e+04 ! x y z 1.61204187e+03 -9.04138146e+02 6.38760222e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -915 8.65375593e+04 1.02314925e+04 ! particle number mass Rhill +Body915 8.65375593e+04 1.02314925e+04 ! particle number mass Rhill 6.76452340e+03 !particle radius in AU -1.07210273e+07 4.87007409e+06 5.61861647e+04 ! x y z -7.65098099e+02 -1.73800332e+03 -1.14385352e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -916 5.51731603e+05 2.32611955e+04 ! particle number mass Rhill +Body916 5.51731603e+05 2.32611955e+04 ! particle number mass Rhill 8.51193471e+03 !particle radius in AU 2.68858721e+06 -1.40830147e+07 -6.98869515e+04 ! x y z 1.69547510e+03 3.28640998e+02 9.31981924e-01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -917 6.08037372e+05 2.25179870e+04 ! particle number mass Rhill +Body917 6.08037372e+05 2.25179870e+04 ! particle number mass Rhill 1.29562429e+04 !particle radius in AU -1.30260417e+07 3.41761257e+06 -7.30560375e+04 ! x y z -4.58021484e+02 -1.72002575e+03 5.01502204e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -918 4.79734805e+05 1.48772500e+04 ! particle number mass Rhill +Body918 4.79734805e+05 1.48772500e+04 ! particle number mass Rhill 1.19720742e+04 !particle radius in AU -4.79303948e+06 8.20836672e+06 6.12546656e+03 ! x y z -1.84411142e+03 -1.07059828e+03 4.85115120e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -919 3.74633489e+05 1.27654921e+04 ! particle number mass Rhill +Body919 3.74633489e+05 1.27654921e+04 ! particle number mass Rhill 1.10248119e+04 !particle radius in AU 7.16020189e+06 -5.20913143e+06 7.41222240e+04 ! x y z 1.31083472e+03 1.77863703e+03 -1.14709109e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -920 5.48029178e+04 7.03991663e+03 ! particle number mass Rhill +Body920 5.48029178e+04 7.03991663e+03 ! particle number mass Rhill 5.80902907e+03 !particle radius in AU 8.99285148e+05 9.31741571e+06 -4.43761911e+04 ! x y z -2.12986907e+03 1.90203427e+02 1.15661198e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -921 4.87827229e+05 1.74774715e+04 ! particle number mass Rhill +Body921 4.87827229e+05 1.74774715e+04 ! particle number mass Rhill 1.20390163e+04 !particle radius in AU 1.03624859e+07 4.00217371e+06 -3.33921276e+04 ! x y z -7.29889411e+02 1.83209523e+03 -3.12704990e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -922 1.05756885e+06 2.06748257e+04 ! particle number mass Rhill +Body922 1.05756885e+06 2.06748257e+04 ! particle number mass Rhill 1.05735757e+04 !particle radius in AU 9.54531799e+06 -3.82777787e+06 -3.08506232e+03 ! x y z 7.65760228e+02 1.88710727e+03 1.54248284e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -923 6.63813995e+04 1.09433671e+04 ! particle number mass Rhill +Body923 6.63813995e+04 1.09433671e+04 ! particle number mass Rhill 6.19228768e+03 !particle radius in AU -1.26508821e+07 -4.96817255e+06 -7.46581466e+04 ! x y z 6.38137580e+02 -1.65998064e+03 -1.05229703e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -924 1.00406632e+05 9.99833989e+03 ! particle number mass Rhill +Body924 1.00406632e+05 9.99833989e+03 ! particle number mass Rhill 7.10814791e+03 !particle radius in AU 6.65714202e+06 8.41817806e+06 5.11373555e+04 ! x y z -1.58896209e+03 1.22956179e+03 -1.67191084e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -925 5.87747010e+05 2.18911763e+04 ! particle number mass Rhill +Body925 5.87747010e+05 2.18911763e+04 ! particle number mass Rhill 8.69325608e+03 !particle radius in AU -1.30432977e+07 2.41169295e+06 9.46191119e+04 ! x y z -3.33638402e+02 -1.76051970e+03 1.16209842e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -926 4.75462803e+04 1.18644248e+04 ! particle number mass Rhill +Body926 4.75462803e+04 1.18644248e+04 ! particle number mass Rhill 3.75974028e+03 !particle radius in AU 1.62111278e+07 2.59399704e+06 1.61282577e+05 ! x y z -2.71405873e+02 1.59773598e+03 -5.81005218e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -927 3.60899345e+05 1.33896338e+04 ! particle number mass Rhill +Body927 3.60899345e+05 1.33896338e+04 ! particle number mass Rhill 7.38892108e+03 !particle radius in AU 2.06345127e+06 9.22023526e+06 -7.22571528e+03 ! x y z -2.09005362e+03 4.30799852e+02 -1.90823955e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -928 6.94986732e+05 2.84409336e+04 ! particle number mass Rhill +Body928 6.94986732e+05 2.84409336e+04 ! particle number mass Rhill 9.19272993e+03 !particle radius in AU -1.13721993e+07 -1.13987875e+07 8.83921800e+04 ! x y z 1.16224359e+03 -1.15160239e+03 -1.45306478e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -929 1.42004128e+06 2.12356496e+04 ! particle number mass Rhill +Body929 1.42004128e+06 2.12356496e+04 ! particle number mass Rhill 1.16650334e+04 !particle radius in AU 2.77942362e+06 -9.01437717e+06 -5.67717467e+04 ! x y z 2.03984238e+03 6.54242641e+02 1.85000009e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -930 2.24733888e+05 1.45872492e+04 ! particle number mass Rhill +Body930 2.24733888e+05 1.45872492e+04 ! particle number mass Rhill 9.29804930e+03 !particle radius in AU -1.18629177e+07 -4.45829589e+05 7.85442143e+04 ! x y z 1.01652144e+02 -1.91537773e+03 4.05611152e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -931 1.47976471e+06 2.49169315e+04 ! particle number mass Rhill +Body931 1.47976471e+06 2.49169315e+04 ! particle number mass Rhill 1.18263271e+04 !particle radius in AU 8.95238380e+06 6.51302794e+06 3.45161345e+04 ! x y z -1.14800130e+03 1.59335172e+03 -7.03295250e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -932 1.70114086e+05 1.29084720e+04 ! particle number mass Rhill +Body932 1.70114086e+05 1.29084720e+04 ! particle number mass Rhill 5.75041368e+03 !particle radius in AU 6.69475580e+06 -9.28551107e+06 -4.91541805e+04 ! x y z 1.59233658e+03 1.14243210e+03 1.78210731e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -933 1.56606121e+06 2.62055008e+04 ! particle number mass Rhill +Body933 1.56606121e+06 2.62055008e+04 ! particle number mass Rhill 1.20518923e+04 !particle radius in AU 1.12760016e+07 1.84611316e+06 -7.48490699e+04 ! x y z -2.79591330e+02 1.91267253e+03 -1.78025369e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -934 8.12648144e+05 1.75896750e+04 ! particle number mass Rhill +Body934 8.12648144e+05 1.75896750e+04 ! particle number mass Rhill 9.68470759e+03 !particle radius in AU -6.71328804e+03 9.68278345e+06 -5.52334404e+04 ! x y z -2.08432418e+03 -8.54871802e+00 1.66064441e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -935 9.32242815e+04 1.03934151e+04 ! particle number mass Rhill +Body935 9.32242815e+04 1.03934151e+04 ! particle number mass Rhill 4.70574813e+03 !particle radius in AU -6.96627774e+06 9.23026738e+06 -2.87240918e+04 ! x y z -1.52286258e+03 -1.17748048e+03 -3.95814303e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -936 9.15923643e+04 9.93071034e+03 ! particle number mass Rhill +Body936 9.15923643e+04 9.93071034e+03 ! particle number mass Rhill 4.67812785e+03 !particle radius in AU 1.23905483e+05 -1.09739869e+07 1.36396267e+04 ! x y z 1.98817193e+03 2.04705438e+01 -2.01972620e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -937 7.73209091e+04 8.79356723e+03 ! particle number mass Rhill +Body937 7.73209091e+04 8.79356723e+03 ! particle number mass Rhill 6.51530333e+03 !particle radius in AU -6.63943360e+06 7.91940404e+06 6.09014325e+04 ! x y z -1.56332740e+03 -1.31647658e+03 2.73931815e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -938 1.15431944e+06 2.13451050e+04 ! particle number mass Rhill +Body938 1.15431944e+06 2.13451050e+04 ! particle number mass Rhill 1.08866518e+04 !particle radius in AU 5.51288052e+06 -8.48543006e+06 3.44011201e+04 ! x y z 1.72675322e+03 1.14606699e+03 -1.64108886e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -939 1.21706761e+05 1.16464966e+04 ! particle number mass Rhill +Body939 1.21706761e+05 1.16464966e+04 ! particle number mass Rhill 7.57891828e+03 !particle radius in AU -6.54081328e+06 -9.90968551e+06 -8.75124119e+02 ! x y z 1.59735811e+03 -1.02533687e+03 2.87435690e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -940 1.44471560e+05 9.79699996e+03 ! particle number mass Rhill +Body940 1.44471560e+05 9.79699996e+03 ! particle number mass Rhill 5.44560895e+03 !particle radius in AU -6.45935547e+06 -6.74639603e+06 -1.43260248e+04 ! x y z 1.55668948e+03 -1.48434496e+03 1.71287847e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -941 3.71977165e+04 6.32336532e+03 ! particle number mass Rhill +Body941 3.71977165e+04 6.32336532e+03 ! particle number mass Rhill 5.10514110e+03 !particle radius in AU 6.10089271e+06 -7.18245737e+06 -1.54248190e+04 ! x y z 1.63416125e+03 1.39276630e+03 2.48510957e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -942 1.37980847e+05 9.55947495e+03 ! particle number mass Rhill +Body942 1.37980847e+05 9.55947495e+03 ! particle number mass Rhill 5.36280409e+03 !particle radius in AU 4.82602306e+06 -8.03439545e+06 -7.67679872e+02 ! x y z 1.85073484e+03 1.06188550e+03 8.12750484e-01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -943 4.27857629e+05 1.62853799e+04 ! particle number mass Rhill +Body943 4.27857629e+05 1.62853799e+04 ! particle number mass Rhill 1.15239690e+04 !particle radius in AU 4.44437862e+06 -9.91763988e+06 4.31307866e+04 ! x y z 1.80875755e+03 8.27020553e+02 -1.01329362e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -944 1.74965082e+06 3.10582259e+04 ! particle number mass Rhill +Body944 1.74965082e+06 3.10582259e+04 ! particle number mass Rhill 1.25055498e+04 !particle radius in AU -1.14222033e+07 -6.06408313e+06 4.03399165e+03 ! x y z 8.56095542e+02 -1.61207885e+03 -3.63239850e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -945 6.72561666e+04 7.87507156e+03 ! particle number mass Rhill +Body945 6.72561666e+04 7.87507156e+03 ! particle number mass Rhill 6.21936950e+03 !particle radius in AU 7.76499151e+06 5.91861320e+06 3.34591110e+04 ! x y z -1.26430519e+03 1.67125233e+03 9.81409163e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -946 8.64373959e+04 8.05199233e+03 ! particle number mass Rhill +Body946 8.64373959e+04 8.05199233e+03 ! particle number mass Rhill 6.76191251e+03 !particle radius in AU 6.41969262e+05 9.07081567e+06 -7.35294633e+03 ! x y z -2.17769789e+03 1.33895254e+02 1.52672754e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -947 5.36332278e+04 1.03602264e+04 ! particle number mass Rhill +Body947 5.36332278e+04 1.03602264e+04 ! particle number mass Rhill 3.91378509e+03 !particle radius in AU -1.06528591e+07 8.93880305e+06 -5.72463584e+04 ! x y z -1.12548728e+03 -1.34323474e+03 6.06469294e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -948 1.17211860e+05 2.10405973e+04 ! particle number mass Rhill +Body948 1.17211860e+05 2.10405973e+04 ! particle number mass Rhill 7.48444340e+03 !particle radius in AU -3.19955637e+06 2.16099834e+07 -4.14759774e+03 ! x y z -1.38306232e+03 -1.85981613e+02 8.81754791e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -949 9.11608285e+04 1.21936686e+04 ! particle number mass Rhill +Body949 9.11608285e+04 1.21936686e+04 ! particle number mass Rhill 6.88290450e+03 !particle radius in AU -1.10508713e+07 7.71301153e+06 -1.18282672e+05 ! x y z -1.00552378e+03 -1.48763887e+03 9.37513940e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -950 4.59859255e+05 1.50029271e+04 ! particle number mass Rhill +Body950 4.59859255e+05 1.50029271e+04 ! particle number mass Rhill 8.01051874e+03 !particle radius in AU -6.84568402e+06 6.93126559e+06 -8.44628949e+04 ! x y z -1.48797188e+03 -1.48762515e+03 1.55236862e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -951 1.26288065e+06 2.47709011e+04 ! particle number mass Rhill +Body951 1.26288065e+06 2.47709011e+04 ! particle number mass Rhill 1.12177675e+04 !particle radius in AU -4.99810043e+06 1.03574496e+07 4.97035769e+03 ! x y z -1.74218913e+03 -8.42934517e+02 -8.95086256e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -952 1.67008034e+06 2.22513268e+04 ! particle number mass Rhill +Body952 1.67008034e+06 2.22513268e+04 ! particle number mass Rhill 1.23130257e+04 !particle radius in AU -5.22893040e+06 -8.08300727e+06 -6.54096012e+04 ! x y z 1.73636332e+03 -1.16550147e+03 -7.26670162e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -953 7.95372577e+05 1.86967687e+04 ! particle number mass Rhill +Body953 7.95372577e+05 1.86967687e+04 ! particle number mass Rhill 9.61558846e+03 !particle radius in AU 8.48788962e+06 5.61313541e+06 -3.97847978e+04 ! x y z -1.16430859e+03 1.69033461e+03 -1.63966122e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -954 8.47395554e+04 1.00079467e+04 ! particle number mass Rhill +Body954 8.47395554e+04 1.00079467e+04 ! particle number mass Rhill 6.71734597e+03 !particle radius in AU -8.10346206e+06 8.11251976e+06 -2.39530194e+04 ! x y z -1.39528138e+03 -1.34141849e+03 -1.46583663e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -955 6.93438909e+05 2.84903753e+04 ! particle number mass Rhill +Body955 6.93438909e+05 2.84903753e+04 ! particle number mass Rhill 9.18590040e+03 !particle radius in AU 1.01379295e+07 1.27148009e+07 1.28683748e+05 ! x y z -1.25755832e+03 1.02459820e+03 2.79221586e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -956 7.31942427e+04 1.24518277e+04 ! particle number mass Rhill +Body956 7.31942427e+04 1.24518277e+04 ! particle number mass Rhill 4.34121509e+03 !particle radius in AU -3.34906408e+06 -1.45007656e+07 3.06724892e+04 ! x y z 1.65986723e+03 -3.87189481e+02 -1.20093781e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -957 3.55587603e+05 1.37341596e+04 ! particle number mass Rhill +Body957 3.55587603e+05 1.37341596e+04 ! particle number mass Rhill 7.35249155e+03 !particle radius in AU 9.72284422e+06 5.24694587e+05 -2.03401805e+04 ! x y z -1.64711568e+02 2.09599540e+03 2.03343245e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -958 1.71213733e+06 2.28612972e+04 ! particle number mass Rhill +Body958 1.71213733e+06 2.28612972e+04 ! particle number mass Rhill 1.24155280e+04 !particle radius in AU 8.48073237e+06 4.51058486e+06 2.53523368e+04 ! x y z -9.87084405e+02 1.87149600e+03 2.30788388e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -959 1.49068065e+05 1.05743641e+04 ! particle number mass Rhill +Body959 1.49068065e+05 1.05743641e+04 ! particle number mass Rhill 5.50275953e+03 !particle radius in AU 6.45455163e+06 -7.63351792e+06 -1.42285814e+05 ! x y z 1.59381455e+03 1.33155701e+03 -4.40247600e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -960 2.47891004e+05 1.32144407e+04 ! particle number mass Rhill +Body960 2.47891004e+05 1.32144407e+04 ! particle number mass Rhill 6.51937434e+03 !particle radius in AU -8.78159278e+06 5.76426176e+06 9.09624378e+04 ! x y z -1.08134022e+03 -1.71795196e+03 -8.73857909e-01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -961 2.14835918e+05 1.35103323e+04 ! particle number mass Rhill +Body961 2.14835918e+05 1.35103323e+04 ! particle number mass Rhill 6.21567016e+03 !particle radius in AU 9.52925894e+06 6.10621713e+06 8.38784066e+04 ! x y z -1.05186401e+03 1.64327133e+03 8.87777455e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -962 6.29065831e+05 1.73269791e+04 ! particle number mass Rhill +Body962 6.29065831e+05 1.73269791e+04 ! particle number mass Rhill 8.89237350e+03 !particle radius in AU 1.01892854e+07 -1.36265120e+06 -1.12357324e+04 ! x y z 2.44094973e+02 2.01912416e+03 -1.23871747e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -963 5.16147317e+05 1.50575212e+04 ! particle number mass Rhill +Body963 5.16147317e+05 1.50575212e+04 ! particle number mass Rhill 1.22676172e+04 !particle radius in AU -9.44952303e+06 6.64794032e+05 2.66575883e+04 ! x y z -1.65527486e+02 -2.12001832e+03 -2.00449290e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -964 1.85821608e+05 1.40472593e+04 ! particle number mass Rhill +Body964 1.85821608e+05 1.40472593e+04 ! particle number mass Rhill 5.92221816e+03 !particle radius in AU 1.83154773e+05 -1.22553647e+07 8.81712635e+04 ! x y z 1.88138741e+03 4.37026901e+01 -1.09775010e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -965 1.06343938e+06 2.54408850e+04 ! particle number mass Rhill +Body965 1.06343938e+06 2.54408850e+04 ! particle number mass Rhill 1.05931042e+04 !particle radius in AU -7.97487196e+06 -9.77747428e+06 2.72278643e+04 ! x y z 1.43311159e+03 -1.15357841e+03 -9.89419786e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -966 1.58002425e+06 2.58710114e+04 ! particle number mass Rhill +Body966 1.58002425e+06 2.58710114e+04 ! particle number mass Rhill 1.20876047e+04 !particle radius in AU 1.94057310e+06 1.10640858e+07 -6.67098464e+04 ! x y z -1.92090005e+03 3.39961177e+02 9.93411747e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -967 8.58401235e+05 2.07572427e+04 ! particle number mass Rhill +Body967 8.58401235e+05 2.07572427e+04 ! particle number mass Rhill 9.86315310e+03 !particle radius in AU -4.65532155e+06 1.00459520e+07 1.92148265e+04 ! x y z -1.79352379e+03 -7.96705869e+02 7.04140623e-01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -968 1.57528626e+05 1.22389329e+04 ! particle number mass Rhill +Body968 1.57528626e+05 1.22389329e+04 ! particle number mass Rhill 5.60495536e+03 !particle radius in AU -7.15394211e+06 8.89862789e+06 -1.32380207e+04 ! x y z -1.51757568e+03 -1.20615223e+03 1.35463888e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -969 2.12134735e+04 6.51263393e+03 ! particle number mass Rhill +Body969 2.12134735e+04 6.51263393e+03 ! particle number mass Rhill 4.23356519e+03 !particle radius in AU -9.43261369e+06 7.11601450e+06 5.44346690e+03 ! x y z -1.15890933e+03 -1.51651908e+03 -4.86353449e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -970 3.29578174e+05 1.21204951e+04 ! particle number mass Rhill +Body970 3.29578174e+05 1.21204951e+04 ! particle number mass Rhill 7.16866817e+03 !particle radius in AU 4.46987922e+06 -7.54136153e+06 -1.75706858e+03 ! x y z 1.91337212e+03 1.12893149e+03 -4.46774330e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -971 1.05411151e+05 1.11684890e+04 ! particle number mass Rhill +Body971 1.05411151e+05 1.11684890e+04 ! particle number mass Rhill 4.90246515e+03 !particle radius in AU -1.19950136e+07 8.16218853e+05 1.95819347e+04 ! x y z -1.42817655e+02 -1.87495301e+03 1.71449405e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -972 2.55344298e+05 1.76418586e+04 ! particle number mass Rhill +Body972 2.55344298e+05 1.76418586e+04 ! particle number mass Rhill 9.70236728e+03 !particle radius in AU -7.49210830e+06 -1.17675041e+07 3.09999690e+03 ! x y z 1.49945194e+03 -9.16839153e+02 1.04827746e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -973 1.37703494e+05 1.12425461e+04 ! particle number mass Rhill +Body973 1.37703494e+05 1.12425461e+04 ! particle number mass Rhill 7.89739710e+03 !particle radius in AU 1.05050579e+07 -3.74118158e+06 2.63300605e+04 ! x y z 6.73610054e+02 1.82488852e+03 9.07423039e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -974 9.84103923e+05 2.00432924e+04 ! particle number mass Rhill +Body974 9.84103923e+05 2.00432924e+04 ! particle number mass Rhill 1.03228429e+04 !particle radius in AU 4.89752221e+06 -8.85494139e+06 -6.75229080e+04 ! x y z 1.83164749e+03 9.48103081e+02 -1.57990456e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -975 1.00252238e+05 9.22748863e+03 ! particle number mass Rhill +Body975 1.00252238e+05 9.22748863e+03 ! particle number mass Rhill 4.82114680e+03 !particle radius in AU -4.94662921e+06 -8.78447645e+06 -1.52590989e+04 ! x y z 1.78359269e+03 -1.02161338e+03 3.01217587e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -976 5.53135509e+05 1.68123246e+04 ! particle number mass Rhill +Body976 5.53135509e+05 1.68123246e+04 ! particle number mass Rhill 8.51914826e+03 !particle radius in AU -2.76648508e+06 1.00209975e+07 1.12220539e+04 ! x y z -1.94324711e+03 -5.66151040e+02 8.07071042e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -977 5.41267890e+05 1.56970657e+04 ! particle number mass Rhill +Body977 5.41267890e+05 1.56970657e+04 ! particle number mass Rhill 1.24634921e+04 !particle radius in AU 8.29729830e+05 -9.56636031e+06 7.03935010e+04 ! x y z 2.11653601e+03 1.88209489e+02 4.94852919e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -978 4.92634995e+04 7.32653208e+03 ! particle number mass Rhill +Body978 4.92634995e+04 7.32653208e+03 ! particle number mass Rhill 3.80446929e+03 !particle radius in AU -9.93606780e+06 -1.91150532e+06 -4.47495052e+04 ! x y z 3.80453971e+02 -2.01867650e+03 -1.85403349e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -979 1.65274417e+04 7.83114800e+03 ! particle number mass Rhill +Body979 1.65274417e+04 7.83114800e+03 ! particle number mass Rhill 3.89556870e+03 !particle radius in AU -8.01896356e+06 1.37141963e+07 -5.15166167e+03 ! x y z -1.39036186e+03 -8.35965747e+02 -1.59320152e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -980 5.24214865e+04 6.69045772e+03 ! particle number mass Rhill +Body980 5.24214865e+04 6.69045772e+03 ! particle number mass Rhill 5.72363723e+03 !particle radius in AU -1.85002148e+06 -8.80679540e+06 1.35544509e+04 ! x y z 2.13508260e+03 -4.62001715e+02 -1.42665412e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -981 9.63241215e+04 2.06858686e+04 ! particle number mass Rhill +Body981 9.63241215e+04 2.06858686e+04 ! particle number mass Rhill 4.75733808e+03 !particle radius in AU 4.27594078e+06 -2.26843001e+07 -1.55793996e+05 ! x y z 1.32907578e+03 2.52657022e+02 -1.02801831e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -982 1.49951567e+05 1.33263763e+04 ! particle number mass Rhill +Body982 1.49951567e+05 1.33263763e+04 ! particle number mass Rhill 8.12492435e+03 !particle radius in AU -5.68991814e+06 -1.12264560e+07 -5.21915423e+04 ! x y z 1.65234255e+03 -8.32199277e+02 -1.84232859e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -983 7.13391753e+05 2.49266565e+04 ! particle number mass Rhill +Body983 7.13391753e+05 2.49266565e+04 ! particle number mass Rhill 9.27317292e+03 !particle radius in AU 5.57078844e+06 -1.29122392e+07 2.98061387e+04 ! x y z 1.60978124e+03 6.76666256e+02 -1.81556760e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -984 4.91078407e+05 1.52853655e+04 ! particle number mass Rhill +Body984 4.91078407e+05 1.52853655e+04 ! particle number mass Rhill 1.20657022e+04 !particle radius in AU -9.23646620e+06 -3.48333300e+06 -5.66153126e+04 ! x y z 7.62840282e+02 -1.92758119e+03 -1.42885719e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -985 3.03747127e+04 9.37667012e+03 ! particle number mass Rhill +Body985 3.03747127e+04 9.37667012e+03 ! particle number mass Rhill 4.77169909e+03 !particle radius in AU -1.33386904e+07 -7.03492878e+06 5.22429887e+04 ! x y z 7.86090473e+02 -1.49627525e+03 -5.64598667e-01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -986 7.62789305e+04 7.49209491e+03 ! particle number mass Rhill +Body986 7.62789305e+04 7.49209491e+03 ! particle number mass Rhill 4.40136307e+03 !particle radius in AU -4.47610210e+06 -7.77281547e+06 -5.58878589e+04 ! x y z 1.89664270e+03 -1.07211196e+03 -5.72288054e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -987 5.38217351e+05 1.59161032e+04 ! particle number mass Rhill +Body987 5.38217351e+05 1.59161032e+04 ! particle number mass Rhill 8.44186160e+03 !particle radius in AU -9.07004249e+06 -3.73002016e+06 4.79325609e+04 ! x y z 7.83046085e+02 -1.94541887e+03 -4.25596103e-01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -988 1.46677051e+06 5.27296565e+04 ! particle number mass Rhill +Body988 1.46677051e+06 5.27296565e+04 ! particle number mass Rhill 1.17916085e+04 !particle radius in AU 4.77535808e+06 2.28272957e+07 -1.30485185e+05 ! x y z -1.33059311e+03 2.72226813e+02 1.17199136e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -989 7.83810354e+05 1.63919096e+04 ! particle number mass Rhill +Body989 7.83810354e+05 1.63919096e+04 ! particle number mass Rhill 9.56876735e+03 !particle radius in AU -6.57222396e+06 -6.18414714e+06 5.03770860e+03 ! x y z 1.49882331e+03 -1.57253167e+03 6.35917239e-01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -990 9.04479666e+05 2.77109755e+04 ! particle number mass Rhill +Body990 9.04479666e+05 2.77109755e+04 ! particle number mass Rhill 1.00365688e+04 !particle radius in AU 1.29779524e+07 -6.46401216e+06 3.48941370e+04 ! x y z 7.80281531e+02 1.52896125e+03 1.61899666e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -991 1.14972347e+06 2.99375373e+04 ! particle number mass Rhill +Body991 1.14972347e+06 2.99375373e+04 ! particle number mass Rhill 1.08721841e+04 !particle radius in AU 8.92019709e+06 1.13125647e+07 2.46536424e+04 ! x y z -1.35073430e+03 1.07341543e+03 -2.21311295e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -992 6.67357642e+04 1.09002272e+04 ! particle number mass Rhill +Body992 6.67357642e+04 1.09002272e+04 ! particle number mass Rhill 6.20328692e+03 !particle radius in AU 1.07245478e+07 -8.18329560e+06 2.13161879e+04 ! x y z 1.05166921e+03 1.44439805e+03 3.54109421e-01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -993 6.11370558e+05 1.56023100e+04 ! particle number mass Rhill +Body993 6.11370558e+05 1.56023100e+04 ! particle number mass Rhill 1.29798746e+04 !particle radius in AU -9.30550358e+06 8.66046042e+05 5.81017139e+04 ! x y z -2.29894248e+02 -2.12058022e+03 1.24228458e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -994 4.45237521e+05 1.77384318e+04 ! particle number mass Rhill +Body994 4.45237521e+05 1.77384318e+04 ! particle number mass Rhill 1.16779401e+04 !particle radius in AU 7.60186730e+06 8.86968517e+06 -2.74017031e+04 ! x y z -1.43991356e+03 1.26760065e+03 4.33685357e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -995 4.53014340e+05 2.01907210e+04 ! particle number mass Rhill +Body995 4.53014340e+05 2.01907210e+04 ! particle number mass Rhill 1.17455396e+04 !particle radius in AU 7.15301504e+06 -1.14025302e+07 6.70488022e+04 ! x y z 1.51419253e+03 9.18252451e+02 1.10269853e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -996 3.76622166e+05 1.36635044e+04 ! particle number mass Rhill +Body996 3.76622166e+05 1.36635044e+04 ! particle number mass Rhill 7.49470061e+03 !particle radius in AU 1.23698701e+06 9.47565448e+06 3.23875154e+04 ! x y z -2.10148424e+03 2.50074394e+02 -1.91619258e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -997 1.45808293e+06 2.77686048e+04 ! particle number mass Rhill +Body997 1.45808293e+06 2.77686048e+04 ! particle number mass Rhill 1.17682821e+04 !particle radius in AU -2.19991014e+06 -1.20488900e+07 1.28489104e+05 ! x y z 1.85062965e+03 -3.21678958e+02 -6.16390717e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -998 6.44391266e+05 1.73102080e+04 ! particle number mass Rhill +Body998 6.44391266e+05 1.73102080e+04 ! particle number mass Rhill 8.96400751e+03 !particle radius in AU -9.49865812e+06 -3.70460583e+06 1.09215654e+05 ! x y z 7.34938455e+02 -1.90450100e+03 -1.30332251e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -999 3.65175986e+05 1.64023546e+04 ! particle number mass Rhill +Body999 3.65175986e+05 1.64023546e+04 ! particle number mass Rhill 1.09312475e+04 !particle radius in AU 1.16226476e+07 1.38150369e+06 -1.92583058e+04 ! x y z -2.26381104e+02 1.88932307e+03 9.55895676e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1000 9.88081458e+05 1.83194505e+04 ! particle number mass Rhill +Body1000 9.88081458e+05 1.83194505e+04 ! particle number mass Rhill 1.03367318e+04 !particle radius in AU 2.15229887e+06 9.00160460e+06 -1.92923892e+04 ! x y z -2.09656754e+03 4.96075668e+02 -1.16719539e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1001 6.62894303e+05 1.89591067e+04 ! particle number mass Rhill +Body1001 6.62894303e+05 1.89591067e+04 ! particle number mass Rhill 9.04899661e+03 !particle radius in AU 1.06770435e+06 1.09358139e+07 4.20062155e+03 ! x y z -1.96462815e+03 1.83747788e+02 1.48559298e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1002 2.36132593e+05 1.08091204e+04 ! particle number mass Rhill +Body1002 2.36132593e+05 1.08091204e+04 ! particle number mass Rhill 6.41462061e+03 !particle radius in AU -6.42789916e+06 -5.88137546e+06 5.96791682e+04 ! x y z 1.50006484e+03 -1.65201659e+03 -1.22137321e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1003 4.16392913e+05 1.52456984e+04 ! particle number mass Rhill +Body1003 4.16392913e+05 1.52456984e+04 ! particle number mass Rhill 7.74973359e+03 !particle radius in AU -6.05164524e+06 -8.28607289e+06 -1.65389595e+03 ! x y z 1.67689384e+03 -1.17484360e+03 -6.18688546e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1004 7.30911687e+05 2.22864831e+04 ! particle number mass Rhill +Body1004 7.30911687e+05 2.22864831e+04 ! particle number mass Rhill 9.34847201e+03 !particle radius in AU 1.21489394e+07 1.95514302e+06 1.23709104e+05 ! x y z -3.04295890e+02 1.85437159e+03 3.05804994e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1005 7.04656544e+05 1.96594388e+04 ! particle number mass Rhill +Body1005 7.04656544e+05 1.96594388e+04 ! particle number mass Rhill 9.23516856e+03 !particle radius in AU 7.58308846e+06 8.14384020e+06 6.98191668e+04 ! x y z -1.44939292e+03 1.32522723e+03 3.40820153e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1006 5.25571133e+05 1.46176750e+04 ! particle number mass Rhill +Body1006 5.25571133e+05 1.46176750e+04 ! particle number mass Rhill 8.37521886e+03 !particle radius in AU 2.35699353e+06 8.90977821e+06 -1.38321436e+04 ! x y z -2.07425100e+03 5.54407039e+02 3.21999470e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1007 7.82045501e+05 2.08763285e+04 ! particle number mass Rhill +Body1007 7.82045501e+05 2.08763285e+04 ! particle number mass Rhill 9.56158017e+03 !particle radius in AU -6.64360612e+06 -9.33976004e+06 -1.15941594e+05 ! x y z 1.59144044e+03 -1.09353179e+03 -2.96304740e-01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1008 8.70025224e+04 1.07141500e+04 ! particle number mass Rhill +Body1008 8.70025224e+04 1.07141500e+04 ! particle number mass Rhill 4.59864210e+03 !particle radius in AU 1.19168220e+07 -3.45563255e+06 1.11394399e+04 ! x y z 5.17861579e+02 1.76812064e+03 1.39033798e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1009 5.64137560e+04 9.27247783e+03 ! particle number mass Rhill +Body1009 5.64137560e+04 9.27247783e+03 ! particle number mass Rhill 3.98028346e+03 !particle radius in AU -9.71007247e+06 7.35807090e+06 -1.31989891e+05 ! x y z -1.16325288e+03 -1.47233955e+03 8.07759554e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1010 1.58980135e+06 2.10225293e+04 ! particle number mass Rhill +Body1010 1.58980135e+06 2.10225293e+04 ! particle number mass Rhill 1.21124859e+04 !particle radius in AU 1.41799542e+06 -9.13902699e+06 4.24742676e+04 ! x y z 2.10898023e+03 3.21322532e+02 -1.26636042e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1011 6.48898466e+05 3.47604826e+04 ! particle number mass Rhill +Body1011 6.48898466e+05 3.47604826e+04 ! particle number mass Rhill 8.98485858e+03 !particle radius in AU -1.08957227e+07 -1.70176619e+07 1.40648070e+05 ! x y z 1.21605254e+03 -8.04289078e+02 5.08636985e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1012 1.42919802e+06 2.30069491e+04 ! particle number mass Rhill +Body1012 1.42919802e+06 2.30069491e+04 ! particle number mass Rhill 1.16900526e+04 !particle radius in AU -5.98329541e+06 8.30801044e+06 9.09812707e+03 ! x y z -1.64846384e+03 -1.22236838e+03 2.54695878e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1013 5.40040880e+05 1.47476030e+04 ! particle number mass Rhill +Body1013 5.40040880e+05 1.47476030e+04 ! particle number mass Rhill 8.45138479e+03 !particle radius in AU -4.65472167e+06 -7.85395586e+06 -5.30698954e+03 ! x y z 1.85738188e+03 -1.11675155e+03 9.77147330e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1014 3.15876640e+05 2.57826803e+04 ! particle number mass Rhill +Body1014 3.15876640e+05 2.57826803e+04 ! particle number mass Rhill 1.04153730e+04 !particle radius in AU 1.69188525e+07 8.47840581e+06 -4.67327616e+04 ! x y z -6.66379185e+02 1.35677843e+03 1.32594121e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1015 1.28437998e+06 2.18214380e+04 ! particle number mass Rhill +Body1015 1.28437998e+06 2.18214380e+04 ! particle number mass Rhill 1.12810669e+04 !particle radius in AU -7.04671066e+06 7.15586671e+06 -3.56479637e+04 ! x y z -1.47400909e+03 -1.45932821e+03 -9.67794404e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1016 8.51014432e+04 1.07189121e+04 ! particle number mass Rhill +Body1016 8.51014432e+04 1.07189121e+04 ! particle number mass Rhill 6.72689473e+03 !particle radius in AU 7.33791533e+06 -9.58517692e+06 3.03846079e+04 ! x y z 1.49051721e+03 1.17984608e+03 -1.97955637e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1017 7.73322783e+04 1.01200226e+04 ! particle number mass Rhill +Body1017 7.73322783e+04 1.01200226e+04 ! particle number mass Rhill 4.42153023e+03 !particle radius in AU 1.21152578e+07 2.07326034e+05 4.57151931e+03 ! x y z -2.18290977e+01 1.86989325e+03 -1.30418260e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1018 9.71965028e+05 1.81983837e+04 ! particle number mass Rhill +Body1018 9.71965028e+05 1.81983837e+04 ! particle number mass Rhill 1.02802232e+04 !particle radius in AU -1.78690734e+06 9.20811486e+06 6.52613267e+03 ! x y z -2.08865445e+03 -3.88689300e+02 7.21544338e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1019 1.49585486e+05 1.14358236e+04 ! particle number mass Rhill +Body1019 1.49585486e+05 1.14358236e+04 ! particle number mass Rhill 5.50911894e+03 !particle radius in AU -6.29895686e+06 8.71900726e+06 -7.33711540e+03 ! x y z -1.63469757e+03 -1.16304985e+03 4.84189753e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1020 1.78577195e+06 2.71175230e+04 ! particle number mass Rhill +Body1020 1.78577195e+06 2.71175230e+04 ! particle number mass Rhill 1.25910224e+04 !particle radius in AU 9.10086700e+06 -7.03219894e+06 -7.28785098e+04 ! x y z 1.17345937e+03 1.50811083e+03 -6.68343594e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1021 1.34502113e+05 9.24659035e+03 ! particle number mass Rhill +Body1021 1.34502113e+05 9.24659035e+03 ! particle number mass Rhill 7.83571609e+03 !particle radius in AU -4.28807654e+06 -7.85915508e+06 2.65183664e+04 ! x y z 1.92700749e+03 -1.07363344e+03 6.86417879e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1022 2.01917888e+05 1.22758301e+04 ! particle number mass Rhill +Body1022 2.01917888e+05 1.22758301e+04 ! particle number mass Rhill 6.08850399e+03 !particle radius in AU 6.47343353e+06 8.23566063e+06 3.01013545e+04 ! x y z -1.59000120e+03 1.26250583e+03 -1.25792680e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1023 1.71637754e+06 2.20305062e+04 ! particle number mass Rhill +Body1023 1.71637754e+06 2.20305062e+04 ! particle number mass Rhill 1.24257689e+04 !particle radius in AU -8.70674127e+06 -2.94645030e+06 -2.92623754e+04 ! x y z 7.11914106e+02 -2.04951615e+03 1.66637378e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1024 1.12639788e+06 4.33869282e+04 ! particle number mass Rhill +Body1024 1.12639788e+06 4.33869282e+04 ! particle number mass Rhill 1.07981562e+04 !particle radius in AU -1.75476786e+07 -1.12768402e+07 1.80639637e+05 ! x y z 7.59106783e+02 -1.22286396e+03 1.20937631e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1025 5.83604478e+05 2.16754875e+04 ! particle number mass Rhill +Body1025 5.83604478e+05 2.16754875e+04 ! particle number mass Rhill 1.27803239e+04 !particle radius in AU 7.04696388e+06 -1.10885823e+07 -6.17953039e+04 ! x y z 1.50498521e+03 9.91641405e+02 -4.14259212e-01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1026 2.20352204e+05 1.09859692e+04 ! particle number mass Rhill +Body1026 2.20352204e+05 1.09859692e+04 ! particle number mass Rhill 6.26842061e+03 !particle radius in AU 9.08053413e+06 1.73092917e+06 9.84209268e+03 ! x y z -4.33130368e+02 2.10086011e+03 -1.06621334e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1027 1.56061006e+06 3.08692906e+04 ! particle number mass Rhill +Body1027 1.56061006e+06 3.08692906e+04 ! particle number mass Rhill 1.20378926e+04 !particle radius in AU -3.00902975e+06 -1.32946373e+07 -5.90702502e+03 ! x y z 1.71319262e+03 -4.00878759e+02 -9.96066412e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1028 3.75033223e+05 1.31801704e+04 ! particle number mass Rhill +Body1028 3.75033223e+05 1.31801704e+04 ! particle number mass Rhill 7.48414588e+03 !particle radius in AU -4.04201967e+06 -8.29248316e+06 -4.12753129e+03 ! x y z 1.92318448e+03 -9.71522928e+02 1.76717922e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1029 4.12899419e+05 2.61767083e+04 ! particle number mass Rhill +Body1029 4.12899419e+05 2.61767083e+04 ! particle number mass Rhill 7.72799953e+03 !particle radius in AU 1.75193620e+07 -2.65169374e+06 1.13236551e+05 ! x y z 2.30440171e+02 1.53861792e+03 6.99701915e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1030 8.89682523e+05 1.86122096e+04 ! particle number mass Rhill +Body1030 8.89682523e+05 1.86122096e+04 ! particle number mass Rhill 9.98153536e+03 !particle radius in AU 3.43641275e+06 -8.93033322e+06 -2.09644587e+04 ! x y z 1.99449709e+03 7.67681042e+02 -1.69978122e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1031 2.48040793e+05 1.35267215e+04 ! particle number mass Rhill +Body1031 2.48040793e+05 1.35267215e+04 ! particle number mass Rhill 6.52068720e+03 !particle radius in AU -8.94110733e+06 -6.35904272e+06 -5.39789507e+04 ! x y z 1.10919784e+03 -1.62340625e+03 -3.28674782e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1032 5.49793186e+04 1.17511732e+04 ! particle number mass Rhill +Body1032 5.49793186e+04 1.17511732e+04 ! particle number mass Rhill 5.81525514e+03 !particle radius in AU -1.30741810e+07 8.57418735e+06 -1.19905050e+03 ! x y z -9.25024677e+02 -1.37017223e+03 4.97519787e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1033 6.00472566e+05 1.75807128e+04 ! particle number mass Rhill +Body1033 6.00472566e+05 1.75807128e+04 ! particle number mass Rhill 1.29022874e+04 !particle radius in AU -2.54473466e+06 1.02641366e+07 -6.03109093e+04 ! x y z -1.94287173e+03 -5.03549968e+02 -1.40714774e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1034 4.73743959e+04 7.85601650e+03 ! particle number mass Rhill +Body1034 4.73743959e+04 7.85601650e+03 ! particle number mass Rhill 3.75520420e+03 !particle radius in AU -2.05229123e+06 1.07524321e+07 -3.91281600e+04 ! x y z -1.94369561e+03 -3.72923016e+02 -4.66840760e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1035 1.71364118e+05 1.29921200e+04 ! particle number mass Rhill +Body1035 1.71364118e+05 1.29921200e+04 ! particle number mass Rhill 8.49458734e+03 !particle radius in AU 9.81310678e+06 -6.45686284e+06 -8.14126007e+04 ! x y z 1.04337462e+03 1.60488987e+03 -6.74659876e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1036 1.51256186e+06 2.01685135e+04 ! particle number mass Rhill +Body1036 1.51256186e+06 2.01685135e+04 ! particle number mass Rhill 1.19130613e+04 !particle radius in AU 6.87800371e+06 5.51073017e+06 -5.46411638e+04 ! x y z -1.36034802e+03 1.74332100e+03 4.94690697e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1037 2.00124444e+05 1.24535014e+04 ! particle number mass Rhill +Body1037 2.00124444e+05 1.24535014e+04 ! particle number mass Rhill 6.07042423e+03 !particle radius in AU -1.07553881e+07 -9.12112446e+05 -4.34386235e+04 ! x y z 1.54461489e+02 -1.98147483e+03 -1.70607618e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1038 2.74425239e+04 7.69344388e+03 ! particle number mass Rhill +Body1038 2.74425239e+04 7.69344388e+03 ! particle number mass Rhill 4.61293151e+03 !particle radius in AU 1.27377380e+07 -1.09778054e+05 -6.19904167e+04 ! x y z -1.25732694e+00 1.84331966e+03 -2.21143255e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1039 1.03073034e+06 3.34851913e+04 ! particle number mass Rhill +Body1039 1.03073034e+06 3.34851913e+04 ! particle number mass Rhill 1.04833644e+04 !particle radius in AU -5.13284511e+05 -1.67637883e+07 -2.82433912e+03 ! x y z 1.59521599e+03 -5.35780376e+01 1.00615428e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1040 8.09310632e+04 1.08186380e+04 ! particle number mass Rhill +Body1040 8.09310632e+04 1.08186380e+04 ! particle number mass Rhill 4.48908069e+03 !particle radius in AU -1.26602775e+07 4.02918646e+05 1.71412707e+04 ! x y z -5.95275114e+01 -1.83478145e+03 -6.71275300e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1041 2.07976707e+05 1.40611818e+04 ! particle number mass Rhill +Body1041 2.07976707e+05 1.40611818e+04 ! particle number mass Rhill 6.14880277e+03 !particle radius in AU 6.61475732e+05 1.19251089e+07 4.99716805e+03 ! x y z -1.89472956e+03 8.25618952e+01 -1.61809802e-01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1042 1.56927251e+04 4.40631103e+03 ! particle number mass Rhill +Body1042 1.56927251e+04 4.40631103e+03 ! particle number mass Rhill 3.82885081e+03 !particle radius in AU 8.80868758e+06 9.32656348e+05 -4.18862348e+04 ! x y z -2.17867324e+02 2.19123384e+03 -1.17898705e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1043 1.25482841e+05 9.88544728e+03 ! particle number mass Rhill +Body1043 1.25482841e+05 9.88544728e+03 ! particle number mass Rhill 5.19573642e+03 !particle radius in AU 1.00480766e+07 1.10334466e+05 4.24190753e+04 ! x y z -1.56774101e+01 2.05584808e+03 1.80904032e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1044 5.76644423e+04 6.79383115e+03 ! particle number mass Rhill +Body1044 5.76644423e+04 6.79383115e+03 ! particle number mass Rhill 5.90842447e+03 !particle radius in AU -2.68410660e+06 -8.45093049e+06 -2.25369168e+04 ! x y z 2.08071561e+03 -7.11201230e+02 1.07896227e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1045 1.27910959e+05 1.05238625e+04 ! particle number mass Rhill +Body1045 1.27910959e+05 1.05238625e+04 ! particle number mass Rhill 7.70557245e+03 !particle radius in AU -2.49395661e+06 -1.01785537e+07 4.67622537e+04 ! x y z 1.97783372e+03 -4.46467141e+02 1.43639227e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1046 1.34350101e+06 2.00599763e+04 ! particle number mass Rhill +Body1046 1.34350101e+06 2.00599763e+04 ! particle number mass Rhill 1.14515690e+04 !particle radius in AU -5.37771504e+06 7.44714074e+06 -6.06003060e+03 ! x y z -1.75372901e+03 -1.25777673e+03 1.33051245e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1047 1.39800754e+05 1.50279289e+04 ! particle number mass Rhill +Body1047 1.39800754e+05 1.50279289e+04 ! particle number mass Rhill 7.93728841e+03 !particle radius in AU 1.43736621e+07 3.27074646e+06 -1.17711231e+05 ! x y z -3.95229369e+02 1.65048180e+03 -2.09427051e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1048 7.35813542e+05 1.62870205e+04 ! particle number mass Rhill +Body1048 7.35813542e+05 1.62870205e+04 ! particle number mass Rhill 9.36932395e+03 !particle radius in AU -8.93375487e+06 -9.23297021e+05 -5.56404103e+04 ! x y z 2.58345498e+02 -2.18331951e+03 -1.86368551e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1049 2.08700220e+05 1.87560451e+04 ! particle number mass Rhill +Body1049 2.08700220e+05 1.87560451e+04 ! particle number mass Rhill 9.07144821e+03 !particle radius in AU -1.28280097e+07 8.91411489e+06 -1.59387089e+04 ! x y z -9.55988990e+02 -1.37339914e+03 -9.51566283e-01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1050 8.72300988e+05 2.84455766e+04 ! particle number mass Rhill +Body1050 8.72300988e+05 2.84455766e+04 ! particle number mass Rhill 9.91610503e+03 !particle radius in AU -1.22031914e+07 8.75617467e+06 1.35904643e+05 ! x y z -1.01713019e+03 -1.34842008e+03 -1.53941683e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1051 3.94208789e+05 1.58087172e+04 ! particle number mass Rhill +Body1051 3.94208789e+05 1.58087172e+04 ! particle number mass Rhill 7.60958719e+03 !particle radius in AU -1.81887078e+05 1.09247030e+07 -4.35726533e+04 ! x y z -1.97588122e+03 -8.11807516e+00 -3.92064501e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1052 2.98029754e+04 8.88054529e+03 ! particle number mass Rhill +Body1052 2.98029754e+04 8.88054529e+03 ! particle number mass Rhill 4.74157034e+03 !particle radius in AU 2.83878155e+06 1.44744864e+07 5.43842125e+04 ! x y z -1.65421841e+03 3.29251794e+02 -6.23680908e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1053 1.69212978e+05 1.16478963e+04 ! particle number mass Rhill +Body1053 1.69212978e+05 1.16478963e+04 ! particle number mass Rhill 8.45889329e+03 !particle radius in AU 1.06135506e+07 -4.48083559e+05 1.72504569e+04 ! x y z 9.44982902e+01 2.00633631e+03 9.90801265e-01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1054 1.11476324e+06 4.68292988e+04 ! particle number mass Rhill +Body1054 1.11476324e+06 4.68292988e+04 ! particle number mass Rhill 1.07608492e+04 !particle radius in AU 8.75139394e+06 -2.04107097e+07 -1.06034326e+05 ! x y z 1.29371288e+03 5.52007802e+02 5.05180489e-01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1055 3.02270985e+05 1.91780468e+04 ! particle number mass Rhill +Body1055 3.02270985e+05 1.91780468e+04 ! particle number mass Rhill 6.96494702e+03 !particle radius in AU 1.42098400e+07 1.83559068e+06 -6.61680518e+04 ! x y z -2.13356829e+02 1.72148688e+03 1.01500659e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1056 1.74016041e+05 1.86889261e+04 ! particle number mass Rhill +Body1056 1.74016041e+05 1.86889261e+04 ! particle number mass Rhill 8.53818219e+03 !particle radius in AU 1.55907651e+07 5.91768331e+06 -8.22551540e+04 ! x y z -5.54998648e+02 1.51448714e+03 -1.24785663e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1057 2.50703722e+05 2.27112105e+04 ! particle number mass Rhill +Body1057 2.50703722e+05 2.27112105e+04 ! particle number mass Rhill 9.64323129e+03 !particle radius in AU 7.38866883e+06 1.67469371e+07 -5.52080317e+04 ! x y z -1.39370270e+03 6.17614086e+02 4.21088917e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1058 8.14993090e+05 1.77743579e+04 ! particle number mass Rhill +Body1058 8.14993090e+05 1.77743579e+04 ! particle number mass Rhill 9.69401392e+03 !particle radius in AU -5.32551208e+06 -7.90474847e+06 -3.86152280e+04 ! x y z 1.76379265e+03 -1.19032254e+03 1.04687204e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1059 5.77311143e+05 2.14072614e+04 ! particle number mass Rhill +Body1059 5.77311143e+05 2.14072614e+04 ! particle number mass Rhill 8.64149686e+03 !particle radius in AU 1.09164841e+07 -7.03739746e+06 2.56807871e+04 ! x y z 9.98839941e+02 1.51559226e+03 -2.93169292e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1060 1.13703075e+06 1.86906120e+04 ! particle number mass Rhill +Body1060 1.13703075e+06 1.86906120e+04 ! particle number mass Rhill 1.08320270e+04 !particle radius in AU -6.83243259e+06 -5.66828831e+06 -1.72900877e+04 ! x y z 1.43365173e+03 -1.68974702e+03 2.09850405e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1061 1.33820642e+05 8.98629492e+03 ! particle number mass Rhill +Body1061 1.33820642e+05 8.98629492e+03 ! particle number mass Rhill 7.82246015e+03 !particle radius in AU 6.82803774e+06 -5.76411607e+06 5.47258325e+04 ! x y z 1.40722674e+03 1.66603602e+03 1.74552894e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1062 2.64155254e+05 1.31901008e+04 ! particle number mass Rhill +Body1062 2.64155254e+05 1.31901008e+04 ! particle number mass Rhill 6.65894479e+03 !particle radius in AU 9.35446321e+06 4.27959887e+06 1.44633990e+04 ! x y z -8.44145057e+02 1.86728709e+03 8.45220846e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1063 6.62937093e+05 1.93477118e+04 ! particle number mass Rhill +Body1063 6.62937093e+05 1.93477118e+04 ! particle number mass Rhill 9.04919131e+03 !particle radius in AU -8.81635825e+06 6.95372208e+06 5.99171831e+04 ! x y z -1.18658772e+03 -1.54806956e+03 -4.34306118e-01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1064 7.34315131e+05 2.50109591e+04 ! particle number mass Rhill +Body1064 7.34315131e+05 2.50109591e+04 ! particle number mass Rhill 9.36295974e+03 !particle radius in AU 3.76533406e+06 -1.36831259e+07 -4.52559471e+04 ! x y z 1.65006231e+03 5.02310012e+02 -7.82371716e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1065 1.67651593e+05 9.98045881e+03 ! particle number mass Rhill +Body1065 1.67651593e+05 9.98045881e+03 ! particle number mass Rhill 8.43279516e+03 !particle radius in AU 8.66363031e+06 -3.01551364e+06 1.87644792e+04 ! x y z 6.94997160e+02 2.04127247e+03 4.50266436e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1066 1.80360416e+06 2.85821499e+04 ! particle number mass Rhill +Body1066 1.80360416e+06 2.85821499e+04 ! particle number mass Rhill 1.26327938e+04 !particle radius in AU -1.81171981e+06 1.18614317e+07 -9.45077050e+04 ! x y z -1.85854649e+03 -2.65883958e+02 1.03797168e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1067 5.82344163e+05 1.77046313e+04 ! particle number mass Rhill +Body1067 5.82344163e+05 1.77046313e+04 ! particle number mass Rhill 1.27711174e+04 !particle radius in AU -5.75108647e+06 -9.00212328e+06 2.40243267e+04 ! x y z 1.69440892e+03 -1.07016945e+03 -1.54605015e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1068 4.19804355e+05 1.33943636e+04 ! particle number mass Rhill +Body1068 4.19804355e+05 1.33943636e+04 ! particle number mass Rhill 7.77084017e+03 !particle radius in AU 1.89490021e+06 8.84022962e+06 2.80656936e+04 ! x y z -2.12712367e+03 4.54322162e+02 -6.09085901e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1069 3.77849576e+05 1.26870716e+04 ! particle number mass Rhill +Body1069 3.77849576e+05 1.26870716e+04 ! particle number mass Rhill 7.50283352e+03 !particle radius in AU -2.84338801e+06 -8.43577004e+06 -3.58252007e+04 ! x y z 2.07616764e+03 -6.90414631e+02 7.86561001e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1070 3.08880512e+05 1.47299271e+04 ! particle number mass Rhill +Body1070 3.08880512e+05 1.47299271e+04 ! particle number mass Rhill 1.03379039e+04 !particle radius in AU 7.23228604e+06 8.21987628e+06 -1.12362711e+05 ! x y z -1.50075767e+03 1.29503859e+03 -4.22019044e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1071 1.59870183e+06 2.28294398e+04 ! particle number mass Rhill +Body1071 1.59870183e+06 2.28294398e+04 ! particle number mass Rhill 1.21350477e+04 !particle radius in AU 9.59011374e+06 -1.47240572e+06 -1.17481033e+04 ! x y z 3.06970553e+02 2.09485379e+03 2.11775305e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1072 8.35009848e+04 1.53899607e+04 ! particle number mass Rhill +Body1072 8.35009848e+04 1.53899607e+04 ! particle number mass Rhill 4.53610253e+03 !particle radius in AU 1.68353028e+07 -5.98357187e+06 1.37705248e+04 ! x y z 4.97655007e+02 1.46172367e+03 -1.17361347e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1073 7.99379007e+05 3.33138646e+04 ! particle number mass Rhill +Body1073 7.99379007e+05 3.33138646e+04 ! particle number mass Rhill 9.63170656e+03 !particle radius in AU -1.80713745e+07 3.81143072e+06 1.47991860e+05 ! x y z -3.34463620e+02 -1.47042095e+03 -2.39441838e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1074 1.97672601e+06 2.81308084e+04 ! particle number mass Rhill +Body1074 1.97672601e+06 2.81308084e+04 ! particle number mass Rhill 1.30247028e+04 !particle radius in AU 8.12437675e+06 -7.89692091e+06 8.58861149e+04 ! x y z 1.36700546e+03 1.38057019e+03 -5.74921289e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1075 4.49688061e+04 6.25101773e+03 ! particle number mass Rhill +Body1075 4.49688061e+04 6.25101773e+03 ! particle number mass Rhill 5.43842039e+03 !particle radius in AU 6.94978876e+06 -5.59183335e+06 2.41251511e+04 ! x y z 1.34132445e+03 1.72532099e+03 1.12041963e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1076 2.56818687e+05 1.81510251e+04 ! particle number mass Rhill +Body1076 2.56818687e+05 1.81510251e+04 ! particle number mass Rhill 6.59671726e+03 !particle radius in AU -1.18687337e+07 -8.19186254e+06 -8.44898067e+04 ! x y z 9.75684146e+02 -1.41995661e+03 -1.13753956e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1077 5.24592418e+05 1.57872425e+04 ! particle number mass Rhill +Body1077 5.24592418e+05 1.57872425e+04 ! particle number mass Rhill 1.23341623e+04 !particle radius in AU -1.89628928e+06 -9.50227023e+06 -4.05755726e+04 ! x y z 2.07857991e+03 -4.30149853e+02 -4.45053647e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1078 2.82198763e+05 1.31237392e+04 ! particle number mass Rhill +Body1078 2.82198763e+05 1.31237392e+04 ! particle number mass Rhill 6.80723430e+03 !particle radius in AU 1.01428084e+07 1.53976563e+06 -1.56033963e+05 ! x y z -3.05629291e+02 2.00359721e+03 3.06409701e-02 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1079 3.13497820e+05 1.18814338e+04 ! particle number mass Rhill +Body1079 3.13497820e+05 1.18814338e+04 ! particle number mass Rhill 7.05013076e+03 !particle radius in AU 3.99603404e+06 7.86593577e+06 5.11268274e+04 ! x y z -1.97467205e+03 9.78734350e+02 8.42153677e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1080 1.79001590e+05 1.04708242e+04 ! particle number mass Rhill +Body1080 1.79001590e+05 1.04708242e+04 ! particle number mass Rhill 8.61895511e+03 !particle radius in AU 6.54388805e+06 -6.77023287e+06 -4.59748352e+03 ! x y z 1.54444266e+03 1.46455300e+03 -1.04095061e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1081 9.85458768e+04 9.85910416e+03 ! particle number mass Rhill +Body1081 9.85458768e+04 9.85910416e+03 ! particle number mass Rhill 7.06396397e+03 !particle radius in AU 6.04468294e+06 8.82617315e+06 -1.42181890e+05 ! x y z -1.63233809e+03 1.16910466e+03 -1.88213215e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1082 2.55906276e+05 1.59131597e+04 ! particle number mass Rhill +Body1082 2.55906276e+05 1.59131597e+04 ! particle number mass Rhill 9.70947993e+03 !particle radius in AU -1.11170150e+07 6.16749342e+06 -3.82809291e+04 ! x y z -8.98686306e+02 -1.59525493e+03 2.55769594e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1083 5.55510829e+05 2.72516797e+04 ! particle number mass Rhill +Body1083 5.55510829e+05 2.72516797e+04 ! particle number mass Rhill 1.25718686e+04 !particle radius in AU 1.25437094e+06 -1.67969561e+07 -1.36312584e+04 ! x y z 1.58470452e+03 1.21111055e+02 3.59330822e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1084 4.68048454e+05 1.54091926e+04 ! particle number mass Rhill +Body1084 4.68048454e+05 1.54091926e+04 ! particle number mass Rhill 8.05778982e+03 !particle radius in AU 8.43800086e+06 5.71987949e+06 -3.20922412e+04 ! x y z -1.14330692e+03 1.67937737e+03 -4.35374922e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1085 2.15219454e+05 1.10871568e+04 ! particle number mass Rhill +Body1085 2.15219454e+05 1.10871568e+04 ! particle number mass Rhill 6.21936681e+03 !particle radius in AU -8.36235204e+06 -4.06735446e+06 1.77837069e+04 ! x y z 9.27393629e+02 -1.94041308e+03 2.61389295e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1086 2.99950641e+05 2.10812869e+04 ! particle number mass Rhill +Body1086 2.99950641e+05 2.10812869e+04 ! particle number mass Rhill 1.02373037e+04 !particle radius in AU -2.57151201e+06 -1.54968676e+07 -9.11168853e+04 ! x y z 1.63776183e+03 -2.76257315e+02 2.80266971e-01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1087 1.59864352e+05 9.50617153e+03 ! particle number mass Rhill +Body1087 1.59864352e+05 9.50617153e+03 ! particle number mass Rhill 8.30015495e+03 !particle radius in AU 8.66211969e+06 2.20644842e+06 5.69512514e+03 ! x y z -5.34166852e+02 2.11025355e+03 7.04563819e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1088 1.71165091e+06 2.20651978e+04 ! particle number mass Rhill +Body1088 1.71165091e+06 2.20651978e+04 ! particle number mass Rhill 1.24143522e+04 !particle radius in AU 2.50735051e+06 -9.08802531e+06 1.47619891e+03 ! x y z 2.03247718e+03 5.95768658e+02 -1.11711400e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1089 3.74682990e+05 1.39092702e+04 ! particle number mass Rhill +Body1089 3.74682990e+05 1.39092702e+04 ! particle number mass Rhill 1.10252975e+04 !particle radius in AU -5.08664524e+06 8.37497108e+06 -9.90101269e+04 ! x y z -1.78382195e+03 -1.07772723e+03 -8.86422219e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1090 2.04861379e+05 1.92942698e+04 ! particle number mass Rhill +Body1090 2.04861379e+05 1.92942698e+04 ! particle number mass Rhill 6.11794676e+03 !particle radius in AU -1.16840844e+07 -1.15084512e+07 8.57597825e+04 ! x y z 1.14349612e+03 -1.15014615e+03 -1.13350767e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1091 2.70294042e+05 1.21706227e+04 ! particle number mass Rhill +Body1091 2.70294042e+05 1.21706227e+04 ! particle number mass Rhill 9.88813712e+03 !particle radius in AU 1.06943121e+06 -9.45008765e+06 3.56309722e+04 ! x y z 2.11041887e+03 2.12664792e+02 3.02388980e-01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1092 1.15804931e+06 2.21787218e+04 ! particle number mass Rhill +Body1092 1.15804931e+06 2.21787218e+04 ! particle number mass Rhill 1.08983650e+04 !particle radius in AU 5.08433832e+06 -9.29067904e+06 4.27842439e+04 ! x y z 1.77269334e+03 9.63287806e+02 7.20636543e-01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1093 1.85153486e+06 2.27742481e+04 ! particle number mass Rhill +Body1093 1.85153486e+06 2.27742481e+04 ! particle number mass Rhill 1.27437222e+04 !particle radius in AU 2.28470278e+06 -8.96024162e+06 4.66696872e+04 ! x y z 2.09182568e+03 5.58957357e+02 -1.60064381e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1094 3.82760289e+04 5.93478404e+03 ! particle number mass Rhill +Body1094 3.82760289e+04 5.93478404e+03 ! particle number mass Rhill 5.15400237e+03 !particle radius in AU 5.02334401e+06 7.15122722e+06 -2.56747414e+04 ! x y z -1.82437670e+03 1.28647622e+03 -2.33583185e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1095 3.80438079e+05 1.41130336e+04 ! particle number mass Rhill +Body1095 3.80438079e+05 1.41130336e+04 ! particle number mass Rhill 7.51992756e+03 !particle radius in AU 8.03755250e+06 -5.51691122e+06 -2.97535232e+04 ! x y z 1.18216983e+03 1.74141617e+03 -1.17374833e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1096 1.81396845e+06 2.21520841e+04 ! particle number mass Rhill +Body1096 1.81396845e+06 2.21520841e+04 ! particle number mass Rhill 1.26569454e+04 !particle radius in AU -3.07464536e+06 -8.53282891e+06 -1.60914047e+04 ! x y z 2.04872286e+03 -7.58617715e+02 -1.15594518e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1097 2.08849843e+05 1.09999150e+04 ! particle number mass Rhill +Body1097 2.08849843e+05 1.09999150e+04 ! particle number mass Rhill 6.15739547e+03 !particle radius in AU -5.04841460e+06 7.90245442e+06 -3.74769403e+03 ! x y z -1.79658551e+03 -1.15333901e+03 -1.03989828e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1098 7.44137462e+05 1.61537051e+04 ! particle number mass Rhill +Body1098 7.44137462e+05 1.61537051e+04 ! particle number mass Rhill 9.40452184e+03 !particle radius in AU -4.42483219e+06 7.92889737e+06 4.84429526e+03 ! x y z -1.90157556e+03 -1.02851509e+03 3.04297458e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1099 3.12842595e+05 1.29972766e+04 ! particle number mass Rhill +Body1099 3.12842595e+05 1.29972766e+04 ! particle number mass Rhill 1.03819185e+04 !particle radius in AU -8.11772737e+06 5.17820457e+06 6.33191218e+04 ! x y z -1.16398577e+03 -1.76329084e+03 -1.46526563e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1100 5.00463370e+05 1.96095736e+04 ! particle number mass Rhill +Body1100 5.00463370e+05 1.96095736e+04 ! particle number mass Rhill 1.21420799e+04 !particle radius in AU -2.42335217e+06 -1.21748818e+07 5.34958561e+04 ! x y z 1.82657196e+03 -3.58482164e+02 2.17635181e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1101 2.58863272e+05 1.24587177e+04 ! particle number mass Rhill +Body1101 2.58863272e+05 1.24587177e+04 ! particle number mass Rhill 9.74673448e+03 !particle radius in AU -8.93954505e+06 -4.45366726e+06 9.09497729e+03 ! x y z 9.19578118e+02 -1.84128399e+03 1.10716364e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1102 3.92218511e+05 2.38002424e+04 ! particle number mass Rhill +Body1102 3.92218511e+05 2.38002424e+04 ! particle number mass Rhill 7.59675917e+03 !particle radius in AU -1.18899005e+07 -1.11121035e+07 7.33607503e+03 ! x y z 1.10060063e+03 -1.20094721e+03 -1.56817575e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1103 1.50461478e+05 1.87935494e+04 ! particle number mass Rhill +Body1103 1.50461478e+05 1.87935494e+04 ! particle number mass Rhill 8.13412353e+03 !particle radius in AU -1.65295735e+07 6.07637672e+06 3.45373521e+04 ! x y z -5.42846771e+02 -1.47237923e+03 2.24703732e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1104 3.40704575e+05 2.13916493e+04 ! particle number mass Rhill +Body1104 3.40704575e+05 2.13916493e+04 ! particle number mass Rhill 7.24844729e+03 !particle radius in AU 8.55996783e+06 -1.26469693e+07 -1.46558216e+05 ! x y z 1.40714271e+03 9.26431770e+02 -1.15490272e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1105 1.22078004e+06 4.53053513e+04 ! particle number mass Rhill +Body1105 1.22078004e+06 4.53053513e+04 ! particle number mass Rhill 1.10917006e+04 !particle radius in AU 5.19156391e+06 -2.05131401e+07 3.01682271e+04 ! x y z 1.38483992e+03 3.58833296e+02 7.82967392e-02 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1106 5.74059007e+05 1.75254745e+04 ! particle number mass Rhill +Body1106 5.74059007e+05 1.75254745e+04 ! particle number mass Rhill 8.62523974e+03 !particle radius in AU -1.04637869e+07 -1.51846657e+06 -3.27030757e+04 ! x y z 3.09759590e+02 -1.99538112e+03 5.67233805e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1107 1.10233704e+05 9.77367852e+03 ! particle number mass Rhill +Body1107 1.10233704e+05 9.77367852e+03 ! particle number mass Rhill 4.97611563e+03 !particle radius in AU 1.03065892e+07 -6.00329704e+05 -2.32121119e+04 ! x y z 1.34736424e+02 2.02883986e+03 3.23964316e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1108 4.92926514e+04 8.35869672e+03 ! particle number mass Rhill +Body1108 4.92926514e+04 8.35869672e+03 ! particle number mass Rhill 5.60741952e+03 !particle radius in AU -1.14276246e+07 -1.75001038e+06 -9.86471787e+04 ! x y z 2.92929450e+02 -1.89771028e+03 5.40774568e-01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1109 2.28123366e+05 2.46002721e+04 ! particle number mass Rhill +Body1109 2.28123366e+05 2.46002721e+04 ! particle number mass Rhill 6.34126039e+03 !particle radius in AU 1.88192745e+07 7.35750851e+06 -3.59880986e+04 ! x y z -5.35957066e+02 1.35808817e+03 -5.10111289e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1110 9.38291323e+05 2.39057714e+04 ! particle number mass Rhill +Body1110 9.38291323e+05 2.39057714e+04 ! particle number mass Rhill 1.01601058e+04 !particle radius in AU 1.11584259e+07 -4.47796771e+06 1.03803467e+04 ! x y z 7.28310338e+02 1.76604469e+03 1.45396412e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1111 6.38487235e+04 8.35289367e+03 ! particle number mass Rhill +Body1111 6.38487235e+04 8.35289367e+03 ! particle number mass Rhill 6.11251206e+03 !particle radius in AU 3.38442251e+06 -9.82784424e+06 -1.36230396e+05 ! x y z 1.90939863e+03 7.30865853e+02 1.53565819e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1112 4.72613591e+04 9.03956075e+03 ! particle number mass Rhill +Body1112 4.72613591e+04 9.03956075e+03 ! particle number mass Rhill 5.52931152e+03 !particle radius in AU -1.26252231e+07 -6.33455275e+05 -1.30864139e+05 ! x y z 9.33992929e+01 -1.83668276e+03 1.68626587e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1113 5.54246342e+04 9.10616654e+03 ! particle number mass Rhill +Body1113 5.54246342e+04 9.10616654e+03 ! particle number mass Rhill 3.95688360e+03 !particle radius in AU -1.20379515e+07 7.22168436e+05 8.94591753e+04 ! x y z -1.09103316e+02 -1.88101208e+03 -4.79548889e-01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1114 5.97374849e+04 7.60664387e+03 ! particle number mass Rhill +Body1114 5.97374849e+04 7.60664387e+03 ! particle number mass Rhill 5.97839539e+03 !particle radius in AU 9.86523103e+06 -1.83199282e+06 -1.01434913e+05 ! x y z 3.62371838e+02 2.01111356e+03 -2.79275007e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1115 2.85730185e+05 1.40237450e+04 ! particle number mass Rhill +Body1115 2.85730185e+05 1.40237450e+04 ! particle number mass Rhill 6.83551180e+03 !particle radius in AU -6.51672994e+06 8.58292997e+06 -5.02195539e+04 ! x y z -1.57720017e+03 -1.21482386e+03 -6.46438464e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1116 3.39840736e+05 1.28616339e+04 ! particle number mass Rhill +Body1116 3.39840736e+05 1.28616339e+04 ! particle number mass Rhill 1.06723682e+04 !particle radius in AU -6.45748170e+06 -6.60771754e+06 -2.88111990e+04 ! x y z 1.51807464e+03 -1.53717383e+03 -6.96952587e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1117 5.80221698e+04 8.94269756e+03 ! particle number mass Rhill +Body1117 5.80221698e+04 8.94269756e+03 ! particle number mass Rhill 4.01775686e+03 !particle radius in AU -1.05725448e+07 -5.16101098e+06 -7.22185112e+04 ! x y z 8.09611157e+02 -1.71812375e+03 -2.92698073e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1118 3.05076450e+04 9.39000602e+03 ! particle number mass Rhill +Body1118 3.05076450e+04 9.39000602e+03 ! particle number mass Rhill 4.77864994e+03 !particle radius in AU 1.47903230e+07 -3.70476681e+06 8.67755187e+04 ! x y z 3.95094726e+02 1.62426955e+03 3.16826057e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1119 1.47140776e+05 9.85483510e+03 ! particle number mass Rhill +Body1119 1.47140776e+05 9.85483510e+03 ! particle number mass Rhill 8.07383748e+03 !particle radius in AU -4.36058679e+05 -9.44156206e+06 -4.16955929e+04 ! x y z 2.12091782e+03 -1.37012120e+02 1.39491466e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1120 1.47165298e+06 4.94297791e+04 ! particle number mass Rhill +Body1120 1.47165298e+06 4.94297791e+04 ! particle number mass Rhill 1.18046777e+04 !particle radius in AU -1.46392393e+07 1.63813686e+07 8.12078291e+03 ! x y z -1.02836410e+03 -9.42723860e+02 -1.38765972e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1121 2.23276517e+05 1.11786883e+04 ! particle number mass Rhill +Body1121 2.23276517e+05 1.11786883e+04 ! particle number mass Rhill 9.27790681e+03 !particle radius in AU 9.24634424e+06 -1.31047137e+06 -7.09194003e+04 ! x y z 3.02062155e+02 2.11565604e+03 -9.58265694e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1122 1.82717804e+06 2.32239948e+04 ! particle number mass Rhill +Body1122 1.82717804e+06 2.32239948e+04 ! particle number mass Rhill 1.26875944e+04 !particle radius in AU -7.40684320e+06 6.13173465e+06 -3.12795630e+04 ! x y z -1.33749169e+03 -1.62866413e+03 1.56290098e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1123 2.51827609e+05 1.22793899e+04 ! particle number mass Rhill +Body1123 2.51827609e+05 1.22793899e+04 ! particle number mass Rhill 9.65761978e+03 !particle radius in AU 9.78515626e+06 -5.26138525e+05 -7.59982349e+03 ! x y z 1.11181620e+02 2.08934488e+03 -1.89984631e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1124 1.90339114e+05 1.21036723e+04 ! particle number mass Rhill +Body1124 1.90339114e+05 1.21036723e+04 ! particle number mass Rhill 8.79721090e+03 !particle radius in AU -2.42960077e+06 1.02657010e+07 6.86680195e+04 ! x y z -1.96613992e+03 -4.70552640e+02 -5.76191698e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1125 1.94434786e+06 2.40654720e+04 ! particle number mass Rhill +Body1125 1.94434786e+06 2.40654720e+04 ! particle number mass Rhill 1.29531974e+04 !particle radius in AU -2.99090493e+06 -9.38394150e+06 1.22754087e+04 ! x y z 1.96346362e+03 -6.64206351e+02 -1.04286573e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1126 3.54738618e+05 1.37755783e+04 ! particle number mass Rhill +Body1126 3.54738618e+05 1.37755783e+04 ! particle number mass Rhill 7.34663539e+03 !particle radius in AU -9.16858859e+06 3.17229706e+06 4.94776739e+02 ! x y z -6.65048356e+02 -2.00655681e+03 -1.69698250e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1127 8.13466838e+04 1.11519361e+04 ! particle number mass Rhill +Body1127 8.13466838e+04 1.11519361e+04 ! particle number mass Rhill 4.49675212e+03 !particle radius in AU 1.02698965e+07 8.30732914e+06 1.14137300e+05 ! x y z -1.13322876e+03 1.37969911e+03 -4.16855749e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1128 8.84633718e+04 9.48965294e+03 ! particle number mass Rhill +Body1128 8.84633718e+04 9.48965294e+03 ! particle number mass Rhill 4.62423780e+03 !particle radius in AU -6.04360154e+06 -8.98719524e+06 -6.31025271e+04 ! x y z 1.63921724e+03 -1.11262949e+03 4.86167037e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1129 3.06815484e+05 1.87036822e+04 ! particle number mass Rhill +Body1129 3.06815484e+05 1.87036822e+04 ! particle number mass Rhill 1.03148143e+04 !particle radius in AU -9.35912101e+06 -1.03642068e+07 -2.18384299e+03 ! x y z 1.30072422e+03 -1.17573948e+03 1.88668155e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1130 2.00267871e+06 2.75110942e+04 ! particle number mass Rhill +Body1130 2.00267871e+06 2.75110942e+04 ! particle number mass Rhill 1.30814562e+04 !particle radius in AU 1.04675718e+07 3.39520028e+06 2.70864639e+04 ! x y z -5.97065438e+02 1.88145152e+03 -6.95974089e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1131 3.21995723e+04 5.75242135e+03 ! particle number mass Rhill +Body1131 3.21995723e+04 5.75242135e+03 ! particle number mass Rhill 4.86540530e+03 !particle radius in AU -6.73236505e+06 6.13242839e+06 -2.94703322e+04 ! x y z -1.45294617e+03 -1.61318512e+03 -5.68499388e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1132 1.22510716e+05 1.18263490e+04 ! particle number mass Rhill +Body1132 1.22510716e+05 1.18263490e+04 ! particle number mass Rhill 7.59556962e+03 !particle radius in AU 4.89468690e+06 -1.07083932e+07 7.90151606e+04 ! x y z 1.76528528e+03 7.71676536e+02 -3.89405176e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1133 1.28112608e+06 3.44843562e+04 ! particle number mass Rhill +Body1133 1.28112608e+06 3.44843562e+04 ! particle number mass Rhill 1.12715321e+04 !particle radius in AU -1.37917712e+07 -7.88960798e+06 -6.85787993e+04 ! x y z 8.27177105e+02 -1.42633285e+03 -6.22498397e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1134 4.68678766e+05 2.48731080e+04 ! particle number mass Rhill +Body1134 4.68678766e+05 2.48731080e+04 ! particle number mass Rhill 1.18793884e+04 !particle radius in AU -7.34584547e+06 1.44613839e+07 -9.00207198e+04 ! x y z -1.43737968e+03 -7.51623709e+02 1.07613671e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1135 1.44600429e+06 2.06107186e+04 ! particle number mass Rhill +Body1135 1.44600429e+06 2.06107186e+04 ! particle number mass Rhill 1.17356962e+04 !particle radius in AU -2.70350276e+05 -9.01638261e+06 4.48528244e+04 ! x y z 2.19935586e+03 -5.92167058e+01 -1.37345562e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1136 1.55894367e+06 3.07191480e+04 ! particle number mass Rhill +Body1136 1.55894367e+06 3.07191480e+04 ! particle number mass Rhill 1.20336065e+04 !particle radius in AU -7.93634451e+06 -1.07127629e+07 7.42071719e+04 ! x y z 1.44011604e+03 -1.07152360e+03 -9.74704513e-01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1137 1.51661612e+05 1.00295649e+04 ! particle number mass Rhill +Body1137 1.51661612e+05 1.00295649e+04 ! particle number mass Rhill 5.53448930e+03 !particle radius in AU -3.42691664e+06 -9.05425003e+06 -2.11677870e+04 ! x y z 1.93479037e+03 -7.69981245e+02 1.10419971e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1138 8.20662008e+04 8.63404579e+03 ! particle number mass Rhill +Body1138 8.20662008e+04 8.63404579e+03 ! particle number mass Rhill 6.64595045e+03 !particle radius in AU -9.89233738e+06 -6.27568084e+05 6.18194671e+03 ! x y z 1.37071969e+02 -2.08621493e+03 4.72062753e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1139 5.83373853e+04 9.33904930e+03 ! particle number mass Rhill +Body1139 5.83373853e+04 9.33904930e+03 ! particle number mass Rhill 5.93131938e+03 !particle radius in AU 7.46340614e+06 9.67912332e+06 1.17459472e+04 ! x y z -1.47885193e+03 1.13911499e+03 4.40806749e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1140 5.11208949e+05 2.15674116e+04 ! particle number mass Rhill +Body1140 5.11208949e+05 2.15674116e+04 ! particle number mass Rhill 1.22283672e+04 !particle radius in AU 6.85478382e+06 1.15701707e+07 7.95650274e+04 ! x y z -1.53423752e+03 9.32610677e+02 -3.67365305e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1141 2.48995873e+04 6.96323506e+03 ! particle number mass Rhill +Body1141 2.48995873e+04 6.96323506e+03 ! particle number mass Rhill 4.46580449e+03 !particle radius in AU -4.56370068e+06 1.10908559e+07 1.08265365e+04 ! x y z -1.75802463e+03 -7.02357275e+02 1.04220113e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1142 1.18025613e+05 1.14053748e+04 ! particle number mass Rhill +Body1142 1.18025613e+05 1.14053748e+04 ! particle number mass Rhill 5.09070290e+03 !particle radius in AU -1.13385925e+07 2.97597054e+06 -4.72391617e+04 ! x y z -5.04596574e+02 -1.84477964e+03 1.31785708e-01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1143 1.20005427e+06 1.94048403e+04 ! particle number mass Rhill +Body1143 1.20005427e+06 1.94048403e+04 ! particle number mass Rhill 1.10285723e+04 !particle radius in AU -9.23261955e+06 -2.89252814e+05 -5.44687237e+04 ! x y z 6.51671796e+01 -2.14992673e+03 -1.81624856e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1144 6.44690750e+04 8.35064291e+03 ! particle number mass Rhill +Body1144 6.44690750e+04 8.35064291e+03 ! particle number mass Rhill 6.13224460e+03 !particle radius in AU 1.09075289e+06 1.05119561e+07 -3.25858255e+04 ! x y z -1.99773044e+03 1.99785681e+02 4.03938771e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1145 1.40498208e+05 1.01388504e+04 ! particle number mass Rhill +Body1145 1.40498208e+05 1.01388504e+04 ! particle number mass Rhill 5.39522124e+03 !particle radius in AU 5.52516207e+06 8.11277010e+06 -1.90841913e+04 ! x y z -1.72426706e+03 1.18446430e+03 1.21936026e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1146 7.72238320e+05 1.87680643e+04 ! particle number mass Rhill +Body1146 7.72238320e+05 1.87680643e+04 ! particle number mass Rhill 9.52144317e+03 !particle radius in AU -4.65951061e+05 1.02295404e+07 5.94558150e+04 ! x y z -2.05121750e+03 -9.71822097e+01 -1.16001667e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1147 1.89858572e+06 2.93947660e+04 ! particle number mass Rhill +Body1147 1.89858572e+06 2.93947660e+04 ! particle number mass Rhill 1.28507675e+04 !particle radius in AU 1.19722664e+07 -1.64049398e+06 8.58821045e+04 ! x y z 2.34549789e+02 1.85980680e+03 1.09499792e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1148 9.08539477e+04 1.04020032e+04 ! particle number mass Rhill +Body1148 9.08539477e+04 1.04020032e+04 ! particle number mass Rhill 6.87517236e+03 !particle radius in AU -1.08162591e+06 1.14927584e+07 -9.76059282e+04 ! x y z -1.93051044e+03 -1.62077695e+02 -7.14665732e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1149 1.34471989e+06 2.27670592e+04 ! particle number mass Rhill +Body1149 1.34471989e+06 2.27670592e+04 ! particle number mass Rhill 1.14550311e+04 !particle radius in AU -1.95233176e+06 1.02927697e+07 -2.00724108e+04 ! x y z -1.97843014e+03 -3.85350221e+02 1.08497627e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1150 9.50016532e+05 2.24812571e+04 ! particle number mass Rhill +Body1150 9.50016532e+05 2.24812571e+04 ! particle number mass Rhill 1.02022521e+04 !particle radius in AU 6.15222182e+06 -9.75312655e+06 1.28837233e+04 ! x y z 1.61895964e+03 1.04728187e+03 -1.26702028e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1151 4.98259579e+04 1.25780817e+04 ! particle number mass Rhill +Body1151 4.98259579e+04 1.25780817e+04 ! particle number mass Rhill 3.81889352e+03 !particle radius in AU 1.70431842e+07 -2.72492428e+06 -3.86028806e+04 ! x y z 2.83672553e+02 1.54910187e+03 2.07904021e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1152 6.79776779e+04 9.03177957e+03 ! particle number mass Rhill +Body1152 6.79776779e+04 9.03177957e+03 ! particle number mass Rhill 6.24153051e+03 !particle radius in AU 8.01774299e+06 8.09902023e+06 -2.62747132e+04 ! x y z -1.35353621e+03 1.36013542e+03 7.64569924e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1153 2.13947474e+05 1.11361089e+04 ! particle number mass Rhill +Body1153 2.13947474e+05 1.11361089e+04 ! particle number mass Rhill 9.14684621e+03 !particle radius in AU 3.29923819e+06 8.68923966e+06 -8.36350791e+03 ! x y z -2.01828563e+03 7.65043187e+02 -1.46373885e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1154 1.61918295e+06 3.85312414e+04 ! particle number mass Rhill +Body1154 1.61918295e+06 3.85312414e+04 ! particle number mass Rhill 1.21866490e+04 !particle radius in AU 9.48630114e+06 1.31203942e+07 7.51325437e+04 ! x y z -1.33995755e+03 9.53539277e+02 6.46323587e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1155 1.43971018e+05 9.40169492e+03 ! particle number mass Rhill +Body1155 1.43971018e+05 9.40169492e+03 ! particle number mass Rhill 5.43931264e+03 !particle radius in AU 9.01020062e+06 -9.02772630e+05 1.38704984e+04 ! x y z 2.41367313e+02 2.16126190e+03 7.68455544e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1156 5.27865615e+05 1.79382428e+04 ! particle number mass Rhill +Body1156 5.27865615e+05 1.79382428e+04 ! particle number mass Rhill 1.23597622e+04 !particle radius in AU -8.09665807e+06 -7.58547860e+06 3.14674691e+04 ! x y z 1.35669172e+03 -1.43426598e+03 7.37210686e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1157 2.61259252e+05 2.15300521e+04 ! particle number mass Rhill +Body1157 2.61259252e+05 2.15300521e+04 ! particle number mass Rhill 6.63452075e+03 !particle radius in AU 4.28160432e+06 -1.65281080e+07 -8.26509117e+03 ! x y z 1.53190957e+03 3.88184614e+02 1.24754943e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1158 6.27042315e+05 1.61291145e+04 ! particle number mass Rhill +Body1158 6.27042315e+05 1.61291145e+04 ! particle number mass Rhill 8.88282855e+03 !particle radius in AU 6.49256441e+05 9.31973535e+06 4.08167273e+04 ! x y z -2.15470427e+03 1.51716056e+02 1.89189290e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1159 1.52946375e+06 2.19072342e+04 ! particle number mass Rhill +Body1159 1.52946375e+06 2.19072342e+04 ! particle number mass Rhill 1.19572707e+04 !particle radius in AU -9.20065102e+05 -9.43874908e+06 -2.04752392e+04 ! x y z 2.12475295e+03 -2.35100552e+02 7.76090899e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1160 1.11460317e+05 9.66356252e+03 ! particle number mass Rhill +Body1160 1.11460317e+05 9.66356252e+03 ! particle number mass Rhill 4.99450465e+03 !particle radius in AU 4.31072822e+06 9.13284291e+06 4.14102022e+04 ! x y z -1.85476950e+03 9.03328979e+02 -1.46829604e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1161 2.86789697e+04 6.28431067e+03 ! particle number mass Rhill +Body1161 2.86789697e+04 6.28431067e+03 ! particle number mass Rhill 4.68119614e+03 !particle radius in AU -6.79093976e+06 8.03119054e+06 -7.05744289e+04 ! x y z -1.52734163e+03 -1.29554248e+03 1.30181520e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1162 9.65732528e+05 2.08012047e+04 ! particle number mass Rhill +Body1162 9.65732528e+05 2.08012047e+04 ! particle number mass Rhill 1.02582029e+04 !particle radius in AU -1.04804105e+07 -1.20577935e+06 3.31638534e+04 ! x y z 2.13664871e+02 -2.01046058e+03 -7.98031732e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1163 3.79954335e+05 1.38084178e+04 ! particle number mass Rhill +Body1163 3.79954335e+05 1.38084178e+04 ! particle number mass Rhill 1.10767611e+04 !particle radius in AU -7.18067628e+06 -6.29465669e+06 -5.18935266e+04 ! x y z 1.39765048e+03 -1.60192161e+03 7.92302858e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1164 5.13864272e+05 1.86014350e+04 ! particle number mass Rhill +Body1164 5.13864272e+05 1.86014350e+04 ! particle number mass Rhill 1.22495029e+04 !particle radius in AU -8.66772744e+06 -7.93918786e+06 3.66255031e+04 ! x y z 1.28753321e+03 -1.40570993e+03 1.04442422e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1165 5.37835639e+04 1.57088864e+04 ! particle number mass Rhill +Body1165 5.37835639e+04 1.57088864e+04 ! particle number mass Rhill 5.77278675e+03 !particle radius in AU -4.13157626e+06 -2.06445199e+07 1.15039089e+05 ! x y z 1.39928757e+03 -2.67584358e+02 -6.80453610e-01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1166 1.74187119e+06 3.12839499e+04 ! particle number mass Rhill +Body1166 1.74187119e+06 3.12839499e+04 ! particle number mass Rhill 1.24869874e+04 !particle radius in AU 2.86527664e+04 -1.30135384e+07 9.46703562e+04 ! x y z 1.82137923e+03 3.52269823e+01 6.17347097e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1167 1.58246923e+05 1.05774006e+04 ! particle number mass Rhill +Body1167 1.58246923e+05 1.05774006e+04 ! particle number mass Rhill 8.27206772e+03 !particle radius in AU 9.61204633e+06 2.11550317e+06 -1.01612254e+05 ! x y z -4.54369173e+02 2.03897871e+03 -3.85711771e-01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1168 3.04701159e+04 5.83960283e+03 ! particle number mass Rhill +Body1168 3.04701159e+04 5.83960283e+03 ! particle number mass Rhill 4.77668965e+03 !particle radius in AU 8.56305753e+06 3.83573915e+06 2.26223304e+04 ! x y z -8.87660780e+02 1.95010957e+03 -6.47697797e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1169 1.28475493e+05 1.68563266e+04 ! particle number mass Rhill +Body1169 1.28475493e+05 1.68563266e+04 ! particle number mass Rhill 7.71689197e+03 !particle radius in AU 7.06863637e+05 1.69810271e+07 1.26105980e+05 ! x y z -1.58048060e+03 4.41879800e+01 4.04119984e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1170 5.67329859e+04 7.91737704e+03 ! particle number mass Rhill +Body1170 5.67329859e+04 7.91737704e+03 ! particle number mass Rhill 5.87643861e+03 !particle radius in AU -5.44027365e+06 8.90923003e+06 -1.91872642e+02 ! x y z -1.72578284e+03 -1.05328021e+03 2.75794079e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1171 4.29332911e+05 1.41021700e+04 ! particle number mass Rhill +Body1171 4.29332911e+05 1.41021700e+04 ! particle number mass Rhill 7.82919405e+03 !particle radius in AU -3.84222450e+06 8.52500722e+06 5.13399679e+04 ! x y z -1.95749070e+03 -8.88579162e+02 4.05131851e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1172 2.41133271e+05 1.89734864e+04 ! particle number mass Rhill +Body1172 2.41133271e+05 1.89734864e+04 ! particle number mass Rhill 6.45958637e+03 !particle radius in AU -1.04764717e+07 1.11206338e+07 -1.83995722e+05 ! x y z -1.21578555e+03 -1.15954535e+03 1.26396174e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1173 1.02998708e+06 2.48616557e+04 ! particle number mass Rhill +Body1173 1.02998708e+06 2.48616557e+04 ! particle number mass Rhill 1.04808440e+04 !particle radius in AU 9.91080561e+06 7.33219213e+06 -1.96182672e+04 ! x y z -1.10289136e+03 1.51166868e+03 8.55255590e-01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1174 8.89416212e+04 1.13520798e+04 ! particle number mass Rhill +Body1174 8.89416212e+04 1.13520798e+04 ! particle number mass Rhill 4.63255599e+03 !particle radius in AU -6.34641421e+06 1.11675051e+07 -1.12534756e+05 ! x y z -1.58363204e+03 -9.07829510e+02 -3.73545248e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1175 5.14885465e+05 3.14248507e+04 ! particle number mass Rhill +Body1175 5.14885465e+05 3.14248507e+04 ! particle number mass Rhill 8.31806943e+03 !particle radius in AU -9.60844812e+06 -1.70444496e+07 1.09767306e+04 ! x y z 1.30061497e+03 -7.22601223e+02 5.04626944e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1176 2.69318662e+05 1.15494702e+04 ! particle number mass Rhill +Body1176 2.69318662e+05 1.15494702e+04 ! particle number mass Rhill 6.70205230e+03 !particle radius in AU 3.30176954e+06 8.21216858e+06 2.33957768e+04 ! x y z -2.06647672e+03 8.14303416e+02 -3.27813568e-01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1177 3.05068788e+05 1.47559128e+04 ! particle number mass Rhill +Body1177 3.05068788e+05 1.47559128e+04 ! particle number mass Rhill 6.98637011e+03 !particle radius in AU -3.56455427e+06 1.04513814e+07 9.13561134e+04 ! x y z -1.86227880e+03 -6.46156347e+02 -1.84370397e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1178 5.19675697e+05 1.60513381e+04 ! particle number mass Rhill +Body1178 5.19675697e+05 1.60513381e+04 ! particle number mass Rhill 1.22955075e+04 !particle radius in AU 1.01719252e+07 6.26688339e+05 3.49609062e+04 ! x y z -1.13334526e+02 2.03525342e+03 3.73100714e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1179 1.39224144e+06 2.01859103e+04 ! particle number mass Rhill +Body1179 1.39224144e+06 2.01859103e+04 ! particle number mass Rhill 1.15884099e+04 !particle radius in AU 6.79475129e+06 -6.15725925e+06 -4.34005132e+04 ! x y z 1.43607392e+03 1.60794893e+03 9.89854216e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1180 4.05538875e+05 1.93162514e+04 ! particle number mass Rhill +Body1180 4.05538875e+05 1.93162514e+04 ! particle number mass Rhill 1.13200016e+04 !particle radius in AU 3.31203426e+06 1.26977181e+07 1.61925621e+04 ! x y z -1.75290457e+03 4.51047834e+02 -6.90112778e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1181 3.20579085e+04 6.70574528e+03 ! particle number mass Rhill +Body1181 3.20579085e+04 6.70574528e+03 ! particle number mass Rhill 4.85825960e+03 !particle radius in AU -5.28465980e+06 9.08656562e+06 5.60870045e+04 ! x y z -1.73422854e+03 -1.05901334e+03 1.51078632e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1182 9.82029002e+05 2.71517490e+04 ! particle number mass Rhill +Body1182 9.82029002e+05 2.71517490e+04 ! particle number mass Rhill 1.03155828e+04 !particle radius in AU -4.41381530e+06 -1.31465095e+07 1.23851466e+05 ! x y z 1.64911245e+03 -5.92288633e+02 -5.00592030e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1183 9.36064907e+04 1.42989922e+04 ! particle number mass Rhill +Body1183 9.36064907e+04 1.42989922e+04 ! particle number mass Rhill 4.71217038e+03 !particle radius in AU 1.58308263e+07 -4.73628624e+05 -2.19545030e+04 ! x y z 5.84709400e+01 1.64641342e+03 -6.62703110e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1184 1.54283486e+06 2.12065020e+04 ! particle number mass Rhill +Body1184 1.54283486e+06 2.12065020e+04 ! particle number mass Rhill 1.19920145e+04 !particle radius in AU 9.12968341e+06 9.11733516e+04 1.78969232e+04 ! x y z -5.65016782e+01 2.18069451e+03 -3.98571279e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1185 2.73946957e+05 1.19011985e+04 ! particle number mass Rhill +Body1185 2.73946957e+05 1.19011985e+04 ! particle number mass Rhill 9.93248268e+03 !particle radius in AU 8.78149411e+06 -3.19216182e+06 -1.60141388e+04 ! x y z 7.37216338e+02 1.99835772e+03 -1.41820401e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1186 3.20723125e+04 9.43296932e+03 ! particle number mass Rhill +Body1186 3.20723125e+04 9.43296932e+03 ! particle number mass Rhill 4.85898712e+03 !particle radius in AU 1.29860619e+07 -8.19871711e+06 9.27457802e+04 ! x y z 8.67118976e+02 1.40272209e+03 6.07478118e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1187 5.63661707e+05 1.72291545e+04 ! particle number mass Rhill +Body1187 5.63661707e+05 1.72291545e+04 ! particle number mass Rhill 8.57284899e+03 !particle radius in AU 6.74596853e+06 7.83340922e+06 1.66421965e+04 ! x y z -1.53458492e+03 1.36487940e+03 -3.08963768e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1188 9.77483308e+05 2.12062991e+04 ! particle number mass Rhill +Body1188 9.77483308e+05 2.12062991e+04 ! particle number mass Rhill 1.02996416e+04 !particle radius in AU 9.97004957e+06 -4.03326891e+06 1.22229820e+04 ! x y z 7.36970819e+02 1.85756062e+03 1.86046036e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1189 1.11997160e+06 3.12831472e+04 ! particle number mass Rhill +Body1189 1.11997160e+06 3.12831472e+04 ! particle number mass Rhill 1.07775819e+04 !particle radius in AU 1.48289776e+07 -3.18422896e+06 -1.95106854e+04 ! x y z 3.65562411e+02 1.64235740e+03 -1.78622262e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1190 4.21697204e+05 2.76052200e+04 ! particle number mass Rhill +Body1190 4.21697204e+05 2.76052200e+04 ! particle number mass Rhill 7.78250193e+03 !particle radius in AU -1.82004676e+07 -4.58264120e+06 -8.80114368e+04 ! x y z 3.67043849e+02 -1.45746561e+03 3.81482960e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1191 1.27924892e+05 1.00707109e+04 ! particle number mass Rhill +Body1191 1.27924892e+05 1.00707109e+04 ! particle number mass Rhill 7.70585221e+03 !particle radius in AU 9.71830285e+06 -2.79239080e+06 -1.21765919e+05 ! x y z 5.86439180e+02 1.97016309e+03 1.41983570e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1192 2.18484788e+05 2.11984156e+04 ! particle number mass Rhill +Body1192 2.18484788e+05 2.11984156e+04 ! particle number mass Rhill 9.21105533e+03 !particle radius in AU -6.87422066e+06 -1.61812284e+07 3.33849657e+04 ! x y z 1.44453834e+03 -6.12213456e+02 5.14798988e-01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1193 4.42881353e+05 1.37597985e+04 ! particle number mass Rhill +Body1193 4.42881353e+05 1.37597985e+04 ! particle number mass Rhill 7.91069782e+03 !particle radius in AU -4.40453318e+05 -9.00359396e+06 2.55701381e+04 ! x y z 2.18504558e+03 -1.66090270e+02 -5.38264979e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1194 3.29981187e+05 3.15651668e+04 ! particle number mass Rhill +Body1194 3.29981187e+05 3.15651668e+04 ! particle number mass Rhill 7.17158897e+03 !particle radius in AU 2.19604188e+07 6.04779191e+06 -2.54791200e+04 ! x y z -3.65663685e+02 1.33014017e+03 -8.36197344e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1195 2.00582226e+05 1.14105456e+04 ! particle number mass Rhill +Body1195 2.00582226e+05 1.14105456e+04 ! particle number mass Rhill 8.95226931e+03 !particle radius in AU 6.76787299e+06 -6.88896584e+06 -7.92738002e+04 ! x y z 1.51846448e+03 1.48693289e+03 -8.03074046e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1196 2.41709605e+04 6.44082984e+03 ! particle number mass Rhill +Body1196 2.41709605e+04 6.44082984e+03 ! particle number mass Rhill 4.42181219e+03 !particle radius in AU -6.18157795e+06 9.50909765e+06 -6.31347661e+04 ! x y z -1.61918243e+03 -1.05906497e+03 6.51625165e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1197 4.00640371e+05 2.08913635e+04 ! particle number mass Rhill +Body1197 4.00640371e+05 2.08913635e+04 ! particle number mass Rhill 7.65074804e+03 !particle radius in AU 1.22370591e+07 -7.52313059e+06 -3.37590788e+04 ! x y z 9.11513184e+02 1.46224236e+03 1.38515615e-01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1198 1.61635239e+06 2.60284499e+04 ! particle number mass Rhill +Body1198 1.61635239e+06 2.60284499e+04 ! particle number mass Rhill 1.21795436e+04 !particle radius in AU 7.05236290e+06 -8.64870991e+06 -6.91330978e+04 ! x y z 1.52616946e+03 1.23310907e+03 1.29403411e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1199 5.36110948e+05 1.44063126e+04 ! particle number mass Rhill +Body1199 5.36110948e+05 1.44063126e+04 ! particle number mass Rhill 8.43083433e+03 !particle radius in AU 7.80864005e+06 -4.26482545e+06 -2.18013868e+04 ! x y z 1.03496940e+03 1.94204946e+03 1.21677642e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1200 4.28449000e+05 1.32968335e+04 ! particle number mass Rhill +Body1200 4.28449000e+05 1.32968335e+04 ! particle number mass Rhill 7.82381744e+03 !particle radius in AU 5.75136921e+06 -6.66165297e+06 -1.60013139e+04 ! x y z 1.66229394e+03 1.46936203e+03 -7.73684722e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1201 9.10224446e+04 8.11138177e+03 ! particle number mass Rhill +Body1201 9.10224446e+04 8.11138177e+03 ! particle number mass Rhill 6.87941995e+03 !particle radius in AU -1.22562478e+06 9.13823949e+06 -4.37327451e+04 ! x y z -2.12169150e+03 -2.88517939e+02 -1.49392473e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1202 1.98612171e+06 2.96000814e+04 ! particle number mass Rhill +Body1202 1.98612171e+06 2.96000814e+04 ! particle number mass Rhill 1.30453064e+04 !particle radius in AU 7.69914612e+06 -9.13021219e+06 -4.57648993e+04 ! x y z 1.43992781e+03 1.22291153e+03 -3.96856343e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1203 4.53993230e+04 7.49997775e+03 ! particle number mass Rhill +Body1203 4.53993230e+04 7.49997775e+03 ! particle number mass Rhill 5.45572052e+03 !particle radius in AU -1.04553344e+07 2.52527420e+06 -1.08628658e+05 ! x y z -4.86679714e+02 -1.92107394e+03 9.45357951e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1204 6.54079550e+05 2.35625462e+04 ! particle number mass Rhill +Body1204 6.54079550e+05 2.35625462e+04 ! particle number mass Rhill 9.00870821e+03 !particle radius in AU 1.39140966e+07 -6.41849608e+05 1.71228409e+05 ! x y z 6.24928406e+01 1.73760043e+03 1.32646652e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1205 7.94478183e+05 1.80563097e+04 ! particle number mass Rhill +Body1205 7.94478183e+05 1.80563097e+04 ! particle number mass Rhill 9.61198288e+03 !particle radius in AU -4.68891691e+06 -8.65727522e+06 1.38785454e+05 ! x y z 1.83563800e+03 -9.88706825e+02 -2.51608816e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1206 1.99428214e+06 2.23251883e+04 ! particle number mass Rhill +Body1206 1.99428214e+06 2.23251883e+04 ! particle number mass Rhill 1.30631485e+04 !particle radius in AU 2.13007974e+05 9.18824852e+06 -3.80121317e+04 ! x y z -2.12834457e+03 7.70592587e+01 -1.61308426e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1207 5.76675515e+04 7.93652829e+03 ! particle number mass Rhill +Body1207 5.76675515e+04 7.93652829e+03 ! particle number mass Rhill 5.90853066e+03 !particle radius in AU -1.00652683e+07 -2.07792286e+06 6.26672177e+04 ! x y z 4.27478087e+02 -2.00526834e+03 1.11714666e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1208 7.68189982e+05 1.70994829e+04 ! particle number mass Rhill +Body1208 7.68189982e+05 1.70994829e+04 ! particle number mass Rhill 9.50477579e+03 !particle radius in AU -9.25272310e+06 4.61553055e+05 2.28064653e+03 ! x y z -1.21224875e+02 -2.16490532e+03 1.16467209e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1209 7.17469390e+04 7.67800796e+03 ! particle number mass Rhill +Body1209 7.17469390e+04 7.67800796e+03 ! particle number mass Rhill 4.31241077e+03 !particle radius in AU 5.99768112e+06 7.18836176e+06 1.30862988e+04 ! x y z -1.63913963e+03 1.36776567e+03 -1.13032580e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1210 8.36379167e+04 1.86325541e+04 ! particle number mass Rhill +Body1210 8.36379167e+04 1.86325541e+04 ! particle number mass Rhill 4.53858074e+03 !particle radius in AU 2.69549465e+06 -2.13775506e+07 -2.70977944e+04 ! x y z 1.39480467e+03 1.95781010e+02 -1.22454588e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1211 2.44077886e+04 5.84483951e+03 ! particle number mass Rhill +Body1211 2.44077886e+04 5.84483951e+03 ! particle number mass Rhill 4.43620698e+03 !particle radius in AU -3.14237843e+06 -9.60218811e+06 -6.89227352e+04 ! x y z 1.95665546e+03 -6.62178945e+02 -9.36372693e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1212 1.44764486e+05 9.84771730e+03 ! particle number mass Rhill +Body1212 1.44764486e+05 9.84771730e+03 ! particle number mass Rhill 5.44928691e+03 !particle radius in AU 3.78692528e+06 8.59540985e+06 -3.20061356e+04 ! x y z -1.96752618e+03 8.51121277e+02 -1.51485463e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1213 2.27221346e+04 6.08153019e+03 ! particle number mass Rhill +Body1213 2.27221346e+04 6.08153019e+03 ! particle number mass Rhill 4.33163678e+03 !particle radius in AU -9.00146283e+06 -6.41911956e+06 6.65091457e+04 ! x y z 1.12404780e+03 -1.59135698e+03 -9.77302741e-01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1214 2.71535887e+04 5.59499408e+03 ! particle number mass Rhill +Body1214 2.71535887e+04 5.59499408e+03 ! particle number mass Rhill 4.59668490e+03 !particle radius in AU 8.54824866e+06 -3.66634423e+06 -4.89483929e+04 ! x y z 8.47956516e+02 1.98291118e+03 3.60869553e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1215 1.83930380e+06 4.81996691e+04 ! particle number mass Rhill +Body1215 1.83930380e+06 4.81996691e+04 ! particle number mass Rhill 1.27155989e+04 !particle radius in AU 1.95697614e+07 6.28199416e+06 9.65119660e+04 ! x y z -4.43211708e+02 1.34690163e+03 -9.62234736e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1216 1.59080558e+04 1.03572285e+04 ! particle number mass Rhill +Body1216 1.59080558e+04 1.03572285e+04 ! particle number mass Rhill 3.84628408e+03 !particle radius in AU -1.58193926e+07 -1.35536390e+07 8.45439846e+04 ! x y z 9.33923428e+02 -1.08590633e+03 1.18308309e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1217 1.66392524e+06 3.70165505e+04 ! particle number mass Rhill +Body1217 1.66392524e+06 3.70165505e+04 ! particle number mass Rhill 1.22978804e+04 !particle radius in AU 1.57128973e+07 -6.39323202e+05 1.78188715e+04 ! x y z 6.88318620e+01 1.65105864e+03 3.96550811e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1218 3.66179316e+05 1.41594102e+04 ! particle number mass Rhill +Body1218 3.66179316e+05 1.41594102e+04 ! particle number mass Rhill 7.42478017e+03 !particle radius in AU 4.15871481e+06 9.23348984e+06 -2.00218047e+04 ! x y z -1.86711988e+03 8.27796037e+02 -1.71003540e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1219 1.54561493e+05 1.00684785e+04 ! particle number mass Rhill +Body1219 1.54561493e+05 1.00684785e+04 ! particle number mass Rhill 8.20734629e+03 !particle radius in AU 1.01202151e+06 -9.34669057e+06 -3.05255233e+04 ! x y z 2.12896558e+03 2.37084406e+02 2.06490854e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1220 1.96961109e+06 2.97634995e+04 ! particle number mass Rhill +Body1220 1.96961109e+06 2.97634995e+04 ! particle number mass Rhill 1.30090572e+04 !particle radius in AU -1.21933337e+07 -1.85215644e+04 -9.08532291e+04 ! x y z 3.99379627e+00 -1.85775511e+03 -5.11110124e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1221 1.52307934e+06 2.08671874e+04 ! particle number mass Rhill +Body1221 1.52307934e+06 2.08671874e+04 ! particle number mass Rhill 1.19406098e+04 !particle radius in AU -3.43283359e+06 -8.55413032e+06 1.39837760e+04 ! x y z 2.01077915e+03 -7.56017909e+02 1.02863591e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1222 4.68434436e+05 2.00080803e+04 ! particle number mass Rhill +Body1222 4.68434436e+05 2.00080803e+04 ! particle number mass Rhill 1.18773237e+04 !particle radius in AU -1.54011563e+06 -1.27126780e+07 7.48528448e+04 ! x y z 1.83173381e+03 -2.00582211e+02 -5.46653115e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1223 2.90685914e+05 1.99495647e+04 ! particle number mass Rhill +Body1223 2.90685914e+05 1.99495647e+04 ! particle number mass Rhill 6.87480407e+03 !particle radius in AU 1.51139781e+07 1.12076930e+06 -2.10697882e+04 ! x y z -1.50737141e+02 1.67679110e+03 1.30972258e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1224 1.38602808e+05 1.24338676e+04 ! particle number mass Rhill +Body1224 1.38602808e+05 1.24338676e+04 ! particle number mass Rhill 7.91455193e+03 !particle radius in AU 4.75991835e+06 1.10017280e+07 2.88714064e+04 ! x y z -1.75624695e+03 7.27843788e+02 7.23217325e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1225 2.95749638e+04 5.42872052e+03 ! particle number mass Rhill +Body1225 2.95749638e+04 5.42872052e+03 ! particle number mass Rhill 4.72944737e+03 !particle radius in AU -7.70162983e+06 -4.41409406e+06 2.58165729e+04 ! x y z 1.05981797e+03 -1.92161597e+03 -1.53504172e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1226 4.32072593e+05 1.78081985e+04 ! particle number mass Rhill +Body1226 4.32072593e+05 1.78081985e+04 ! particle number mass Rhill 7.84581210e+03 !particle radius in AU 8.79063205e+06 8.04366554e+06 -1.54947665e+04 ! x y z -1.27701177e+03 1.39840130e+03 -2.40220571e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1227 6.41589266e+04 9.67981886e+03 ! particle number mass Rhill +Body1227 6.41589266e+04 9.67981886e+03 ! particle number mass Rhill 6.12239510e+03 !particle radius in AU 8.04074117e+06 9.64104753e+06 -4.45617960e+04 ! x y z -1.39128132e+03 1.17398843e+03 -6.62327287e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1228 3.20284500e+05 1.26827896e+04 ! particle number mass Rhill +Body1228 3.20284500e+05 1.26827896e+04 ! particle number mass Rhill 7.10064233e+03 !particle radius in AU -6.66261606e+06 6.71220967e+06 -3.99553759e+04 ! x y z -1.50278601e+03 -1.49037570e+03 1.28507761e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1229 1.51846639e+05 1.45701862e+04 ! particle number mass Rhill +Body1229 1.51846639e+05 1.45701862e+04 ! particle number mass Rhill 5.53673908e+03 !particle radius in AU 7.85675354e+06 -1.09086703e+07 6.52437187e+03 ! x y z 1.47253647e+03 1.04716710e+03 -2.78745894e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1230 1.23586335e+05 1.11194308e+04 ! particle number mass Rhill +Body1230 1.23586335e+05 1.11194308e+04 ! particle number mass Rhill 7.61773407e+03 !particle radius in AU 1.20372202e+06 -1.12995198e+07 -7.66376724e+04 ! x y z 1.92159252e+03 2.10022167e+02 1.77035004e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1231 2.25142465e+05 1.38893155e+04 ! particle number mass Rhill +Body1231 2.25142465e+05 1.38893155e+04 ! particle number mass Rhill 6.31351866e+03 !particle radius in AU 1.34520987e+06 -1.14199869e+07 -1.06162090e+05 ! x y z 1.91854210e+03 2.27440517e+02 -2.86612981e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1232 2.50526229e+04 5.93289297e+03 ! particle number mass Rhill +Body1232 2.50526229e+04 5.93289297e+03 ! particle number mass Rhill 4.47493492e+03 !particle radius in AU -7.81637690e+06 6.77408689e+06 -7.41358369e+04 ! x y z -1.33330305e+03 -1.52276964e+03 -6.38372634e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1233 1.90834790e+06 2.35258485e+04 ! particle number mass Rhill +Body1233 1.90834790e+06 2.35258485e+04 ! particle number mass Rhill 1.28727553e+04 !particle radius in AU -9.27394458e+06 2.25024078e+06 5.28422677e+04 ! x y z -5.05715454e+02 -2.06066723e+03 1.34558284e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1234 4.91248539e+04 7.28485384e+03 ! particle number mass Rhill +Body1234 4.91248539e+04 7.28485384e+03 ! particle number mass Rhill 3.80089688e+03 !particle radius in AU 7.39246396e+06 7.02828616e+06 -5.45617263e+04 ! x y z -1.39190312e+03 1.48134140e+03 -3.43671966e-01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1235 1.41719231e+05 1.93293155e+04 ! particle number mass Rhill +Body1235 1.41719231e+05 1.93293155e+04 ! particle number mass Rhill 7.97343121e+03 !particle radius in AU 1.36549158e+07 -1.27792544e+07 5.75773322e+03 ! x y z 1.01857297e+03 1.11983894e+03 2.42317366e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1236 2.00882370e+05 1.08894510e+04 ! particle number mass Rhill +Body1236 2.00882370e+05 1.08894510e+04 ! particle number mass Rhill 6.07807803e+03 !particle radius in AU 8.51250762e+06 3.74715124e+06 -3.66793926e+04 ! x y z -9.06822201e+02 1.95546956e+03 -1.35124063e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1237 1.20287590e+05 1.23845440e+04 ! particle number mass Rhill +Body1237 1.20287590e+05 1.23845440e+04 ! particle number mass Rhill 7.54934486e+03 !particle radius in AU 1.11622021e+07 6.11280266e+06 1.12048087e+05 ! x y z -8.90669182e+02 1.59847160e+03 8.83220737e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1238 4.77986782e+05 1.49760594e+04 ! particle number mass Rhill +Body1238 4.77986782e+05 1.49760594e+04 ! particle number mass Rhill 8.11442267e+03 !particle radius in AU -3.59837711e+06 8.94095859e+06 9.64175823e+04 ! x y z -1.96856779e+03 -7.62947641e+02 3.79489804e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1239 2.65771158e+05 1.18757587e+04 ! particle number mass Rhill +Body1239 2.65771158e+05 1.18757587e+04 ! particle number mass Rhill 9.83267321e+03 !particle radius in AU 1.29422873e+06 -9.18423777e+06 1.13052561e+04 ! x y z 2.13217255e+03 3.09173468e+02 -6.46064530e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1240 9.09935528e+05 1.77629488e+04 ! particle number mass Rhill +Body1240 9.09935528e+05 1.77629488e+04 ! particle number mass Rhill 1.00567087e+04 !particle radius in AU 7.55024995e+06 5.55902389e+06 2.47186332e+04 ! x y z -1.28842830e+03 1.68728817e+03 -8.10804757e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1241 6.99841166e+05 3.29812546e+04 ! particle number mass Rhill +Body1241 6.99841166e+05 3.29812546e+04 ! particle number mass Rhill 9.21408381e+03 !particle radius in AU 1.88151667e+07 3.33001002e+06 3.73324839e+04 ! x y z -2.30107887e+02 1.46487898e+03 2.65739699e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1242 3.90005908e+05 1.34816243e+04 ! particle number mass Rhill +Body1242 3.90005908e+05 1.34816243e+04 ! particle number mass Rhill 1.11735897e+04 !particle radius in AU 5.44170973e+06 -7.58711950e+06 -1.68342575e+04 ! x y z 1.71954001e+03 1.27240084e+03 9.88806581e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1243 1.08664322e+06 2.28428386e+04 ! particle number mass Rhill +Body1243 1.08664322e+06 2.28428386e+04 ! particle number mass Rhill 1.06695963e+04 !particle radius in AU -8.65530733e+06 -7.08569033e+06 -2.23265845e+04 ! x y z 1.25758504e+03 -1.50248441e+03 -3.62008173e-01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1244 1.52765224e+06 2.10792686e+04 ! particle number mass Rhill +Body1244 1.52765224e+06 2.10792686e+04 ! particle number mass Rhill 1.19525480e+04 !particle radius in AU -5.77529746e+06 -7.17376952e+06 -5.18219866e+04 ! x y z 1.69375434e+03 -1.34010802e+03 -1.50223596e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1245 6.16725526e+04 8.80160618e+03 ! particle number mass Rhill +Body1245 6.16725526e+04 8.80160618e+03 ! particle number mass Rhill 6.04226309e+03 !particle radius in AU -1.06219205e+07 -3.45583164e+06 7.57878163e+04 ! x y z 6.00669506e+02 -1.87043192e+03 1.96458906e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1246 2.90774616e+05 1.23816662e+04 ! particle number mass Rhill +Body1246 2.90774616e+05 1.23816662e+04 ! particle number mass Rhill 6.87550328e+03 !particle radius in AU 6.08800715e+06 7.31025693e+06 2.11892900e+04 ! x y z -1.62733880e+03 1.34749417e+03 4.48661776e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1247 2.91111310e+05 1.70046080e+04 ! particle number mass Rhill +Body1247 2.91111310e+05 1.70046080e+04 ! particle number mass Rhill 6.87815602e+03 !particle radius in AU 1.11973713e+07 -6.89047737e+06 8.77501535e+04 ! x y z 9.27451132e+02 1.53222806e+03 7.89688850e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1248 1.92146673e+04 5.02220470e+03 ! particle number mass Rhill +Body1248 1.92146673e+04 5.02220470e+03 ! particle number mass Rhill 4.09618861e+03 !particle radius in AU -7.43211722e+06 -5.81999467e+06 -9.65323707e+03 ! x y z 1.33310134e+03 -1.66490648e+03 -3.67453264e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1249 1.12236575e+06 2.53698511e+04 ! particle number mass Rhill +Body1249 1.12236575e+06 2.53698511e+04 ! particle number mass Rhill 1.07852562e+04 !particle radius in AU -1.08902550e+07 -5.66422797e+06 1.03662075e+04 ! x y z 8.63087680e+02 -1.66058015e+03 -2.16763143e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1250 1.97375621e+05 1.34147884e+04 ! particle number mass Rhill +Body1250 1.97375621e+05 1.34147884e+04 ! particle number mass Rhill 8.90430770e+03 !particle radius in AU 5.12124924e+06 1.04057141e+07 -2.37917852e+04 ! x y z -1.74067826e+03 8.20317248e+02 -1.61468664e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1251 6.18834861e+04 1.06379610e+04 ! particle number mass Rhill +Body1251 6.18834861e+04 1.06379610e+04 ! particle number mass Rhill 6.04914386e+03 !particle radius in AU -1.68906115e+06 -1.36100786e+07 1.12141407e+05 ! x y z 1.74322371e+03 -2.27430898e+02 1.33662045e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1252 1.48860804e+05 1.71420231e+04 ! particle number mass Rhill +Body1252 1.48860804e+05 1.71420231e+04 ! particle number mass Rhill 8.10517587e+03 !particle radius in AU 1.55662567e+07 4.00286637e+06 -1.79247131e+05 ! x y z -4.13259864e+02 1.59216194e+03 8.36151351e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1253 9.89512707e+05 4.29095693e+04 ! particle number mass Rhill +Body1253 9.89512707e+05 4.29095693e+04 ! particle number mass Rhill 1.03417203e+04 !particle radius in AU -1.88242941e+07 1.06236844e+07 -6.10248603e+04 ! x y z -7.07744890e+02 -1.22126213e+03 4.18101860e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1254 3.12504250e+05 1.56490359e+04 ! particle number mass Rhill +Body1254 3.12504250e+05 1.56490359e+04 ! particle number mass Rhill 1.03781744e+04 !particle radius in AU 6.54563477e+06 9.67513797e+06 -6.81578535e+04 ! x y z -1.58341801e+03 1.07058771e+03 -6.04814628e-01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1255 1.91935878e+05 1.27404816e+04 ! particle number mass Rhill +Body1255 1.91935878e+05 1.27404816e+04 ! particle number mass Rhill 8.82174250e+03 !particle radius in AU 1.04054207e+07 -4.16069278e+06 2.73610807e+04 ! x y z 7.03766909e+02 1.81842161e+03 8.81427302e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1256 1.11002558e+05 1.15265444e+04 ! particle number mass Rhill +Body1256 1.11002558e+05 1.15265444e+04 ! particle number mass Rhill 4.98765792e+03 !particle radius in AU 3.08072328e+06 -1.16153087e+07 4.07709281e+04 ! x y z 1.83456791e+03 4.73999302e+02 7.43116200e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1257 1.46365124e+05 1.07472865e+04 ! particle number mass Rhill +Body1257 1.46365124e+05 1.07472865e+04 ! particle number mass Rhill 5.46929730e+03 !particle radius in AU 6.34509950e+06 -8.39632633e+06 3.00680333e+04 ! x y z 1.60571507e+03 1.18326876e+03 -2.08403941e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1258 3.58622633e+04 7.27385097e+03 ! particle number mass Rhill +Body1258 3.58622633e+04 7.27385097e+03 ! particle number mass Rhill 5.04330099e+03 !particle radius in AU 1.11214656e+07 1.24533693e+06 -1.06574136e+05 ! x y z -2.16829963e+02 1.93905765e+03 1.21579926e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1259 4.04109068e+05 1.42195375e+04 ! particle number mass Rhill +Body1259 4.04109068e+05 1.42195375e+04 ! particle number mass Rhill 1.13066823e+04 !particle radius in AU -8.88143306e+06 -3.59836181e+06 5.33136699e+04 ! x y z 8.14785566e+02 -1.96550951e+03 6.43084310e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1260 3.08027204e+05 1.50707848e+04 ! particle number mass Rhill +Body1260 3.08027204e+05 1.50707848e+04 ! particle number mass Rhill 7.00888103e+03 !particle radius in AU -8.26948189e+06 -7.55777650e+06 1.90589282e+04 ! x y z 1.31251337e+03 -1.45641325e+03 -2.75253497e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1261 5.68308086e+04 7.77187750e+03 ! particle number mass Rhill +Body1261 5.68308086e+04 7.77187750e+03 ! particle number mass Rhill 3.99006780e+03 !particle radius in AU -8.76369433e+06 5.12820302e+06 4.83723083e+04 ! x y z -1.02986001e+03 -1.78262989e+03 -1.16887378e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1262 3.44231334e+05 1.47159604e+04 ! particle number mass Rhill +Body1262 3.44231334e+05 1.47159604e+04 ! particle number mass Rhill 1.07181325e+04 !particle radius in AU 8.77351236e+06 5.86805867e+06 7.03132721e+04 ! x y z -1.14557695e+03 1.66192575e+03 2.25245099e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1263 2.40295629e+05 1.18592176e+04 ! particle number mass Rhill +Body1263 2.40295629e+05 1.18592176e+04 ! particle number mass Rhill 6.45209798e+03 !particle radius in AU 2.81170524e+06 9.19584888e+06 4.45600518e+04 ! x y z -2.01744512e+03 6.24046260e+02 -9.89046691e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1264 6.80068207e+04 8.07363373e+03 ! particle number mass Rhill +Body1264 6.80068207e+04 8.07363373e+03 ! particle number mass Rhill 6.24242232e+03 !particle radius in AU -9.87293199e+06 -1.42461669e+06 -2.08948330e+04 ! x y z 2.77302880e+02 -2.05434640e+03 1.23835967e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1265 4.03465047e+05 1.96297243e+04 ! particle number mass Rhill +Body1265 4.03465047e+05 1.96297243e+04 ! particle number mass Rhill 1.13006727e+04 !particle radius in AU -3.58991165e+06 -1.30771532e+07 4.60336444e+04 ! x y z 1.69912089e+03 -4.85176809e+02 -8.42271300e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1266 1.12924923e+06 1.97340059e+04 ! particle number mass Rhill +Body1266 1.12924923e+06 1.97340059e+04 ! particle number mass Rhill 1.08072599e+04 !particle radius in AU -9.30543267e+06 -1.69593678e+06 7.96573126e+04 ! x y z 3.79186148e+02 -2.10571304e+03 -2.17512876e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1267 2.12462415e+05 1.13846036e+04 ! particle number mass Rhill +Body1267 2.12462415e+05 1.13846036e+04 ! particle number mass Rhill 6.19269515e+03 !particle radius in AU -3.38260922e+06 8.95675600e+06 -9.15710109e+04 ! x y z -1.98063128e+03 -7.58924908e+02 1.62762983e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1268 1.22284830e+05 9.48762297e+03 ! particle number mass Rhill +Body1268 1.22284830e+05 9.48762297e+03 ! particle number mass Rhill 7.59089850e+03 !particle radius in AU 9.06470291e+06 3.39698455e+06 -1.93072359e+04 ! x y z -7.42646003e+02 1.96423004e+03 3.04319746e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1269 3.20826960e+05 1.28228485e+04 ! particle number mass Rhill +Body1269 3.20826960e+05 1.28228485e+04 ! particle number mass Rhill 7.10464881e+03 !particle radius in AU -8.28344816e+06 -4.56542130e+06 -3.98741155e+04 ! x y z 9.81538136e+02 -1.88759078e+03 8.61570104e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1270 1.68765847e+05 1.17429653e+04 ! particle number mass Rhill +Body1270 1.68765847e+05 1.17429653e+04 ! particle number mass Rhill 8.45143607e+03 !particle radius in AU 9.83373151e+06 4.43940145e+06 2.01558777e+04 ! x y z -8.55397447e+02 1.79285028e+03 -1.01803709e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1271 5.60563834e+05 1.63043729e+04 ! particle number mass Rhill +Body1271 5.60563834e+05 1.63043729e+04 ! particle number mass Rhill 1.26098721e+04 !particle radius in AU 6.20736435e+06 7.70565657e+06 2.01353242e+04 ! x y z -1.62930967e+03 1.30802298e+03 1.80300563e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1272 2.23640540e+05 2.16768752e+04 ! particle number mass Rhill +Body1272 2.23640540e+05 2.16768752e+04 ! particle number mass Rhill 9.28294621e+03 !particle radius in AU -1.21242621e+07 -1.29944427e+07 9.45840193e+03 ! x y z 1.14488121e+03 -1.06447129e+03 8.51817054e-01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1273 3.24484331e+05 1.23517614e+04 ! particle number mass Rhill +Body1273 3.24484331e+05 1.23517614e+04 ! particle number mass Rhill 1.05091333e+04 !particle radius in AU -9.34416446e+04 9.14288304e+06 8.29702341e+03 ! x y z -2.15581546e+03 -1.85313701e+01 1.24100830e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1274 4.20796538e+05 1.46309941e+04 ! particle number mass Rhill +Body1274 4.20796538e+05 1.46309941e+04 ! particle number mass Rhill 1.14602223e+04 !particle radius in AU -8.56201175e+06 -4.77007031e+06 6.27239711e+04 ! x y z 1.04809893e+03 -1.81527422e+03 -2.35300971e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1275 5.97784859e+05 1.68704229e+04 ! particle number mass Rhill +Body1275 5.97784859e+05 1.68704229e+04 ! particle number mass Rhill 8.74246630e+03 !particle radius in AU 9.33774261e+06 -3.80575834e+06 3.61612768e+04 ! x y z 7.89084549e+02 1.90660726e+03 1.55750455e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1276 7.71866509e+05 1.63632082e+04 ! particle number mass Rhill +Body1276 7.71866509e+05 1.63632082e+04 ! particle number mass Rhill 9.51991482e+03 !particle radius in AU 1.44814086e+05 -9.02785011e+06 -7.62099316e+03 ! x y z 2.17482769e+03 2.31217788e+01 4.51562127e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1277 2.09762369e+04 6.28274160e+03 ! particle number mass Rhill +Body1277 2.09762369e+04 6.28274160e+03 ! particle number mass Rhill 4.21772425e+03 !particle radius in AU 2.68337698e+06 1.12799171e+07 -1.92110080e+04 ! x y z -1.86815076e+03 4.16102947e+02 -8.29271140e-01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1278 3.46246737e+05 1.25842743e+04 ! particle number mass Rhill +Body1278 3.46246737e+05 1.25842743e+04 ! particle number mass Rhill 1.07390093e+04 !particle radius in AU -8.56711815e+06 -3.15713404e+06 3.97972006e+03 ! x y z 7.43604689e+02 -2.02339459e+03 6.66994916e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1279 4.20281553e+05 1.36364340e+04 ! particle number mass Rhill +Body1279 4.20281553e+05 1.36364340e+04 ! particle number mass Rhill 7.77378347e+03 !particle radius in AU 2.18747509e+06 8.65395918e+06 -2.06536040e+04 ! x y z -2.15725804e+03 5.30856591e+02 2.37348618e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1280 1.24686009e+06 3.01782349e+04 ! particle number mass Rhill +Body1280 1.24686009e+06 3.01782349e+04 ! particle number mass Rhill 1.11701303e+04 !particle radius in AU 7.66628600e+06 -1.17727557e+07 -1.47420679e+04 ! x y z 1.47098208e+03 9.52353449e+02 1.59639874e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1281 1.23652829e+06 2.28978896e+04 ! particle number mass Rhill +Body1281 1.23652829e+06 2.28978896e+04 ! particle number mass Rhill 1.11391918e+04 !particle radius in AU 1.04264792e+07 -2.74372425e+06 3.12865429e+04 ! x y z 5.41650708e+02 1.91683777e+03 -8.25764712e-01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1282 5.71090410e+05 1.53591732e+04 ! particle number mass Rhill +Body1282 5.71090410e+05 1.53591732e+04 ! particle number mass Rhill 8.61034631e+03 !particle radius in AU -3.55923980e+06 -8.64968069e+06 1.79106442e+03 ! x y z 1.99649530e+03 -7.67245271e+02 -5.93442801e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1283 5.19767258e+05 1.51351192e+04 ! particle number mass Rhill +Body1283 5.19767258e+05 1.51351192e+04 ! particle number mass Rhill 8.34427553e+03 !particle radius in AU 9.42893053e+06 2.45878278e+05 -4.57214896e+04 ! x y z -6.01176022e+01 2.13776727e+03 1.81291767e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1284 4.43010149e+04 6.43778074e+03 ! particle number mass Rhill +Body1284 4.43010149e+04 6.43778074e+03 ! particle number mass Rhill 5.41136566e+03 !particle radius in AU 9.07031967e+06 -2.25767487e+06 5.83955838e+03 ! x y z 5.13475058e+02 2.05838222e+03 2.17889632e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1285 1.89897561e+05 1.41973974e+04 ! particle number mass Rhill +Body1285 1.89897561e+05 1.41973974e+04 ! particle number mass Rhill 5.96520618e+03 !particle radius in AU -7.87040592e+06 9.69728016e+06 -1.66849672e+03 ! x y z -1.42992939e+03 -1.17418658e+03 -3.60129869e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1286 1.97476197e+05 1.67504404e+04 ! particle number mass Rhill +Body1286 1.97476197e+05 1.67504404e+04 ! particle number mass Rhill 6.04352860e+03 !particle radius in AU 1.32660339e+07 5.77686809e+06 1.35800303e+05 ! x y z -6.62231218e+02 1.59103506e+03 -3.43945323e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1287 6.78506127e+05 1.94924484e+04 ! particle number mass Rhill +Body1287 6.78506127e+05 1.94924484e+04 ! particle number mass Rhill 9.11948377e+03 !particle radius in AU -1.01101796e+07 -4.73633978e+06 1.92223885e+04 ! x y z 8.16987783e+02 -1.78318056e+03 8.86814927e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1288 3.31102311e+05 2.06337640e+04 ! particle number mass Rhill +Body1288 3.31102311e+05 2.06337640e+04 ! particle number mass Rhill 7.17970170e+03 !particle radius in AU -1.00157479e+07 1.12142854e+07 -2.29871580e+04 ! x y z -1.26146743e+03 -1.12281660e+03 -9.84657732e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1289 5.85238829e+05 1.87103235e+04 ! particle number mass Rhill +Body1289 5.85238829e+05 1.87103235e+04 ! particle number mass Rhill 1.27922430e+04 !particle radius in AU -8.01070020e+06 -7.68441073e+06 -7.44586443e+03 ! x y z 1.37227167e+03 -1.42837223e+03 -3.04293724e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1290 2.57089994e+05 1.14604204e+04 ! particle number mass Rhill +Body1290 2.57089994e+05 1.14604204e+04 ! particle number mass Rhill 6.59903940e+03 !particle radius in AU 5.94423414e+06 -6.60015867e+06 3.79489917e+04 ! x y z 1.64871713e+03 1.48917509e+03 4.06312752e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1291 5.62761960e+05 1.46125539e+04 ! particle number mass Rhill +Body1291 5.62761960e+05 1.46125539e+04 ! particle number mass Rhill 1.26263329e+04 !particle radius in AU -3.52967631e+06 8.16512241e+06 -2.51085986e+04 ! x y z -2.00672046e+03 -8.99089812e+02 1.47195859e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1292 1.22606951e+05 1.04784482e+04 ! particle number mass Rhill +Body1292 1.22606951e+05 1.04784482e+04 ! particle number mass Rhill 5.15573627e+03 !particle radius in AU 8.67857522e+06 6.03654833e+06 6.58011140e+03 ! x y z -1.13872966e+03 1.66817442e+03 2.18662162e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1293 2.63411927e+05 1.40199277e+04 ! particle number mass Rhill +Body1293 2.63411927e+05 1.40199277e+04 ! particle number mass Rhill 9.80349206e+03 !particle radius in AU -4.55569332e+06 1.00472663e+07 8.70354064e+03 ! x y z -1.80149559e+03 -7.99810234e+02 3.42249675e-01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1294 2.73475123e+05 1.57989125e+04 ! particle number mass Rhill +Body1294 2.73475123e+05 1.57989125e+04 ! particle number mass Rhill 9.92677698e+03 !particle radius in AU 9.14438839e+06 8.39253082e+06 -8.86556588e+04 ! x y z -1.26689180e+03 1.34538142e+03 -8.40350285e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1295 2.86580523e+05 1.51966222e+04 ! particle number mass Rhill +Body1295 2.86580523e+05 1.51966222e+04 ! particle number mass Rhill 6.84228595e+03 !particle radius in AU 7.97751328e+06 8.67584783e+06 5.30436727e+04 ! x y z -1.38366127e+03 1.29303381e+03 -8.41467876e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1296 4.12299552e+05 1.34934085e+04 ! particle number mass Rhill +Body1296 4.12299552e+05 1.34934085e+04 ! particle number mass Rhill 7.72425527e+03 !particle radius in AU -5.79048975e+06 6.93664576e+06 1.29124985e+04 ! x y z -1.68001209e+03 -1.40612278e+03 -3.61171376e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1297 5.59645883e+05 1.70426121e+04 ! particle number mass Rhill +Body1297 5.59645883e+05 1.70426121e+04 ! particle number mass Rhill 1.26029852e+04 !particle radius in AU -5.16609529e+06 9.03539760e+06 5.58960613e+04 ! x y z -1.76517041e+03 -1.00560177e+03 -5.00965832e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1298 6.33916014e+04 1.50366592e+04 ! particle number mass Rhill +Body1298 6.33916014e+04 1.50366592e+04 ! particle number mass Rhill 6.09788969e+03 !particle radius in AU 1.46424048e+07 -1.15689038e+07 3.27414078e+04 ! x y z 9.47675088e+02 1.20085208e+03 1.06976469e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1299 8.52433630e+04 8.93705997e+03 ! particle number mass Rhill +Body1299 8.52433630e+04 8.93705997e+03 ! particle number mass Rhill 6.73063203e+03 !particle radius in AU 1.01236173e+07 1.45579667e+06 5.15839678e+04 ! x y z -2.87224826e+02 2.02832432e+03 -4.14184381e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1300 5.14081123e+04 6.53080242e+03 ! particle number mass Rhill +Body1300 5.14081123e+04 6.53080242e+03 ! particle number mass Rhill 3.85889430e+03 !particle radius in AU 7.23258453e+06 4.97813060e+06 -4.38592192e+03 ! x y z -1.24479041e+03 1.83714641e+03 -1.95822638e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1301 6.77217199e+04 7.14700851e+03 ! particle number mass Rhill +Body1301 6.77217199e+04 7.14700851e+03 ! particle number mass Rhill 4.23020736e+03 !particle radius in AU 8.93601994e+06 -6.94569357e+05 -6.12210199e+02 ! x y z 2.19917996e+02 2.16082384e+03 -1.54527155e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1302 6.11703776e+05 2.00034005e+04 ! particle number mass Rhill +Body1302 6.11703776e+05 2.00034005e+04 ! particle number mass Rhill 1.29822323e+04 !particle radius in AU 8.82738308e+06 -7.76404080e+06 8.11338370e+04 ! x y z 1.26378234e+03 1.44510358e+03 2.18294651e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1303 1.65801844e+05 1.55733762e+04 ! particle number mass Rhill +Body1303 1.65801844e+05 1.55733762e+04 ! particle number mass Rhill 8.40166656e+03 !particle radius in AU -1.07812933e+07 -9.62734933e+06 -5.03390757e+03 ! x y z 1.12256505e+03 -1.29339213e+03 -5.66212341e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1304 4.62987998e+05 1.42062076e+04 ! particle number mass Rhill +Body1304 4.62987998e+05 1.42062076e+04 ! particle number mass Rhill 8.02864474e+03 !particle radius in AU -6.42251747e+06 -6.74488620e+06 7.04602772e+04 ! x y z 1.54144883e+03 -1.48324937e+03 1.60342159e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1305 2.60642975e+05 1.22939187e+04 ! particle number mass Rhill +Body1305 2.60642975e+05 1.22939187e+04 ! particle number mass Rhill 6.62929998e+03 !particle radius in AU 9.47929213e+06 -2.19579661e+06 -3.25100566e+04 ! x y z 4.68213030e+02 2.04336200e+03 2.65890903e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1306 1.40715229e+06 2.33795274e+04 ! particle number mass Rhill +Body1306 1.40715229e+06 2.33795274e+04 ! particle number mass Rhill 1.16296336e+04 !particle radius in AU -1.05077611e+07 -1.31085244e+06 7.30464724e+04 ! x y z 2.82650675e+02 -1.98548135e+03 -1.05658937e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1307 7.13061331e+04 7.85310031e+03 ! particle number mass Rhill +Body1307 7.13061331e+04 7.85310031e+03 ! particle number mass Rhill 4.30356095e+03 !particle radius in AU -9.66162364e+06 4.23926500e+05 -1.22905037e+04 ! x y z -9.71624638e+01 -2.08984070e+03 2.75014649e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1308 4.89601650e+05 2.17422005e+04 ! particle number mass Rhill +Body1308 4.89601650e+05 2.17422005e+04 ! particle number mass Rhill 8.17962300e+03 !particle radius in AU 9.30519559e+06 1.02777991e+07 -1.35151955e+04 ! x y z -1.30832060e+03 1.17931837e+03 4.96678180e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1309 1.78067654e+05 1.20379239e+04 ! particle number mass Rhill +Body1309 1.78067654e+05 1.20379239e+04 ! particle number mass Rhill 8.60393924e+03 !particle radius in AU -5.38712062e+06 -9.43582755e+06 -1.42962613e+04 ! x y z 1.72402431e+03 -9.72573668e+02 -5.35637349e-01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1310 4.80906653e+04 1.22640544e+04 ! particle number mass Rhill +Body1310 4.80906653e+04 1.22640544e+04 ! particle number mass Rhill 3.77403501e+03 !particle radius in AU -7.15437615e+06 -1.57030040e+07 1.86249551e+05 ! x y z 1.42003546e+03 -6.56667148e+02 -3.41426138e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1311 8.59903706e+04 7.89944042e+03 ! particle number mass Rhill +Body1311 8.59903706e+04 7.89944042e+03 ! particle number mass Rhill 6.75023558e+03 !particle radius in AU 5.41844043e+06 -7.25472299e+06 -9.37968266e+03 ! x y z 1.74397758e+03 1.29517496e+03 1.90126636e-01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1312 1.63891142e+06 3.26516084e+04 ! particle number mass Rhill +Body1312 1.63891142e+06 3.26516084e+04 ! particle number mass Rhill 1.22359443e+04 !particle radius in AU 1.22229448e+07 -6.93664382e+06 -3.73566212e+04 ! x y z 8.86957021e+02 1.49812000e+03 2.93544144e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1313 1.65548000e+05 1.22081060e+04 ! particle number mass Rhill +Body1313 1.65548000e+05 1.22081060e+04 ! particle number mass Rhill 5.69849680e+03 !particle radius in AU 4.97534313e+05 1.12973925e+07 -2.47714549e+04 ! x y z -1.93747095e+03 6.82256092e+01 4.50885373e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1314 8.18131400e+04 1.04556815e+04 ! particle number mass Rhill +Body1314 8.18131400e+04 1.04556815e+04 ! particle number mass Rhill 6.63911222e+03 !particle radius in AU 6.27007593e+06 1.03894624e+07 -7.16417007e+03 ! x y z -1.60760769e+03 9.75456582e+02 -4.84946763e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1315 1.03590462e+06 1.78980493e+04 ! particle number mass Rhill +Body1315 1.03590462e+06 1.78980493e+04 ! particle number mass Rhill 1.05008774e+04 !particle radius in AU 4.20395564e+06 7.76433301e+06 8.41688618e+04 ! x y z -1.94265714e+03 1.06320178e+03 6.22424610e-01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1316 7.67868642e+04 7.82041161e+03 ! particle number mass Rhill +Body1316 7.67868642e+04 7.82041161e+03 ! particle number mass Rhill 4.41111088e+03 !particle radius in AU 6.37276437e+06 -6.42184183e+06 6.41580563e+04 ! x y z 1.58319090e+03 1.53287002e+03 -1.33788595e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1317 5.89194336e+05 1.47666686e+04 ! particle number mass Rhill +Body1317 5.89194336e+05 1.47666686e+04 ! particle number mass Rhill 1.28209983e+04 !particle radius in AU -7.71353791e+06 4.23425293e+06 1.25697535e+04 ! x y z -1.04844519e+03 -1.95403749e+03 -9.90990915e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1318 5.31112427e+04 7.05725430e+03 ! particle number mass Rhill +Body1318 5.31112427e+04 7.05725430e+03 ! particle number mass Rhill 3.90104672e+03 !particle radius in AU -7.40633695e+06 5.93955618e+06 -5.19978226e+04 ! x y z -1.31908110e+03 -1.66222684e+03 -1.03799917e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1319 1.71842148e+06 2.82333324e+04 ! particle number mass Rhill +Body1319 1.71842148e+06 2.82333324e+04 ! particle number mass Rhill 1.24306993e+04 !particle radius in AU 1.85739893e+06 -1.16268582e+07 -8.21342836e+03 ! x y z 1.89473415e+03 2.92048965e+02 -8.56627398e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1320 6.17278582e+05 1.48891277e+04 ! particle number mass Rhill +Body1320 6.17278582e+05 1.48891277e+04 ! particle number mass Rhill 8.83648205e+03 !particle radius in AU 3.72582096e+06 7.91120697e+06 -5.23905881e+04 ! x y z -2.02715857e+03 9.13111080e+02 2.50053811e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1321 1.14474067e+06 2.18093377e+04 ! particle number mass Rhill +Body1321 1.14474067e+06 2.18093377e+04 ! particle number mass Rhill 1.08564549e+04 !particle radius in AU 5.09385670e+05 -1.04637690e+07 -6.20563116e+04 ! x y z 2.02501696e+03 7.65309669e+01 -1.01351101e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1322 8.26533157e+04 7.68124990e+03 ! particle number mass Rhill +Body1322 8.26533157e+04 7.68124990e+03 ! particle number mass Rhill 6.66176154e+03 !particle radius in AU -3.29144876e+06 8.15112104e+06 8.11267893e+04 ! x y z -2.05815351e+03 -8.34364146e+02 -5.14984629e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1323 1.46998004e+05 1.13133262e+04 ! particle number mass Rhill +Body1323 1.46998004e+05 1.13133262e+04 ! particle number mass Rhill 5.47716901e+03 !particle radius in AU -1.05633758e+07 -2.07935484e+06 1.56201239e+04 ! x y z 3.80416672e+02 -1.96300156e+03 -6.47463330e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1324 1.56081831e+04 4.62254860e+03 ! particle number mass Rhill +Body1324 1.56081831e+04 4.62254860e+03 ! particle number mass Rhill 3.82196266e+03 !particle radius in AU -8.96632975e+06 -4.86195335e+05 -1.06964367e+05 ! x y z 1.34820268e+02 -2.22107483e+03 1.19634049e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1325 6.88345306e+05 1.57488065e+04 ! particle number mass Rhill +Body1325 6.88345306e+05 1.57488065e+04 ! particle number mass Rhill 9.16335366e+03 !particle radius in AU -7.48232762e+06 4.92380808e+06 2.29127905e+04 ! x y z -1.22302901e+03 -1.81943768e+03 2.38496332e-01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1326 1.99767409e+06 2.30772351e+04 ! particle number mass Rhill +Body1326 1.99767409e+06 2.30772351e+04 ! particle number mass Rhill 1.30705504e+04 !particle radius in AU -5.03707716e+05 -9.29849125e+06 -1.11404007e+04 ! x y z 2.13355604e+03 -1.25957885e+02 3.59182325e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1327 1.47237759e+04 1.04619691e+04 ! particle number mass Rhill +Body1327 1.47237759e+04 1.04619691e+04 ! particle number mass Rhill 3.74836657e+03 !particle radius in AU 2.17225066e+07 1.26121705e+06 -8.44855246e+04 ! x y z -9.80183609e+01 1.39255713e+03 -2.45394775e-01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1328 1.03148280e+05 1.18766934e+04 ! particle number mass Rhill +Body1328 1.03148280e+05 1.18766934e+04 ! particle number mass Rhill 7.17226488e+03 !particle radius in AU -3.31559823e+06 1.24035988e+07 -2.07947532e+04 ! x y z -1.76007958e+03 -4.72548604e+02 9.49057096e-01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1329 7.89194790e+05 2.30906258e+04 ! particle number mass Rhill +Body1329 7.89194790e+05 2.30906258e+04 ! particle number mass Rhill 9.59062845e+03 !particle radius in AU 1.21445680e+07 2.59228119e+06 -3.02162959e+04 ! x y z -3.98075492e+02 1.82853529e+03 6.91989022e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1330 1.23249402e+05 1.28550711e+04 ! particle number mass Rhill +Body1330 1.23249402e+05 1.28550711e+04 ! particle number mass Rhill 7.61080504e+03 !particle radius in AU -1.13326598e+06 -1.29825734e+07 6.69579485e+03 ! x y z 1.80475746e+03 -1.76133915e+02 -5.83190587e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1331 1.22964994e+05 1.16605265e+04 ! particle number mass Rhill +Body1331 1.22964994e+05 1.16605265e+04 ! particle number mass Rhill 7.60494634e+03 !particle radius in AU -4.79738768e+06 1.05660072e+07 -1.20703674e+04 ! x y z -1.76872416e+03 -7.96773745e+02 -7.48094782e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1332 4.01797998e+05 3.24133753e+04 ! particle number mass Rhill +Body1332 4.01797998e+05 3.24133753e+04 ! particle number mass Rhill 1.12850870e+04 !particle radius in AU 2.19019020e+07 2.63899527e+06 3.37827752e+04 ! x y z -1.61269975e+02 1.38753575e+03 3.39443977e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1333 1.00770997e+06 2.34834210e+04 ! particle number mass Rhill +Body1333 1.00770997e+06 2.34834210e+04 ! particle number mass Rhill 1.04047308e+04 !particle radius in AU -1.21105762e+07 -5.24541367e+05 -2.70555025e+04 ! x y z 6.19806533e+01 -1.85471109e+03 -1.08022259e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1334 3.90007197e+04 7.82329415e+03 ! particle number mass Rhill +Body1334 3.90007197e+04 7.82329415e+03 ! particle number mass Rhill 5.18632661e+03 !particle radius in AU 6.24492290e+06 9.69571067e+06 -1.68199218e+04 ! x y z -1.63521643e+03 1.03697361e+03 9.03169661e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1335 2.52614269e+05 1.19155037e+04 ! particle number mass Rhill +Body1335 2.52614269e+05 1.19155037e+04 ! particle number mass Rhill 6.56052039e+03 !particle radius in AU -9.25769957e+06 2.29292734e+06 -1.14919079e+04 ! x y z -5.12974483e+02 -2.05331332e+03 2.34930072e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1336 5.74783862e+05 1.77378872e+04 ! particle number mass Rhill +Body1336 5.74783862e+05 1.77378872e+04 ! particle number mass Rhill 8.62886853e+03 !particle radius in AU -7.09412869e+06 -8.06275271e+06 -7.38498407e+04 ! x y z 1.50307169e+03 -1.31876348e+03 -1.74679708e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1337 1.20042329e+06 4.16689932e+04 ! particle number mass Rhill +Body1337 1.20042329e+06 4.16689932e+04 ! particle number mass Rhill 1.10297026e+04 !particle radius in AU -1.83827850e+07 6.94620255e+06 -2.99390580e+04 ! x y z -5.38167682e+02 -1.38025174e+03 8.14592781e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1338 5.43654965e+04 1.07517216e+04 ! particle number mass Rhill +Body1338 5.43654965e+04 1.07517216e+04 ! particle number mass Rhill 3.93151662e+03 !particle radius in AU 1.28440178e+07 6.15520582e+06 5.37944446e+04 ! x y z -7.49642103e+02 1.56926042e+03 -4.14121777e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1339 1.01511663e+05 1.53639766e+04 ! particle number mass Rhill +Body1339 1.01511663e+05 1.53639766e+04 ! particle number mass Rhill 4.84125149e+03 !particle radius in AU -1.37958464e+07 -9.01984290e+06 9.37503357e+03 ! x y z 8.63514338e+02 -1.36928306e+03 -4.92726033e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1340 7.26811398e+04 1.23143345e+04 ! particle number mass Rhill +Body1340 7.26811398e+04 1.23143345e+04 ! particle number mass Rhill 6.38228557e+03 !particle radius in AU 5.94552238e+06 -1.37356259e+07 -3.12464640e+04 ! x y z 1.54132538e+03 6.86924077e+02 4.95166504e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1341 1.79156251e+06 2.30318870e+04 ! particle number mass Rhill +Body1341 1.79156251e+06 2.30318870e+04 ! particle number mass Rhill 1.26046169e+04 !particle radius in AU -8.47051395e+06 -4.33049723e+06 8.99388095e+03 ! x y z 1.01895175e+03 -1.86853627e+03 6.25752144e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1342 1.03732725e+06 4.12058066e+04 ! particle number mass Rhill +Body1342 1.03732725e+06 4.12058066e+04 ! particle number mass Rhill 1.05056822e+04 !particle radius in AU -7.25230880e+06 -1.91074290e+07 -8.70931708e+04 ! x y z 1.36155621e+03 -5.02831587e+02 -8.24983528e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1343 1.06908158e+06 1.94954238e+04 ! particle number mass Rhill +Body1343 1.06908158e+06 1.94954238e+04 ! particle number mass Rhill 1.06118054e+04 !particle radius in AU 4.25302051e+06 -8.61174101e+06 -1.08068198e+04 ! x y z 1.88839849e+03 9.49718679e+02 1.00715649e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1344 7.82894787e+04 1.38148136e+04 ! particle number mass Rhill +Body1344 7.82894787e+04 1.38148136e+04 ! particle number mass Rhill 6.54239543e+03 !particle radius in AU 2.64852472e+06 1.60749418e+07 5.58768351e+04 ! x y z -1.60049117e+03 2.61947391e+02 -1.05513072e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1345 7.95878743e+04 7.78168116e+03 ! particle number mass Rhill +Body1345 7.95878743e+04 7.78168116e+03 ! particle number mass Rhill 4.46410737e+03 !particle radius in AU 6.85901436e+06 5.92668091e+06 5.88024522e+03 ! x y z -1.42967304e+03 1.64782988e+03 3.76673216e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1346 3.00157124e+05 3.10642558e+04 ! particle number mass Rhill +Body1346 3.00157124e+05 3.10642558e+04 ! particle number mass Rhill 1.02396523e+04 !particle radius in AU 1.65616231e+07 1.66028360e+07 -5.29304371e+04 ! x y z -9.28645255e+02 9.80527992e+02 5.80916438e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1347 9.96861900e+05 1.88907368e+04 ! particle number mass Rhill +Body1347 9.96861900e+05 1.88907368e+04 ! particle number mass Rhill 1.03672601e+04 !particle radius in AU -7.26003067e+05 9.56806531e+06 9.83311273e+04 ! x y z -2.10111468e+03 -1.57355588e+02 7.65120270e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1348 1.71021140e+05 1.36698293e+04 ! particle number mass Rhill +Body1348 1.71021140e+05 1.36698293e+04 ! particle number mass Rhill 8.48891637e+03 !particle radius in AU -3.13308835e+06 1.20377491e+07 -1.96893006e+04 ! x y z -1.80038683e+03 -4.46661696e+02 -1.05229342e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1349 5.21822966e+04 7.10639660e+03 ! particle number mass Rhill +Body1349 5.21822966e+04 7.10639660e+03 ! particle number mass Rhill 5.71491865e+03 !particle radius in AU 3.61039948e+06 -8.94670524e+06 -6.45909208e+04 ! x y z 1.94572548e+03 7.94221249e+02 2.27282153e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1350 2.11854770e+05 1.49949851e+04 ! particle number mass Rhill +Body1350 2.11854770e+05 1.49949851e+04 ! particle number mass Rhill 6.18678578e+03 !particle radius in AU 1.23051248e+07 -2.76310551e+06 1.16872533e+05 ! x y z 4.31851334e+02 1.79778427e+03 -3.52355374e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1351 4.53712916e+05 2.12325358e+04 ! particle number mass Rhill +Body1351 4.53712916e+05 2.12325358e+04 ! particle number mass Rhill 7.97466982e+03 !particle radius in AU 1.37198938e+07 -1.77790003e+06 -1.13538998e+05 ! x y z 2.34248090e+02 1.75094064e+03 -4.43647357e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1352 6.12975304e+05 1.54940796e+04 ! particle number mass Rhill +Body1352 6.12975304e+05 1.54940796e+04 ! particle number mass Rhill 8.81590001e+03 !particle radius in AU 7.46219447e+06 -5.55061844e+06 3.02223367e+04 ! x y z 1.30415331e+03 1.69020434e+03 -2.84026488e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1353 2.51706491e+05 1.19271740e+04 ! particle number mass Rhill +Body1353 2.51706491e+05 1.19271740e+04 ! particle number mass Rhill 9.65607124e+03 !particle radius in AU 1.79117779e+06 -9.28064516e+06 2.29081417e+03 ! x y z 2.10478434e+03 3.74607623e+02 2.08339038e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1354 1.05226394e+06 1.80004323e+04 ! particle number mass Rhill +Body1354 1.05226394e+06 1.80004323e+04 ! particle number mass Rhill 1.05558666e+04 !particle radius in AU 7.62366140e+06 -4.73786634e+06 -3.67690119e+04 ! x y z 1.17730042e+03 1.83367733e+03 -1.18403024e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1355 1.53011690e+06 2.33989676e+04 ! particle number mass Rhill +Body1355 1.53011690e+06 2.33989676e+04 ! particle number mass Rhill 1.19589725e+04 !particle radius in AU -1.01261545e+07 2.81055834e+05 -8.19414070e+03 ! x y z -6.18154480e+01 -2.06712328e+03 -2.24522121e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1356 9.08272734e+05 1.83178714e+04 ! particle number mass Rhill +Body1356 9.08272734e+05 1.83178714e+04 ! particle number mass Rhill 1.00505792e+04 !particle radius in AU 6.29538118e+06 7.15708897e+06 4.07031267e+04 ! x y z -1.60705715e+03 1.38487957e+03 -1.00848425e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1357 1.23742619e+06 1.91614444e+04 ! particle number mass Rhill +Body1357 1.23742619e+06 1.91614444e+04 ! particle number mass Rhill 1.11418874e+04 !particle radius in AU -8.49609253e+06 2.57253582e+06 -4.04158861e+03 ! x y z -6.25851824e+02 -2.12221062e+03 -1.18572479e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1358 1.94661335e+05 1.30044682e+04 ! particle number mass Rhill +Body1358 1.94661335e+05 1.30044682e+04 ! particle number mass Rhill 6.01467589e+03 !particle radius in AU -1.10898042e+07 -1.78242858e+06 -7.98635316e+03 ! x y z 3.31900537e+02 -1.93252272e+03 -5.54822823e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1359 5.76290328e+05 1.90919967e+04 ! particle number mass Rhill +Body1359 5.76290328e+05 1.90919967e+04 ! particle number mass Rhill 1.27267086e+04 !particle radius in AU -9.56599926e+06 -6.50694892e+06 1.36299753e+04 ! x y z 1.08336182e+03 -1.59117844e+03 -6.14843419e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1360 1.46712586e+05 9.57263826e+03 ! particle number mass Rhill +Body1360 1.46712586e+05 9.57263826e+03 ! particle number mass Rhill 5.47362181e+03 !particle radius in AU -8.97074514e+06 8.73736202e+05 8.61659651e+03 ! x y z -2.31036282e+02 -2.18526870e+03 3.84732945e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1361 1.04321892e+06 1.88500830e+04 ! particle number mass Rhill +Body1361 1.04321892e+06 1.88500830e+04 ! particle number mass Rhill 1.05255343e+04 !particle radius in AU 2.22458775e+06 -9.09183474e+06 6.60915144e+04 ! x y z 2.08331663e+03 4.95850932e+02 -1.01931453e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1362 4.75220894e+05 1.68019312e+04 ! particle number mass Rhill +Body1362 4.75220894e+05 1.68019312e+04 ! particle number mass Rhill 1.19344067e+04 !particle radius in AU 5.23135757e+06 -9.91357725e+06 4.20848292e+03 ! x y z 1.68969350e+03 9.19667997e+02 7.40595361e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1363 7.30092568e+04 1.27115707e+04 ! particle number mass Rhill +Body1363 7.30092568e+04 1.27115707e+04 ! particle number mass Rhill 4.33755478e+03 !particle radius in AU -1.28024389e+07 8.53060405e+06 4.23749438e+04 ! x y z -9.17577167e+02 -1.39144923e+03 -5.10429471e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1364 1.28074679e+06 4.35476221e+04 ! particle number mass Rhill +Body1364 1.28074679e+06 4.35476221e+04 ! particle number mass Rhill 1.12704197e+04 !particle radius in AU -8.46758421e+06 -1.84532581e+07 8.05817267e+04 ! x y z 1.31420508e+03 -6.13047074e+02 -4.80774414e-03 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1365 3.15565087e+05 1.24463932e+04 ! particle number mass Rhill +Body1365 3.15565087e+05 1.24463932e+04 ! particle number mass Rhill 7.06559347e+03 !particle radius in AU -5.61587582e+06 7.53072526e+06 -2.26125540e+04 ! x y z -1.70025928e+03 -1.25935338e+03 1.03927192e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1366 1.32749597e+06 3.08557682e+04 ! particle number mass Rhill +Body1366 1.32749597e+06 3.08557682e+04 ! particle number mass Rhill 1.14059133e+04 !particle radius in AU -2.14619149e+06 -1.42066503e+07 1.73542964e+04 ! x y z 1.70134938e+03 -2.12094299e+02 -3.88248921e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1367 3.00481034e+05 1.26260123e+04 ! particle number mass Rhill +Body1367 3.00481034e+05 1.26260123e+04 ! particle number mass Rhill 1.02433343e+04 !particle radius in AU -2.01595454e+06 -9.31357942e+06 -4.91526291e+04 ! x y z 2.05875974e+03 -4.99092474e+02 -1.24005530e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1368 5.62740643e+05 2.30653210e+04 ! particle number mass Rhill +Body1368 5.62740643e+05 2.30653210e+04 ! particle number mass Rhill 1.26261734e+04 !particle radius in AU -3.35093529e+06 -1.37898898e+07 -7.67867475e+04 ! x y z 1.68266801e+03 -4.09195838e+02 4.84518176e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1369 6.60086057e+04 9.53594170e+03 ! particle number mass Rhill +Body1369 6.60086057e+04 9.53594170e+03 ! particle number mass Rhill 4.19423265e+03 !particle radius in AU -5.47614308e+04 1.19582326e+07 -9.89002659e+04 ! x y z -1.88840184e+03 -2.62651981e+01 7.68950274e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1370 1.25293273e+05 1.14207894e+04 ! particle number mass Rhill +Body1370 1.25293273e+05 1.14207894e+04 ! particle number mass Rhill 5.19311868e+03 !particle radius in AU -3.77832466e+06 1.09398130e+07 3.13756637e+04 ! x y z -1.82483111e+03 -5.94408085e+02 -5.78133740e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1371 7.50733289e+04 1.04930646e+04 ! particle number mass Rhill +Body1371 7.50733289e+04 1.04930646e+04 ! particle number mass Rhill 6.45155218e+03 !particle radius in AU 4.84011056e+06 -1.18968706e+07 1.84555477e+04 ! x y z 1.67151498e+03 6.81175038e+02 -7.19327483e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1372 1.98591196e+05 1.30161400e+04 ! particle number mass Rhill +Body1372 1.98591196e+05 1.30161400e+04 ! particle number mass Rhill 6.05488167e+03 !particle radius in AU 5.21483996e+04 -1.14249117e+07 5.55267676e+04 ! x y z 1.92199543e+03 2.89226318e+00 3.62643891e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1373 6.85663466e+05 2.04510345e+04 ! particle number mass Rhill +Body1373 6.85663466e+05 2.04510345e+04 ! particle number mass Rhill 9.15143782e+03 !particle radius in AU -1.10411425e+07 -3.92571862e+06 -5.07146026e+04 ! x y z 6.36950570e+02 -1.80153278e+03 2.92128142e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1374 1.23065485e+05 1.94250011e+04 ! particle number mass Rhill +Body1374 1.23065485e+05 1.94250011e+04 ! particle number mass Rhill 7.60701744e+03 !particle radius in AU -1.31978898e+07 1.46521426e+07 -3.77196518e+04 ! x y z -1.09404867e+03 -9.86978912e+02 -1.39684139e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1375 9.32976416e+05 2.08746348e+04 ! particle number mass Rhill +Body1375 9.32976416e+05 2.08746348e+04 ! particle number mass Rhill 1.01408856e+04 !particle radius in AU -2.88294831e+06 -1.04031089e+07 2.08513090e+04 ! x y z 1.92072665e+03 -5.23302927e+02 5.19800736e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1376 1.08992704e+06 1.83798070e+04 ! particle number mass Rhill +Body1376 1.08992704e+06 1.83798070e+04 ! particle number mass Rhill 1.06803333e+04 !particle radius in AU 2.38782775e+06 -8.75851927e+06 4.58765881e+04 ! x y z 2.08778972e+03 5.70538122e+02 1.58463921e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1377 3.76825728e+05 2.16154245e+04 ! particle number mass Rhill +Body1377 3.76825728e+05 2.16154245e+04 ! particle number mass Rhill 1.10462747e+04 !particle radius in AU -1.39881250e+07 -5.83335318e+06 -6.16116575e+04 ! x y z 6.22870510e+02 -1.55838806e+03 1.20223983e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1378 5.53365914e+05 1.43923959e+04 ! particle number mass Rhill +Body1378 5.53365914e+05 1.43923959e+04 ! particle number mass Rhill 1.25556671e+04 !particle radius in AU 4.99865237e+06 7.28764110e+06 -6.86499352e+04 ! x y z -1.79951538e+03 1.27018155e+03 -3.04997592e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1379 6.39199380e+04 9.52618767e+03 ! particle number mass Rhill +Body1379 6.39199380e+04 9.52618767e+03 ! particle number mass Rhill 6.11478378e+03 !particle radius in AU 4.99165759e+06 1.10448368e+07 3.69114811e+04 ! x y z -1.71481010e+03 7.51891478e+02 2.57133594e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1380 1.50512007e+04 4.38843070e+03 ! particle number mass Rhill +Body1380 1.50512007e+04 4.38843070e+03 ! particle number mass Rhill 3.77594830e+03 !particle radius in AU -1.38190232e+06 8.92446579e+06 -2.39874601e+01 ! x y z -2.13999854e+03 -3.62741075e+02 -1.15400248e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1381 5.00451986e+04 8.33623035e+03 ! particle number mass Rhill +Body1381 5.00451986e+04 8.33623035e+03 ! particle number mass Rhill 3.82448653e+03 !particle radius in AU -1.11170825e+07 2.94394609e+06 -4.30953134e+04 ! x y z -5.00071887e+02 -1.85670191e+03 4.27947102e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1382 1.37866160e+06 2.24025141e+04 ! particle number mass Rhill +Body1382 1.37866160e+06 2.24025141e+04 ! particle number mass Rhill 1.15506092e+04 !particle radius in AU 1.02590139e+07 -2.70501621e+05 1.75890374e+04 ! x y z 8.26113275e+01 2.03083325e+03 -1.20188470e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1383 1.52540156e+06 2.36328931e+04 ! particle number mass Rhill +Body1383 1.52540156e+06 2.36328931e+04 ! particle number mass Rhill 1.19466753e+04 !particle radius in AU 1.05552207e+06 1.03618993e+07 4.81086872e+04 ! x y z -2.01112311e+03 2.15384368e+02 -7.43201232e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1384 4.98999643e+05 1.49525075e+04 ! particle number mass Rhill +Body1384 4.98999643e+05 1.49525075e+04 ! particle number mass Rhill 1.21302309e+04 !particle radius in AU 2.73631070e+06 -9.24970389e+06 5.21198850e+04 ! x y z 2.01203797e+03 5.75113061e+02 -1.08228016e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1385 1.22963928e+05 1.15704812e+04 ! particle number mass Rhill +Body1385 1.22963928e+05 1.15704812e+04 ! particle number mass Rhill 7.60492436e+03 !particle radius in AU 7.49333106e+06 8.99255805e+06 4.28079932e+04 ! x y z -1.47027422e+03 1.22861330e+03 -2.29537873e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1386 6.29316275e+05 1.65343140e+04 ! particle number mass Rhill +Body1386 6.29316275e+05 1.65343140e+04 ! particle number mass Rhill 8.89355341e+03 !particle radius in AU 7.19860353e+06 -6.54495925e+06 4.11431543e+04 ! x y z 1.41373944e+03 1.55175420e+03 1.34717999e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1387 6.64261825e+04 8.06796854e+03 ! particle number mass Rhill +Body1387 6.64261825e+04 8.06796854e+03 ! particle number mass Rhill 4.20305844e+03 !particle radius in AU -1.00628201e+07 -1.83741461e+06 -1.98227486e+03 ! x y z 3.70859453e+02 -1.99423409e+03 -1.20280387e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1388 1.61162197e+06 2.05540497e+04 ! particle number mass Rhill +Body1388 1.61162197e+06 2.05540497e+04 ! particle number mass Rhill 1.21676504e+04 !particle radius in AU 5.77701761e+06 6.58972717e+06 1.74818314e+04 ! x y z -1.68661617e+03 1.44550446e+03 -1.99467032e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1389 2.31008539e+05 1.09300831e+04 ! particle number mass Rhill +Body1389 2.31008539e+05 1.09300831e+04 ! particle number mass Rhill 6.36788201e+03 !particle radius in AU 2.92908581e+06 -8.51550871e+06 2.35649421e+04 ! x y z 2.06952805e+03 6.82474350e+02 -1.19878409e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1390 8.79756930e+04 1.57795601e+04 ! particle number mass Rhill +Body1390 8.79756930e+04 1.57795601e+04 ! particle number mass Rhill 4.61572468e+03 !particle radius in AU -1.67832510e+07 5.10602561e+06 6.05666574e+04 ! x y z -4.71529253e+02 -1.50630622e+03 1.54396748e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1391 7.86523786e+05 2.26449685e+04 ! particle number mass Rhill +Body1391 7.86523786e+05 2.26449685e+04 ! particle number mass Rhill 9.57979650e+03 !particle radius in AU 5.94339422e+06 1.09804417e+07 4.79977238e+04 ! x y z -1.62390609e+03 8.74411928e+02 6.90172493e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1392 7.95689825e+05 2.04444166e+04 ! particle number mass Rhill +Body1392 7.95689825e+05 2.04444166e+04 ! particle number mass Rhill 9.61686674e+03 !particle radius in AU -9.53286463e+05 1.08518193e+07 1.37804570e+04 ! x y z -1.99765013e+03 -1.63665978e+02 -1.39490183e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1393 1.57903814e+05 1.75328316e+04 ! particle number mass Rhill +Body1393 1.57903814e+05 1.75328316e+04 ! particle number mass Rhill 8.26608492e+03 !particle radius in AU -6.92004578e+06 -1.47096496e+07 9.07914526e+04 ! x y z 1.47519584e+03 -6.90837866e+02 6.35058618e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1394 1.79760964e+06 3.27447713e+04 ! particle number mass Rhill +Body1394 1.79760964e+06 3.27447713e+04 ! particle number mass Rhill 1.26187826e+04 !particle radius in AU -1.20616278e+07 6.06273134e+06 -6.00296658e+04 ! x y z -8.01878358e+02 -1.59732664e+03 6.85710223e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1395 1.72877299e+06 3.01002806e+04 ! particle number mass Rhill +Body1395 1.72877299e+06 3.01002806e+04 ! particle number mass Rhill 1.24556096e+04 !particle radius in AU 1.07241366e+07 6.87028361e+06 9.95384965e+03 ! x y z -9.77403580e+02 1.54502689e+03 -6.02368193e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1396 5.37735425e+05 1.81911004e+04 ! particle number mass Rhill +Body1396 5.37735425e+05 1.81911004e+04 ! particle number mass Rhill 8.43934121e+03 !particle radius in AU -9.89312276e+06 -5.78442642e+06 3.19342091e+03 ! x y z 1.00166999e+03 -1.63649382e+03 -7.28916722e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1397 1.12551232e+05 1.00244300e+04 ! particle number mass Rhill +Body1397 1.12551232e+05 1.00244300e+04 ! particle number mass Rhill 7.38389889e+03 !particle radius in AU -1.05072101e+07 8.59747253e+05 -8.51062631e+04 ! x y z -1.76270864e+02 -2.00169685e+03 -1.88486496e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1398 1.93788717e+05 1.07523030e+04 ! particle number mass Rhill +Body1398 1.93788717e+05 1.07523030e+04 ! particle number mass Rhill 6.00567499e+03 !particle radius in AU 5.23533805e+06 -8.01402331e+06 2.56229650e+04 ! x y z 1.74936393e+03 1.14948262e+03 1.14944776e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1399 3.94151482e+05 1.32927065e+04 ! particle number mass Rhill +Body1399 3.94151482e+05 1.32927065e+04 ! particle number mass Rhill 1.12130402e+04 !particle radius in AU -3.53936356e+06 8.37116745e+06 -5.28989524e+04 ! x y z -2.00215068e+03 -8.57726431e+02 -1.43522460e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1400 9.72092511e+05 1.81538052e+04 ! particle number mass Rhill +Body1400 9.72092511e+05 1.81538052e+04 ! particle number mass Rhill 1.02806726e+04 !particle radius in AU 8.06463120e+06 -4.43013823e+06 9.40752267e+04 ! x y z 1.03931497e+03 1.89699386e+03 -9.86578192e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1401 5.15220478e+05 1.68308350e+04 ! particle number mass Rhill +Body1401 5.15220478e+05 1.68308350e+04 ! particle number mass Rhill 1.22602698e+04 !particle radius in AU -1.05188937e+07 8.26557998e+05 -2.50244301e+04 ! x y z -1.75058944e+02 -2.01148735e+03 6.39744454e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1402 2.13063868e+05 1.07950104e+04 ! particle number mass Rhill +Body1402 2.13063868e+05 1.07950104e+04 ! particle number mass Rhill 9.13423664e+03 !particle radius in AU 9.02166027e+05 -9.17478955e+06 6.28467621e+04 ! x y z 2.13279891e+03 2.18658803e+02 5.09551557e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1403 4.71317796e+05 1.46342438e+04 ! particle number mass Rhill +Body1403 4.71317796e+05 1.46342438e+04 ! particle number mass Rhill 8.07650766e+03 !particle radius in AU -3.82128992e+06 8.76150983e+06 -3.66320445e+04 ! x y z -1.91568216e+03 -8.82768818e+02 -8.66361539e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1404 4.64539498e+05 1.97631805e+04 ! particle number mass Rhill +Body1404 4.64539498e+05 1.97631805e+04 ! particle number mass Rhill 8.03760289e+03 !particle radius in AU 6.34183157e+06 1.14263259e+07 -3.93771961e+04 ! x y z -1.57702001e+03 8.61699373e+02 7.37963170e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1405 1.22910745e+06 2.88108450e+04 ! particle number mass Rhill +Body1405 1.22910745e+06 2.88108450e+04 ! particle number mass Rhill 1.11168637e+04 !particle radius in AU -1.30405721e+07 -3.97553562e+06 6.86718538e+04 ! x y z 5.08860652e+02 -1.69393029e+03 3.39424464e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1406 3.59051292e+05 1.29060626e+04 ! particle number mass Rhill +Body1406 3.59051292e+05 1.29060626e+04 ! particle number mass Rhill 7.37628737e+03 !particle radius in AU 1.47724485e+06 8.92877200e+06 -1.05084746e+05 ! x y z -2.16100073e+03 3.48067255e+02 2.02796618e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1407 5.58713149e+05 1.72404097e+04 ! particle number mass Rhill +Body1407 5.58713149e+05 1.72404097e+04 ! particle number mass Rhill 1.25959797e+04 !particle radius in AU 6.68480405e+06 8.22694034e+06 5.91279278e+04 ! x y z -1.56238715e+03 1.25932846e+03 7.35031359e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1408 1.49551836e+06 2.70347043e+04 ! particle number mass Rhill +Body1408 1.49551836e+06 2.70347043e+04 ! particle number mass Rhill 1.18681469e+04 !particle radius in AU 1.16829878e+07 3.26454849e+06 8.84361419e+04 ! x y z -5.06154292e+02 1.79320925e+03 1.57229654e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1409 1.74614925e+05 1.13819946e+04 ! particle number mass Rhill +Body1409 1.74614925e+05 1.13819946e+04 ! particle number mass Rhill 8.54796582e+03 !particle radius in AU 9.47110497e+06 -3.98852153e+06 -3.02153569e+04 ! x y z 8.00176660e+02 1.87835641e+03 1.12222570e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1410 4.37419833e+05 1.87404958e+04 ! particle number mass Rhill +Body1410 4.37419833e+05 1.87404958e+04 ! particle number mass Rhill 7.87804554e+03 !particle radius in AU 1.46320698e+06 -1.24945211e+07 2.33172915e+04 ! x y z 1.82255294e+03 2.24692006e+02 -5.94227757e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1411 9.88194235e+05 2.19599829e+04 ! particle number mass Rhill +Body1411 9.88194235e+05 2.19599829e+04 ! particle number mass Rhill 1.03371250e+04 !particle radius in AU -2.99549263e+06 1.07900890e+07 -3.59480074e+04 ! x y z -1.87291441e+03 -5.40526156e+02 -2.72086375e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1412 8.12416369e+04 8.11359134e+03 ! particle number mass Rhill +Body1412 8.12416369e+04 8.11359134e+03 ! particle number mass Rhill 4.49481566e+03 !particle radius in AU 8.92552694e+06 -2.88867045e+06 4.50164736e+04 ! x y z 6.21245683e+02 2.05314318e+03 5.45203724e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1413 1.05826275e+06 1.96138959e+04 ! particle number mass Rhill +Body1413 1.05826275e+06 1.96138959e+04 ! particle number mass Rhill 1.05758878e+04 !particle radius in AU 5.22399519e+06 8.01692184e+06 -5.68152669e+03 ! x y z -1.79741529e+03 1.14577258e+03 9.91685440e-01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1414 1.63403319e+05 9.80071456e+03 ! particle number mass Rhill +Body1414 1.63403319e+05 9.80071456e+03 ! particle number mass Rhill 8.36095619e+03 !particle radius in AU 8.03570746e+06 -4.11887844e+06 3.48874429e+04 ! x y z 1.00266026e+03 1.93580077e+03 -1.91021104e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1415 2.42846073e+04 5.95994238e+03 ! particle number mass Rhill +Body1415 2.42846073e+04 5.95994238e+03 ! particle number mass Rhill 4.42873150e+03 !particle radius in AU 9.90649703e+06 3.18003586e+06 1.94516997e+04 ! x y z -6.33346908e+02 1.92588552e+03 -4.00155121e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1416 1.39585476e+06 1.98821424e+04 ! particle number mass Rhill +Body1416 1.39585476e+06 1.98821424e+04 ! particle number mass Rhill 1.15984265e+04 !particle radius in AU -1.09606598e+06 8.80615149e+06 -2.31959292e+04 ! x y z -2.19928594e+03 -2.15273172e+02 -1.46856638e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1417 5.69983191e+05 1.68129906e+04 ! particle number mass Rhill +Body1417 5.69983191e+05 1.68129906e+04 ! particle number mass Rhill 8.60477818e+03 !particle radius in AU 1.52623331e+06 -9.87507162e+06 -7.34326606e+04 ! x y z 2.07157812e+03 3.10284089e+02 -1.48877124e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1418 4.36632456e+05 1.43212304e+04 ! particle number mass Rhill +Body1418 4.36632456e+05 1.43212304e+04 ! particle number mass Rhill 1.16022173e+04 !particle radius in AU 5.60100517e+06 -7.52238732e+06 -7.05544699e+04 ! x y z 1.72239950e+03 1.29297128e+03 -1.52256341e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1419 1.67122060e+05 1.16630765e+04 ! particle number mass Rhill +Body1419 1.67122060e+05 1.16630765e+04 ! particle number mass Rhill 5.71650065e+03 !particle radius in AU -3.94522959e+06 -9.97626417e+06 9.25599419e+03 ! x y z 1.86732899e+03 -7.00228008e+02 -6.60836692e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1420 1.46864649e+06 2.03402135e+04 ! particle number mass Rhill +Body1420 1.46864649e+06 2.03402135e+04 ! particle number mass Rhill 1.17966335e+04 !particle radius in AU 8.23445883e+04 -9.04812768e+06 -1.64851152e+03 ! x y z 2.17359230e+03 -1.27347929e+01 -1.55026516e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1421 4.13129899e+05 1.84920921e+04 ! particle number mass Rhill +Body1421 4.13129899e+05 1.84920921e+04 ! particle number mass Rhill 1.13901960e+04 !particle radius in AU -9.27915033e+06 -8.53740765e+06 -1.42390767e+05 ! x y z 1.24138782e+03 -1.35430995e+03 -1.90290768e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1422 3.39196625e+05 1.53683400e+04 ! particle number mass Rhill +Body1422 3.39196625e+05 1.53683400e+04 ! particle number mass Rhill 7.23773766e+03 !particle radius in AU 6.08369217e+06 -9.30896549e+06 1.20641705e+05 ! x y z 1.63879722e+03 1.07988243e+03 -4.44689941e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1423 1.56760316e+05 1.13228643e+04 ! particle number mass Rhill +Body1423 1.56760316e+05 1.13228643e+04 ! particle number mass Rhill 5.59582821e+03 !particle radius in AU 9.59849615e+06 4.68470056e+06 3.84316246e+04 ! x y z -8.55957491e+02 1.80183427e+03 7.74894619e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1424 8.72575676e+05 1.94114085e+04 ! particle number mass Rhill +Body1424 8.72575676e+05 1.94114085e+04 ! particle number mass Rhill 9.91714578e+03 !particle radius in AU -1.08060668e+06 -1.00607858e+07 4.94826506e+04 ! x y z 2.05453656e+03 -2.59041316e+02 -1.24750217e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1425 1.52610080e+05 1.67317953e+04 ! particle number mass Rhill +Body1425 1.52610080e+05 1.67317953e+04 ! particle number mass Rhill 8.17265933e+03 !particle radius in AU 1.47983590e+07 5.41415872e+06 -1.80415422e+04 ! x y z -5.58693227e+02 1.55361354e+03 1.18553934e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1426 1.44994049e+05 1.07202302e+04 ! particle number mass Rhill +Body1426 1.44994049e+05 1.07202302e+04 ! particle number mass Rhill 8.03438024e+03 !particle radius in AU -7.58136593e+06 6.99309921e+06 2.29302110e+04 ! x y z -1.40627338e+03 -1.47284043e+03 -4.36076043e-01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1427 7.80472321e+05 1.86417464e+04 ! particle number mass Rhill +Body1427 7.80472321e+05 1.86417464e+04 ! particle number mass Rhill 9.55516443e+03 !particle radius in AU -1.00024650e+07 2.57885499e+06 -6.07457902e+03 ! x y z -5.22539017e+02 -1.95674023e+03 -7.68835058e-01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1428 6.00438958e+05 1.93290671e+04 ! particle number mass Rhill +Body1428 6.00438958e+05 1.93290671e+04 ! particle number mass Rhill 1.29020467e+04 !particle radius in AU -9.01182188e+06 7.17037576e+06 -1.80541014e+04 ! x y z -1.21356170e+03 -1.50384647e+03 1.80093599e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1429 1.75115386e+06 2.43458664e+04 ! particle number mass Rhill +Body1429 1.75115386e+06 2.43458664e+04 ! particle number mass Rhill 1.25091298e+04 !particle radius in AU -5.24887098e+06 8.72732331e+06 8.04218722e+04 ! x y z -1.74335368e+03 -1.08193759e+03 -5.43249124e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1430 3.33981162e+05 2.15867295e+04 ! particle number mass Rhill +Body1430 3.33981162e+05 2.15867295e+04 ! particle number mass Rhill 1.06106742e+04 !particle radius in AU -2.45049686e+06 1.55426920e+07 1.07580343e+05 ! x y z -1.62197493e+03 -2.92833542e+02 -1.14576459e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1431 4.58385695e+05 2.01935560e+04 ! particle number mass Rhill +Body1431 4.58385695e+05 2.01935560e+04 ! particle number mass Rhill 8.00195335e+03 !particle radius in AU -1.22199859e+07 4.38221625e+06 -3.89351024e+04 ! x y z -6.16349372e+02 -1.72585692e+03 4.89125567e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1432 2.23751701e+05 1.21149867e+04 ! particle number mass Rhill +Body1432 2.23751701e+05 1.21149867e+04 ! particle number mass Rhill 6.30049172e+03 !particle radius in AU -2.68787716e+06 -9.60100858e+06 2.64767119e+03 ! x y z 2.00338289e+03 -5.71028998e+02 2.70092626e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1433 6.14170089e+05 1.68963871e+04 ! particle number mass Rhill +Body1433 6.14170089e+05 1.68963871e+04 ! particle number mass Rhill 1.29996565e+04 !particle radius in AU -8.95990349e+06 4.52753433e+06 1.16091499e+04 ! x y z -9.24228536e+02 -1.84658152e+03 6.10613917e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1434 4.88383647e+04 1.28185350e+04 ! particle number mass Rhill +Body1434 4.88383647e+04 1.28185350e+04 ! particle number mass Rhill 5.59014012e+03 !particle radius in AU 1.71028024e+07 4.97528193e+06 -6.57328228e+04 ! x y z -4.53167939e+02 1.47788400e+03 4.60344609e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1435 3.78131340e+05 3.35514648e+04 ! particle number mass Rhill +Body1435 3.78131340e+05 3.35514648e+04 ! particle number mass Rhill 1.10590176e+04 !particle radius in AU -2.23441151e+07 -5.50686380e+06 3.85003687e+04 ! x y z 3.37072469e+02 -1.33411055e+03 5.11825064e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1436 1.12257471e+06 4.29816726e+04 ! particle number mass Rhill +Body1436 1.12257471e+06 4.29816726e+04 ! particle number mass Rhill 1.07859254e+04 !particle radius in AU -1.12784475e+07 1.70585791e+07 -1.32439952e+05 ! x y z -1.22293182e+03 -8.00872476e+02 4.14711101e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1437 6.97796488e+05 1.81514488e+04 ! particle number mass Rhill +Body1437 6.97796488e+05 1.81514488e+04 ! particle number mass Rhill 9.20510168e+03 !particle radius in AU -3.79252235e+06 9.57625977e+06 -9.43032419e+04 ! x y z -1.90113874e+03 -7.45374550e+02 -2.76613575e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1438 6.32170601e+04 7.02909847e+03 ! particle number mass Rhill +Body1438 6.32170601e+04 7.02909847e+03 ! particle number mass Rhill 4.13425343e+03 !particle radius in AU -7.96122660e+06 3.67866986e+06 -9.30226617e+03 ! x y z -9.42526154e+02 -2.01745780e+03 -1.25281974e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1439 1.55582987e+05 1.03484949e+04 ! particle number mass Rhill +Body1439 1.55582987e+05 1.03484949e+04 ! particle number mass Rhill 5.58178407e+03 !particle radius in AU -7.53794950e+06 6.23579413e+06 -2.61014008e+04 ! x y z -1.34980984e+03 -1.58862900e+03 -1.61372420e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1440 4.37297807e+04 6.59045414e+03 ! particle number mass Rhill +Body1440 4.37297807e+04 6.59045414e+03 ! particle number mass Rhill 5.38800623e+03 !particle radius in AU -8.66326774e+06 4.08110980e+06 -3.65358197e+04 ! x y z -9.22979977e+02 -1.88593300e+03 -1.20742584e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1441 1.00764560e+05 1.20451591e+04 ! particle number mass Rhill +Body1441 1.00764560e+05 1.20451591e+04 ! particle number mass Rhill 4.82934540e+03 !particle radius in AU -8.01465112e+06 -1.03186901e+07 -8.69608158e+04 ! x y z 1.40671015e+03 -1.13976841e+03 1.88119518e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1442 3.51703554e+05 2.06788915e+04 ! particle number mass Rhill +Body1442 3.51703554e+05 2.06788915e+04 ! particle number mass Rhill 1.07951308e+04 !particle radius in AU -1.49556816e+07 -7.86589247e+05 1.11406498e+05 ! x y z 1.14089906e+02 -1.67632423e+03 -1.08680759e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1443 1.92277696e+06 3.28524926e+04 ! particle number mass Rhill +Body1443 1.92277696e+06 3.28524926e+04 ! particle number mass Rhill 1.29051176e+04 !particle radius in AU 1.27123539e+07 -2.64461233e+06 -6.18084715e+04 ! x y z 3.74400777e+02 1.80142774e+03 3.83561532e-01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1444 3.45658520e+05 2.43824484e+04 ! particle number mass Rhill +Body1444 3.45658520e+05 2.43824484e+04 ! particle number mass Rhill 1.07329246e+04 !particle radius in AU -4.06927547e+05 -1.75442240e+07 1.00963469e+05 ! x y z 1.56104472e+03 -4.39048470e+01 3.93620680e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1445 1.13287340e+05 1.58649945e+04 ! particle number mass Rhill +Body1445 1.13287340e+05 1.58649945e+04 ! particle number mass Rhill 5.02164633e+03 !particle radius in AU 8.84368264e+06 1.43003762e+07 5.00874702e+04 ! x y z -1.35152929e+03 8.24556921e+02 -8.03719400e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1446 1.49424265e+06 2.19656703e+04 ! particle number mass Rhill +Body1446 1.49424265e+06 2.19656703e+04 ! particle number mass Rhill 1.18647713e+04 !particle radius in AU -9.54707879e+06 1.77630246e+06 -8.88116065e+03 ! x y z -3.48826440e+02 -2.06942564e+03 -2.16674061e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1447 7.99886482e+05 2.37523761e+04 ! particle number mass Rhill +Body1447 7.99886482e+05 2.37523761e+04 ! particle number mass Rhill 9.63374432e+03 !particle radius in AU 1.09242185e+07 6.96934254e+06 -3.27489047e+04 ! x y z -9.84319971e+02 1.52494369e+03 8.24595564e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1448 6.88070041e+04 8.39015369e+03 ! particle number mass Rhill +Body1448 6.88070041e+04 8.39015369e+03 ! particle number mass Rhill 4.25268498e+03 !particle radius in AU 5.58576103e+06 8.70672427e+06 -2.15687306e+04 ! x y z -1.72503313e+03 1.07740968e+03 -3.41426440e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1449 3.82536212e+05 1.40133678e+04 ! particle number mass Rhill +Body1449 3.82536212e+05 1.40133678e+04 ! particle number mass Rhill 1.11017942e+04 !particle radius in AU -4.11471227e+06 -8.93287907e+06 -4.36028632e+04 ! x y z 1.89219131e+03 -8.56549006e+02 8.16432689e-01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1450 2.90080057e+05 1.19567122e+04 ! particle number mass Rhill +Body1450 2.90080057e+05 1.19567122e+04 ! particle number mass Rhill 6.87002453e+03 !particle radius in AU 8.96616870e+06 -2.05606701e+06 2.01901008e+04 ! x y z 4.73236695e+02 2.09528249e+03 -4.42528671e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1451 1.59018668e+05 1.92436459e+04 ! particle number mass Rhill +Body1451 1.59018668e+05 1.92436459e+04 ! particle number mass Rhill 8.28549309e+03 !particle radius in AU 1.71268946e+07 4.30766948e+06 2.02642738e+03 ! x y z -4.07771856e+02 1.51502114e+03 -1.13119700e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1452 9.33386750e+04 1.64255317e+04 ! particle number mass Rhill +Body1452 9.33386750e+04 1.64255317e+04 ! particle number mass Rhill 4.70767212e+03 !particle radius in AU -4.68916418e+05 1.79356049e+07 2.73217306e+04 ! x y z -1.55840072e+03 -4.92017252e+01 -1.97207421e-01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1453 3.61408263e+05 1.25858962e+04 ! particle number mass Rhill +Body1453 3.61408263e+05 1.25858962e+04 ! particle number mass Rhill 1.08935228e+04 !particle radius in AU -8.58951775e+06 -2.49673020e+06 1.50355881e+04 ! x y z 6.03037486e+02 -2.10005557e+03 9.90449926e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1454 4.04341391e+05 1.39794979e+04 ! particle number mass Rhill +Body1454 4.04341391e+05 1.39794979e+04 ! particle number mass Rhill 1.13088486e+04 !particle radius in AU -1.24947062e+06 9.39169733e+06 -1.29611502e+03 ! x y z -2.12088670e+03 -2.33617557e+02 -7.92353291e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1455 1.15205467e+05 9.46757023e+03 ! particle number mass Rhill +Body1455 1.15205467e+05 9.46757023e+03 ! particle number mass Rhill 5.04982925e+03 !particle radius in AU 9.31255896e+06 3.14623519e+06 -5.69089329e+03 ! x y z -7.03486722e+02 1.96419139e+03 2.25468152e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1456 1.36945908e+05 1.16200120e+04 ! particle number mass Rhill +Body1456 1.36945908e+05 1.16200120e+04 ! particle number mass Rhill 7.88288776e+03 !particle radius in AU -5.85221513e+05 -1.12876036e+07 -5.52028652e+04 ! x y z 1.95064275e+03 -9.81526152e+01 -5.91601856e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1457 3.65528213e+05 1.31090663e+04 ! particle number mass Rhill +Body1457 3.65528213e+05 1.31090663e+04 ! particle number mass Rhill 1.09347609e+04 !particle radius in AU -2.96784791e+06 -8.77030784e+06 -6.49349269e+04 ! x y z 2.04523947e+03 -6.63593054e+02 -5.41808592e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1458 1.69950901e+04 6.03470815e+03 ! particle number mass Rhill +Body1458 1.69950901e+04 6.03470815e+03 ! particle number mass Rhill 3.93196955e+03 !particle radius in AU 8.90265546e+05 1.20291601e+07 -5.41238919e+02 ! x y z -1.86112508e+03 1.50752240e+02 -5.69806824e-01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1459 1.14279210e+05 1.31227492e+04 ! particle number mass Rhill +Body1459 1.14279210e+05 1.31227492e+04 ! particle number mass Rhill 5.03625919e+03 !particle radius in AU -4.12865927e+06 -1.30370302e+07 2.49268877e+04 ! x y z 1.68286207e+03 -5.42218893e+02 7.09107529e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1460 1.32563480e+06 2.20277567e+04 ! particle number mass Rhill +Body1460 1.32563480e+06 2.20277567e+04 ! particle number mass Rhill 1.14005804e+04 !particle radius in AU -8.83659135e+06 4.88772967e+06 3.97374919e+04 ! x y z -9.96652878e+02 -1.80490383e+03 4.50625373e-01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1461 1.09382671e+05 1.04026284e+04 ! particle number mass Rhill +Body1461 1.09382671e+05 1.04026284e+04 ! particle number mass Rhill 7.31394737e+03 !particle radius in AU 7.51899250e+06 8.02238049e+06 4.96372898e+04 ! x y z -1.45435540e+03 1.33207577e+03 -8.91729858e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1462 1.96680548e+05 2.21014105e+04 ! particle number mass Rhill +Body1462 1.96680548e+05 2.21014105e+04 ! particle number mass Rhill 8.89384301e+03 !particle radius in AU 1.07692501e+07 -1.58383421e+07 5.11056372e+04 ! x y z 1.24097868e+03 8.36402001e+02 1.17081374e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1463 6.31269846e+05 1.55026435e+04 ! particle number mass Rhill +Body1463 6.31269846e+05 1.55026435e+04 ! particle number mass Rhill 8.90274659e+03 !particle radius in AU -7.87110940e+06 4.57199197e+06 -7.32174697e+03 ! x y z -1.11779702e+03 -1.86164265e+03 1.82306653e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1464 1.65148564e+05 1.29292367e+04 ! particle number mass Rhill +Body1464 1.65148564e+05 1.29292367e+04 ! particle number mass Rhill 8.39061750e+03 !particle radius in AU -9.02697440e+06 7.44735568e+06 -6.20239222e+04 ! x y z -1.22828772e+03 -1.48671915e+03 -3.25023413e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1465 2.01259594e+05 1.25893360e+04 ! particle number mass Rhill +Body1465 2.01259594e+05 1.25893360e+04 ! particle number mass Rhill 8.96233529e+03 !particle radius in AU 1.03311380e+07 2.97114168e+06 2.75510366e+04 ! x y z -5.53060286e+02 1.92682584e+03 -7.92293805e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1466 3.47358922e+04 5.91061876e+03 ! particle number mass Rhill +Body1466 3.47358922e+04 5.91061876e+03 ! particle number mass Rhill 4.98993792e+03 !particle radius in AU 7.02853805e+06 6.05239702e+06 3.87860255e+03 ! x y z -1.40362427e+03 1.60647543e+03 -1.45016070e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1467 6.56492226e+04 7.07440593e+03 ! particle number mass Rhill +Body1467 6.56492226e+04 7.07440593e+03 ! particle number mass Rhill 4.18660697e+03 !particle radius in AU 6.55440785e+06 5.85117198e+06 -4.93943511e+04 ! x y z -1.49384332e+03 1.63681032e+03 -1.39258100e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1468 4.49127828e+05 1.61155734e+04 ! particle number mass Rhill +Body1468 4.49127828e+05 1.61155734e+04 ! particle number mass Rhill 1.17118539e+04 !particle radius in AU 9.90570829e+06 4.34179796e+06 -2.00530721e+04 ! x y z -7.94337401e+02 1.80469509e+03 -3.79870453e-01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1469 4.46485515e+05 1.75275373e+04 ! particle number mass Rhill +Body1469 4.46485515e+05 1.75275373e+04 ! particle number mass Rhill 7.93209892e+03 !particle radius in AU -8.25205087e+06 7.98686094e+06 -3.50332951e+04 ! x y z -1.35816228e+03 -1.38349553e+03 1.34047111e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1470 3.40516646e+05 1.47688794e+04 ! particle number mass Rhill +Body1470 3.40516646e+05 1.47688794e+04 ! particle number mass Rhill 7.24711433e+03 !particle radius in AU -9.96135005e+06 3.70457700e+06 -9.07193755e+04 ! x y z -7.21948720e+02 -1.87787046e+03 -1.05717777e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1471 7.95155921e+04 1.33847411e+04 ! particle number mass Rhill +Body1471 7.95155921e+04 1.33847411e+04 ! particle number mass Rhill 6.57637276e+03 !particle radius in AU -1.22268683e+07 1.01474610e+07 -8.42852150e+04 ! x y z -1.02194217e+03 -1.27298189e+03 -7.67733923e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1472 9.54539516e+04 9.68623016e+03 ! particle number mass Rhill +Body1472 9.54539516e+04 9.68623016e+03 ! particle number mass Rhill 6.98929911e+03 !particle radius in AU 4.92746951e+06 9.58728854e+06 2.89432610e+04 ! x y z -1.76304026e+03 9.13627287e+02 6.36664299e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1473 1.51141099e+06 2.76245591e+04 ! particle number mass Rhill +Body1473 1.51141099e+06 2.76245591e+04 ! particle number mass Rhill 1.19100391e+04 !particle radius in AU 1.23329034e+07 -6.92729902e+05 2.96405314e+04 ! x y z 1.12931575e+02 1.84303874e+03 -9.66021750e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1474 2.27824759e+05 2.21950382e+04 ! particle number mass Rhill +Body1474 2.27824759e+05 2.21950382e+04 ! particle number mass Rhill 9.34048218e+03 !particle radius in AU 1.63682186e+07 -7.64635682e+06 7.51258389e+04 ! x y z 6.57521797e+02 1.40505156e+03 -1.44981512e-01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1475 2.82996551e+04 5.59807489e+03 ! particle number mass Rhill +Body1475 2.82996551e+04 5.59807489e+03 ! particle number mass Rhill 4.66046628e+03 !particle radius in AU -9.02931313e+06 1.40224619e+06 -7.68912993e+03 ! x y z -3.55553612e+02 -2.15150134e+03 1.02691019e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1476 1.08035073e+05 8.74419607e+03 ! particle number mass Rhill +Body1476 1.08035073e+05 8.74419607e+03 ! particle number mass Rhill 7.28378715e+03 !particle radius in AU -2.13040703e+06 9.05085932e+06 2.75232896e+04 ! x y z -2.09375359e+03 -4.54923992e+02 -6.60791548e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1477 6.82388851e+04 9.03381717e+03 ! particle number mass Rhill +Body1477 6.82388851e+04 9.03381717e+03 ! particle number mass Rhill 4.24094823e+03 !particle radius in AU 2.12770208e+06 -1.09362652e+07 6.56462507e+04 ! x y z 1.92901319e+03 3.58659857e+02 1.88568450e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1478 1.71725563e+06 3.27614334e+04 ! particle number mass Rhill +Body1478 1.71725563e+06 3.27614334e+04 ! particle number mass Rhill 1.24278875e+04 !particle radius in AU 4.49722640e+06 1.29879609e+07 6.17022585e+04 ! x y z -1.66361829e+03 6.02542134e+02 -3.15731575e-01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1479 4.31736407e+05 1.33145899e+04 ! particle number mass Rhill +Body1479 4.31736407e+05 1.33145899e+04 ! particle number mass Rhill 1.15586882e+04 !particle radius in AU -2.46270150e+05 -8.94568869e+06 -6.37006664e+04 ! x y z 2.17872017e+03 -8.88856930e+01 -1.82962039e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1480 4.69987554e+05 1.50577774e+04 ! particle number mass Rhill +Body1480 4.69987554e+05 1.50577774e+04 ! particle number mass Rhill 8.06890215e+03 !particle radius in AU -7.68511313e+06 -6.12228878e+06 -9.32586560e+03 ! x y z 1.29882576e+03 -1.62777018e+03 -1.19293575e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1481 1.17648820e+05 8.85436283e+03 ! particle number mass Rhill +Body1481 1.17648820e+05 8.85436283e+03 ! particle number mass Rhill 7.49373241e+03 !particle radius in AU -8.92478393e+06 1.31107857e+06 -7.25655485e+04 ! x y z -2.98094429e+02 -2.17047563e+03 -1.53783344e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1482 1.06595743e+05 1.08697806e+04 ! particle number mass Rhill +Body1482 1.06595743e+05 1.08697806e+04 ! particle number mass Rhill 7.25129561e+03 !particle radius in AU -6.57681719e+06 -9.45888345e+06 -3.72144545e+04 ! x y z 1.58522928e+03 -1.10501157e+03 1.05113370e-01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1483 2.40181521e+05 2.05658561e+04 ! particle number mass Rhill +Body1483 2.40181521e+05 2.05658561e+04 ! particle number mass Rhill 9.50638765e+03 !particle radius in AU 1.34071651e+07 1.03792566e+07 -4.53441732e+04 ! x y z -9.71553194e+02 1.24234337e+03 9.20294843e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1484 2.30979462e+05 1.61646706e+04 ! particle number mass Rhill +Body1484 2.30979462e+05 1.61646706e+04 ! particle number mass Rhill 6.36761483e+03 !particle radius in AU -3.51077302e+06 -1.26567098e+07 2.57715830e+04 ! x y z 1.74422450e+03 -5.08580589e+02 2.03158207e-01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1485 1.30379505e+05 1.26014074e+04 ! particle number mass Rhill +Body1485 1.30379505e+05 1.26014074e+04 ! particle number mass Rhill 5.26245957e+03 !particle radius in AU 2.88059988e+06 -1.21489772e+07 1.66531109e+03 ! x y z 1.80288747e+03 4.42317052e+02 -1.19583569e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1486 5.14863696e+05 1.57196952e+04 ! particle number mass Rhill +Body1486 5.14863696e+05 1.57196952e+04 ! particle number mass Rhill 8.31795219e+03 !particle radius in AU -5.79801378e+06 7.81844110e+06 7.21651425e+04 ! x y z -1.66669076e+03 -1.30229321e+03 -2.20360225e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1487 1.26463086e+06 1.90076383e+04 ! particle number mass Rhill +Body1487 1.26463086e+06 1.90076383e+04 ! particle number mass Rhill 1.12229473e+04 !particle radius in AU 1.79079043e+06 8.72935614e+06 7.66173175e+03 ! x y z -2.14494592e+03 4.29349753e+02 -3.05321261e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1488 1.10279394e+06 2.94811703e+04 ! particle number mass Rhill +Body1488 1.10279394e+06 2.94811703e+04 ! particle number mass Rhill 1.07221971e+04 !particle radius in AU -1.31449667e+07 5.65642590e+06 -1.35348879e+04 ! x y z -6.99474388e+02 -1.58839301e+03 5.07187025e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1489 9.64986931e+05 2.60335138e+04 ! particle number mass Rhill +Body1489 9.64986931e+05 2.60335138e+04 ! particle number mass Rhill 1.02555622e+04 !particle radius in AU -1.28107010e+07 3.64301270e+06 -4.79094708e+04 ! x y z -4.96849501e+02 -1.72146269e+03 1.99970261e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1490 3.85017463e+05 1.31518104e+04 ! particle number mass Rhill +Body1490 3.85017463e+05 1.31518104e+04 ! particle number mass Rhill 7.54998008e+03 !particle radius in AU -8.81052520e+06 1.96363775e+06 -7.03542162e+04 ! x y z -4.55600237e+02 -2.14195252e+03 -1.54510587e+01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1491 7.12464696e+04 7.27507090e+03 ! particle number mass Rhill +Body1491 7.12464696e+04 7.27507090e+03 ! particle number mass Rhill 4.30236032e+03 !particle radius in AU 6.76054921e+06 5.69153857e+06 -8.32813680e+04 ! x y z -1.43863210e+03 1.66962801e+03 -3.05680786e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1492 2.30337841e+05 1.99962209e+04 ! particle number mass Rhill +Body1492 2.30337841e+05 1.99962209e+04 ! particle number mass Rhill 9.37470089e+03 !particle radius in AU -1.58533753e+07 -4.64141565e+06 -1.37616342e+05 ! x y z 4.71661565e+02 -1.53679456e+03 4.54920894e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1493 1.54078080e+05 1.40811002e+04 ! particle number mass Rhill +Body1493 1.54078080e+05 1.40811002e+04 ! particle number mass Rhill 5.56372876e+03 !particle radius in AU -5.05912024e+06 1.20461614e+07 -1.00213774e+05 ! x y z -1.67920042e+03 -7.11202226e+02 4.13175962e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1494 8.27228641e+04 9.01203219e+03 ! particle number mass Rhill +Body1494 8.27228641e+04 9.01203219e+03 ! particle number mass Rhill 6.66362952e+03 !particle radius in AU 8.41034459e+05 -1.03591089e+07 -4.26263251e+04 ! x y z 2.02679172e+03 1.77245292e+02 -7.59374588e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1495 6.59711957e+04 7.21319042e+03 ! particle number mass Rhill +Body1495 6.59711957e+04 7.21319042e+03 ! particle number mass Rhill 4.19344015e+03 !particle radius in AU -8.72674150e+06 -1.84604826e+06 -9.49439666e+03 ! x y z 5.06255038e+02 -2.14329601e+03 8.35004981e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1496 4.76016816e+05 1.56977540e+04 ! particle number mass Rhill +Body1496 4.76016816e+05 1.56977540e+04 ! particle number mass Rhill 1.19410657e+04 !particle radius in AU 8.32975138e+06 5.59994962e+06 1.36490477e+04 ! x y z -1.14500563e+03 1.73284125e+03 2.21368330e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1497 8.74132422e+05 1.84842648e+04 ! particle number mass Rhill +Body1497 8.74132422e+05 1.84842648e+04 ! particle number mass Rhill 9.92303995e+03 !particle radius in AU 5.20187427e+06 8.26928364e+06 7.79156795e+04 ! x y z -1.78869520e+03 1.08594628e+03 -2.89543422e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1498 1.05100593e+06 1.88653392e+04 ! particle number mass Rhill +Body1498 1.05100593e+06 1.88653392e+04 ! particle number mass Rhill 1.05516583e+04 !particle radius in AU -3.97296892e+06 -8.38171851e+06 1.59358464e+04 ! x y z 1.95617296e+03 -9.13960827e+02 -3.62965884e-01 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1499 4.64374943e+05 2.44967912e+04 ! particle number mass Rhill +Body1499 4.64374943e+05 2.44967912e+04 ! particle number mass Rhill 8.03665372e+03 !particle radius in AU 8.20764080e+05 -1.58893023e+07 7.87114038e+04 ! x y z 1.64101205e+03 9.20364252e+01 9.68548448e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1500 7.98550448e+05 3.23468692e+04 ! particle number mass Rhill +Body1500 7.98550448e+05 3.23468692e+04 ! particle number mass Rhill 9.62837764e+03 !particle radius in AU -9.69224879e+06 1.49532038e+07 7.33593405e+04 ! x y z -1.29931651e+03 -8.27698792e+02 -3.16602237e+00 ! vx vy vz 0.4 0.4 0.4 ! Ip 0.0 0.0 0.0 ! rot -1501 7.54058320e+04 8.18405513e+03 ! particle number mass Rhill +Body1501 7.54058320e+04 8.18405513e+03 ! particle number mass Rhill 4.38450573e+03 !particle radius in AU -5.62663613e+06 7.91766436e+06 2.60207243e+04 ! x y z -1.74178290e+03 -1.18522553e+03 2.27430689e+00 ! vx vy vz diff --git a/examples/symba_mars_disk/param.in b/examples/symba_mars_disk/param.in index 122d1a9d7..ae89cd6d4 100644 --- a/examples/symba_mars_disk/param.in +++ b/examples/symba_mars_disk/param.in @@ -1,6 +1,6 @@ !Parameter file for the SyMBA-RINGMOONS test T0 0.0 -TSTOP 10000.0 +TSTOP 100000.0 DT 600.0 CB_IN cb.in PL_IN mars.in diff --git a/examples/symba_mars_disk/testnetcdf.ipynb b/examples/symba_mars_disk/testnetcdf.ipynb index 0b274f44b..1fb3af422 100644 --- a/examples/symba_mars_disk/testnetcdf.ipynb +++ b/examples/symba_mars_disk/testnetcdf.ipynb @@ -48,7 +48,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 3, "metadata": {}, "outputs": [ { @@ -405,33 +405,36 @@ " stroke: currentColor;\n", " fill: currentColor;\n", "}\n", - "
<xarray.DataArray 'name' (id: 1521)>\n",
-       "array(['Mars', 'Body2', 'Body3', ..., 'UNNAMED', 'UNNAMED', 'UNNAMED'],\n",
-       "      dtype='<U15')\n",
+       "
<xarray.DataArray 'origin_type' (id: 1521)>\n",
+       "array(['Initial conditions', 'Initial conditions', 'Initial conditions',\n",
+       "       ..., 'Supercatastrophic', 'Supercatastrophic', 'Supercatastrophic'],\n",
+       "      dtype='<U18')\n",
        "Coordinates:\n",
-       "  * id       (id) int32 0 1 2 3 4 5 6 7 ... 1514 1515 1516 1517 1518 1519 1520
" + " * id (id) int32 0 1 2 3 4 5 6 7 ... 1514 1515 1516 1517 1518 1519 1520
" ], "text/plain": [ - "\n", - "array(['Mars', 'Body2', 'Body3', ..., 'UNNAMED', 'UNNAMED', 'UNNAMED'],\n", - " dtype='\n", + "array(['Initial conditions', 'Initial conditions', 'Initial conditions',\n", + " ..., 'Supercatastrophic', 'Supercatastrophic', 'Supercatastrophic'],\n", + " dtype='
<xarray.DataArray 'name' ()>\n",
        "array(b'1322', dtype='|S32')\n",
        "Coordinates:\n",
-       "    id       int32 1321
" + " id int32 1321" ], "text/plain": [ "\n", @@ -809,7 +812,7 @@ " id int32 1321" ] }, - "execution_count": 4, + "execution_count": 5, "metadata": {}, "output_type": "execute_result" } diff --git a/src/modules/swiftest_classes.f90 b/src/modules/swiftest_classes.f90 index e1b788f24..45ea97f15 100644 --- a/src/modules/swiftest_classes.f90 +++ b/src/modules/swiftest_classes.f90 @@ -167,8 +167,9 @@ module swiftest_classes real(DP), dimension(NDIM) :: origin_xh !! The heliocentric distance vector at the time of the particle's formation real(DP), dimension(NDIM) :: origin_vh !! The heliocentric velocity vector at the time of the particle's formation contains - procedure :: dump => io_dump_particle_info !! Dumps contents of particle information to file - procedure :: read_in => io_read_in_particle_info !! Read in a particle information object from an open file + procedure :: dump => io_dump_particle_info !! Dumps contents of particle information to file + procedure :: read_in => io_read_in_particle_info !! Read in a particle information object from an open file + procedure :: copy => util_copy_particle_info !! Copies one set of information object components into another, component-by-component end type swiftest_particle_info !******************************************************************************************************************************** @@ -178,10 +179,10 @@ module swiftest_classes !! An abstract superclass for a generic Swiftest object contains !! The minimal methods that all systems must have - procedure :: dump => io_dump_base !! Dump contents to file - procedure :: dump_particle_info => io_dump_particle_info_base !! Dump contents of particle information metadata to file - procedure :: write_frame_netcdf => netcdf_write_frame_base !! I/O routine for writing out a single frame of time-series data for all bodies in the system in NetCDF format - generic :: write_frame => write_frame_netcdf !! Set up generic procedure that will switch between NetCDF or Fortran binary depending on arguments + procedure :: dump => io_dump_base !! Dump contents to file + procedure :: dump_particle_info => io_dump_particle_info_base !! Dump contents of particle information metadata to file + procedure :: write_frame_netcdf => netcdf_write_frame_base !! I/O routine for writing out a single frame of time-series data for all bodies in the system in NetCDF format + generic :: write_frame => write_frame_netcdf !! Set up generic procedure that will switch between NetCDF or Fortran binary depending on arguments end type swiftest_base !******************************************************************************************************************************** @@ -258,25 +259,25 @@ 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 :: read_in => io_read_in_body !! 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_bin => 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 :: append => util_append_body !! Appends 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 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_spill_body !! "Spills" bodies from one object to another depending on the results of a mask (uses the PACK intrinsic) - generic :: write_frame => write_frame_bin !! Add the generic write frame for Fortran binary files + 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 :: read_in => io_read_in_body !! 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_bin => 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 :: append => util_append_body !! Appends 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 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_spill_body !! "Spills" bodies from one object to another depending on the results of a mask (uses the PACK intrinsic) + generic :: write_frame => write_frame_bin !! Add the generic write frame for Fortran binary files end type swiftest_body !******************************************************************************************************************************** @@ -1208,6 +1209,19 @@ module subroutine util_copy_encounter(self, source) class(swiftest_encounter), intent(in) :: source !! Source object to copy into end subroutine util_copy_encounter + module subroutine util_copy_particle_info(self, source) + implicit none + class(swiftest_particle_info), intent(inout) :: self + class(swiftest_particle_info), intent(in) :: source + end subroutine util_copy_particle_info + + module subroutine util_copy_particle_info_arr(source, dest, idx) + implicit none + class(swiftest_particle_info), dimension(:), intent(in) :: source !! Source object to copy into + class(swiftest_particle_info), dimension(:), intent(inout) :: dest !! Swiftest body object with particle metadata information object + integer(I4B), dimension(:), intent(in), optional :: idx !! Optional array of indices to draw the source object + end subroutine util_copy_particle_info_arr + module subroutine util_exit(code) implicit none integer(I4B), intent(in) :: code !! Failure exit code diff --git a/src/symba/symba_collision.f90 b/src/symba/symba_collision.f90 index 3f5ebadc3..a8619e35e 100644 --- a/src/symba/symba_collision.f90 +++ b/src/symba/symba_collision.f90 @@ -833,7 +833,8 @@ subroutine symba_collision_mergeaddsub(system, param, family, id_frag, Ip_frag, integer(I4B) :: i, ibiggest, nstart, nend, nfamily, nfrag logical, dimension(system%pl%nbody) :: lmask class(symba_pl), allocatable :: plnew - character(*), parameter :: FRAGFMT = '("Fragment",I0.7)' + character(*), parameter :: FRAGFMT = '("Newbody",I0.7)' + character(len=NAMELEN) :: newname select type(pl => system%pl) class is (symba_pl) @@ -880,7 +881,8 @@ subroutine symba_collision_mergeaddsub(system, param, family, id_frag, Ip_frag, plnew%status(1:nfrag) = NEW_PARTICLE plnew%info(1:nfrag)%origin_time = param%t do i = 1, nfrag - write(info(i)%name, FRAGFMT) id_frag(i) + write(newname, FRAGFMT) id_frag(i) + plnew%info(i)%name = newname plnew%info(i)%origin_xh(:) = plnew%xh(:,i) plnew%info(i)%origin_vh(:) = plnew%vh(:,i) end do @@ -889,29 +891,25 @@ subroutine symba_collision_mergeaddsub(system, param, family, id_frag, Ip_frag, plnew%status(1:nfrag) = NEW_PARTICLE plnew%info(1:nfrag)%origin_time = param%t do i = 1, nfrag - write(info(i)%name, FRAGFMT) id_frag(i) + write(newname, FRAGFMT) id_frag(i) + plnew%info(i)%name = newname plnew%info(i)%origin_xh(:) = plnew%xh(:,i) plnew%info(i)%origin_vh(:) = plnew%vh(:,i) end do case(HIT_AND_RUN_DISRUPT) - plnew%info(1)%name = pl%info(ibiggest)%name - plnew%info(1)%origin_type = pl%info(ibiggest)%origin_type - plnew%info(1)%origin_xh(:) = pl%info(ibiggest)%origin_xh(:) - plnew%info(1)%origin_vh(:) = pl%info(ibiggest)%origin_vh(:) + call plnew%info(1)%copy(pl%info(ibiggest)) plnew%status(1) = OLD_PARTICLE plnew%status(2:nfrag) = NEW_PARTICLE plnew%info(2:nfrag)%origin_type = "Hit and run fragment" plnew%info(2:nfrag)%origin_time = param%t do i = 2, nfrag - write(info(i)%name, FRAGFMT) id_frag(i) + write(newname, FRAGFMT) id_frag(i) + plnew%info(i)%name = newname plnew%info(i)%origin_xh(:) = plnew%xh(:,i) plnew%info(i)%origin_vh(:) = plnew%vh(:,i) end do case(MERGED) - plnew%info(1)%name = pl%info(ibiggest)%name - plnew%info(1)%origin_type = pl%info(ibiggest)%origin_type - plnew%info(1)%origin_xh(:) = pl%info(ibiggest)%origin_xh(:) - plnew%info(1)%origin_vh(:) = pl%info(ibiggest)%origin_vh(:) + call plnew%info(1)%copy(pl%info(ibiggest)) plnew%status(1) = OLD_PARTICLE end select diff --git a/src/util/util_append.f90 b/src/util/util_append.f90 index 9722e4059..6abbc0e9a 100644 --- a/src/util/util_append.f90 +++ b/src/util/util_append.f90 @@ -127,7 +127,8 @@ module subroutine util_append_arr_info(arr, source, nold, nsrc, lsource_mask) integer(I4B), intent(in) :: nold, nsrc !! Extend of the old array and the source array, respectively logical, dimension(:), intent(in) :: lsource_mask !! Logical mask indicating which elements to append to ! Internals - integer(I4B) :: nnew + integer(I4B) :: nnew, i + integer(I4B), dimension(:), allocatable :: idx if (.not. allocated(source)) return @@ -138,7 +139,11 @@ module subroutine util_append_arr_info(arr, source, nold, nsrc, lsource_mask) call util_resize(arr, nold + nnew) end if - arr(nold + 1:nold + nnew) = pack(source(1:nsrc), lsource_mask(1:nsrc)) + allocate(idx(nnew)) + + idx = pack([(i, i = 1, nsrc)], lsource_mask(1:nsrc)) + + call util_copy_particle_info_arr(source(1:nsrc), arr(nold+1:nold+nnew), idx) return end subroutine util_append_arr_info @@ -179,9 +184,9 @@ 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(:), intent(in) :: lsource_mask !! Logical mask indicating which elements to append to + class(swiftest_body), intent(inout) :: self !! Swiftest body object + class(swiftest_body), intent(in) :: source !! Source object to append + logical, dimension(:), intent(in) :: lsource_mask !! Logical mask indicating which elements to append to associate(nold => self%nbody, nsrc => source%nbody) call util_append(self%info, source%info, nold, nsrc, lsource_mask) diff --git a/src/util/util_copy.f90 b/src/util/util_copy.f90 index 73195df91..0d29cc92f 100644 --- a/src/util/util_copy.f90 +++ b/src/util/util_copy.f90 @@ -2,32 +2,93 @@ 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%kidx(1:n) = source%kidx(1:n) - self%index1(1:n) = source%index1(1:n) - self%index2(1:n) = source%index2(1:n) - self%id1(1:n) = source%id1(1:n) - self%id2(1:n) = source%id2(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) - self%t(1:n) = source%t(1:n) - end associate - - return -end subroutine util_copy_encounter + 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%kidx(1:n) = source%kidx(1:n) + self%index1(1:n) = source%index1(1:n) + self%index2(1:n) = source%index2(1:n) + self%id1(1:n) = source%id1(1:n) + self%id2(1:n) = source%id2(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) + self%t(1:n) = source%t(1:n) + end associate + + return + end subroutine util_copy_encounter + + + module subroutine util_copy_particle_info(self, source) + !! author: David A. Minton + !! + !! Copies one set of information object components into another, component-by-component + implicit none + class(swiftest_particle_info), intent(inout) :: self + class(swiftest_particle_info), intent(in) :: source + + self%name = source%name + self%particle_type = source%particle_type + self%origin_type = source%origin_type + self%origin_time = source%origin_time + self%origin_xh(:) = source%origin_xh(:) + self%origin_vh(:) = source%origin_vh(:) + + return + end subroutine util_copy_particle_info + + + module subroutine util_copy_particle_info_arr(source, dest, idx) + !! author: David A. Minton + !! + !! Copies contents from an array of one particle information objects to another. + implicit none + class(swiftest_particle_info), dimension(:), intent(in) :: source !! Source object to copy into + class(swiftest_particle_info), dimension(:), intent(inout) :: dest !! Swiftest body object with particle metadata information object + integer(I4B), dimension(:), intent(in), optional :: idx !! Optional array of indices to draw the source object + ! Internals + integer(I4B) :: i, j, n, nsource, ndest + + if (size(source) == 0) return + + if (present(idx)) then + n = size(idx) + else + n = size(source) + end if + + nsource = size(source) + ndest = size(dest) + + if ((n == 0) .or. (n > ndest) .or. (n > nsource)) then + write(*,*) 'Particle info copy operation failed. n, nsource, ndest: ',n, nsource, ndest + return + end if + + do i = 1, n + if (present(idx)) then + j = idx(i) + else + j = i + end if + call dest(i)%copy(source(j)) + end do + + return + end subroutine util_copy_particle_info_arr + + end submodule s_util_copy diff --git a/src/util/util_fill.f90 b/src/util/util_fill.f90 index 7009e3688..541ee40cd 100644 --- a/src/util/util_fill.f90 +++ b/src/util/util_fill.f90 @@ -92,15 +92,20 @@ module subroutine util_fill_arr_info(keeps, inserts, lfill_list) ! Arguments type(swiftest_particle_info), dimension(:), allocatable, intent(inout) :: keeps !! Array of values to keep type(swiftest_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 + logical, dimension(:), intent(in) :: lfill_list !! Logical array of bodies to merge into the keeps ! Internals - type(swiftest_particle_info), dimension(:), allocatable :: ktmp, itmp - + integer(I4B), dimension(:), allocatable :: insert_idx + integer(I4B) :: i, nkeep, ninsert if (.not.allocated(keeps) .or. .not.allocated(inserts)) return - keeps(:) = unpack(keeps(:), .not.lfill_list(:), keeps(:)) - keeps(:) = unpack(inserts(:), lfill_list(:), keeps(:)) + nkeep = size(keeps) + ninsert = count(lfill_list) + + allocate(insert_idx(ninsert)) + + insert_idx(:) = pack([(i, i = 1, nkeep)], lfill_list) + call util_copy_particle_info_arr(inserts, keeps, insert_idx) return end subroutine util_fill_arr_info diff --git a/src/util/util_resize.f90 b/src/util/util_resize.f90 index d43d0b879..ed28d1007 100644 --- a/src/util/util_resize.f90 +++ b/src/util/util_resize.f90 @@ -163,10 +163,11 @@ module subroutine util_resize_arr_info(arr, nnew) allocate(tmp(nnew)) if (nnew > nold) then - tmp(1:nold) = arr(1:nold) + call util_copy_particle_info_arr(arr(1:nold), tmp(1:nold)) else - tmp(1:nnew) = arr(1:nnew) + call util_copy_particle_info_arr(arr(1:nnew), tmp(1:nnew)) end if + call move_alloc(tmp, arr) return diff --git a/src/util/util_sort.f90 b/src/util/util_sort.f90 index 218e49ef3..9717f1e3e 100644 --- a/src/util/util_sort.f90 +++ b/src/util/util_sort.f90 @@ -466,16 +466,17 @@ module subroutine util_sort_rearrange_arr_info(arr, ind, n) implicit none ! Arguments type(swiftest_particle_info), dimension(:), allocatable, intent(inout) :: arr !! Destination array - integer(I4B), dimension(:), intent(in) :: ind !! Index to rearrange against - integer(I4B), intent(in) :: n !! Number of elements in arr and ind to rearrange + integer(I4B), dimension(:), intent(in) :: ind !! Index to rearrange against + integer(I4B), intent(in) :: n !! Number of elements in arr and ind to rearrange ! Internals - type(swiftest_particle_info), dimension(:), allocatable :: tmp !! Temporary copy of array used during rearrange operation + type(swiftest_particle_info), dimension(:), allocatable :: tmp !! Temporary copy of array used during rearrange operation integer(I4B) :: i if (.not. allocated(arr) .or. n <= 0) return allocate(tmp, mold=arr) - tmp(1:n) = arr(ind(1:n)) + + call util_copy_particle_info_arr(arr, tmp, ind) call move_alloc(tmp, arr) return diff --git a/src/util/util_spill.f90 b/src/util/util_spill.f90 index 84391f168..b4d43e019 100644 --- a/src/util/util_spill.f90 +++ b/src/util/util_spill.f90 @@ -15,6 +15,7 @@ module subroutine util_spill_arr_char_string(keeps, discards, lspill_list, ldest logical, intent(in) :: ldestructive !! Logical flag indicating whether or not this operation should alter the keeps array or not ! Internals integer(I4B) :: nspill, nkeep, nlist + character(len=STRMAX), dimension(:), allocatable :: tmp !! Array of values to keep nkeep = count(.not.lspill_list(:)) nspill = count(lspill_list(:)) @@ -31,7 +32,9 @@ module subroutine util_spill_arr_char_string(keeps, discards, lspill_list, ldest discards(:) = pack(keeps(1:nlist), lspill_list(1:nlist)) if (ldestructive) then if (nkeep > 0) then - keeps(:) = pack(keeps(1:nlist), .not. lspill_list(1:nlist)) + allocate(tmp(nkeep)) + tmp(:) = pack(keeps(1:nlist), .not. lspill_list(1:nlist)) + call move_alloc(tmp, keeps) else deallocate(keeps) end if @@ -54,6 +57,7 @@ module subroutine util_spill_arr_DP(keeps, discards, lspill_list, ldestructive) logical, intent(in) :: ldestructive !! Logical flag indicating whether or not this operation should alter the keeps array or not ! Internals integer(I4B) :: nspill, nkeep, nlist + real(DP), dimension(:), allocatable :: tmp !! Array of values to keep nkeep = count(.not.lspill_list(:)) nspill = count(lspill_list(:)) @@ -70,7 +74,9 @@ module subroutine util_spill_arr_DP(keeps, discards, lspill_list, ldestructive) discards(:) = pack(keeps(1:nlist), lspill_list(1:nlist)) if (ldestructive) then if (nkeep > 0) then - keeps(:) = pack(keeps(1:nlist), .not. lspill_list(1:nlist)) + allocate(tmp(nkeep)) + tmp(:) = pack(keeps(1:nlist), .not. lspill_list(1:nlist)) + call move_alloc(tmp, keeps) else deallocate(keeps) end if @@ -93,6 +99,7 @@ module subroutine util_spill_arr_DPvec(keeps, discards, lspill_list, ldestructiv logical, intent(in) :: ldestructive !! Logical flag indicating whether or not this operation should alter the keeps array or not ! Internals integer(I4B) :: i, nspill, nkeep, nlist + real(DP), dimension(:,:), allocatable :: tmp !! Array of values to keep nkeep = count(.not.lspill_list(:)) nspill = count(lspill_list(:)) @@ -111,9 +118,11 @@ module subroutine util_spill_arr_DPvec(keeps, discards, lspill_list, ldestructiv end do if (ldestructive) then if (nkeep > 0) then + allocate(tmp(NDIM, nkeep)) do i = 1, NDIM - keeps(i,:) = pack(keeps(i,1:nlist), .not. lspill_list(1:nlist)) + tmp(i, :) = pack(keeps(i, 1:nlist), .not. lspill_list(1:nlist)) end do + call move_alloc(tmp, keeps) else deallocate(keeps) end if @@ -136,6 +145,7 @@ module subroutine util_spill_arr_I4B(keeps, discards, lspill_list, ldestructive) logical, intent(in) :: ldestructive !! Logical flag indicating whether or not this operation should alter the keeps array or not ! Internals integer(I4B) :: nspill, nkeep, nlist + integer(I4B), dimension(:), allocatable :: tmp !! Array of values to keep nkeep = count(.not.lspill_list(:)) nspill = count(lspill_list(:)) @@ -152,7 +162,9 @@ module subroutine util_spill_arr_I4B(keeps, discards, lspill_list, ldestructive) discards(:) = pack(keeps(1:nlist), lspill_list(1:nlist)) if (ldestructive) then if (nkeep > 0) then - keeps(:) = pack(keeps(1:nlist), .not. lspill_list(1:nlist)) + allocate(tmp(nkeep)) + tmp(:) = pack(keeps(1:nlist), .not. lspill_list(1:nlist)) + call move_alloc(tmp, keeps) else deallocate(keeps) end if @@ -175,6 +187,7 @@ module subroutine util_spill_arr_I8B(keeps, discards, lspill_list, ldestructive) logical, intent(in) :: ldestructive !! Logical flag indicating whether or not this operation should alter the keeps array or not ! Internals integer(I4B) :: nspill, nkeep, nlist + integer(I8B), dimension(:), allocatable :: tmp !! Array of values to keep nkeep = count(.not.lspill_list(:)) nspill = count(lspill_list(:)) @@ -191,7 +204,9 @@ module subroutine util_spill_arr_I8B(keeps, discards, lspill_list, ldestructive) discards(:) = pack(keeps(1:nlist), lspill_list(1:nlist)) if (ldestructive) then if (nkeep > 0) then - keeps(:) = pack(keeps(1:nlist), .not. lspill_list(1:nlist)) + allocate(tmp(nkeep)) + tmp(:) = pack(keeps(1:nlist), .not. lspill_list(1:nlist)) + call move_alloc(tmp, keeps) else deallocate(keeps) end if @@ -213,7 +228,9 @@ module subroutine util_spill_arr_info(keeps, discards, lspill_list, ldestructive 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 ! Internals - integer(I4B) :: nspill, nkeep, nlist + integer(I4B) :: i, nspill, nkeep, nlist + integer(I4B), dimension(:), allocatable :: idx + type(swiftest_particle_info), dimension(:), allocatable :: tmp nkeep = count(.not.lspill_list(:)) nspill = count(lspill_list(:)) @@ -227,10 +244,17 @@ module subroutine util_spill_arr_info(keeps, discards, lspill_list, ldestructive allocate(discards(nspill)) end if - discards(:) = pack(keeps(1:nlist), lspill_list(1:nlist)) + allocate(idx(nspill)) + idx(:) = pack([(i, i = 1, nlist)], lspill_list) + call util_copy_particle_info_arr(keeps, discards, idx) if (ldestructive) then if (nkeep > 0) then - keeps(:) = pack(keeps(1:nlist), .not. lspill_list(1:nlist)) + deallocate(idx) + allocate(idx(nkeep)) + allocate(tmp(nkeep)) + idx(:) = pack([(i, i = 1, nlist)], .not. lspill_list) + call util_copy_particle_info_arr(keeps, tmp, idx) + call move_alloc(tmp, keeps) else deallocate(keeps) end if @@ -253,6 +277,7 @@ module subroutine util_spill_arr_logical(keeps, discards, lspill_list, ldestruct logical, intent(in) :: ldestructive !! Logical flag indicating whether or not this operation should alter the keeps array or no ! Internals integer(I4B) :: nspill, nkeep, nlist + logical, dimension(:), allocatable :: tmp !! Array of values to keep nkeep = count(.not.lspill_list(:)) nspill = count(lspill_list(:)) @@ -269,7 +294,9 @@ module subroutine util_spill_arr_logical(keeps, discards, lspill_list, ldestruct discards(:) = pack(keeps(1:nlist), lspill_list(1:nlist)) if (ldestructive) then if (nkeep > 0) then - keeps(:) = pack(keeps(1:nlist), .not. lspill_list(1:nlist)) + allocate(tmp(nkeep)) + tmp(:) = pack(keeps(1:nlist), .not. lspill_list(1:nlist)) + call move_alloc(tmp, keeps) else deallocate(keeps) end if @@ -325,6 +352,7 @@ 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 !! From 8823057e3d861299049f2592d48f0b21f800639b Mon Sep 17 00:00:00 2001 From: David A Minton Date: Sat, 28 Aug 2021 13:05:16 -0400 Subject: [PATCH 083/154] Updated Clement example with new body naming system and NetCDF outputs. --- examples/symba_clement_2018/param.in | 6 +- .../symba_clement_2018/pl_clement_2018.in | 2210 ++++++++--------- examples/symba_clement_2018/sun_MsunAUYR.in | 2 +- examples/symba_mars_disk/testnetcdf.ipynb | 40 +- 4 files changed, 1132 insertions(+), 1126 deletions(-) diff --git a/examples/symba_clement_2018/param.in b/examples/symba_clement_2018/param.in index 849acd9e0..6f58b1822 100644 --- a/examples/symba_clement_2018/param.in +++ b/examples/symba_clement_2018/param.in @@ -4,14 +4,14 @@ TSTOP 100000000.0 DT 0.016 ISTEP_OUT 6250 ISTEP_DUMP 6250 -OUT_FORM EL -OUT_TYPE REAL8 +OUT_FORM XVEL +OUT_TYPE NETCDF_DOUBLE OUT_STAT REPLACE IN_TYPE ASCII PL_IN pl_clement_2018.in TP_IN tp.in CB_IN sun_MsunAUYR.in -BIN_OUT bin.dat +BIN_OUT bin.nc CHK_QMIN -1.0 CHK_RMIN -1.0 CHK_RMAX 100000.0 diff --git a/examples/symba_clement_2018/pl_clement_2018.in b/examples/symba_clement_2018/pl_clement_2018.in index 584245a70..eb8eecffc 100644 --- a/examples/symba_clement_2018/pl_clement_2018.in +++ b/examples/symba_clement_2018/pl_clement_2018.in @@ -1,6629 +1,6629 @@ 1105 -2.0 0.0376722155 0.35307558995269156 +Jupiter 0.0376722155 0.35307558995269156 0.000467326079 5.172281681449432 0.046760050149286136 1.3034369794516383 100.50370344615287 277.95408735904414 299.47072527467117 0.4 0.4 0.4 0.0 0.0 0.0 -3.0 0.0112798314 0.43362938279920926 +Saturn 0.0112798314 0.43362938279920926 0.000389256801 9.495241797076803 0.05831886504886423 2.4897150857337977 113.60173064710709 341.1122276637114 214.47759752003608 0.4 0.4 0.4 0.0 0.0 0.0 -4.0 0.00172303742 0.4689444140515067 +Uranus 0.00172303742 0.4689444140515067 0.000169534465 19.209290579028355 0.04660264515690298 0.772131045762339 74.00329991835538 95.9871868832834 234.95264516428847 0.4 0.4 0.4 0.0 0.0 0.0 -5.0 0.00203247359 0.7765171236861929 +Neptune 0.00203247359 0.7765171236861929 0.000164587872 30.104466076098753 0.009375961185985455 1.7702774190709465 131.7823850231201 267.4341182268954 312.4212576431109 0.4 0.4 0.4 0.0 0.0 0.0 -6.0 0.00203247359 0.9027929359579849 +IceGiant 0.00203247359 0.9027929359579849 0.000164587872 34.99999998103326 0.046602647094867104 1.770277414721863 74.00329996123871 267.4340808607514 234.95264506877194 0.4 0.4 0.4 0.0 0.0 0.0 -7.0 2.96336237e-06 0.005512259131852213 +Body7 2.96336237e-06 0.005512259131852213 1.52529846e-05 1.884616116091531 0.0007423022395688265 6.5728685708454355 49.55283194123395 12.557899778504652 10.484350244753976 0.4 0.4 0.4 0.0 0.0 0.0 -8.0 2.96336237e-06 0.0019178533602580044 +Body8 2.96336237e-06 0.0019178533602580044 1.52529846e-05 0.6557052679466514 8.378761417954488e-05 0.3063403435881767 309.12238967303904 280.7713337479704 62.82466997448164 0.4 0.4 0.4 0.0 0.0 0.0 -9.0 2.96336237e-06 0.0004112571359191792 +Body9 2.96336237e-06 0.0004112571359191792 1.52529846e-05 0.14060692860614776 0.00023031374149944594 1.7305895846896235 258.19178410822843 126.80591596818843 241.30807229544132 0.4 0.4 0.4 0.0 0.0 0.0 -10.0 2.96336237e-06 0.0003558360060864788 +Body10 2.96336237e-06 0.0003558360060864788 1.52529846e-05 0.12165869849643374 0.001996906171922296 8.181163575953859 127.03740060987732 228.31258600353382 45.987222950345235 0.4 0.4 0.4 0.0 0.0 0.0 -11.0 2.96336237e-06 0.004238951617733855 +Body11 2.96336237e-06 0.004238951617733855 1.52529846e-05 1.4492781168343072 0.00123354906776431 6.127603772301239 0.586278364878247 120.20877867772262 332.4438578039355 0.4 0.4 0.4 0.0 0.0 0.0 -12.0 2.96336237e-06 0.000428115645359569 +Body12 2.96336237e-06 0.000428115645359569 1.52529846e-05 0.14637077566497864 0.0015174471395206497 7.384343118829618 90.24919099580596 294.5077497540469 309.5576905676759 0.4 0.4 0.4 0.0 0.0 0.0 -13.0 2.96336237e-06 0.0004147219696796154 +Body13 2.96336237e-06 0.0004147219696796154 1.52529846e-05 0.1417915393779389 0.000636441064464215 2.271662502450314 236.62326008233057 147.42136715339123 168.82519701899685 0.4 0.4 0.4 0.0 0.0 0.0 -14.0 2.96336237e-06 0.000668774022810232 +Body14 2.96336237e-06 0.000668774022810232 1.52529846e-05 0.22865077117447094 0.0015399665313668989 1.1545306249464131 182.11815578681754 152.61307302562298 352.4210953391632 0.4 0.4 0.4 0.0 0.0 0.0 -15.0 2.96336237e-06 0.0007265432314441647 +Body15 2.96336237e-06 0.0007265432314441647 1.52529846e-05 0.24840179865724105 0.0005839332787213311 2.5222956390757862 290.9274478155636 36.95928606481527 79.46628403762982 0.4 0.4 0.4 0.0 0.0 0.0 -16.0 2.96336237e-06 0.0003702478544426329 +Body16 2.96336237e-06 0.0003702478544426329 1.52529846e-05 0.12658604335178142 2.5298156499728664e-05 5.555515038103633 281.4445031789493 115.18582702932352 123.1281305262438 0.4 0.4 0.4 0.0 0.0 0.0 -17.0 2.96336237e-06 0.0003716166862503535 +Body17 2.96336237e-06 0.0003716166862503535 1.52529846e-05 0.12705404066891446 0.0018538649394883614 0.6607277579311023 277.3261168781127 349.65966467861733 180.55214229908566 0.4 0.4 0.4 0.0 0.0 0.0 -18.0 2.96336237e-06 0.009886886821922786 +Body18 2.96336237e-06 0.009886886821922786 1.52529846e-05 3.3802812598013072 0.0009489984628827527 6.676039983361881 59.82012534336036 213.93617863051722 163.23770845915809 0.4 0.4 0.4 0.0 0.0 0.0 -19.0 2.96336237e-06 0.0003042929175250516 +Body19 2.96336237e-06 0.0003042929175250516 1.52529846e-05 0.10403635291135628 0.0009103080479353925 6.122729019987302 318.3178593181005 175.8383457329596 150.09818752378183 0.4 0.4 0.4 0.0 0.0 0.0 -20.0 2.96336237e-06 0.000414062269914102 +Body20 2.96336237e-06 0.000414062269914102 1.52529846e-05 0.1415659910537166 0.001778924678086685 8.74170905442332 151.59204615190697 112.80122061317465 351.99863693065214 0.4 0.4 0.4 0.0 0.0 0.0 -21.0 2.96336237e-06 0.0005993179173196159 +Body21 2.96336237e-06 0.0005993179173196159 1.52529846e-05 0.204904047256471 0.0009022495147953 9.556673591780722 293.15242050181297 205.54468433705313 66.99160557674251 0.4 0.4 0.4 0.0 0.0 0.0 -22.0 2.96336237e-06 0.002357418873323602 +Body22 2.96336237e-06 0.002357418873323602 1.52529846e-05 0.8059907008673469 0.0005274445636380367 10.71837041537424 292.38024093727984 54.5314890445609 209.0622657387699 0.4 0.4 0.4 0.0 0.0 0.0 -23.0 2.96336237e-06 0.0004214539772450991 +Body23 2.96336237e-06 0.0004214539772450991 1.52529846e-05 0.14409318188930928 0.0005277374008030665 7.435302831333165 308.79862632298676 308.7903333476832 269.9580628313294 0.4 0.4 0.4 0.0 0.0 0.0 -24.0 2.96336237e-06 0.0006370769225463271 +Body24 2.96336237e-06 0.0006370769225463271 1.52529846e-05 0.21781367796788728 0.0005372113643125736 5.052697475502013 350.4786532330898 328.18629143860676 33.62398940139005 0.4 0.4 0.4 0.0 0.0 0.0 -25.0 2.96336237e-06 0.0015893429501222733 +Body25 2.96336237e-06 0.0015893429501222733 1.52529846e-05 0.5433890653813334 0.0010833931179439658 6.392318924578698 140.62795204427934 121.66139860726184 111.15061258998092 0.4 0.4 0.4 0.0 0.0 0.0 -26.0 2.96336237e-06 0.0002977220788417684 +Body26 2.96336237e-06 0.0002977220788417684 1.52529846e-05 0.10178981330163511 0.001554559170086404 6.762843301253261 275.72551196143047 304.0824964166165 279.0982565916498 0.4 0.4 0.4 0.0 0.0 0.0 -27.0 2.96336237e-06 0.0006434040689664967 +Body27 2.96336237e-06 0.0006434040689664967 1.52529846e-05 0.21997690031050524 0.001305716802829907 2.7998391456887615 75.36228204537746 56.58870706902731 14.357402916294584 0.4 0.4 0.4 0.0 0.0 0.0 -28.0 2.96336237e-06 0.00042548420866017075 +Body28 2.96336237e-06 0.00042548420866017075 1.52529846e-05 0.14547109952611498 0.0003031612390917364 5.499354660587805 99.672922712559 349.8198724431721 9.207509473918162 0.4 0.4 0.4 0.0 0.0 0.0 -29.0 2.96336237e-06 0.000535554750738145 +Body29 2.96336237e-06 0.000535554750738145 1.52529846e-05 0.18310371304176035 0.001924927935650522 9.765808261360519 174.90404902276703 179.70781236278643 349.9071587094426 0.4 0.4 0.4 0.0 0.0 0.0 -30.0 2.96336237e-06 0.001562483215882271 +Body30 2.96336237e-06 0.001562483215882271 1.52529846e-05 0.5342058454325218 0.000910989382946404 0.42557979839177 199.2182898728689 348.6064975505299 181.29024903254737 0.4 0.4 0.4 0.0 0.0 0.0 -31.0 2.96336237e-06 0.00086782112982034 +Body31 2.96336237e-06 0.00086782112982034 1.52529846e-05 0.29670406416372774 0.0015539346678792127 8.507172918199394 56.78001502543606 2.1901152768222105 210.0052739519094 0.4 0.4 0.4 0.0 0.0 0.0 -32.0 2.96336237e-06 0.0009735172826472634 +Body32 2.96336237e-06 0.0009735172826472634 1.52529846e-05 0.3328410940568706 0.0019038946718063178 1.4641789250636663 3.408328718128681 130.04949056115072 9.016242433085356 0.4 0.4 0.4 0.0 0.0 0.0 -33.0 2.96336237e-06 0.0038019527946996806 +Body33 2.96336237e-06 0.0038019527946996806 1.52529846e-05 1.2998702234636448 0.0009836202486354657 3.0512558532109577 138.0591311501441 314.0932368495456 74.27234332051141 0.4 0.4 0.4 0.0 0.0 0.0 -34.0 2.96336237e-06 0.0005479571006109701 +Body34 2.96336237e-06 0.0005479571006109701 1.52529846e-05 0.187344019581899 0.0008844589852042751 1.1462571354370081 28.565869118248454 220.9318913181933 212.27191880186984 0.4 0.4 0.4 0.0 0.0 0.0 -35.0 2.96336237e-06 0.00041487177744318864 +Body35 2.96336237e-06 0.00041487177744318864 1.52529846e-05 0.1418427579652354 0.000837740619082511 1.3240047327876507 66.96059900785556 122.84289190897105 90.8401190418799 0.4 0.4 0.4 0.0 0.0 0.0 -36.0 2.96336237e-06 0.004410491996161498 +Body36 2.96336237e-06 0.004410491996161498 1.52529846e-05 1.5079269854763997 0.0011606180197893023 11.458477170055312 43.6564442974332 303.7628696474891 239.03035318801133 0.4 0.4 0.4 0.0 0.0 0.0 -37.0 2.96336237e-06 0.00029269568494804857 +Body37 2.96336237e-06 0.00029269568494804857 1.52529846e-05 0.1000713122821184 0.001992921364867069 1.862015266455362 289.39207909055943 92.99956112881118 352.49936500999166 0.4 0.4 0.4 0.0 0.0 0.0 -38.0 2.96336237e-06 0.0005294652941220678 +Body38 2.96336237e-06 0.0005294652941220678 1.52529846e-05 0.18102175575303558 0.0015375005788222443 6.705775265229424 57.457618895550674 4.8991276747484 325.7412316817131 0.4 0.4 0.4 0.0 0.0 0.0 -39.0 2.96336237e-06 0.008838173136496128 +Body39 2.96336237e-06 0.008838173136496128 1.52529846e-05 3.0217308605103526 0.0007151903883037801 4.765943051487868 217.00603073329984 316.7592986736139 167.08804213361745 0.4 0.4 0.4 0.0 0.0 0.0 -40.0 2.96336237e-06 0.0033821686043295175 +Body40 2.96336237e-06 0.0033821686043295175 1.52529846e-05 1.1563479340486675 0.00014024853976584234 5.824022890508242 280.5118240980303 291.52707060581224 328.04622434434833 0.4 0.4 0.4 0.0 0.0 0.0 -41.0 2.96336237e-06 0.0018594751888462591 +Body41 2.96336237e-06 0.0018594751888462591 1.52529846e-05 0.6357460388830569 0.0016547156427348215 3.710620870063664 286.0231816539961 14.646380981042592 338.78134855925765 0.4 0.4 0.4 0.0 0.0 0.0 -42.0 2.96336237e-06 0.0003928901625901477 +Body42 2.96336237e-06 0.0003928901625901477 1.52529846e-05 0.13432734466211702 0.0010140900941583708 1.2375646950643446 105.27764656680067 32.503934734894735 79.49945640875738 0.4 0.4 0.4 0.0 0.0 0.0 -43.0 2.96336237e-06 0.00043047831964606665 +Body43 2.96336237e-06 0.00043047831964606665 1.52529846e-05 0.14717856316750708 0.00015736811248780546 4.479442312720945 131.36322545134732 214.5151978549483 245.40096474843565 0.4 0.4 0.4 0.0 0.0 0.0 -44.0 2.96336237e-06 0.0004590595533962268 +Body44 2.96336237e-06 0.0004590595533962268 1.52529846e-05 0.15695035590346132 0.001208683669168596 9.003131147077262 86.7435564939847 129.97504134377874 24.20918867850695 0.4 0.4 0.4 0.0 0.0 0.0 -45.0 2.96336237e-06 0.0003619975032214959 +Body45 2.96336237e-06 0.0003619975032214959 1.52529846e-05 0.1237652861081818 0.001187847968452721 4.302353822263908 341.3972947599278 22.014032448755064 311.42016526303485 0.4 0.4 0.4 0.0 0.0 0.0 -46.0 2.96336237e-06 0.0003324131500351793 +Body46 2.96336237e-06 0.0003324131500351793 1.52529846e-05 0.11365053143765139 0.0015502484288971025 4.00871284588694 261.88481642634423 339.06854717459015 79.69858695338057 0.4 0.4 0.4 0.0 0.0 0.0 -47.0 2.96336237e-06 0.000496379881807675 +Body47 2.96336237e-06 0.000496379881807675 1.52529846e-05 0.16971000502365977 0.0014325900377036435 9.95061299344038 250.17381730527916 87.95208230539924 102.0004995073183 0.4 0.4 0.4 0.0 0.0 0.0 -48.0 2.96336237e-06 0.0005157985955691492 +Body48 2.96336237e-06 0.0005157985955691492 1.52529846e-05 0.17634917419790458 0.0008367753488732046 2.8399055244426505 277.80982627559274 335.24157779229466 355.91319936843087 0.4 0.4 0.4 0.0 0.0 0.0 -49.0 2.96336237e-06 0.0014377264318076988 +Body49 2.96336237e-06 0.0014377264318076988 1.52529846e-05 0.4915520731343233 0.001668761198248755 2.724730971254485 1.184941006009358 180.7127233751173 190.77749105751863 0.4 0.4 0.4 0.0 0.0 0.0 -50.0 2.96336237e-06 0.0018469701340973388 +Body50 2.96336237e-06 0.0018469701340973388 1.52529846e-05 0.6314706180168207 0.00012548469609685502 2.2189534702546796 271.48546449808333 181.24061098711405 350.0467753082608 0.4 0.4 0.4 0.0 0.0 0.0 -51.0 2.96336237e-06 0.0006867805867685211 +Body51 2.96336237e-06 0.0006867805867685211 1.52529846e-05 0.23480713280760443 0.0009799971984811224 10.32166937046239 18.522746145836443 143.8970111474202 146.57428347230623 0.4 0.4 0.4 0.0 0.0 0.0 -52.0 2.96336237e-06 0.001144467965552166 +Body52 2.96336237e-06 0.001144467965552166 1.52529846e-05 0.3912883485042818 0.0011562023962381485 4.654414911538165 139.67234029432404 181.2814027780411 263.9615460438718 0.4 0.4 0.4 0.0 0.0 0.0 -53.0 2.96336237e-06 0.0007236927667533216 +Body53 2.96336237e-06 0.0007236927667533216 1.52529846e-05 0.24742723785263904 0.0009106011783749763 6.637469401668185 217.37100372225163 27.820897562259916 216.10094469186052 0.4 0.4 0.4 0.0 0.0 0.0 -54.0 2.96336237e-06 0.0010822227367685607 +Body54 2.96336237e-06 0.0010822227367685607 1.52529846e-05 0.37000699026088424 0.00155625665305578 2.048697893892725 237.61972697354346 230.27714637647796 68.89760532960919 0.4 0.4 0.4 0.0 0.0 0.0 -55.0 2.96336237e-06 0.0003441896635908343 +Body55 2.96336237e-06 0.0003441896635908343 1.52529846e-05 0.11767686741124705 0.001198428505168961 6.072268886189525 300.23374778378593 22.65361177317996 128.9596052337353 0.4 0.4 0.4 0.0 0.0 0.0 -56.0 2.96336237e-06 0.0005513198683284796 +Body56 2.96336237e-06 0.0005513198683284796 1.52529846e-05 0.18849373444172296 0.0005538080547316358 4.06122956076789 122.4297047079465 241.56914921410043 89.48149632078902 0.4 0.4 0.4 0.0 0.0 0.0 -57.0 2.96336237e-06 0.001865218727466639 +Body57 2.96336237e-06 0.001865218727466639 1.52529846e-05 0.63770972839555 0.0008225834609268351 10.919992929087485 85.46384904760785 305.6259559084242 86.59460080872209 0.4 0.4 0.4 0.0 0.0 0.0 -58.0 2.96336237e-06 0.0003069363065443012 +Body58 2.96336237e-06 0.0003069363065443012 1.52529846e-05 0.1049401154935597 0.0018009357119500263 0.592034643137779 25.16469002163629 180.19944782836734 335.3887921629321 0.4 0.4 0.4 0.0 0.0 0.0 -59.0 2.96336237e-06 0.00875446597270691 +Body59 2.96336237e-06 0.00875446597270691 1.52529846e-05 2.993111765120244 0.0006354800586648284 9.0042412902944 49.4919597225473 36.11869018733198 261.5725854651475 0.4 0.4 0.4 0.0 0.0 0.0 -60.0 2.96336237e-06 0.0003854621874058603 +Body60 2.96336237e-06 0.0003854621874058603 1.52529846e-05 0.13178775401382103 4.4529010620616345e-05 2.360287043259888 326.48003818293364 191.00545232281667 151.6460032361024 0.4 0.4 0.4 0.0 0.0 0.0 -61.0 2.96336237e-06 0.0010704942155659338 +Body61 2.96336237e-06 0.0010704942155659338 1.52529846e-05 0.36599706265267967 0.0005581318642156938 4.859609391716076 48.17369372173571 244.08610894914074 127.05543357948909 0.4 0.4 0.4 0.0 0.0 0.0 -62.0 2.96336237e-06 0.006953870017056551 +Body62 2.96336237e-06 0.006953870017056551 1.52529846e-05 2.377496266026745 1.0214216129345541e-05 7.587889256607299 62.36017315943624 288.7093435214597 144.67669650162128 0.4 0.4 0.4 0.0 0.0 0.0 -63.0 2.96336237e-06 0.0005502814419966461 +Body63 2.96336237e-06 0.0005502814419966461 1.52529846e-05 0.18813870124144422 0.0008200124826780808 4.739467256908708 105.80134697241932 140.8450054535519 116.52348499601447 0.4 0.4 0.4 0.0 0.0 0.0 -64.0 2.96336237e-06 0.00043123792660773683 +Body64 2.96336237e-06 0.00043123792660773683 1.52529846e-05 0.14743826930388712 6.654872018888729e-05 0.43233119103254647 116.87246380412185 249.10658724790036 18.443296542154236 0.4 0.4 0.4 0.0 0.0 0.0 -65.0 2.96336237e-06 0.0007838544428803723 +Body65 2.96336237e-06 0.0007838544428803723 1.52529846e-05 0.26799623899863934 0.0006335544840110136 3.912013198254297 1.422457404214392 1.1037941278376344 209.20450761766227 0.4 0.4 0.4 0.0 0.0 0.0 -66.0 2.96336237e-06 0.0004617177005654156 +Body66 2.96336237e-06 0.0004617177005654156 1.52529846e-05 0.1578591642294431 0.001462342243452415 2.6139086813479384 339.32713268531063 324.9716853293816 185.46654489619115 0.4 0.4 0.4 0.0 0.0 0.0 -67.0 2.96336237e-06 0.000966026120046073 +Body67 2.96336237e-06 0.000966026120046073 1.52529846e-05 0.3302798999205344 0.0012943277404190033 2.07090981231813 250.52813757471867 172.21424522235066 184.46280287699042 0.4 0.4 0.4 0.0 0.0 0.0 -68.0 2.96336237e-06 0.0004166358165940514 +Body68 2.96336237e-06 0.0004166358165940514 1.52529846e-05 0.14244587486043392 0.0004004025716564624 11.216416510869244 214.858418619383 233.3580913046752 139.20899858980107 0.4 0.4 0.4 0.0 0.0 0.0 -69.0 2.96336237e-06 0.001752802301460241 +Body69 2.96336237e-06 0.001752802301460241 1.52529846e-05 0.5992750679237953 0.00020092576841079375 3.098104910493994 12.188464684450674 184.25164373455684 337.8926560055481 0.4 0.4 0.4 0.0 0.0 0.0 -70.0 2.96336237e-06 0.0018710623936237275 +Body70 2.96336237e-06 0.0018710623936237275 1.52529846e-05 0.6397076510536248 0.0002264822119683341 4.492144164063947 185.69461488058917 302.74015643751306 68.32329141485204 0.4 0.4 0.4 0.0 0.0 0.0 -71.0 2.96336237e-06 0.00032714043349845297 +Body71 2.96336237e-06 0.00032714043349845297 1.52529846e-05 0.11184781383620987 0.0006745963590975601 11.223592983244703 299.7532726735807 81.53622715906313 272.5551284711186 0.4 0.4 0.4 0.0 0.0 0.0 -72.0 2.96336237e-06 0.0024734708981726376 +Body72 2.96336237e-06 0.0024734708981726376 1.52529846e-05 0.8456683559093109 0.00067595270188909 6.429813857902258 171.77598150380612 78.85585985653326 91.83884206797602 0.4 0.4 0.4 0.0 0.0 0.0 -73.0 2.96336237e-06 0.001860822716695508 +Body73 2.96336237e-06 0.001860822716695508 1.52529846e-05 0.6362067524744957 0.0019150357270504297 6.99716246024162 39.881166427162526 94.16779161006244 304.496858353172 0.4 0.4 0.4 0.0 0.0 0.0 -74.0 2.96336237e-06 0.0005852088275810136 +Body74 2.96336237e-06 0.0005852088275810136 1.52529846e-05 0.20008021418391064 0.0009314005907283757 2.500651234196459 19.02043485849883 157.19403208231407 225.30409522496208 0.4 0.4 0.4 0.0 0.0 0.0 -75.0 2.96336237e-06 0.0005426423718263105 +Body75 2.96336237e-06 0.0005426423718263105 1.52529846e-05 0.1855269381855715 0.0001464086728528122 8.321861407243103 50.133767147926584 137.99182539572098 47.9871236095155 0.4 0.4 0.4 0.0 0.0 0.0 -76.0 2.96336237e-06 0.00033240500836887306 +Body76 2.96336237e-06 0.00033240500836887306 1.52529846e-05 0.11364774783928172 0.0007847641170717963 1.5894841887345945 5.787407085828862 353.58328754555964 315.9332274421555 0.4 0.4 0.4 0.0 0.0 0.0 -77.0 2.96336237e-06 0.0018778603413056314 +Body77 2.96336237e-06 0.0018778603413056314 1.52529846e-05 0.6420318381883755 0.0015138855021274002 1.9208238539698494 192.1660704480532 249.9821485712254 64.44683327824293 0.4 0.4 0.4 0.0 0.0 0.0 -78.0 2.96336237e-06 0.001359331142595401 +Body78 2.96336237e-06 0.001359331142595401 1.52529846e-05 0.46474908330000686 0.001707547960728472 2.551257182249693 234.77502060953586 161.44361253378054 144.21526760560283 0.4 0.4 0.4 0.0 0.0 0.0 -79.0 2.96336237e-06 0.0015946183954167843 +Body79 2.96336237e-06 0.0015946183954167843 1.52529846e-05 0.5451927159325465 0.0004578749650967072 10.098289348566071 141.88454324679114 72.86297110120593 190.4352832521177 0.4 0.4 0.4 0.0 0.0 0.0 -80.0 2.96336237e-06 0.0008452285833792304 +Body80 2.96336237e-06 0.0008452285833792304 1.52529846e-05 0.288979776152588 0.0017867250039365573 1.2090758348980601 285.4906115439976 114.40545630390098 105.89085636285911 0.4 0.4 0.4 0.0 0.0 0.0 -81.0 2.96336237e-06 0.004044561714236451 +Body81 2.96336237e-06 0.004044561714236451 1.52529846e-05 1.3828171003665302 0.0009830800043135217 9.96155439965852 114.57880137808799 146.18283890529827 98.29337208284545 0.4 0.4 0.4 0.0 0.0 0.0 -82.0 2.96336237e-06 0.011421491213150557 +Body82 2.96336237e-06 0.011421491213150557 1.52529846e-05 3.904955462946195 0.0002493766806123511 2.8983381040505707 110.34349021157364 57.27650400202746 156.207756210604 0.4 0.4 0.4 0.0 0.0 0.0 -83.0 2.96336237e-06 0.00443901923055079 +Body83 2.96336237e-06 0.00443901923055079 1.52529846e-05 1.5176803160785328 0.0004705120497389799 11.377571422949671 215.86224406942333 294.2470414571703 357.6385223802111 0.4 0.4 0.4 0.0 0.0 0.0 -84.0 2.96336237e-06 0.0017237509115899283 +Body84 2.96336237e-06 0.0017237509115899283 1.52529846e-05 0.5893425309666562 0.0005613530732356125 5.436319252086878 91.49742720579809 263.2834004462977 323.40619872828955 0.4 0.4 0.4 0.0 0.0 0.0 -85.0 2.96336237e-06 0.0003628628664899316 +Body85 2.96336237e-06 0.0003628628664899316 1.52529846e-05 0.12406114984081071 0.00019277605226163423 0.43354596978899146 33.3084551810417 256.88755156979323 178.17894205051425 0.4 0.4 0.4 0.0 0.0 0.0 -86.0 2.96336237e-06 0.0013358065929795853 +Body86 2.96336237e-06 0.0013358065929795853 1.52529846e-05 0.4567061476779175 0.0011858249024265526 7.255704549265122 311.80420731067284 263.8411001240191 53.20182707985439 0.4 0.4 0.4 0.0 0.0 0.0 -87.0 2.96336237e-06 0.009327851159356281 +Body87 2.96336237e-06 0.009327851159356281 1.52529846e-05 3.189149530696851 0.00044967413146262676 5.7088595655220225 201.13803507415147 180.31863077187782 84.84802457451434 0.4 0.4 0.4 0.0 0.0 0.0 -88.0 2.96336237e-06 0.0010930789467634894 +Body88 2.96336237e-06 0.0010930789467634894 1.52529846e-05 0.3737186786678916 0.0010712575445926738 4.737993907013679 111.24558688225532 262.75985237332554 278.564628048252 0.4 0.4 0.4 0.0 0.0 0.0 -89.0 2.96336237e-06 0.0003110136706795079 +Body89 2.96336237e-06 0.0003110136706795079 1.52529846e-05 0.10633414759121293 0.0010992579545403803 2.698638929207632 63.949878138869906 213.00270074997584 155.9172911297509 0.4 0.4 0.4 0.0 0.0 0.0 -90.0 2.96336237e-06 0.005316960413365863 +Body90 2.96336237e-06 0.005316960413365863 1.52529846e-05 1.8178443799471666 0.0014415005771152344 6.104347936783227 196.54132799728893 145.59871447908833 277.8926496760078 0.4 0.4 0.4 0.0 0.0 0.0 -91.0 2.96336237e-06 0.005577501405309552 +Body91 2.96336237e-06 0.005577501405309552 1.52529846e-05 1.9069221501634153 0.0005306043429530631 10.734771503339624 225.7400967557793 353.1675426238301 52.2985523542907 0.4 0.4 0.4 0.0 0.0 0.0 -92.0 2.96336237e-06 0.0003464192022134111 +Body92 2.96336237e-06 0.0003464192022134111 1.52529846e-05 0.11843913644088624 0.0010195217727061176 8.555266129794546 199.11263407523387 179.72300188226367 124.33321523618078 0.4 0.4 0.4 0.0 0.0 0.0 -93.0 2.96336237e-06 0.0013567124917219324 +Body93 2.96336237e-06 0.0013567124917219324 1.52529846e-05 0.4638537785763884 0.0005088412966745147 10.415384386783682 315.0251998521479 301.9207071748058 338.6673300092794 0.4 0.4 0.4 0.0 0.0 0.0 -94.0 2.96336237e-06 0.0010001044219994175 +Body94 2.96336237e-06 0.0010001044219994175 1.52529846e-05 0.34193111506373947 0.001729140497532948 9.667089515541221 89.17173976722862 309.26337399604756 284.4388045990902 0.4 0.4 0.4 0.0 0.0 0.0 -95.0 2.96336237e-06 0.0003245938403393872 +Body95 2.96336237e-06 0.0003245938403393872 1.52529846e-05 0.11097714531466465 0.0016926325067968522 1.8765632088536646 181.15091271958 173.58221858572264 88.09695160724537 0.4 0.4 0.4 0.0 0.0 0.0 -96.0 2.96336237e-06 0.0005177858788758957 +Body96 2.96336237e-06 0.0005177858788758957 1.52529846e-05 0.17702861724612637 0.0002478281018597761 9.159778720650952 160.3088036954629 38.53182945837775 335.4697169770586 0.4 0.4 0.4 0.0 0.0 0.0 -97.0 2.96336237e-06 0.0015151185752123697 +Body97 2.96336237e-06 0.0015151185752123697 1.52529846e-05 0.5180120920177788 2.9502982112599547e-06 7.009095414468045 281.37693305656705 4.849548456356212 359.1004845579101 0.4 0.4 0.4 0.0 0.0 0.0 -98.0 2.96336237e-06 0.0003350113563366908 +Body98 2.96336237e-06 0.0003350113563366908 1.52529846e-05 0.11453884625588343 0.0011989095169828302 6.5905002472760374 59.15624414719007 269.39010899221546 123.0990286579837 0.4 0.4 0.4 0.0 0.0 0.0 -99.0 2.96336237e-06 0.0012874772911666674 +Body99 2.96336237e-06 0.0012874772911666674 1.52529846e-05 0.4401825810426401 0.0002036497411803174 3.1771770594002913 100.76352640956914 120.26047229947972 194.5615138427278 0.4 0.4 0.4 0.0 0.0 0.0 -100.0 2.96336237e-06 0.00040838650279990496 +Body100 2.96336237e-06 0.00040838650279990496 1.52529846e-05 0.1396254723083644 0.0004861527967895541 11.131515304468477 262.1262484543326 33.59992903683474 182.1510046705191 0.4 0.4 0.4 0.0 0.0 0.0 -101.0 2.96336237e-06 0.0013243099351560306 +Body101 2.96336237e-06 0.0013243099351560306 1.52529846e-05 0.4527754930956137 0.001261914712861443 9.83965028122555 297.72636258480867 71.8128525718681 56.63573381981481 0.4 0.4 0.4 0.0 0.0 0.0 -102.0 2.96336237e-06 0.0019790875030929254 +Body102 2.96336237e-06 0.0019790875030929254 1.52529846e-05 0.6766409405413768 0.0009016004840216479 7.593246713308825 355.5379789655611 289.2039035363469 135.50491239970953 0.4 0.4 0.4 0.0 0.0 0.0 -103.0 2.96336237e-06 0.00030453665889241036 +Body103 2.96336237e-06 0.00030453665889241036 1.52529846e-05 0.10411968696697571 0.0011992959016376718 1.098941138399255 165.94115750005759 198.33423950434633 247.96779069456593 0.4 0.4 0.4 0.0 0.0 0.0 -104.0 2.96336237e-06 0.0002950967801424541 +Body104 2.96336237e-06 0.0002950967801424541 1.52529846e-05 0.10089223571684924 0.0017749395365379967 7.944123402911042 98.55169231931721 77.0260459225988 187.86561079123032 0.4 0.4 0.4 0.0 0.0 0.0 -105.0 2.96336237e-06 0.00038266901491270424 +Body105 2.96336237e-06 0.00038266901491270424 1.52529846e-05 0.13083278114884678 0.000397437811020739 1.485636402870702 332.2718789916222 165.0358244796671 344.2374508160317 0.4 0.4 0.4 0.0 0.0 0.0 -106.0 2.96336237e-06 0.00342975196143917 +Body106 2.96336237e-06 0.00342975196143917 1.52529846e-05 1.1726164656110538 0.0014673076508426542 3.761359336182932 357.0970820407398 74.49778133500645 72.15707611613152 0.4 0.4 0.4 0.0 0.0 0.0 -107.0 2.96336237e-07 0.00016816959154585814 +Body107 2.96336237e-07 0.00016816959154585814 7.07980829e-06 0.12387226470904195 0.0005531995219881519 10.355978378376493 167.8468401653107 194.82823573726952 211.2267678896405 0.4 0.4 0.4 0.0 0.0 0.0 -108.0 2.96336237e-07 0.00031238764510778253 +Body108 2.96336237e-07 0.00031238764510778253 7.07980829e-06 0.23010203397011544 0.0015261790638578562 11.402130907481173 240.52621289420662 257.13676455604707 174.67141681189824 0.4 0.4 0.4 0.0 0.0 0.0 -109.0 2.96336237e-07 0.0009879110922956823 +Body109 2.96336237e-07 0.0009879110922956823 7.07980829e-06 0.7276867548345038 0.0003207190041773218 0.08589053062255086 98.44578407007661 85.55661268681133 37.370841744572076 0.4 0.4 0.4 0.0 0.0 0.0 -110.0 2.96336237e-07 0.000785792619431494 +Body110 2.96336237e-07 0.000785792619431494 7.07980829e-06 0.5788080381588274 0.00016604617562400475 9.412958915158283 351.0710936405306 137.41416246163016 129.97454633579267 0.4 0.4 0.4 0.0 0.0 0.0 -111.0 2.96336237e-07 0.0006155430753947794 +Body111 2.96336237e-07 0.0006155430753947794 7.07980829e-06 0.45340369845833645 0.0005439008162404882 4.035430293108841 64.71336831652852 103.21305113594659 66.88095597857762 0.4 0.4 0.4 0.0 0.0 0.0 -112.0 2.96336237e-07 0.004403662469145191 +Body112 2.96336237e-07 0.004403662469145191 7.07980829e-06 3.243699637092097 0.0002020826503553822 7.389264551217258 251.3369840198275 259.11381324975497 268.92906302672765 0.4 0.4 0.4 0.0 0.0 0.0 -113.0 2.96336237e-07 0.0008628168581811688 +Body113 2.96336237e-07 0.0008628168581811688 7.07980829e-06 0.6355434253575909 0.0005259848429150753 4.7087952689007215 306.5808360320152 288.3570014006157 118.33807629420642 0.4 0.4 0.4 0.0 0.0 0.0 -114.0 2.96336237e-07 0.00017936753664072642 +Body114 2.96336237e-07 0.00017936753664072642 7.07980829e-06 0.13212057408672506 0.0008665990131266118 7.120353865956092 190.6498907794794 67.47847112103364 67.34416211198067 0.4 0.4 0.4 0.0 0.0 0.0 -115.0 2.96336237e-07 0.00019489758562106689 +Body115 2.96336237e-07 0.00019489758562106689 7.07980829e-06 0.14355987366849599 0.0007000052466704764 11.067266200846223 302.59326698995415 307.16068571669496 320.29539349711746 0.4 0.4 0.4 0.0 0.0 0.0 -116.0 2.96336237e-07 0.0001628468016523569 +Body116 2.96336237e-07 0.0001628468016523569 7.07980829e-06 0.11995154377122244 0.0014304974516166369 8.682040333318456 53.699379689860955 126.10980496487173 244.39176131260652 0.4 0.4 0.4 0.0 0.0 0.0 -117.0 2.96336237e-07 0.0031958201254853424 +Body117 2.96336237e-07 0.0031958201254853424 7.07980829e-06 2.354013427205437 0.0004309473905377549 6.9308357983711355 1.4931374316461492 223.11468690258278 182.31725106488204 0.4 0.4 0.4 0.0 0.0 0.0 -118.0 2.96336237e-07 0.00022418288944292232 +Body118 2.96336237e-07 0.00022418288944292232 7.07980829e-06 0.16513117483988746 0.00022456101212881178 1.0598981407408903 114.65563902572339 195.5529426878297 153.30104159945483 0.4 0.4 0.4 0.0 0.0 0.0 -119.0 2.96336237e-07 0.00014740592815102062 +Body119 2.96336237e-07 0.00014740592815102062 7.07980829e-06 0.1085779300749866 0.0014275161808413696 4.182286103891713 185.19997719955006 69.72766414334342 9.101445563021494 0.4 0.4 0.4 0.0 0.0 0.0 -120.0 2.96336237e-07 0.00029585734777689063 +Body120 2.96336237e-07 0.00029585734777689063 7.07980829e-06 0.217925960115925 0.0002554032758021398 3.8965563945123276 3.601488246601578 242.95765486078784 162.17838073574453 0.4 0.4 0.4 0.0 0.0 0.0 -121.0 2.96336237e-07 0.0007727191730603037 +Body121 2.96336237e-07 0.0007727191730603037 7.07980829e-06 0.5691782507836827 0.0014564975655409615 5.719967231993963 132.89767002952325 284.20909613831935 321.5205172054022 0.4 0.4 0.4 0.0 0.0 0.0 -122.0 2.96336237e-07 0.000213337994549106 +Body122 2.96336237e-07 0.000213337994549106 7.07980829e-06 0.15714291918272705 0.0009494019514339251 9.258388123215918 303.4191655124367 4.878388841323113 218.06868709619636 0.4 0.4 0.4 0.0 0.0 0.0 -123.0 2.96336237e-07 0.00503670254640343 +Body123 2.96336237e-07 0.00503670254640343 7.07980829e-06 3.7099914755912216 0.0010572364648053154 8.010499521080863 27.338053747350823 357.39960777194 177.32187278760247 0.4 0.4 0.4 0.0 0.0 0.0 -124.0 2.96336237e-07 0.0004888292015968271 +Body124 2.96336237e-07 0.0004888292015968271 7.07980829e-06 0.3600673564174043 0.0005742657612974902 10.991021500652414 27.37893830965835 73.88568796383163 163.34375430175132 0.4 0.4 0.4 0.0 0.0 0.0 -125.0 2.96336237e-07 0.00014264880902187626 +Body125 2.96336237e-07 0.00014264880902187626 7.07980829e-06 0.10507387732323137 9.366386918200216e-05 10.015322656735082 35.15867604017057 22.715911698400244 239.12458545347477 0.4 0.4 0.4 0.0 0.0 0.0 -126.0 2.96336237e-07 0.00030911707147207823 +Body126 2.96336237e-07 0.00030911707147207823 7.07980829e-06 0.22769295775468146 0.00114543654379223 7.2920536261670375 49.219898695122154 122.03136784373147 29.828866312026616 0.4 0.4 0.4 0.0 0.0 0.0 -127.0 2.96336237e-07 0.00027012914569216496 +Body127 2.96336237e-07 0.00027012914569216496 7.07980829e-06 0.19897478927801643 0.000404593719157789 4.158279605327939 244.79974749640303 9.508569293962292 221.75078468690472 0.4 0.4 0.4 0.0 0.0 0.0 -128.0 2.96336237e-07 0.001140878866283859 +Body128 2.96336237e-07 0.001140878866283859 7.07980829e-06 0.8403614923850751 8.166778751100094e-05 2.3495898654178586 19.66803963421033 324.7517696127286 86.7158886901674 0.4 0.4 0.4 0.0 0.0 0.0 -129.0 2.96336237e-07 0.002093064990976749 +Body129 2.96336237e-07 0.002093064990976749 7.07980829e-06 1.5417335454775085 0.0019781302961249174 9.297247630023088 80.94579107830113 303.78348612504453 157.20359273800975 0.4 0.4 0.4 0.0 0.0 0.0 -130.0 2.96336237e-07 0.00024098630227522674 +Body130 2.96336237e-07 0.00024098630227522674 7.07980829e-06 0.17750842320711635 0.0009065473133236789 1.1969282234062077 208.46027229431306 177.53308148788503 193.90461945177137 0.4 0.4 0.4 0.0 0.0 0.0 -131.0 2.96336237e-07 0.00017488753769088187 +Body131 2.96336237e-07 0.00017488753769088187 7.07980829e-06 0.12882064565905776 0.0007637828097086882 4.264892111605374 48.83276293064713 251.82172372717227 93.46042142454374 0.4 0.4 0.4 0.0 0.0 0.0 -132.0 2.96336237e-07 0.0001829508529618976 +Body132 2.96336237e-07 0.0001829508529618976 7.07980829e-06 0.13476001385578287 0.00012336312947165454 10.908632447200223 3.041087803171923 147.6307876075636 158.6334537310142 0.4 0.4 0.4 0.0 0.0 0.0 -133.0 2.96336237e-07 0.0007185313679488019 +Body133 2.96336237e-07 0.0007185313679488019 7.07980829e-06 0.529263982829101 0.0006014399909228298 10.751025293098404 259.0034496020978 71.26585297294893 169.2533123873972 0.4 0.4 0.4 0.0 0.0 0.0 -134.0 2.96336237e-07 0.0003356472216466589 +Body134 2.96336237e-07 0.0003356472216466589 7.07980829e-06 0.24723483661034923 0.0014629077708104236 7.287843144309161 301.2638371683688 127.51989720943986 350.2545635084609 0.4 0.4 0.4 0.0 0.0 0.0 -135.0 2.96336237e-07 0.000367851307342242 +Body135 2.96336237e-07 0.000367851307342242 7.07980829e-06 0.2709560872319762 0.001449899070243202 5.3985906685376595 12.869632117018408 56.440619438168206 202.03548534709378 0.4 0.4 0.4 0.0 0.0 0.0 -136.0 2.96336237e-07 0.001020738812493088 +Body136 2.96336237e-07 0.001020738812493088 7.07980829e-06 0.7518673692292205 0.0012878198164970637 9.63415161769334 252.38383472649286 100.10844071089208 53.564469155545595 0.4 0.4 0.4 0.0 0.0 0.0 -137.0 2.96336237e-07 0.0003458138054797775 +Body137 2.96336237e-07 0.0003458138054797775 7.07980829e-06 0.25472345421467585 0.0019417161345252878 4.492776211582144 32.81484412388676 294.309511162598 356.86306577351746 0.4 0.4 0.4 0.0 0.0 0.0 -138.0 2.96336237e-07 0.005423859736551002 +Body138 2.96336237e-07 0.005423859736551002 7.07980829e-06 3.9951681089000517 0.0016294274679503591 4.017393924029837 53.96037334403256 238.11794566096674 189.17852482330372 0.4 0.4 0.4 0.0 0.0 0.0 -139.0 2.96336237e-07 0.00022464116667460812 +Body139 2.96336237e-07 0.00022464116667460812 7.07980829e-06 0.16546873787986208 0.0003270774573829799 8.732005449682077 190.0565396265665 252.49069835037028 36.440263763470895 0.4 0.4 0.4 0.0 0.0 0.0 -140.0 2.96336237e-07 0.00017892196313582106 +Body140 2.96336237e-07 0.00017892196313582106 7.07980829e-06 0.13179236850187698 0.0012997759733666453 4.791504166071849 339.4645982231863 224.59146298588695 16.435525916126085 0.4 0.4 0.4 0.0 0.0 0.0 -141.0 2.96336237e-07 0.003572985279690336 +Body141 2.96336237e-07 0.003572985279690336 7.07980829e-06 2.6318300133744494 0.0016593635605119624 5.196026746192993 199.06815846896959 264.6777435678608 188.65547946252804 0.4 0.4 0.4 0.0 0.0 0.0 -142.0 2.96336237e-07 0.0006012280502272479 +Body142 2.96336237e-07 0.0006012280502272479 7.07980829e-06 0.4428593748944328 0.0018396972558659796 9.622671158320054 63.01326469430487 166.6051238855187 350.0800519903532 0.4 0.4 0.4 0.0 0.0 0.0 -143.0 2.96336237e-07 0.0003791479110369971 +Body143 2.96336237e-07 0.0003791479110369971 7.07980829e-06 0.2792770676799085 0.001877076266242859 3.48890767723524 157.21151440385083 97.74472544944372 15.724902633339642 0.4 0.4 0.4 0.0 0.0 0.0 -144.0 2.96336237e-07 0.0013135886106589365 +Body144 2.96336237e-07 0.0013135886106589365 7.07980829e-06 0.9675779943483723 0.00160002291337724 1.8015622994879954 222.10756640600732 59.163772721633265 88.68453279850249 0.4 0.4 0.4 0.0 0.0 0.0 -145.0 2.96336237e-07 0.00019265066338718887 +Body145 2.96336237e-07 0.00019265066338718887 7.07980829e-06 0.14190481021036971 0.0012818420622606925 2.271664559627985 96.82770203480024 200.08884344226988 269.93379244585316 0.4 0.4 0.4 0.0 0.0 0.0 -146.0 2.96336237e-07 0.0003410152371557038 +Body146 2.96336237e-07 0.0003410152371557038 7.07980829e-06 0.25118887034490417 0.0008201337497851175 5.3814977411779825 124.75435580418859 354.6430029121366 34.25689544138114 0.4 0.4 0.4 0.0 0.0 0.0 -147.0 2.96336237e-07 0.0004492852049709176 +Body147 2.96336237e-07 0.0004492852049709176 7.07980829e-06 0.3309395909713998 0.00013413983096058658 2.079421664422223 220.65257096631845 282.99697243327626 179.4785782033792 0.4 0.4 0.4 0.0 0.0 0.0 -148.0 2.96336237e-07 0.00031646761210079417 +Body148 2.96336237e-07 0.00031646761210079417 7.07980829e-06 0.2331073023228347 0.0008321440549849696 8.138223976196302 357.1499273249601 345.83759313945666 171.95488139485323 0.4 0.4 0.4 0.0 0.0 0.0 -149.0 2.96336237e-07 0.0030007519303011394 +Body149 2.96336237e-07 0.0030007519303011394 7.07980829e-06 2.21032788401029 0.0005453550198973763 1.193619266234995 114.70209914368695 359.1252528706196 165.34546146882104 0.4 0.4 0.4 0.0 0.0 0.0 -150.0 2.96336237e-07 0.00044661239308489296 +Body150 2.96336237e-07 0.00044661239308489296 7.07980829e-06 0.3289708208838966 0.0007315984915959174 5.998345784509511 184.6392027490737 117.6774753530886 22.70218197599295 0.4 0.4 0.4 0.0 0.0 0.0 -151.0 2.96336237e-07 0.0001589193735568456 +Body151 2.96336237e-07 0.0001589193735568456 7.07980829e-06 0.11705863424934708 0.001782716686229557 9.975268794775284 315.3388992722859 202.00883409163833 339.06925812232953 0.4 0.4 0.4 0.0 0.0 0.0 -152.0 2.96336237e-07 0.0013828055989717654 +Body152 2.96336237e-07 0.0013828055989717654 7.07980829e-06 1.0185626284896245 0.0015720599420678773 5.391948036033658 9.820726173963978 286.1158705977679 206.034011860938 0.4 0.4 0.4 0.0 0.0 0.0 -153.0 2.96336237e-07 0.00038037707112716703 +Body153 2.96336237e-07 0.00038037707112716703 7.07980829e-06 0.2801824563572533 0.0013860194854161548 9.848432483325945 158.82387513055312 205.0823418590616 37.56087631123559 0.4 0.4 0.4 0.0 0.0 0.0 -154.0 2.96336237e-07 0.0013628622598251458 +Body154 2.96336237e-07 0.0013628622598251458 7.07980829e-06 1.003872537592433 0.0013261028002044145 6.480312337478101 167.62398308531448 98.09395195195651 75.24672256131272 0.4 0.4 0.4 0.0 0.0 0.0 -155.0 2.96336237e-07 0.001364806745053002 +Body155 2.96336237e-07 0.001364806745053002 7.07980829e-06 1.0053048285711628 0.001983518426589933 4.367180046307461 261.6577560096613 290.33343326668313 332.8968570055506 0.4 0.4 0.4 0.0 0.0 0.0 -156.0 2.96336237e-07 0.00022145689694976492 +Body156 2.96336237e-07 0.00022145689694976492 7.07980829e-06 0.16312323237773801 0.0006439448200590166 11.067956808253003 184.72859242658714 344.652192145938 254.2430158874952 0.4 0.4 0.4 0.0 0.0 0.0 -157.0 2.96336237e-07 0.0003177625865168285 +Body157 2.96336237e-07 0.0003177625865168285 7.07980829e-06 0.23406116926262982 0.00029821637830765893 0.15540232276448177 273.90933503912856 252.71441052672986 86.66419647342113 0.4 0.4 0.4 0.0 0.0 0.0 -158.0 2.96336237e-07 0.0002934051804898172 +Body158 2.96336237e-07 0.0002934051804898172 7.07980829e-06 0.21611971492912865 0.0011028044694697762 3.1406010838512883 268.825042139767 338.59104007622176 57.915432061847646 0.4 0.4 0.4 0.0 0.0 0.0 -159.0 2.96336237e-07 0.0006754039114352842 +Body159 2.96336237e-07 0.0006754039114352842 7.07980829e-06 0.49749667186424473 0.0010626644786087133 8.88185444878993 128.26300715096647 34.443743165914995 283.6020679966429 0.4 0.4 0.4 0.0 0.0 0.0 -160.0 2.96336237e-07 0.002066712252351126 +Body160 2.96336237e-07 0.002066712252351126 7.07980829e-06 1.52232234643234 0.001793237979184002 7.375200915704474 347.057516065177 161.152451712529 300.3840302811319 0.4 0.4 0.4 0.0 0.0 0.0 -161.0 2.96336237e-07 0.004515216758673851 +Body161 2.96336237e-07 0.004515216758673851 7.07980829e-06 3.3258695606490276 0.0013745148894753647 6.966183990909284 23.251726492966064 196.06378863722077 338.06632215580805 0.4 0.4 0.4 0.0 0.0 0.0 -162.0 2.96336237e-07 0.0010236214108874067 +Body162 2.96336237e-07 0.0010236214108874067 7.07980829e-06 0.7539906662418885 0.0004840005158154663 7.427940478904475 349.557243638905 246.69414694612487 330.93962802388324 0.4 0.4 0.4 0.0 0.0 0.0 -163.0 2.96336237e-07 0.0002718807786590962 +Body163 2.96336237e-07 0.0002718807786590962 7.07980829e-06 0.20026502695153556 0.0006058354245075206 5.295860408343369 73.35823722731428 98.10792491734249 317.9966842101337 0.4 0.4 0.4 0.0 0.0 0.0 -164.0 2.96336237e-07 0.00018018330144109257 +Body164 2.96336237e-07 0.00018018330144109257 7.07980829e-06 0.1327214593737879 0.0008093086192652557 3.6928066678370177 59.170715481563 138.97885118139544 251.188395768202 0.4 0.4 0.4 0.0 0.0 0.0 -165.0 2.96336237e-07 0.00017559504684091343 +Body165 2.96336237e-07 0.00017559504684091343 7.07980829e-06 0.12934179077162636 0.0006135474766472398 9.933562821823118 10.484576903357922 194.67967982707057 20.333846557878356 0.4 0.4 0.4 0.0 0.0 0.0 -166.0 2.96336237e-07 0.00039962935024950884 +Body166 2.96336237e-07 0.00039962935024950884 7.07980829e-06 0.2943635184254499 0.0012619760406024807 2.779578041982537 35.52954059395194 305.2214761982664 138.76489378040108 0.4 0.4 0.4 0.0 0.0 0.0 -167.0 2.96336237e-07 0.00022115456668983884 +Body167 2.96336237e-07 0.00022115456668983884 7.07980829e-06 0.1629005385265913 0.0001929527786699337 9.440631307955767 127.4007986821642 337.0886437695329 269.41233940608936 0.4 0.4 0.4 0.0 0.0 0.0 -168.0 2.96336237e-07 0.0008060441724070385 +Body168 2.96336237e-07 0.0008060441724070385 7.07980829e-06 0.5937251566931361 0.0005249423886786294 2.9987821947478523 48.6375472295649 214.28217837784138 255.52618034001915 0.4 0.4 0.4 0.0 0.0 0.0 -169.0 2.96336237e-07 0.00031106873049514165 +Body169 2.96336237e-07 0.00031106873049514165 7.07980829e-06 0.22913053288883273 0.0016186032198070468 9.151761940335717 11.200770827285309 266.3777681156726 49.034665032791885 0.4 0.4 0.4 0.0 0.0 0.0 -170.0 2.96336237e-07 0.0003671364476741176 +Body170 2.96336237e-07 0.0003671364476741176 7.07980829e-06 0.2704295277914392 0.00012545600265867656 3.134397409063039 10.298354663953061 133.16092507665462 276.0065731998203 0.4 0.4 0.4 0.0 0.0 0.0 -171.0 2.96336237e-07 0.0001406861515402154 +Body171 2.96336237e-07 0.0001406861515402154 7.07980829e-06 0.10362820081972879 0.0010692074694615696 10.759956971253267 43.8394536060831 179.56586036953883 129.3281899786029 0.4 0.4 0.4 0.0 0.0 0.0 -172.0 2.96336237e-07 0.00016190577897156664 +Body172 2.96336237e-07 0.00016190577897156664 7.07980829e-06 0.1192583946142283 0.00019753162900574672 3.8060033566757454 349.38327819474637 26.026878084041176 320.1433164558795 0.4 0.4 0.4 0.0 0.0 0.0 -173.0 2.96336237e-07 0.00019959834578956432 +Body173 2.96336237e-07 0.00019959834578956432 7.07980829e-06 0.14702241289793241 0.0009524778563671583 8.147159648286227 314.40136019421766 221.39624878001882 155.89907353446114 0.4 0.4 0.4 0.0 0.0 0.0 -174.0 2.96336237e-07 0.00026054361645258187 +Body174 2.96336237e-07 0.00026054361645258187 7.07980829e-06 0.1919141714550962 0.0011892772120079787 6.863317164196909 114.29995318209117 163.44259320800703 20.060149144011508 0.4 0.4 0.4 0.0 0.0 0.0 -175.0 2.96336237e-07 0.00014110396260167847 +Body175 2.96336237e-07 0.00014110396260167847 7.07980829e-06 0.10393595682917241 0.0019650009001170015 8.380209652009132 27.694704254845995 124.84538034739687 0.9605955234993264 0.4 0.4 0.4 0.0 0.0 0.0 -176.0 2.96336237e-07 0.000335299116311714 +Body176 2.96336237e-07 0.000335299116311714 7.07980829e-06 0.24697842523537622 0.00013153259079534292 9.342039055239226 98.7649591870879 183.74431768897168 325.6204743384124 0.4 0.4 0.4 0.0 0.0 0.0 -177.0 2.96336237e-07 0.0009920857025102555 +Body177 2.96336237e-07 0.0009920857025102555 7.07980829e-06 0.7307617365645729 0.0017633866996118002 9.110512873524705 226.63496885023062 241.9899351563555 284.7615263965227 0.4 0.4 0.4 0.0 0.0 0.0 -178.0 2.96336237e-07 0.0005050245818596466 +Body178 2.96336237e-07 0.0005050245818596466 7.07980829e-06 0.3719967332597837 0.0006100482118329518 3.0520895784014277 37.530361626110185 202.00026377977647 135.978768482857 0.4 0.4 0.4 0.0 0.0 0.0 -179.0 2.96336237e-07 0.00021298758224292248 +Body179 2.96336237e-07 0.00021298758224292248 7.07980829e-06 0.15688480851271908 0.0006791788186175694 8.326300133053458 24.834781106245998 71.16192911147928 183.39434898702336 0.4 0.4 0.4 0.0 0.0 0.0 -180.0 2.96336237e-07 0.0001546801787549805 +Body180 2.96336237e-07 0.0001546801787549805 7.07980829e-06 0.11393608007161017 0.0016976011178171653 1.9413029702389735 333.9359764465807 329.27703780599694 298.5147658284802 0.4 0.4 0.4 0.0 0.0 0.0 -181.0 2.96336237e-07 0.001414987985585469 +Body181 2.96336237e-07 0.001414987985585469 7.07980829e-06 1.042267895755463 0.001616466643041654 10.645313273891006 329.61906607910646 202.88772573773534 117.97158715648169 0.4 0.4 0.4 0.0 0.0 0.0 -182.0 2.96336237e-07 0.00042896379618307366 +Body182 2.96336237e-07 0.00042896379618307366 7.07980829e-06 0.3159710172507339 0.000766433922706978 8.17912136606349 13.739394195734159 34.350772076221816 352.3560733672413 0.4 0.4 0.4 0.0 0.0 0.0 -183.0 2.96336237e-07 0.00019906284169194215 +Body183 2.96336237e-07 0.00019906284169194215 7.07980829e-06 0.14662796521732815 0.0012326717671009941 0.7877533807498188 74.61864594498222 328.98883992061695 161.9126770172985 0.4 0.4 0.4 0.0 0.0 0.0 -184.0 2.96336237e-07 0.0003817964110505486 +Body184 2.96336237e-07 0.0003817964110505486 7.07980829e-06 0.2812279298526996 0.0006617861350581386 5.156218707648213 61.38509954988284 30.762104505928384 290.25836261238675 0.4 0.4 0.4 0.0 0.0 0.0 -185.0 2.96336237e-07 0.0006641055159158564 +Body185 2.96336237e-07 0.0006641055159158564 7.07980829e-06 0.48917437157377647 0.0007007716015580458 7.78402706330698 109.68696794203515 200.37796049973736 300.38920394549854 0.4 0.4 0.4 0.0 0.0 0.0 -186.0 2.96336237e-07 0.00036563238786947765 +Body186 2.96336237e-07 0.00036563238786947765 7.07980829e-06 0.26932165036516986 0.0017465208479135463 4.539557413499532 316.6242898617949 323.76084431082694 165.39345302687377 0.4 0.4 0.4 0.0 0.0 0.0 -187.0 2.96336237e-07 0.0010726745256709551 +Body187 2.96336237e-07 0.0010726745256709551 7.07980829e-06 0.790122765769607 0.00041571389225238895 8.48743965069622 312.8252679132003 63.779768711678884 346.1600707719443 0.4 0.4 0.4 0.0 0.0 0.0 -188.0 2.96336237e-07 0.002760564552000707 +Body188 2.96336237e-07 0.002760564552000707 7.07980829e-06 2.033407941283969 0.0012487716784506683 4.780479160068423 119.95278344844063 192.49227229271023 312.8861177607798 0.4 0.4 0.4 0.0 0.0 0.0 -189.0 2.96336237e-07 0.00014918339096463875 +Body189 2.96336237e-07 0.00014918339096463875 7.07980829e-06 0.10988719378987731 0.0018685801956184883 9.871355330700402 16.62388996911967 341.4312426028597 117.11558241918884 0.4 0.4 0.4 0.0 0.0 0.0 -190.0 2.96336237e-07 0.0001694186633171762 +Body190 2.96336237e-07 0.0001694186633171762 7.07980829e-06 0.12479232015827643 0.001494790158159074 6.170794640494448 287.2665655167668 196.7638664776334 108.39673013661518 0.4 0.4 0.4 0.0 0.0 0.0 -191.0 2.96336237e-07 0.00021199568746620945 +Body191 2.96336237e-07 0.00021199568746620945 7.07980829e-06 0.15615418741044323 2.78913477291886e-05 10.692986130530839 200.68567455035873 82.4386461946673 294.62391664458 0.4 0.4 0.4 0.0 0.0 0.0 -192.0 2.96336237e-07 0.00014016614488350753 +Body192 2.96336237e-07 0.00014016614488350753 7.07980829e-06 0.10324516841988725 0.0004637618628390578 0.7308051275018799 42.30233194875857 310.1699033238308 52.740299428167255 0.4 0.4 0.4 0.0 0.0 0.0 -193.0 2.96336237e-07 0.0012229160482499482 +Body193 2.96336237e-07 0.0012229160482499482 7.07980829e-06 0.9007893701427262 0.00022289967307811764 2.700684154462068 152.30439809554642 286.5828940111849 236.45852634540913 0.4 0.4 0.4 0.0 0.0 0.0 -194.0 2.96336237e-07 0.0007667428750310092 +Body194 2.96336237e-07 0.0007667428750310092 7.07980829e-06 0.5647761614127097 0.0018924303727522655 9.159135124003821 211.70900212994155 346.3426486608832 78.23424628533033 0.4 0.4 0.4 0.0 0.0 0.0 -195.0 2.96336237e-07 0.00032907751915612477 +Body195 2.96336237e-07 0.00032907751915612477 7.07980829e-06 0.2423956506523743 0.0012369454673971248 9.788750352316649 334.9339658731037 143.94705891738602 218.96160352808548 0.4 0.4 0.4 0.0 0.0 0.0 -196.0 2.96336237e-07 0.0035665013066683814 +Body196 2.96336237e-07 0.0035665013066683814 7.07980829e-06 2.627053975000575 0.000316185566059322 10.18193359257925 190.764389273938 312.49027742470116 193.61040983155738 0.4 0.4 0.4 0.0 0.0 0.0 -197.0 2.96336237e-07 0.0020067073773769673 +Body197 2.96336237e-07 0.0020067073773769673 7.07980829e-06 1.4781232751953437 0.0006941622875320177 10.98511563930743 190.41758145328998 148.6655764055237 309.18433423478973 0.4 0.4 0.4 0.0 0.0 0.0 -198.0 2.96336237e-07 0.0016980237611734642 +Body198 2.96336237e-07 0.0016980237611734642 7.07980829e-06 1.2507495968375788 0.001614108985697043 2.1464434538508557 322.37009572544537 55.104142869009216 85.39669528097619 0.4 0.4 0.4 0.0 0.0 0.0 -199.0 2.96336237e-07 0.0002435955289572822 +Body199 2.96336237e-07 0.0002435955289572822 7.07980829e-06 0.17943035698405208 0.0008730361704048029 4.3454735664214414 305.60595571513664 160.92719052876444 77.14881713031818 0.4 0.4 0.4 0.0 0.0 0.0 -200.0 2.96336237e-07 0.00016010149885709995 +Body200 2.96336237e-07 0.00016010149885709995 7.07980829e-06 0.11792937750778232 0.0010256005854385702 6.358956336477252 99.14079090569145 14.581675963536666 236.57160174756234 0.4 0.4 0.4 0.0 0.0 0.0 -201.0 2.96336237e-07 0.0008787982558057802 +Body201 2.96336237e-07 0.0008787982558057802 7.07980829e-06 0.6473151844418513 0.0015377994661774882 9.32745353877487 228.24666762955778 323.9446178720141 119.24764249841333 0.4 0.4 0.4 0.0 0.0 0.0 -202.0 2.96336237e-07 0.0017954751469194494 +Body202 2.96336237e-07 0.0017954751469194494 7.07980829e-06 1.3225314436056246 0.000691805367143881 10.532213204900485 211.87639711279724 61.735729223558934 82.11482242324249 0.4 0.4 0.4 0.0 0.0 0.0 -203.0 2.96336237e-07 0.0012991885817706806 +Body203 2.96336237e-07 0.0012991885817706806 7.07980829e-06 0.9569710577799532 0.0007249951304479727 2.000271567863135 288.99784275305177 214.0678946094761 254.58478817829277 0.4 0.4 0.4 0.0 0.0 0.0 -204.0 2.96336237e-07 0.0003399181905856912 +Body204 2.96336237e-07 0.0003399181905856912 7.07980829e-06 0.2503807953423453 0.0013759788133305114 3.316892456213196 96.23975353122707 357.4722317667782 127.2736160439848 0.4 0.4 0.4 0.0 0.0 0.0 -205.0 2.96336237e-07 0.00024793880705204326 +Body205 2.96336237e-07 0.00024793880705204326 7.07980829e-06 0.18262957801392843 0.0017157779266407896 2.2009158458663625 11.807095777018043 339.8227906851545 39.16400100090238 0.4 0.4 0.4 0.0 0.0 0.0 -206.0 2.96336237e-07 0.00014772181136383643 +Body206 2.96336237e-07 0.00014772181136383643 7.07980829e-06 0.10881060691385727 0.0006751379178441995 8.205815716422652 167.78369402264536 217.23434074847805 96.10947124818023 0.4 0.4 0.4 0.0 0.0 0.0 -207.0 2.96336237e-07 0.0001726437639612437 +Body207 2.96336237e-07 0.0001726437639612437 7.07980829e-06 0.12716790136188713 0.0007840743508914886 7.104423669752906 20.288608511524213 215.52017237393778 52.26007028792386 0.4 0.4 0.4 0.0 0.0 0.0 -208.0 2.96336237e-07 0.0018620952900203491 +Body208 2.96336237e-07 0.0018620952900203491 7.07980829e-06 1.371603264053607 0.0009670280064962706 0.26975802667935367 186.73900145950276 11.807046949130749 210.80209167405837 0.4 0.4 0.4 0.0 0.0 0.0 -209.0 2.96336237e-07 0.0001500772754354715 +Body209 2.96336237e-07 0.0001500772754354715 7.07980829e-06 0.11054562134965469 0.0004212731576929747 5.107089289406828 191.41091549672987 168.2169823184333 214.77055756537882 0.4 0.4 0.4 0.0 0.0 0.0 -210.0 2.96336237e-07 0.002084404211654546 +Body210 2.96336237e-07 0.002084404211654546 7.07980829e-06 1.535354090434984 0.0003044619843016671 9.817178189524565 24.02751479490522 345.76928856220974 77.25094364044551 0.4 0.4 0.4 0.0 0.0 0.0 -211.0 2.96336237e-07 0.0037098487958060786 +Body211 2.96336237e-07 0.0037098487958060786 7.07980829e-06 2.732642494046239 0.0017533570248068017 10.541784042600442 183.96265326310302 42.56564437980813 318.5382099562932 0.4 0.4 0.4 0.0 0.0 0.0 -212.0 2.96336237e-07 0.00038115621754547513 +Body212 2.96336237e-07 0.00038115621754547513 7.07980829e-06 0.2807563688612237 0.00042096780769310235 8.178730051971389 13.660589419038033 61.78654310928999 359.09913531464383 0.4 0.4 0.4 0.0 0.0 0.0 -213.0 2.96336237e-07 0.00014785801751927767 +Body213 2.96336237e-07 0.00014785801751927767 7.07980829e-06 0.10891093518834927 0.001649245523746131 1.5883493999405343 162.60580357685225 292.9008584369058 264.2190177580755 0.4 0.4 0.4 0.0 0.0 0.0 -214.0 2.96336237e-07 0.0004740021377059934 +Body214 2.96336237e-07 0.0004740021377059934 7.07980829e-06 0.34914586956439975 0.0008049997580228192 7.147446272658471 196.43371055896776 244.68364848264363 125.53445762406609 0.4 0.4 0.4 0.0 0.0 0.0 -215.0 2.96336237e-07 0.0001697778484955723 +Body215 2.96336237e-07 0.0001697778484955723 7.07980829e-06 0.1250568928499792 0.0011272406254360131 0.8303248616962521 219.21382519185622 294.0883983025753 125.65741218814509 0.4 0.4 0.4 0.0 0.0 0.0 -216.0 2.96336237e-07 0.0022980225363745223 +Body216 2.96336237e-07 0.0022980225363745223 7.07980829e-06 1.6927034983937899 0.00042475279959607796 6.839865737755455 256.1546018631811 52.72632430493219 240.04551169076447 0.4 0.4 0.4 0.0 0.0 0.0 -217.0 2.96336237e-07 0.00035289505479375573 +Body217 2.96336237e-07 0.00035289505479375573 7.07980829e-06 0.25993944113257617 0.0010708877295575513 5.692463515502207 148.48804231261136 191.641133752022 41.885954320221956 0.4 0.4 0.4 0.0 0.0 0.0 -218.0 2.96336237e-07 0.00025301275516371996 +Body218 2.96336237e-07 0.00025301275516371996 7.07980829e-06 0.18636700425033675 0.0012416834402048642 10.26542747504295 329.24538975442806 257.9445474945486 185.52836484359017 0.4 0.4 0.4 0.0 0.0 0.0 -219.0 2.96336237e-07 0.0014762812657693556 +Body219 2.96336237e-07 0.0014762812657693556 7.07980829e-06 1.0874159951117812 0.0017109019247707644 8.236341398611993 7.455178471365682 73.51925788845762 265.1313439020597 0.4 0.4 0.4 0.0 0.0 0.0 -220.0 2.96336237e-07 0.0003149117198965777 +Body220 2.96336237e-07 0.0003149117198965777 7.07980829e-06 0.231961245599929 3.4109124152629e-05 2.1542164870395832 285.29015445980576 282.9646433174194 174.9398683992383 0.4 0.4 0.4 0.0 0.0 0.0 -221.0 2.96336237e-07 0.00019506210462675862 +Body221 2.96336237e-07 0.00019506210462675862 7.07980829e-06 0.14368105694328057 0.0008306655083517787 8.114916758603387 99.24628499032778 189.16677308527224 143.18476513265207 0.4 0.4 0.4 0.0 0.0 0.0 -222.0 2.96336237e-07 0.00013615561035436202 +Body222 2.96336237e-07 0.00013615561035436202 7.07980829e-06 0.1002910434187357 0.001378237544990353 0.8497756036880315 58.85638691575179 169.1319154934693 228.48288782623976 0.4 0.4 0.4 0.0 0.0 0.0 -223.0 2.96336237e-07 0.00038439934667768895 +Body223 2.96336237e-07 0.00038439934667768895 7.07980829e-06 0.2831452296930682 0.0012684965519581396 3.023547839769216 49.435923162329786 103.29742604797761 219.8817809109895 0.4 0.4 0.4 0.0 0.0 0.0 -224.0 2.96336237e-07 0.00018149758177013166 +Body224 2.96336237e-07 0.00018149758177013166 7.07980829e-06 0.13368954688190451 0.001655295759468958 10.408320781356021 161.15193021387574 5.411709863050264 110.29299367176876 0.4 0.4 0.4 0.0 0.0 0.0 -225.0 2.96336237e-07 0.0001915431981668877 +Body225 2.96336237e-07 0.0001915431981668877 7.07980829e-06 0.14108906092023843 0.0015564326687895838 10.714020711437744 146.0653453808813 175.78773632718568 160.5520207087941 0.4 0.4 0.4 0.0 0.0 0.0 -226.0 2.96336237e-07 0.0012367194492356964 +Body226 2.96336237e-07 0.0012367194492356964 7.07980829e-06 0.910956835765222 0.0008941512327692245 7.343267100816448 34.79194078075773 235.37851553601487 0.5637235052828101 0.4 0.4 0.4 0.0 0.0 0.0 -227.0 2.96336237e-07 0.0006033454038874619 +Body227 2.96336237e-07 0.0006033454038874619 7.07980829e-06 0.4444189992633197 0.00027434415554570955 1.3946438470777796 177.87891221055915 205.47947156499617 226.64594351417597 0.4 0.4 0.4 0.0 0.0 0.0 -228.0 2.96336237e-07 0.0002295040567714756 +Body228 2.96336237e-07 0.0002295040567714756 7.07980829e-06 0.1690507006104184 0.0015495487122857464 0.506258533467444 118.3395525479282 111.12727377366951 20.62163702517497 0.4 0.4 0.4 0.0 0.0 0.0 -229.0 2.96336237e-07 0.000680188629669569 +Body229 2.96336237e-07 0.000680188629669569 7.07980829e-06 0.5010210538778258 0.0018125122300620218 3.516518540160953 286.18394034264486 46.65261004443694 180.6934797702036 0.4 0.4 0.4 0.0 0.0 0.0 -230.0 2.96336237e-07 0.0008309321372508847 +Body230 2.96336237e-07 0.0008309321372508847 7.07980829e-06 0.612057416056242 0.0013479381556343616 8.781970742963736 4.6502582809159225 235.79852002674681 254.58469355674114 0.4 0.4 0.4 0.0 0.0 0.0 -231.0 2.96336237e-07 0.00028875338348513253 +Body231 2.96336237e-07 0.00028875338348513253 7.07980829e-06 0.21269324154211386 0.0017014082467900972 10.805769273150426 210.4351975769534 16.69354930850494 307.16209275059845 0.4 0.4 0.4 0.0 0.0 0.0 -232.0 2.96336237e-07 0.004789166988213282 +Body232 2.96336237e-07 0.004789166988213282 7.07980829e-06 3.5276589271966508 0.00016917592282757524 0.0919403618348367 5.541775361397037 316.5417521480938 19.724330375795756 0.4 0.4 0.4 0.0 0.0 0.0 -233.0 2.96336237e-07 0.00015602774231945101 +Body233 2.96336237e-07 0.00015602774231945101 7.07980829e-06 0.1149286837226979 0.0005694907494871749 4.2061005176099675 298.3884159608733 160.7896563736114 54.12728271096299 0.4 0.4 0.4 0.0 0.0 0.0 -234.0 2.96336237e-07 0.00033361659151024965 +Body234 2.96336237e-07 0.00033361659151024965 7.07980829e-06 0.24573909203803246 0.0008538548336281108 5.267761887787151 69.88816687432661 130.85673441359256 330.0663861704082 0.4 0.4 0.4 0.0 0.0 0.0 -235.0 2.96336237e-07 0.0007255629284671912 +Body235 2.96336237e-07 0.0007255629284671912 7.07980829e-06 0.5344433694104976 0.00029151450416525646 5.790283282713547 209.80207261084993 200.85446052779668 22.50654792931252 0.4 0.4 0.4 0.0 0.0 0.0 -236.0 2.96336237e-07 0.00014050915870131856 +Body236 2.96336237e-07 0.00014050915870131856 7.07980829e-06 0.10349782942743427 0.0007924621844157655 11.173923475547578 11.154342452970775 214.64853940043557 285.1138704849443 0.4 0.4 0.4 0.0 0.0 0.0 -237.0 2.96336237e-07 0.00037797350969624765 +Body237 2.96336237e-07 0.00037797350969624765 7.07980829e-06 0.2784120138231516 0.00035560782977214273 3.5867703877553323 347.79807714965494 142.65591536366088 120.30910012971961 0.4 0.4 0.4 0.0 0.0 0.0 -238.0 2.96336237e-07 0.0002818717377284597 +Body238 2.96336237e-07 0.0002818717377284597 7.07980829e-06 0.20762428087586896 0.0019345055907977475 4.699858656823634 11.910525225358313 225.4147272411337 227.5842364756943 0.4 0.4 0.4 0.0 0.0 0.0 -239.0 2.96336237e-07 0.00017962394541836337 +Body239 2.96336237e-07 0.00017962394541836337 7.07980829e-06 0.13230944257171812 0.0005909912378243259 6.874912174730618 4.410205837761819 12.178632782698875 168.85550551610942 0.4 0.4 0.4 0.0 0.0 0.0 -240.0 2.96336237e-07 0.00014763491417794765 +Body240 2.96336237e-07 0.00014763491417794765 7.07980829e-06 0.10874659919929998 0.0001487868707847223 8.592895875798417 341.2285492296072 117.82083180908305 107.39008168704405 0.4 0.4 0.4 0.0 0.0 0.0 -241.0 2.96336237e-07 0.00021413852875499322 +Body241 2.96336237e-07 0.00021413852875499322 7.07980829e-06 0.15773258574580046 0.0013968876742388708 2.5666121192866873 7.892521759158565 273.23494428618056 114.36072842368112 0.4 0.4 0.4 0.0 0.0 0.0 -242.0 2.96336237e-07 0.000302920880213668 +Body242 2.96336237e-07 0.000302920880213668 7.07980829e-06 0.2231288969355152 0.001490662786820567 8.823469116533468 77.74603760548976 256.1711765244276 190.7090045158862 0.4 0.4 0.4 0.0 0.0 0.0 -243.0 2.96336237e-07 0.002176341257532404 +Body243 2.96336237e-07 0.002176341257532404 7.07980829e-06 1.603074122212809 1.1249616815154717e-05 7.221093398248473 333.49253555301203 218.11923385527152 275.41388027309995 0.4 0.4 0.4 0.0 0.0 0.0 -244.0 2.96336237e-07 0.00024317880758719938 +Body244 2.96336237e-07 0.00024317880758719938 7.07980829e-06 0.17912340363184193 0.000336998420125595 7.724078976290007 161.37544585797195 241.90498095337946 69.3977624533481 0.4 0.4 0.4 0.0 0.0 0.0 -245.0 2.96336237e-07 0.00038691804961616397 +Body245 2.96336237e-07 0.00038691804961616397 7.07980829e-06 0.2850004844644586 9.420942546640277e-05 7.669912374939788 259.7007514363307 35.13983765302773 10.91017038567923 0.4 0.4 0.4 0.0 0.0 0.0 -246.0 2.96336237e-07 0.00047054547278308634 +Body246 2.96336237e-07 0.00047054547278308634 7.07980829e-06 0.3465997201184457 0.0009193224760291305 6.7204038763804865 161.4453141138866 180.73760235721628 141.2837397885981 0.4 0.4 0.4 0.0 0.0 0.0 -247.0 2.96336237e-07 0.0001594873671616805 +Body247 2.96336237e-07 0.0001594873671616805 7.07980829e-06 0.11747701341959062 0.0014297941505331205 9.641397929251935 46.77020617086623 74.02294078385285 275.92894966924365 0.4 0.4 0.4 0.0 0.0 0.0 -248.0 2.96336237e-07 0.0010118558762477353 +Body248 2.96336237e-07 0.0010118558762477353 7.07980829e-06 0.7453242753210819 0.0019755797078711747 6.782190434597142 78.2813100583065 150.3875582241861 12.61430541775426 0.4 0.4 0.4 0.0 0.0 0.0 -249.0 2.96336237e-07 0.0006915933047027637 +Body249 2.96336237e-07 0.0006915933047027637 7.07980829e-06 0.5094216387377067 0.0011040779288285353 9.711103505274918 341.190827080925 137.43932028377347 142.79616533586562 0.4 0.4 0.4 0.0 0.0 0.0 -250.0 2.96336237e-07 0.0004130865867584533 +Body250 2.96336237e-07 0.0004130865867584533 7.07980829e-06 0.30427600229227064 0.0006650742528771187 2.3314517503433927 348.7061105973839 33.495458937222274 142.47561828090258 0.4 0.4 0.4 0.0 0.0 0.0 -251.0 2.96336237e-07 0.00014720505103971152 +Body251 2.96336237e-07 0.00014720505103971152 7.07980829e-06 0.10842996573448166 0.0017727333230638425 5.354009837425878 23.03294932605134 357.9059136353031 67.57407478038287 0.4 0.4 0.4 0.0 0.0 0.0 -252.0 2.96336237e-07 0.000984600319821135 +Body252 2.96336237e-07 0.000984600319821135 7.07980829e-06 0.725248068502518 0.0016807788727423241 2.745464915439347 207.77125122588643 259.65622404449584 55.63308259585522 0.4 0.4 0.4 0.0 0.0 0.0 -253.0 2.96336237e-07 0.00040567014772123635 +Body253 2.96336237e-07 0.00040567014772123635 7.07980829e-06 0.29881311752712514 0.0005181305464388276 2.907943351307752 174.15791217888955 248.3289466312303 65.98173066158998 0.4 0.4 0.4 0.0 0.0 0.0 -254.0 2.96336237e-07 0.00023718335075471962 +Body254 2.96336237e-07 0.00023718335075471962 7.07980829e-06 0.17470720205236642 0.0004048198416281155 2.942839656148467 107.79982635849616 232.18812022144456 210.21701646839182 0.4 0.4 0.4 0.0 0.0 0.0 -255.0 2.96336237e-07 0.004283665517049441 +Body255 2.96336237e-07 0.004283665517049441 7.07980829e-06 3.155310921405471 0.0008690751471973748 2.9468228217980252 299.4906587956731 350.15633095889694 75.52026808606432 0.4 0.4 0.4 0.0 0.0 0.0 -256.0 2.96336237e-07 0.000817134870139535 +Body256 2.96336237e-07 0.000817134870139535 7.07980829e-06 0.6018944685925062 0.0005609106650894346 3.367785048520667 233.83059625294527 309.822511579689 97.28410767563408 0.4 0.4 0.4 0.0 0.0 0.0 -257.0 2.96336237e-07 0.00015528474379070223 +Body257 2.96336237e-07 0.00015528474379070223 7.07980829e-06 0.11438139744112007 0.0011797166186013966 10.837249867290915 169.6006931282434 208.11075987000896 233.87472157884088 0.4 0.4 0.4 0.0 0.0 0.0 -258.0 2.96336237e-07 0.0008434582955810151 +Body258 2.96336237e-07 0.0008434582955810151 7.07980829e-06 0.6212840758001004 0.0008612378969723491 5.01164468826643 198.09164937559453 354.2664945635985 289.3258487055918 0.4 0.4 0.4 0.0 0.0 0.0 -259.0 2.96336237e-07 0.0002147178424179851 +Body259 2.96336237e-07 0.0002147178424179851 7.07980829e-06 0.15815930317284568 0.00048635766663721026 7.555015607446637 120.8362654476432 47.0664105312282 66.63879584602019 0.4 0.4 0.4 0.0 0.0 0.0 -260.0 2.96336237e-07 0.0004047082180033782 +Body260 2.96336237e-07 0.0004047082180033782 7.07980829e-06 0.298104568427691 0.0010505831612709206 3.5709675793137308 224.89284013971303 178.55081080406057 334.3940893078972 0.4 0.4 0.4 0.0 0.0 0.0 -261.0 2.96336237e-07 0.00016261985975975462 +Body261 2.96336237e-07 0.00016261985975975462 7.07980829e-06 0.11978438033854957 0.0006309182599047637 2.0017352253487477 31.612113473826636 341.20755547153817 89.2680098475455 0.4 0.4 0.4 0.0 0.0 0.0 -262.0 2.96336237e-07 0.00017805495279096215 +Body262 2.96336237e-07 0.00017805495279096215 7.07980829e-06 0.13115373619055 0.0018221731090361927 4.067869231849736 119.11962705630604 333.0495355236492 149.44948219551455 0.4 0.4 0.4 0.0 0.0 0.0 -263.0 2.96336237e-07 0.0002406453365312257 +Body263 2.96336237e-07 0.0002406453365312257 7.07980829e-06 0.17725727079300055 0.0009377733636088368 10.395809749714058 270.9505765961 298.9615482937117 288.5573654373031 0.4 0.4 0.4 0.0 0.0 0.0 -264.0 2.96336237e-07 0.0005833010762516816 +Body264 2.96336237e-07 0.0005833010762516816 7.07980829e-06 0.42965452111961755 0.0015665462291608002 3.6943684564611403 164.81313967514203 8.491196746822613 354.10643082270167 0.4 0.4 0.4 0.0 0.0 0.0 -265.0 2.96336237e-07 0.0004650446566381699 +Body265 2.96336237e-07 0.0004650446566381699 7.07980829e-06 0.3425478665856205 0.0011592257075281403 2.8377121499569835 155.09023565207045 114.58340895178573 132.77196435560555 0.4 0.4 0.4 0.0 0.0 0.0 -266.0 2.96336237e-07 0.0002830521676258744 +Body266 2.96336237e-07 0.0002830521676258744 7.07980829e-06 0.20849377531525543 0.0009276865729839454 5.071334838260017 78.03911987700765 127.5115304739284 162.63541069544019 0.4 0.4 0.4 0.0 0.0 0.0 -267.0 2.96336237e-07 0.0005591199386490625 +Body267 2.96336237e-07 0.0005591199386490625 7.07980829e-06 0.41184290458096057 0.001963941440472467 1.4928876090999643 197.58335766687242 234.72955990999395 115.31060076949608 0.4 0.4 0.4 0.0 0.0 0.0 -268.0 2.96336237e-07 0.00045605011976187506 +Body268 2.96336237e-07 0.00045605011976187506 7.07980829e-06 0.335922568619241 0.00019918741957323128 3.782891073799093 250.13842381649116 326.9879175546122 293.37785999714566 0.4 0.4 0.4 0.0 0.0 0.0 -269.0 2.96336237e-07 0.004221674486263204 +Body269 2.96336237e-07 0.004221674486263204 7.07980829e-06 3.109648864998293 9.395893190170921e-05 6.959994520926894 302.0166560623343 69.93562142002673 204.67515235084042 0.4 0.4 0.4 0.0 0.0 0.0 -270.0 2.96336237e-07 0.0028958481002412154 +Body270 2.96336237e-07 0.0028958481002412154 7.07980829e-06 2.133056631302087 0.0017127018283247966 1.2994943768340637 27.3948787970591 164.80826908236628 91.06657370776342 0.4 0.4 0.4 0.0 0.0 0.0 -271.0 2.96336237e-07 0.0027918986640844586 +Body271 2.96336237e-07 0.0027918986640844586 7.07980829e-06 2.05648837687748 0.000909040281369389 6.316269060791007 353.38275478294435 210.45802798856064 276.50218980188725 0.4 0.4 0.4 0.0 0.0 0.0 -272.0 2.96336237e-07 0.0006193301949800568 +Body272 2.96336237e-07 0.0006193301949800568 7.07980829e-06 0.4561932579467078 0.000531155583006727 0.9557363211994999 35.14124101438557 62.789057177241475 204.8361250748343 0.4 0.4 0.4 0.0 0.0 0.0 -273.0 2.96336237e-07 0.0013633319545579942 +Body273 2.96336237e-07 0.0013633319545579942 7.07980829e-06 1.0042185106648833 0.0006243122502952267 1.6622398169826273 88.79831610924471 31.759105856310057 349.87779027468093 0.4 0.4 0.4 0.0 0.0 0.0 -274.0 2.96336237e-07 0.00022448066128420477 +Body274 2.96336237e-07 0.00022448066128420477 7.07980829e-06 0.1653505109993392 0.000984910938394988 8.64712660160123 96.32856540828398 33.39814592089414 190.49175636262328 0.4 0.4 0.4 0.0 0.0 0.0 -275.0 2.96336237e-07 0.00023385189275707766 +Body275 2.96336237e-07 0.00023385189275707766 7.07980829e-06 0.17225327894321488 0.0004507722173204072 2.0623087142726786 90.86674638551156 35.708335043797334 6.1504009310031424 0.4 0.4 0.4 0.0 0.0 0.0 -276.0 2.96336237e-07 0.0007236741577720057 +Body276 2.96336237e-07 0.0007236741577720057 7.07980829e-06 0.5330521172740204 0.0010252529693844888 2.425520360206466 145.93090085987384 124.27193077457585 301.5935684271459 0.4 0.4 0.4 0.0 0.0 0.0 -277.0 2.96336237e-07 0.004877712984588716 +Body277 2.96336237e-07 0.004877712984588716 7.07980829e-06 3.592881141278991 5.830717080473449e-05 3.526339375615492 351.36151318117334 338.22374970629886 148.99798219413535 0.4 0.4 0.4 0.0 0.0 0.0 -278.0 2.96336237e-07 0.0015932248899463701 +Body278 2.96336237e-07 0.0015932248899463701 7.07980829e-06 1.1735556558966482 0.0004713092568289672 2.4420849935412474 124.5320238473141 142.44497982130548 348.8685090358063 0.4 0.4 0.4 0.0 0.0 0.0 -279.0 2.96336237e-07 0.00015438530451958966 +Body279 2.96336237e-07 0.00015438530451958966 7.07980829e-06 0.11371887826356362 0.001684106342533987 4.260438131801079 118.06852705903006 63.0824313989246 107.32296690173546 0.4 0.4 0.4 0.0 0.0 0.0 -280.0 2.96336237e-07 0.0004676223281528159 +Body280 2.96336237e-07 0.0004676223281528159 7.07980829e-06 0.3444465570995242 0.00017458176162088424 8.771994098916668 289.96532402399885 263.43716217781775 88.67844086604237 0.4 0.4 0.4 0.0 0.0 0.0 -281.0 2.96336237e-07 0.00030689082150139386 +Body281 2.96336237e-07 0.00030689082150139386 7.07980829e-06 0.2260531213065926 0.0001389546880067447 8.317900590662783 129.3093251303657 126.75033720369892 39.68818985068336 0.4 0.4 0.4 0.0 0.0 0.0 -282.0 2.96336237e-07 0.00016337000737253707 +Body282 2.96336237e-07 0.00016337000737253707 7.07980829e-06 0.12033693257351236 0.0007847664923863612 5.325462720215728 201.2719119400836 166.04592478545598 170.03779621767723 0.4 0.4 0.4 0.0 0.0 0.0 -283.0 2.96336237e-07 0.00035652831014559557 +Body283 2.96336237e-07 0.00035652831014559557 7.07980829e-06 0.26261566555913024 0.0014982151714328952 10.962654304958802 228.23841788964108 174.9792769157084 123.96613498843118 0.4 0.4 0.4 0.0 0.0 0.0 -284.0 2.96336237e-07 0.00029163914318341435 +Body284 2.96336237e-07 0.00029163914318341435 7.07980829e-06 0.21481886714390272 0.00021469580921765585 4.1290254174892365 66.5908804077143 125.64321519201816 166.41069852906648 0.4 0.4 0.4 0.0 0.0 0.0 -285.0 2.96336237e-07 0.002472326230018165 +Body285 2.96336237e-07 0.002472326230018165 7.07980829e-06 1.821094089584001 2.107474130330652e-06 3.7825140479516866 192.21174039003108 264.52980539740355 347.8641428782904 0.4 0.4 0.4 0.0 0.0 0.0 -286.0 2.96336237e-07 0.0001933634368959666 +Body286 2.96336237e-07 0.0001933634368959666 7.07980829e-06 0.14242983300399903 0.0009824500665722429 8.409381527228243 318.1547354292355 345.2908820248665 284.6050377786674 0.4 0.4 0.4 0.0 0.0 0.0 -287.0 2.96336237e-07 0.0006119929742245199 +Body287 2.96336237e-07 0.0006119929742245199 7.07980829e-06 0.45078872468178216 0.0013030763010814608 11.232159219303057 285.95416096202626 200.28696560521092 320.0404299094864 0.4 0.4 0.4 0.0 0.0 0.0 -288.0 2.96336237e-07 0.00042826795884411866 +Body288 2.96336237e-07 0.00042826795884411866 7.07980829e-06 0.31545846949312123 0.0009007784181869242 6.879509621691664 89.2096671407246 12.235493134100752 266.0479848260117 0.4 0.4 0.4 0.0 0.0 0.0 -289.0 2.96336237e-07 0.00017410820540282124 +Body289 2.96336237e-07 0.00017410820540282124 7.07980829e-06 0.12824659624503737 0.00014342148426163992 1.0703625616233259 46.538023129070226 107.4930627998194 300.56956795686585 0.4 0.4 0.4 0.0 0.0 0.0 -290.0 2.96336237e-07 0.00015114966336430465 +Body290 2.96336237e-07 0.00015114966336430465 7.07980829e-06 0.11133553301067563 2.766395057426916e-05 5.761202682615806 319.4801151987132 141.96380152116765 189.0460950989753 0.4 0.4 0.4 0.0 0.0 0.0 -291.0 2.96336237e-07 0.00021734923207295198 +Body291 2.96336237e-07 0.00021734923207295198 7.07980829e-06 0.16009756200368674 0.0013191852741356376 5.615188330135927 151.0271919560084 69.3646412761158 192.88078617531676 0.4 0.4 0.4 0.0 0.0 0.0 -292.0 2.96336237e-07 0.0011944697111478653 +Body292 2.96336237e-07 0.0011944697111478653 7.07980829e-06 0.8798360445912934 0.0006850212851320823 6.814346772167117 78.44571808758236 103.92010109199413 242.81886155862486 0.4 0.4 0.4 0.0 0.0 0.0 -293.0 2.96336237e-07 0.00015278398644398032 +Body293 2.96336237e-07 0.00015278398644398032 7.07980829e-06 0.11253936123719822 5.183610896181789e-05 4.053109511534237 236.27362376794815 258.6362917075659 310.0353562648458 0.4 0.4 0.4 0.0 0.0 0.0 -294.0 2.96336237e-07 0.00034896123301151255 +Body294 2.96336237e-07 0.00034896123301151255 7.07980829e-06 0.2570418220764263 6.0769476677815276e-05 5.713343744289857 299.9253937144354 189.19621914314894 101.59353256474273 0.4 0.4 0.4 0.0 0.0 0.0 -295.0 2.96336237e-07 0.00025478314682010465 +Body295 2.96336237e-07 0.00025478314682010465 7.07980829e-06 0.18767105941204867 0.0018449348227060555 1.2835484399431265 290.4682644970513 305.78831832496115 215.73128560603016 0.4 0.4 0.4 0.0 0.0 0.0 -296.0 2.96336237e-07 0.0006250814006742552 +Body296 2.96336237e-07 0.0006250814006742552 7.07980829e-06 0.46042954625304894 0.000596769292531275 2.5129034189216504 145.43775163382543 274.05520730065695 223.66497443462396 0.4 0.4 0.4 0.0 0.0 0.0 -297.0 2.96336237e-07 0.0002282198327816247 +Body297 2.96336237e-07 0.0002282198327816247 7.07980829e-06 0.16810475234144653 0.0017247737094638039 5.107324795408434 124.79937809811587 226.08434523725555 305.7830635332392 0.4 0.4 0.4 0.0 0.0 0.0 -298.0 2.96336237e-07 0.0009477301107050991 +Body298 2.96336237e-07 0.0009477301107050991 7.07980829e-06 0.6980897917800946 0.0001517768392752887 5.574014468921428 249.01242380384846 257.47120895883273 139.97390722263367 0.4 0.4 0.4 0.0 0.0 0.0 -299.0 2.96336237e-07 0.0031407431101470235 +Body299 2.96336237e-07 0.0031407431101470235 7.07980829e-06 2.3134441746987386 0.0015616804960815864 6.117489231243545 256.7324568865978 220.6785657320005 123.0674530910947 0.4 0.4 0.4 0.0 0.0 0.0 -300.0 2.96336237e-07 0.0004204361522249776 +Body300 2.96336237e-07 0.0004204361522249776 7.07980829e-06 0.30968962856439886 0.00195927594219296 6.306085925673815 312.00891473474553 73.99762506858666 216.5279233163698 0.4 0.4 0.4 0.0 0.0 0.0 -301.0 2.96336237e-07 0.0009942157315783549 +Body301 2.96336237e-07 0.0009942157315783549 7.07980829e-06 0.7323306975291335 0.00021855504650573836 8.368350519218684 237.27561034714356 272.3964709349121 286.9144825005913 0.4 0.4 0.4 0.0 0.0 0.0 -302.0 2.96336237e-07 0.00018683411530759256 +Body302 2.96336237e-07 0.00018683411530759256 7.07980829e-06 0.1376203912688386 0.0010315807571819164 5.2755550278547485 44.12983056103787 223.37841130869015 128.86001971717735 0.4 0.4 0.4 0.0 0.0 0.0 -303.0 2.96336237e-07 0.00025133191919356077 +Body303 2.96336237e-07 0.00025133191919356077 7.07980829e-06 0.18512891503150636 0.0009331929516210252 6.536562647357183 291.76734381546066 70.66568841443045 126.26321054382733 0.4 0.4 0.4 0.0 0.0 0.0 -304.0 2.96336237e-07 0.00019500768911756772 +Body304 2.96336237e-07 0.00019500768911756772 7.07980829e-06 0.14364097495047312 0.00039209244628038144 9.848623859718383 245.89557619047113 117.87493794887448 338.12840463525515 0.4 0.4 0.4 0.0 0.0 0.0 -305.0 2.96336237e-07 0.0001625383298355381 +Body305 2.96336237e-07 0.0001625383298355381 7.07980829e-06 0.11972432610245717 0.0011745754487988123 4.387084176328411 106.0618658508988 80.5444882525448 84.64174187568527 0.4 0.4 0.4 0.0 0.0 0.0 -306.0 2.96336237e-07 0.00023586028260954013 +Body306 2.96336237e-07 0.00023586028260954013 7.07980829e-06 0.1737326415149872 0.001671319316829762 5.501673418983377 348.95321631475684 200.94418904994996 330.4440114985243 0.4 0.4 0.4 0.0 0.0 0.0 -307.0 2.96336237e-07 0.0003365884691163788 +Body307 2.96336237e-07 0.0003365884691163788 7.07980829e-06 0.2479281513449222 0.0014193080584742374 11.094828295285224 31.371307509920015 240.58423164611085 165.28222019489715 0.4 0.4 0.4 0.0 0.0 0.0 -308.0 2.96336237e-07 0.00023571497841569307 +Body308 2.96336237e-07 0.00023571497841569307 7.07980829e-06 0.17362561170419857 0.0005768421886276322 5.284489567307279 98.85486595751904 13.212732070412448 230.02980695324322 0.4 0.4 0.4 0.0 0.0 0.0 -309.0 2.96336237e-07 0.0001801084671471839 +Body309 2.96336237e-07 0.0001801084671471839 7.07980829e-06 0.13266633708099312 0.0009177789908346947 5.324485126624002 148.3631841889071 267.83910430205896 59.843201690272075 0.4 0.4 0.4 0.0 0.0 0.0 -310.0 2.96336237e-07 0.004922591836343339 +Body310 2.96336237e-07 0.004922591836343339 7.07980829e-06 3.625938514810581 0.0008037249965389214 1.863877400137279 347.99161053606065 214.8189761659566 173.46818152084595 0.4 0.4 0.4 0.0 0.0 0.0 -311.0 2.96336237e-07 0.001606405521600504 +Body311 2.96336237e-07 0.001606405521600504 7.07980829e-06 1.183264395022937 0.00025039709043080626 11.41113625586248 176.51998858123935 140.35911454474774 147.38759836239387 0.4 0.4 0.4 0.0 0.0 0.0 -312.0 2.96336237e-07 0.00022953580689701405 +Body312 2.96336237e-07 0.00022953580689701405 7.07980829e-06 0.1690740874779198 0.00017995036684982085 2.5624472975864214 93.69670004832261 5.072707264965885 194.42820284682057 0.4 0.4 0.4 0.0 0.0 0.0 -313.0 2.96336237e-07 0.0004560010949555674 +Body313 2.96336237e-07 0.0004560010949555674 7.07980829e-06 0.3358864573714915 0.0017281502204120312 5.808809764521844 316.45299102623267 192.88920395505212 19.031504976546625 0.4 0.4 0.4 0.0 0.0 0.0 -314.0 2.96336237e-07 0.00020589517649069033 +Body314 2.96336237e-07 0.00020589517649069033 7.07980829e-06 0.15166060385902067 0.0014460419115430905 8.580387771814594 2.027448348404554 61.39523640794668 310.8259013460574 0.4 0.4 0.4 0.0 0.0 0.0 -315.0 2.96336237e-07 0.0017103724786315462 +Body315 2.96336237e-07 0.0017103724786315462 7.07980829e-06 1.2598455551718035 0.001040160606823539 8.866568986800155 201.9511825476413 25.06154164547849 167.52608336931982 0.4 0.4 0.4 0.0 0.0 0.0 -316.0 2.96336237e-07 0.00036481350926962107 +Body316 2.96336237e-07 0.00036481350926962107 7.07980829e-06 0.26871847148036926 6.7596178272466e-05 10.264244616216553 96.8748429708464 157.16467008976218 200.80623110746035 0.4 0.4 0.4 0.0 0.0 0.0 -317.0 2.96336237e-07 0.0005677970507966551 +Body317 2.96336237e-07 0.0005677970507966551 7.07980829e-06 0.41823439024121756 0.0016492348678305217 3.985448712266753 141.35422552657585 324.0916041102787 22.20933645695202 0.4 0.4 0.4 0.0 0.0 0.0 -318.0 2.96336237e-07 0.00017869361209387716 +Body318 2.96336237e-07 0.00017869361209387716 7.07980829e-06 0.13162416710200292 0.0011439008076636614 3.2407253494579034 190.01218772119614 44.20946646779479 2.004533467122998 0.4 0.4 0.4 0.0 0.0 0.0 -319.0 2.96336237e-07 0.00015228572269447034 +Body319 2.96336237e-07 0.00015228572269447034 7.07980829e-06 0.11217234447449538 0.0009168186738675861 2.8638522507923314 93.22615350753611 33.85431327929882 239.03387997148917 0.4 0.4 0.4 0.0 0.0 0.0 -320.0 2.96336237e-07 0.0002228749297341271 +Body320 2.96336237e-07 0.0002228749297341271 7.07980829e-06 0.1641677430459031 0.0014250007569514766 8.995787444712223 6.360744237560372 246.00127166536984 117.23024488217823 0.4 0.4 0.4 0.0 0.0 0.0 -321.0 2.96336237e-07 0.00016657687495983734 +Body321 2.96336237e-07 0.00016657687495983734 7.07980829e-06 0.12269908346541473 0.0002722641518232161 2.5361455280784493 294.747187083813 253.91062671694937 21.543427585789953 0.4 0.4 0.4 0.0 0.0 0.0 -322.0 2.96336237e-07 0.0003119834065271981 +Body322 2.96336237e-07 0.0003119834065271981 7.07980829e-06 0.22980427533254327 0.0002561538067768338 7.283682147132967 351.50642528622967 353.05050444668393 37.915945343913684 0.4 0.4 0.4 0.0 0.0 0.0 -323.0 2.96336237e-07 0.0003636327820351304 +Body323 2.96336237e-07 0.0003636327820351304 7.07980829e-06 0.2678487580250677 0.00030140848800125055 7.394557096887053 269.6118768787643 66.8992901686776 271.65173432137044 0.4 0.4 0.4 0.0 0.0 0.0 -324.0 2.96336237e-07 0.00015848034184009056 +Body324 2.96336237e-07 0.00015848034184009056 7.07980829e-06 0.11673524728899572 0.0019276867342928185 8.11274732856384 303.66016858902975 82.72816698207556 313.66739660789585 0.4 0.4 0.4 0.0 0.0 0.0 -325.0 2.96336237e-07 0.00027836204038314506 +Body325 2.96336237e-07 0.00027836204038314506 7.07980829e-06 0.2050390682068539 0.0007631400667376777 10.463799400784199 28.670451511576793 91.11735677392642 254.85925697503265 0.4 0.4 0.4 0.0 0.0 0.0 -326.0 2.96336237e-07 0.00026836168207477904 +Body326 2.96336237e-07 0.00026836168207477904 7.07980829e-06 0.19767289088447285 0.0016214214428952305 8.268846910383754 222.17426119100602 196.7982012673432 282.25263254954075 0.4 0.4 0.4 0.0 0.0 0.0 -327.0 2.96336237e-07 0.0003589316062721598 +Body327 2.96336237e-07 0.0003589316062721598 7.07980829e-06 0.26438591267234157 7.76907304503399e-06 5.047413034763888 173.2690936517081 28.344089675206597 291.5460190814182 0.4 0.4 0.4 0.0 0.0 0.0 -328.0 2.96336237e-07 0.00014822536550915556 +Body328 2.96336237e-07 0.00014822536550915556 7.07980829e-06 0.10918152053629596 0.0010554718431630332 5.294051241865372 280.9870442314642 243.25347719092647 275.98182391301384 0.4 0.4 0.4 0.0 0.0 0.0 -329.0 2.96336237e-07 0.0006505027268334232 +Body329 2.96336237e-07 0.0006505027268334232 7.07980829e-06 0.47915467494187414 0.0006517479027116303 7.292113973652021 5.488359739149935 185.63065345666627 225.7335982038429 0.4 0.4 0.4 0.0 0.0 0.0 -330.0 2.96336237e-07 0.0007169610725077651 +Body330 2.96336237e-07 0.0007169610725077651 7.07980829e-06 0.528107316806692 0.0012695547737103553 2.286365445938052 264.56567615972165 94.99106094678771 139.68443412635122 0.4 0.4 0.4 0.0 0.0 0.0 -331.0 2.96336237e-07 0.00014290244996673993 +Body331 2.96336237e-07 0.00014290244996673993 7.07980829e-06 0.1052607070465743 0.0011677205977731777 0.8176499307396407 273.11035397112664 153.26705683902466 305.48002207509745 0.4 0.4 0.4 0.0 0.0 0.0 -332.0 2.96336237e-07 0.0027107575201529735 +Body332 2.96336237e-07 0.0027107575201529735 7.07980829e-06 1.9967205129760297 0.0002174696896302886 4.548246093501465 31.607783203459267 55.72124572358127 62.8218389960747 0.4 0.4 0.4 0.0 0.0 0.0 -333.0 2.96336237e-07 0.00021889530790215867 +Body333 2.96336237e-07 0.00021889530790215867 7.07980829e-06 0.16123638806977442 0.001444705141822196 9.609484812903395 31.464950213756925 349.80740372868604 234.47574007627532 0.4 0.4 0.4 0.0 0.0 0.0 -334.0 2.96336237e-07 0.0011772666033075512 +Body334 2.96336237e-07 0.0011772666033075512 7.07980829e-06 0.8671643843427015 0.0017419436543695752 7.697186841151445 327.70006686631075 245.93846763390636 237.56052707500405 0.4 0.4 0.4 0.0 0.0 0.0 -335.0 2.96336237e-07 0.00014321614347240008 +Body335 2.96336237e-07 0.00014321614347240008 7.07980829e-06 0.10549177096611795 0.0013551666337921638 5.4536982339343565 10.92195396327973 165.29999635983054 27.633395340256648 0.4 0.4 0.4 0.0 0.0 0.0 -336.0 2.96336237e-07 0.00029889604796622495 +Body336 2.96336237e-07 0.00029889604796622495 7.07980829e-06 0.2201642403588903 0.0013608821634157593 8.38274482236048 46.71017873691516 210.61788270484556 166.69795474367763 0.4 0.4 0.4 0.0 0.0 0.0 -337.0 2.96336237e-07 0.00018415554172083735 +Body337 2.96336237e-07 0.00018415554172083735 7.07980829e-06 0.13564737716247616 0.0003179485550799256 8.136125699171172 152.81408877925242 209.80742536198633 130.40397707101712 0.4 0.4 0.4 0.0 0.0 0.0 -338.0 2.96336237e-07 0.003543703727191604 +Body338 2.96336237e-07 0.003543703727191604 7.07980829e-06 2.6102614753951827 0.0017753297686231334 8.620159985630853 94.67477537826696 273.860740239627 146.26748120005496 0.4 0.4 0.4 0.0 0.0 0.0 -339.0 2.96336237e-07 0.0008243326122071452 +Body339 2.96336237e-07 0.0008243326122071452 7.07980829e-06 0.6071962630638525 0.0007381654194420349 1.990384843054466 310.9770511114949 94.0747249242464 252.80656511785244 0.4 0.4 0.4 0.0 0.0 0.0 -340.0 2.96336237e-07 0.005008804403226113 +Body340 2.96336237e-07 0.005008804403226113 7.07980829e-06 3.6894419449371676 0.0005994918878210641 9.959226775698019 322.9608823547301 50.78959164496634 295.6703866824421 0.4 0.4 0.4 0.0 0.0 0.0 -341.0 2.96336237e-07 0.0001503613961053045 +Body341 2.96336237e-07 0.0001503613961053045 7.07980829e-06 0.11075490217444199 0.0015504100076306501 1.6675619240329276 159.33523472053665 29.682478042780815 205.71814487652136 0.4 0.4 0.4 0.0 0.0 0.0 -342.0 2.96336237e-07 0.00013732826243335652 +Body342 2.96336237e-07 0.00013732826243335652 7.07980829e-06 0.10115480878443323 0.0015317213079232641 10.458820129694365 118.01043838028095 102.64908626926156 336.57718276865387 0.4 0.4 0.4 0.0 0.0 0.0 -343.0 2.96336237e-07 0.001101513135339633 +Body343 2.96336237e-07 0.001101513135339633 7.07980829e-06 0.8113650358963385 0.0006358631971043168 8.635102019265844 290.0593797645032 124.67027381809105 357.8987600908822 0.4 0.4 0.4 0.0 0.0 0.0 -344.0 2.96336237e-07 0.0002496437530839839 +Body344 2.96336237e-07 0.0002496437530839839 7.07980829e-06 0.18388542649546316 0.0017114415848874511 6.152672513669821 227.02003856771577 207.80971255570097 306.4507853203065 0.4 0.4 0.4 0.0 0.0 0.0 -345.0 2.96336237e-07 0.000786402919866365 +Body345 2.96336237e-07 0.000786402919866365 7.07980829e-06 0.5792575801736796 0.001996656772695265 2.4412597448951736 226.3625546241884 331.64674246663526 36.1478697838596 0.4 0.4 0.4 0.0 0.0 0.0 -346.0 2.96336237e-07 0.0003388719406716841 +Body346 2.96336237e-07 0.0003388719406716841 7.07980829e-06 0.24961013671667837 0.0017937088367951564 9.811900318991631 64.85290027540626 118.22661839313105 62.03376070937007 0.4 0.4 0.4 0.0 0.0 0.0 -347.0 2.96336237e-07 0.000426447460349051 +Body347 2.96336237e-07 0.000426447460349051 7.07980829e-06 0.314117506067983 0.00015224476174463102 8.252536131358141 260.43549278392493 32.70366712445605 190.55803156205212 0.4 0.4 0.4 0.0 0.0 0.0 -348.0 2.96336237e-07 0.0006444195357616657 +Body348 2.96336237e-07 0.0006444195357616657 7.07980829e-06 0.47467384908156435 0.0010876343271783054 6.514014864428936 310.5233342327956 343.9574292034065 199.19111614640337 0.4 0.4 0.4 0.0 0.0 0.0 -349.0 2.96336237e-07 0.00054226433855886 +Body349 2.96336237e-07 0.00054226433855886 7.07980829e-06 0.39942721553152877 0.0017981619784875422 10.227345064991548 37.37523364182289 202.41739212372974 269.0861108570201 0.4 0.4 0.4 0.0 0.0 0.0 -350.0 2.96336237e-07 0.00047954498951542 +Body350 2.96336237e-07 0.00047954498951542 7.07980829e-06 0.35322868620365555 0.0016492335376706317 0.49337664309798085 283.7971089038009 95.5833514086352 71.56770760930895 0.4 0.4 0.4 0.0 0.0 0.0 -351.0 2.96336237e-07 0.00028009747225710857 +Body351 2.96336237e-07 0.00028009747225710857 7.07980829e-06 0.20631737229560168 0.0010316139909898982 1.2686189308547466 86.55109564714702 214.38460242228032 104.33146341509861 0.4 0.4 0.4 0.0 0.0 0.0 -352.0 2.96336237e-07 0.00025623404455162827 +Body352 2.96336237e-07 0.00025623404455162827 7.07980829e-06 0.18873977811566775 0.0006452132368777103 0.6050579146050421 157.43781147686246 2.5850389604214 159.43765898916868 0.4 0.4 0.4 0.0 0.0 0.0 -353.0 2.96336237e-07 0.0004058236215884254 +Body353 2.96336237e-07 0.0004058236215884254 7.07980829e-06 0.29892616504854447 1.3191328167835538e-05 1.9784258448731697 189.94678909317844 33.557846185365456 293.99534737705994 0.4 0.4 0.4 0.0 0.0 0.0 -354.0 2.96336237e-07 0.00019280291180421137 +Body354 2.96336237e-07 0.00019280291180421137 7.07980829e-06 0.14201695507580933 0.001647108671401029 3.5640591075394887 135.654713397442 47.85588862949121 320.6811997480477 0.4 0.4 0.4 0.0 0.0 0.0 -355.0 2.96336237e-07 0.004773934278971867 +Body355 2.96336237e-07 0.004773934278971867 7.07980829e-06 3.516438645491477 0.0010761216903622214 3.221566589364664 37.186866202379946 309.6540427909378 16.17630653640015 0.4 0.4 0.4 0.0 0.0 0.0 -356.0 2.96336237e-07 0.0011590159350373256 +Body356 2.96336237e-07 0.0011590159350373256 7.07980829e-06 0.8537211001537772 0.0017587197664019573 7.585968540023092 278.7934262814676 99.53015751946636 352.88619866914877 0.4 0.4 0.4 0.0 0.0 0.0 -357.0 2.96336237e-07 0.0017832929898511443 +Body357 2.96336237e-07 0.0017832929898511443 7.07980829e-06 1.3135581722120224 3.17502276408299e-05 11.030328628464801 98.53532708337863 56.9975562596022 33.71040048985311 0.4 0.4 0.4 0.0 0.0 0.0 -358.0 2.96336237e-07 0.00039697861826237725 +Body358 2.96336237e-07 0.00039697861826237725 7.07980829e-06 0.29241101220024956 0.0008458555454990808 10.58777976211051 239.12203417314623 133.0689566770032 115.70577915610316 0.4 0.4 0.4 0.0 0.0 0.0 -359.0 2.96336237e-07 0.00029557716051867804 +Body359 2.96336237e-07 0.00029557716051867804 7.07980829e-06 0.21771957660807217 0.0010392643981527155 8.03170940349945 288.9256328269013 67.78208540280802 342.17504476494315 0.4 0.4 0.4 0.0 0.0 0.0 -360.0 2.96336237e-07 0.0014833560516777343 +Body360 2.96336237e-07 0.0014833560516777343 7.07980829e-06 1.0926272211410928 0.0006092108167580567 2.2096414041046692 311.3662182072021 291.7919905103377 304.97098144688493 0.4 0.4 0.4 0.0 0.0 0.0 -361.0 2.96336237e-07 0.000993445612055267 +Body361 2.96336237e-07 0.000993445612055267 7.07980829e-06 0.7317634341580055 0.0014006123392814103 2.1919067330947506 120.01996203370337 128.74716731340266 5.827785850564331 0.4 0.4 0.4 0.0 0.0 0.0 -362.0 2.96336237e-07 0.0005463426586983324 +Body362 2.96336237e-07 0.0005463426586983324 7.07980829e-06 0.40243127082619357 0.0011965762956253783 10.898821474898226 281.91463076199005 29.575440192365903 214.20508522622518 0.4 0.4 0.4 0.0 0.0 0.0 -363.0 2.96336237e-07 0.0003881791589043536 +Body363 2.96336237e-07 0.0003881791589043536 7.07980829e-06 0.2859294066443704 2.900497725161311e-05 9.127483813809095 249.54173239568317 90.63367169371816 266.5485228009919 0.4 0.4 0.4 0.0 0.0 0.0 -364.0 2.96336237e-07 0.0013968631201863857 +Body364 2.96336237e-07 0.0013968631201863857 7.07980829e-06 1.028917276871913 0.001603944913241954 3.0960547395036917 11.620252615054142 44.62761359844495 198.88658277447743 0.4 0.4 0.4 0.0 0.0 0.0 -365.0 2.96336237e-07 0.0002630194417645936 +Body365 2.96336237e-07 0.0002630194417645936 7.07980829e-06 0.1937378429381731 0.000747167760463149 7.1657186191455775 228.24188046622197 277.72286896705293 91.13011664684869 0.4 0.4 0.4 0.0 0.0 0.0 -366.0 2.96336237e-07 0.0002749926323670147 +Body366 2.96336237e-07 0.0002749926323670147 7.07980829e-06 0.2025571914427479 0.00133596025404816 4.503723068347708 73.89042601654641 43.869574691929124 124.89440067010928 0.4 0.4 0.4 0.0 0.0 0.0 -367.0 2.96336237e-07 0.00034802520380482264 +Body367 2.96336237e-07 0.00034802520380482264 7.07980829e-06 0.25635235106920873 0.0003990604853807404 4.721069759511323 289.9667438551355 89.90143863984306 308.2229017081904 0.4 0.4 0.4 0.0 0.0 0.0 -368.0 2.96336237e-07 0.00036443935286634496 +Body368 2.96336237e-07 0.00036443935286634496 7.07980829e-06 0.26844287111407733 0.0008485077286316471 6.764038727594673 253.3611698186918 150.74732229379677 328.9769827782936 0.4 0.4 0.4 0.0 0.0 0.0 -369.0 2.96336237e-07 0.0008469945776758163 +Body369 2.96336237e-07 0.0008469945776758163 7.07980829e-06 0.6238888705653514 0.0001333427676397332 4.1474959515146415 267.71710049416396 150.87718065006715 119.97373879602044 0.4 0.4 0.4 0.0 0.0 0.0 -370.0 2.96336237e-07 0.0002799708966091264 +Body370 2.96336237e-07 0.0002799708966091264 7.07980829e-06 0.20622413776949955 0.0005428172476920105 6.168519622305448 96.33658992043293 129.60600999117443 297.12149196391545 0.4 0.4 0.4 0.0 0.0 0.0 -371.0 2.96336237e-07 0.0005421356999893545 +Body371 2.96336237e-07 0.0005421356999893545 7.07980829e-06 0.3993324614752984 0.0009919338011116921 4.745092400309358 295.19339993138095 291.6130480807459 203.70027399593255 0.4 0.4 0.4 0.0 0.0 0.0 -372.0 2.96336237e-07 0.0006294503606226284 +Body372 2.96336237e-07 0.0006294503606226284 7.07980829e-06 0.46364768431387976 0.00041641717513561904 1.934529957130357 350.8676271559399 177.52429758946244 62.301164228997536 0.4 0.4 0.4 0.0 0.0 0.0 -373.0 2.96336237e-07 0.0002809800292278342 +Body373 2.96336237e-07 0.0002809800292278342 7.07980829e-06 0.20696745611690134 0.0008475677763260917 0.46568355676114265 14.900153214321696 190.0523015188567 319.6113375878809 0.4 0.4 0.4 0.0 0.0 0.0 -374.0 2.96336237e-07 0.0018166312625594561 +Body374 2.96336237e-07 0.0018166312625594561 7.07980829e-06 1.3381148551646602 0.0010624355759753792 6.933338705363457 257.43788022187965 295.18471400586776 295.1190325206985 0.4 0.4 0.4 0.0 0.0 0.0 -375.0 2.96336237e-07 0.00016392755580813283 +Body375 2.96336237e-07 0.00016392755580813283 7.07980829e-06 0.12074761792255417 0.00023695768245123492 3.1581589183258623 339.1487157944927 83.23577626586008 345.89695591969786 0.4 0.4 0.4 0.0 0.0 0.0 -376.0 2.96336237e-07 0.00029571793986295827 +Body376 2.96336237e-07 0.00029571793986295827 7.07980829e-06 0.2178232734538571 0.0002948999251832698 0.362705770588533 213.82508431076934 242.2651748717798 83.27447892616063 0.4 0.4 0.4 0.0 0.0 0.0 -377.0 2.96336237e-07 0.00020811537789423138 +Body377 2.96336237e-07 0.00020811537789423138 7.07980829e-06 0.15329598498493502 0.0018051616135915112 3.106896506398628 178.3112067859215 63.88472884866744 1.3270972588545527 0.4 0.4 0.4 0.0 0.0 0.0 -378.0 2.96336237e-07 0.0001559380129035177 +Body378 2.96336237e-07 0.0001559380129035177 7.07980829e-06 0.11486258981201816 0.0017844542058524017 6.130540321897014 288.19324195157367 344.28272044710786 210.06820283808818 0.4 0.4 0.4 0.0 0.0 0.0 -379.0 2.96336237e-07 0.0012589113538808599 +Body379 2.96336237e-07 0.0012589113538808599 7.07980829e-06 0.9273032005350614 0.0007950274671429485 0.7443682928155341 206.7513766110101 220.9240832277189 190.998462308951 0.4 0.4 0.4 0.0 0.0 0.0 -380.0 2.96336237e-07 0.0021256371126569047 +Body380 2.96336237e-07 0.0021256371126569047 7.07980829e-06 1.5657258882180163 1.9263879203954986e-05 5.128316556491018 239.8438686641544 174.44658062206983 247.6331818960163 0.4 0.4 0.4 0.0 0.0 0.0 -381.0 2.96336237e-07 0.000977305599748203 +Body381 2.96336237e-07 0.000977305599748203 7.07980829e-06 0.7198748408723243 0.0010168747207552594 6.687759662707231 346.7619173455041 149.905703053694 34.41280092344825 0.4 0.4 0.4 0.0 0.0 0.0 -382.0 2.96336237e-07 0.0008650682748260707 +Body382 2.96336237e-07 0.0008650682748260707 7.07980829e-06 0.6372017993599538 0.0006067227825775598 3.8110465174551575 283.42141873127645 296.75010671228034 236.75772996243154 0.4 0.4 0.4 0.0 0.0 0.0 -383.0 2.96336237e-07 0.0004166997753732313 +Body383 2.96336237e-07 0.0004166997753732313 7.07980829e-06 0.3069374457340919 0.0012556587656461812 7.028090843879932 157.07945315433642 109.64383603363065 170.14986474214172 0.4 0.4 0.4 0.0 0.0 0.0 -384.0 2.96336237e-07 0.0012888125307341934 +Body384 2.96336237e-07 0.0012888125307341934 7.07980829e-06 0.9493281484477046 0.0011246500645733703 1.0945156676865877 40.94588274454956 313.0368841398567 91.0294850281977 0.4 0.4 0.4 0.0 0.0 0.0 -385.0 2.96336237e-07 0.0004170975464251864 +Body385 2.96336237e-07 0.0004170975464251864 7.07980829e-06 0.3072304404460873 0.0005324736339296211 8.850334116104705 277.3659221161124 9.697380193441212 64.32137229646291 0.4 0.4 0.4 0.0 0.0 0.0 -386.0 2.96336237e-07 0.0006424192463846406 +Body386 2.96336237e-07 0.0006424192463846406 7.07980829e-06 0.4732004532498454 0.0009767299868219384 4.560220727189972 141.0032517869996 198.6227331147623 95.44242731540014 0.4 0.4 0.4 0.0 0.0 0.0 -387.0 2.96336237e-07 0.00029749720154096163 +Body387 2.96336237e-07 0.00029749720154096163 7.07980829e-06 0.21913386219667502 3.8428933346828534e-05 0.4566407574340587 163.58034265489712 30.086812659347586 336.68557772655623 0.4 0.4 0.4 0.0 0.0 0.0 -388.0 2.96336237e-07 0.00037333395328135164 +Body388 2.96336237e-07 0.00037333395328135164 7.07980829e-06 0.2749945567485662 0.000790150080386718 1.8156192287506017 43.99805042163406 347.86839033496585 214.04308309953382 0.4 0.4 0.4 0.0 0.0 0.0 -389.0 2.96336237e-07 0.004147011336074886 +Body389 2.96336237e-07 0.004147011336074886 7.07980829e-06 3.054652635185745 0.0014026881427117554 10.790384698103471 279.67254068824695 225.0250301683067 97.97655801733977 0.4 0.4 0.4 0.0 0.0 0.0 -390.0 2.96336237e-07 0.00033661360847250473 +Body390 2.96336237e-07 0.00033661360847250473 7.07980829e-06 0.24794666877692653 0.0007621219491829389 9.595112059936255 106.89981329122423 248.35330221528335 176.9399293058729 0.4 0.4 0.4 0.0 0.0 0.0 -391.0 2.96336237e-07 0.0005946763114846585 +Body391 2.96336237e-07 0.0005946763114846585 7.07980829e-06 0.4380334208776199 0.000334786490861461 7.27688899569563 346.55013797445457 314.40373096079713 182.33788039799467 0.4 0.4 0.4 0.0 0.0 0.0 -392.0 2.96336237e-07 0.0021357003856353578 +Body392 2.96336237e-07 0.0021357003856353578 7.07980829e-06 1.573138407941514 0.0002122062437119598 5.7992283642476155 199.8708344637552 185.03678107510362 197.54499438742337 0.4 0.4 0.4 0.0 0.0 0.0 -393.0 2.96336237e-07 0.0008881507473098536 +Body393 2.96336237e-07 0.0008881507473098536 7.07980829e-06 0.6542041486870058 0.001082481934100155 2.7982249640470442 119.9027947481912 170.5019847492018 291.70022422658934 0.4 0.4 0.4 0.0 0.0 0.0 -394.0 2.96336237e-07 0.0007244470355779672 +Body394 2.96336237e-07 0.0007244470355779672 7.07980829e-06 0.5336214123724252 9.630470210241686e-05 5.950031157607894 126.92938559220951 32.644368454661134 350.5658369759275 0.4 0.4 0.4 0.0 0.0 0.0 -395.0 2.96336237e-07 0.0006653067544630493 +Body395 2.96336237e-07 0.0006653067544630493 7.07980829e-06 0.4900591934843774 0.0019737014910964673 0.8943016802588735 272.8273238811659 55.953417510337296 50.223313961578874 0.4 0.4 0.4 0.0 0.0 0.0 -396.0 2.96336237e-07 0.0007161433044466716 +Body396 2.96336237e-07 0.0007161433044466716 7.07980829e-06 0.5275049559351265 0.0005776380861563799 2.1625712495313376 323.42339680121006 295.9412274627063 312.5321427083825 0.4 0.4 0.4 0.0 0.0 0.0 -397.0 2.96336237e-07 0.00019237855607078444 +Body397 2.96336237e-07 0.00019237855607078444 7.07980829e-06 0.14170437831767688 0.001235027961422897 8.862824259166967 187.64716698671413 265.10784930422506 313.1562873499811 0.4 0.4 0.4 0.0 0.0 0.0 -398.0 2.96336237e-07 0.0002694653837463263 +Body398 2.96336237e-07 0.0002694653837463263 7.07980829e-06 0.19848586797718606 0.0001843567188453995 7.817351154193235 10.9747308973224 84.04994685907948 167.64074726542177 0.4 0.4 0.4 0.0 0.0 0.0 -399.0 2.96336237e-07 0.0005559092662315294 +Body399 2.96336237e-07 0.0005559092662315294 7.07980829e-06 0.40947795108406015 0.0015731368864208269 7.301942896898631 233.93068498816038 96.85691573796926 228.57420704043378 0.4 0.4 0.4 0.0 0.0 0.0 -400.0 2.96336237e-07 0.0005648674168838437 +Body400 2.96336237e-07 0.0005648674168838437 7.07980829e-06 0.4160764472729765 0.0008511691534231788 11.02211477235316 288.5365659185221 243.18693500084063 147.5758032364719 0.4 0.4 0.4 0.0 0.0 0.0 -401.0 2.96336237e-07 0.0003563429630533414 +Body401 2.96336237e-07 0.0003563429630533414 7.07980829e-06 0.2624791404961643 0.0006910428723700232 1.6815715845642314 345.6424607017423 5.893839931298697 6.255682574253842 0.4 0.4 0.4 0.0 0.0 0.0 -402.0 2.96336237e-07 0.00016104257317250704 +Body402 2.96336237e-07 0.00016104257317250704 7.07980829e-06 0.11862256469838804 0.0010496344692817025 4.916447327909487 302.6523312870475 77.2459630669138 352.07919775440547 0.4 0.4 0.4 0.0 0.0 0.0 -403.0 2.96336237e-07 0.0005296002136298966 +Body403 2.96336237e-07 0.0005296002136298966 7.07980829e-06 0.39009893078582225 0.00035129161820691924 6.677196188784857 287.91001686761524 41.031404630978 88.87616473052356 0.4 0.4 0.4 0.0 0.0 0.0 -404.0 2.96336237e-07 0.000680609470172004 +Body404 2.96336237e-07 0.000680609470172004 7.07980829e-06 0.501331041347253 0.001425845881592816 3.2094418329058256 221.46587179584483 243.95606935186083 110.57964936968159 0.4 0.4 0.4 0.0 0.0 0.0 -405.0 2.96336237e-07 0.00036071081000078566 +Body405 2.96336237e-07 0.00036071081000078566 7.07980829e-06 0.26569645873014985 0.0005837248865675421 4.246745909239596 68.65912803601522 184.39073957774 328.5406871742207 0.4 0.4 0.4 0.0 0.0 0.0 -406.0 2.96336237e-07 0.0012218677490596584 +Body406 2.96336237e-07 0.0012218677490596584 7.07980829e-06 0.9000172020378971 0.001653325602643437 0.4316924490710903 243.42814614167057 36.062607930561725 200.57349259723486 0.4 0.4 0.4 0.0 0.0 0.0 -407.0 2.96336237e-07 0.00022469531896527966 +Body407 2.96336237e-07 0.00022469531896527966 7.07980829e-06 0.16550862598818775 0.0006231907034263553 10.828347490927952 215.92068451736867 172.60595676103023 39.75954075681499 0.4 0.4 0.4 0.0 0.0 0.0 -408.0 2.96336237e-07 0.00030192373602011584 +Body408 2.96336237e-07 0.00030192373602011584 7.07980829e-06 0.22239440915825795 0.000472568455432349 2.060980747075354 229.523789056114 199.61364747622306 342.653951976515 0.4 0.4 0.4 0.0 0.0 0.0 -409.0 2.96336237e-07 0.0007191942353202133 +Body409 2.96336237e-07 0.0007191942353202133 7.07980829e-06 0.5297522451941558 0.0019716610411549614 2.285858920711909 84.27479164545005 103.59991024063056 23.961613159888778 0.4 0.4 0.4 0.0 0.0 0.0 -410.0 2.96336237e-07 0.00025605536434479824 +Body410 2.96336237e-07 0.00025605536434479824 7.07980829e-06 0.18860816382276702 0.001783512692209141 9.452149479129856 260.4969228407456 340.862082769848 299.53745307977607 0.4 0.4 0.4 0.0 0.0 0.0 -411.0 2.96336237e-07 0.0014137481967857802 +Body411 2.96336237e-07 0.0014137481967857802 7.07980829e-06 1.0413546780627359 0.0006675714211968135 6.751304877817071 197.4393793507263 34.63396263565147 17.886456900372362 0.4 0.4 0.4 0.0 0.0 0.0 -412.0 2.96336237e-07 0.00018851276799694233 +Body412 2.96336237e-07 0.00018851276799694233 7.07980829e-06 0.13885687230193297 0.0005099067038711923 3.4579373385270666 97.37519886197563 161.24570001991358 88.00320543674819 0.4 0.4 0.4 0.0 0.0 0.0 -413.0 2.96336237e-07 0.00022744268097446977 +Body413 2.96336237e-07 0.00022744268097446977 7.07980829e-06 0.16753230905077734 0.001439434713915598 1.488957242480834 330.64136140921306 54.28403635089244 292.3523663851032 0.4 0.4 0.4 0.0 0.0 0.0 -414.0 2.96336237e-07 0.0006898514209958568 +Body414 2.96336237e-07 0.0006898514209958568 7.07980829e-06 0.5081385822846886 0.0010638026176632393 0.11968083851335284 160.7138589091659 25.382795589912288 25.782727478421545 0.4 0.4 0.4 0.0 0.0 0.0 -415.0 2.96336237e-07 0.0008266249233141564 +Body415 2.96336237e-07 0.0008266249233141564 7.07980829e-06 0.6088847595728408 0.00014688882663911135 8.1996019102165 246.03901024919443 68.98131066613524 288.1999591902379 0.4 0.4 0.4 0.0 0.0 0.0 -416.0 2.96336237e-07 0.0004534921194170814 +Body416 2.96336237e-07 0.0004534921194170814 7.07980829e-06 0.33403836771868944 0.0005142348550326742 7.8216933915030875 248.20221654965226 331.99676605650495 244.64201903455245 0.4 0.4 0.4 0.0 0.0 0.0 -417.0 2.96336237e-07 0.000424897105060519 +Body417 2.96336237e-07 0.000424897105060519 7.07980829e-06 0.31297552778921833 0.00029497534822830286 0.15310919652858854 140.46973581083438 24.65529286461425 351.40407552316753 0.4 0.4 0.4 0.0 0.0 0.0 -418.0 2.96336237e-07 0.0009879275456483537 +Body418 2.96336237e-07 0.0009879275456483537 7.07980829e-06 0.7276988742315883 0.0011029900349679963 10.864568129667113 208.5430096157955 9.10233088314665 317.21898012234874 0.4 0.4 0.4 0.0 0.0 0.0 -419.0 2.96336237e-07 0.0015502587131062853 +Body419 2.96336237e-07 0.0015502587131062853 7.07980829e-06 1.1419071421424887 0.0006712296928285242 6.872092503437728 23.789921841197497 176.23932642847208 203.11796148326633 0.4 0.4 0.4 0.0 0.0 0.0 -420.0 2.96336237e-07 0.0001706954398692114 +Body420 2.96336237e-07 0.0001706954398692114 7.07980829e-06 0.1257327827090514 0.0006363407247909787 7.996370665082673 242.54962943655892 119.0581532962803 244.4636246279242 0.4 0.4 0.4 0.0 0.0 0.0 -421.0 2.96336237e-07 0.0008548996282611012 +Body421 2.96336237e-07 0.0008548996282611012 7.07980829e-06 0.6297116623652099 0.0018528503137257384 6.449151072040503 247.14499536359432 194.51125232940055 120.02019995779871 0.4 0.4 0.4 0.0 0.0 0.0 -422.0 2.96336237e-07 0.0020676193368498715 +Body422 2.96336237e-07 0.0020676193368498715 7.07980829e-06 1.5229904970183599 0.0018279824313815899 3.119809687865496 319.56432456135326 256.80466553677377 302.7810027784062 0.4 0.4 0.4 0.0 0.0 0.0 -423.0 2.96336237e-07 0.0014317805565749072 +Body423 2.96336237e-07 0.0014317805565749072 7.07980829e-06 1.0546371581151317 0.0005102985592123978 7.904804333209818 231.8152004370599 136.71782915075784 317.74375180780237 0.4 0.4 0.4 0.0 0.0 0.0 -424.0 2.96336237e-07 0.0002923636451554646 +Body424 2.96336237e-07 0.0002923636451554646 7.07980829e-06 0.21535252902200486 0.0012571792466268344 7.172400983983878 255.00609299925236 150.88650593626468 54.83063423384363 0.4 0.4 0.4 0.0 0.0 0.0 -425.0 2.96336237e-07 0.00020267791261800836 +Body425 2.96336237e-07 0.00020267791261800836 7.07980829e-06 0.1492907951533426 2.4169993512502616e-05 1.8789654006057819 142.81133764592184 200.87399856342702 268.6282317022573 0.4 0.4 0.4 0.0 0.0 0.0 -426.0 2.96336237e-07 0.00216686956495537 +Body426 2.96336237e-07 0.00216686956495537 7.07980829e-06 1.596097355489646 0.0019817103498467135 7.425491559820209 271.70257003964826 15.863017483508967 264.63792447579806 0.4 0.4 0.4 0.0 0.0 0.0 -427.0 2.96336237e-07 0.0001553159107903783 +Body427 2.96336237e-07 0.0001553159107903783 7.07980829e-06 0.11440435478316135 0.0005117869222478517 8.667289313439003 218.19361442257141 144.619241655023 119.95076677123069 0.4 0.4 0.4 0.0 0.0 0.0 -428.0 2.96336237e-07 0.0006311383297158283 +Body428 2.96336237e-07 0.0006311383297158283 7.07980829e-06 0.46489102772936586 0.000277977539000612 4.101627214272958 231.6073302900749 98.09235602296367 116.20533850272857 0.4 0.4 0.4 0.0 0.0 0.0 -429.0 2.96336237e-07 0.00018352418073515838 +Body429 2.96336237e-07 0.00018352418073515838 7.07980829e-06 0.13518232212829265 0.0004995940876123834 10.532479056086265 213.8058404309228 61.39961018062948 265.52368141249804 0.4 0.4 0.4 0.0 0.0 0.0 -430.0 2.96336237e-07 0.00023931226875080732 +Body430 2.96336237e-07 0.00023931226875080732 7.07980829e-06 0.17627534461090566 0.0014351073175199352 10.094752215598206 236.8492000043581 1.4027964177489896 321.9949830850897 0.4 0.4 0.4 0.0 0.0 0.0 -431.0 2.96336237e-07 0.00029309420455664 +Body431 2.96336237e-07 0.00029309420455664 7.07980829e-06 0.21589065274994054 0.0011799630485976175 0.6723681526471154 296.59764239360464 359.5559702912326 114.540592515933 0.4 0.4 0.4 0.0 0.0 0.0 -432.0 2.96336237e-07 0.004222680517088697 +Body432 2.96336237e-07 0.004222680517088697 7.07980829e-06 3.1103898985916754 0.00042637688730952177 9.098589541222267 0.4371423916632341 329.05080871562564 127.13138850101329 0.4 0.4 0.4 0.0 0.0 0.0 -433.0 2.96336237e-07 0.000748582470725869 +Body433 2.96336237e-07 0.000748582470725869 7.07980829e-06 0.5513993648787411 0.0008576894511570327 3.1242992472498163 283.9222469806783 86.35211955431778 70.7562799265316 0.4 0.4 0.4 0.0 0.0 0.0 -434.0 2.96336237e-07 0.0007306232922059338 +Body434 2.96336237e-07 0.0007306232922059338 7.07980829e-06 0.5381707895154495 0.0009348514117079304 2.5557739076942165 69.52099049625218 74.14516210351093 4.234771022669347 0.4 0.4 0.4 0.0 0.0 0.0 -435.0 2.96336237e-07 0.00013897041687791617 +Body435 2.96336237e-07 0.00013897041687791617 7.07980829e-06 0.10236440552650627 0.00013146320707978484 0.7364793187850734 357.6923007593962 90.33367235008731 318.70658846752104 0.4 0.4 0.4 0.0 0.0 0.0 -436.0 2.96336237e-07 0.00029779475298576227 +Body436 2.96336237e-07 0.00029779475298576227 7.07980829e-06 0.21935303601398698 0.000555782890957427 11.18983876159149 327.61355695929603 97.40480976734528 165.0138253761267 0.4 0.4 0.4 0.0 0.0 0.0 -437.0 2.96336237e-07 0.0001708745799574377 +Body437 2.96336237e-07 0.0001708745799574377 7.07980829e-06 0.12586473574660587 0.0018987729174404723 6.736566670953775 182.67517715189774 273.16145577873795 183.44656120677303 0.4 0.4 0.4 0.0 0.0 0.0 -438.0 2.96336237e-07 0.000728623848165005 +Body438 2.96336237e-07 0.000728623848165005 7.07980829e-06 0.5366980163509781 0.0006550250963848307 9.768788974647288 67.0108552725336 257.03153378424787 13.000160888491234 0.4 0.4 0.4 0.0 0.0 0.0 -439.0 2.96336237e-07 0.00013599191518003068 +Body439 2.96336237e-07 0.00013599191518003068 7.07980829e-06 0.10017046697099641 0.0003582430996764604 7.76057892051022 20.841385258916905 113.02934367613256 180.8733491565871 0.4 0.4 0.4 0.0 0.0 0.0 -440.0 2.96336237e-07 0.0018797971931425249 +Body440 2.96336237e-07 0.0018797971931425249 7.07980829e-06 1.3846423325870287 0.0019378229233473117 4.622098056806427 109.98005607003847 225.20986743480188 142.48074218515666 0.4 0.4 0.4 0.0 0.0 0.0 -441.0 2.96336237e-07 0.0001997542634290336 +Body441 2.96336237e-07 0.0001997542634290336 7.07980829e-06 0.1471372604808492 7.759826083314737e-05 3.1994038265505984 18.00063527962045 150.13335509330886 284.73890718547926 0.4 0.4 0.4 0.0 0.0 0.0 -442.0 2.96336237e-07 0.00024525408550693235 +Body442 2.96336237e-07 0.00024525408550693235 7.07980829e-06 0.18065203537468522 0.0013635787575385526 5.055965540023692 187.18991520484477 189.55324411240977 238.44197104059097 0.4 0.4 0.4 0.0 0.0 0.0 -443.0 2.96336237e-07 0.0002719572676112937 +Body443 2.96336237e-07 0.0002719572676112937 7.07980829e-06 0.20032136805129583 0.0012308591993952483 7.0044899345984275 269.552911515444 223.2589430936312 255.77773483876354 0.4 0.4 0.4 0.0 0.0 0.0 -444.0 2.96336237e-07 0.0024012337876925392 +Body444 2.96336237e-07 0.0024012337876925392 7.07980829e-06 1.7687280122591906 0.0014246905125783382 3.1894616327597674 263.45723692347207 348.5056611813291 229.81072090051504 0.4 0.4 0.4 0.0 0.0 0.0 -445.0 2.96336237e-07 0.0012814807946355462 +Body445 2.96336237e-07 0.0012814807946355462 7.07980829e-06 0.9439276551335444 0.0008456351484432009 8.506847778604175 16.976934831274097 204.11939881755924 21.926603695751165 0.4 0.4 0.4 0.0 0.0 0.0 -446.0 2.96336237e-07 0.0002214572277532168 +Body446 2.96336237e-07 0.0002214572277532168 7.07980829e-06 0.16312347604469576 0.0006328788606050711 4.341669245285442 217.21176443296935 47.570634047337755 255.51497981231765 0.4 0.4 0.4 0.0 0.0 0.0 -447.0 2.96336237e-07 0.000371320605655443 +Body447 2.96336237e-07 0.000371320605655443 7.07980829e-06 0.27351154232381 0.0012718461900307523 3.6005688541966956 160.45882348034823 229.3479177073646 325.89926615619186 0.4 0.4 0.4 0.0 0.0 0.0 -448.0 2.96336237e-07 0.00018813481449221457 +Body448 2.96336237e-07 0.00018813481449221457 7.07980829e-06 0.13857847502359635 0.0004967774773828962 9.454215364643224 236.19374241613463 15.838117427972968 32.50108674998017 0.4 0.4 0.4 0.0 0.0 0.0 -449.0 2.96336237e-07 0.0002829712914052262 +Body449 2.96336237e-07 0.0002829712914052262 7.07980829e-06 0.2084342025915501 0.0006005957457232561 1.584780194658919 102.56822379223705 346.4911804247638 40.57008757741396 0.4 0.4 0.4 0.0 0.0 0.0 -450.0 2.96336237e-07 0.00019747957360339362 +Body450 2.96336237e-07 0.00019747957360339362 7.07980829e-06 0.1454617436551108 0.0005977045502023303 11.353602159881305 200.3192108307083 271.1674421737156 31.081475067751285 0.4 0.4 0.4 0.0 0.0 0.0 -451.0 2.96336237e-07 0.001245613757542642 +Body451 2.96336237e-07 0.001245613757542642 7.07980829e-06 0.9175083062354428 1.590462859464138e-05 3.357327507443001 79.60987598923194 30.837831867702302 298.7278990002848 0.4 0.4 0.4 0.0 0.0 0.0 -452.0 2.96336237e-07 0.0002486996704319826 +Body452 2.96336237e-07 0.0002486996704319826 7.07980829e-06 0.18319002339017568 0.0009885566764127646 9.782621242440886 108.07786801396067 273.9970912250933 310.35367852760163 0.4 0.4 0.4 0.0 0.0 0.0 -453.0 2.96336237e-07 0.00016692767554210932 +Body453 2.96336237e-07 0.00016692767554210932 7.07980829e-06 0.12295748013622683 0.0010979062296577725 10.024347500550677 106.88907055247773 198.1327684359928 340.050135138907 0.4 0.4 0.4 0.0 0.0 0.0 -454.0 2.96336237e-07 0.0005445630251279117 +Body454 2.96336237e-07 0.0005445630251279117 7.07980829e-06 0.40112040815064176 0.0012765243645821193 0.36158828981659213 300.78312579930036 122.72230217785753 79.57847915252297 0.4 0.4 0.4 0.0 0.0 0.0 -455.0 2.96336237e-07 0.0006418298530095252 +Body455 2.96336237e-07 0.0006418298530095252 7.07980829e-06 0.47276631119414475 0.0018754191712590468 9.618142402240167 210.01360274606708 52.81319523404354 295.506781436836 0.4 0.4 0.4 0.0 0.0 0.0 -456.0 2.96336237e-07 0.0003305503945146837 +Body456 2.96336237e-07 0.0003305503945146837 7.07980829e-06 0.24348055788573156 0.0009724490518056483 9.764140650772767 285.1217564231297 241.4693010940454 153.8706167630325 0.4 0.4 0.4 0.0 0.0 0.0 -457.0 2.96336237e-07 0.0008872014207357944 +Body457 2.96336237e-07 0.0008872014207357944 7.07980829e-06 0.6535048829541451 0.0012768686940541607 3.1122731807633186 191.39791508615775 317.147311001137 65.98215050080154 0.4 0.4 0.4 0.0 0.0 0.0 -458.0 2.96336237e-07 0.0007939614798380874 +Body458 2.96336237e-07 0.0007939614798380874 7.07980829e-06 0.5848251499883511 0.00040825964837822265 1.8844887309819964 318.2015406963481 193.18114828574815 104.40965648293675 0.4 0.4 0.4 0.0 0.0 0.0 -459.0 2.96336237e-07 0.0002696263073715259 +Body459 2.96336237e-07 0.0002696263073715259 7.07980829e-06 0.1986044029258377 0.001056477230864351 5.155184286743782 225.03923040849543 131.52836819098496 255.26276672816687 0.4 0.4 0.4 0.0 0.0 0.0 -460.0 2.96336237e-07 0.0006881217741479458 +Body460 2.96336237e-07 0.0006881217741479458 7.07980829e-06 0.5068645393960302 0.0003326335736345842 5.266871447065479 228.66670984475485 245.29263210567836 343.40974951486265 0.4 0.4 0.4 0.0 0.0 0.0 -461.0 2.96336237e-07 0.00036350958220436396 +Body461 2.96336237e-07 0.00036350958220436396 7.07980829e-06 0.2677580100966906 0.0011350441528606126 6.177365782766478 118.87478336871442 355.77015297228894 95.63595646327923 0.4 0.4 0.4 0.0 0.0 0.0 -462.0 2.96336237e-07 0.0004486060856822659 +Body462 2.96336237e-07 0.0004486060856822659 7.07980829e-06 0.3304393575848548 0.0014687785019336904 5.241448084521409 96.18365857942207 183.77862980776774 228.65495228458707 0.4 0.4 0.4 0.0 0.0 0.0 -463.0 2.96336237e-07 0.0004604269617478805 +Body463 2.96336237e-07 0.0004604269617478805 7.07980829e-06 0.33914651252072975 0.0004055292170800828 4.895873668563538 59.02464154565896 62.12229762294026 55.07526689128356 0.4 0.4 0.4 0.0 0.0 0.0 -464.0 2.96336237e-07 0.0005143025297492694 +Body464 2.96336237e-07 0.0005143025297492694 7.07980829e-06 0.3788307893241148 0.0005293066055721069 4.462141950647905 320.6002755530967 306.8596225069373 320.9666429183768 0.4 0.4 0.4 0.0 0.0 0.0 -465.0 2.96336237e-07 0.0006667305570919559 +Body465 2.96336237e-07 0.0006667305570919559 7.07980829e-06 0.49110795417006453 0.0007770182250284304 0.690544254500474 289.6118630282647 147.3904940483378 243.83250464820526 0.4 0.4 0.4 0.0 0.0 0.0 -466.0 2.96336237e-07 0.0005863629315512525 +Body466 2.96336237e-07 0.0005863629315512525 7.07980829e-06 0.43190985721624947 0.0007198902586070987 4.0182624493743635 288.28733727149256 324.69481343360036 189.6182444711077 0.4 0.4 0.4 0.0 0.0 0.0 -467.0 2.96336237e-07 0.000294672324076889 +Body467 2.96336237e-07 0.000294672324076889 7.07980829e-06 0.21705308192133735 0.00044576452998949914 8.921250090759099 238.22729318130882 296.190068054446 195.9121254193718 0.4 0.4 0.4 0.0 0.0 0.0 -468.0 2.96336237e-07 0.0028087096654579474 +Body468 2.96336237e-07 0.0028087096654579474 7.07980829e-06 2.0688712148984254 0.0002984810832466857 10.575534104328895 152.56442877635615 170.47613853133058 274.7547200671628 0.4 0.4 0.4 0.0 0.0 0.0 -469.0 2.96336237e-07 0.0003450690782735793 +Body469 2.96336237e-07 0.0003450690782735793 7.07980829e-06 0.2541748946042599 0.0008041489377130242 8.309065348651579 261.2187986265465 53.27309426724574 261.1432403005431 0.4 0.4 0.4 0.0 0.0 0.0 -470.0 2.96336237e-07 0.00046973846516796657 +Body470 2.96336237e-07 0.00046973846516796657 7.07980829e-06 0.3460052852981942 0.0018686403872765615 3.0895039953712953 75.98671392677977 38.52726973601133 140.56799733511798 0.4 0.4 0.4 0.0 0.0 0.0 -471.0 2.96336237e-07 0.00041866256056546783 +Body471 2.96336237e-07 0.00041866256056546783 7.07980829e-06 0.30838321630809845 0.0007211803251128147 10.87151624456058 51.710646603351435 342.61557663182634 39.59410990999061 0.4 0.4 0.4 0.0 0.0 0.0 -472.0 2.96336237e-07 0.0003214617114907036 +Body472 2.96336237e-07 0.0003214617114907036 7.07980829e-06 0.23678591268231478 0.00043228108644888024 8.092409625280016 162.74609562124746 81.11807186647502 138.9873457289479 0.4 0.4 0.4 0.0 0.0 0.0 -473.0 2.96336237e-07 0.003263293606577269 +Body473 2.96336237e-07 0.003263293606577269 7.07980829e-06 2.4037138090273222 0.001132185797944382 7.94561700619783 44.938610848203766 268.82872855970845 36.99135992364371 0.4 0.4 0.4 0.0 0.0 0.0 -474.0 2.96336237e-07 0.0008214380972595391 +Body474 2.96336237e-07 0.0008214380972595391 7.07980829e-06 0.6050641884212358 0.0017016394827102327 9.659688816023383 109.74887856274627 109.62683981188026 47.758744134896425 0.4 0.4 0.4 0.0 0.0 0.0 -475.0 2.96336237e-07 0.0008837582199748425 +Body475 2.96336237e-07 0.0008837582199748425 7.07980829e-06 0.6509686510932816 0.0012461324332944481 4.499649557650997 10.572812949107973 47.77269188323101 215.6753167223474 0.4 0.4 0.4 0.0 0.0 0.0 -476.0 2.96336237e-07 0.001098223293562403 +Body476 2.96336237e-07 0.001098223293562403 7.07980829e-06 0.8089417669347273 0.0008312252935948881 3.3621695139802132 210.05120303274737 154.63817919238844 104.28857510691935 0.4 0.4 0.4 0.0 0.0 0.0 -477.0 2.96336237e-07 0.0013733620550810425 +Body477 2.96336237e-07 0.0013733620550810425 7.07980829e-06 1.0116065958450184 0.0017738610178885557 10.197193583320637 193.21906157260963 160.6826353045648 197.35313110103235 0.4 0.4 0.4 0.0 0.0 0.0 -478.0 2.96336237e-07 0.0010710598818969162 +Body478 2.96336237e-07 0.0010710598818969162 7.07980829e-06 0.788933433149185 0.0011447284160657012 6.439774290412318 130.66057255969486 89.60632128531438 276.6850184610414 0.4 0.4 0.4 0.0 0.0 0.0 -479.0 2.96336237e-07 0.00013804426495303047 +Body479 2.96336237e-07 0.00013804426495303047 7.07980829e-06 0.10168221003952403 0.00020449864584018424 6.3886896970000135 294.43963116142464 80.85135126684784 59.551631887885094 0.4 0.4 0.4 0.0 0.0 0.0 -480.0 2.96336237e-07 0.000510984594283785 +Body480 2.96336237e-07 0.000510984594283785 7.07980829e-06 0.37638682679503926 0.0009538703934352033 7.8137851712048985 270.8856913657831 54.866604813306864 203.72806433585802 0.4 0.4 0.4 0.0 0.0 0.0 -481.0 2.96336237e-07 0.0003052773574941031 +Body481 2.96336237e-07 0.0003052773574941031 7.07980829e-06 0.22486465769213987 0.00010499401161215899 9.80847519219533 204.58216972265092 63.46577648609118 52.22718811087346 0.4 0.4 0.4 0.0 0.0 0.0 -482.0 2.96336237e-07 0.0007595910572551223 +Body482 2.96336237e-07 0.0007595910572551223 7.07980829e-06 0.5595081943769218 1.603969670767141e-05 3.5748016430332377 252.14559085297245 258.52147517626855 89.88327467849027 0.4 0.4 0.4 0.0 0.0 0.0 -483.0 2.96336237e-07 0.0005026243751300119 +Body483 2.96336237e-07 0.0005026243751300119 7.07980829e-06 0.3702287617695952 0.0017002155023706134 3.2650363437768473 4.579531934785606 181.49448196402307 253.24637502081566 0.4 0.4 0.4 0.0 0.0 0.0 -484.0 2.96336237e-07 0.0014946853378614818 +Body484 2.96336237e-07 0.0014946853378614818 7.07980829e-06 1.100972275227372 0.0011016475133641122 1.1713720975409359 50.43747985108622 106.6248278266832 32.13983751921431 0.4 0.4 0.4 0.0 0.0 0.0 -485.0 2.96336237e-07 0.0001840981898284837 +Body485 2.96336237e-07 0.0001840981898284837 7.07980829e-06 0.1356051322552614 0.0006111558538924435 10.4892853776386 222.02834859636715 325.69799642747853 140.07145275861674 0.4 0.4 0.4 0.0 0.0 0.0 -486.0 2.96336237e-07 0.00015386479581017197 +Body486 2.96336237e-07 0.00015386479581017197 7.07980829e-06 0.11333547605604403 0.000622891064807166 8.184129534679386 37.28466927526265 329.2628905575532 294.6220703951143 0.4 0.4 0.4 0.0 0.0 0.0 -487.0 2.96336237e-07 0.0003082091957628682 +Body487 2.96336237e-07 0.0003082091957628682 7.07980829e-06 0.22702422436988573 0.001991696543638015 3.5267414013239837 338.50159401266495 180.01552983278972 322.20628816659337 0.4 0.4 0.4 0.0 0.0 0.0 -488.0 2.96336237e-07 0.00014583060375858106 +Body488 2.96336237e-07 0.00014583060375858106 7.07980829e-06 0.10741755977052718 0.0002905638340767039 11.302540381129162 241.2135864811138 151.6941052951146 298.57489059943174 0.4 0.4 0.4 0.0 0.0 0.0 -489.0 2.96336237e-07 0.0005605944288335752 +Body489 2.96336237e-07 0.0005605944288335752 7.07980829e-06 0.41292900128113025 7.941636802451363e-05 7.359319334258025 297.84171946708426 94.33235973893102 344.4529489692567 0.4 0.4 0.4 0.0 0.0 0.0 -490.0 2.96336237e-07 0.00021857685064681165 +Body490 2.96336237e-07 0.00021857685064681165 7.07980829e-06 0.16100181521346763 0.0012407299957247105 0.6038825024030959 239.7275077723229 236.00381573862157 256.95939485907843 0.4 0.4 0.4 0.0 0.0 0.0 -491.0 2.96336237e-07 0.00019674218925549213 +Body491 2.96336237e-07 0.00019674218925549213 7.07980829e-06 0.14491859273052377 0.0013058487505551934 3.821881106309761 216.39978867899538 258.25042579710794 351.02242222027417 0.4 0.4 0.4 0.0 0.0 0.0 -492.0 2.96336237e-07 0.0002159160466132611 +Body492 2.96336237e-07 0.0002159160466132611 7.07980829e-06 0.15904189000610347 0.0014522873185646632 4.0846204015874 134.00372653420538 92.03836218081587 302.6381080058215 0.4 0.4 0.4 0.0 0.0 0.0 -493.0 2.96336237e-07 0.0016256926204691628 +Body493 2.96336237e-07 0.0016256926204691628 7.07980829e-06 1.197471105014716 0.0004360059768893441 0.4814083894751589 349.1904845488782 337.1306233013751 217.9405054238214 0.4 0.4 0.4 0.0 0.0 0.0 -494.0 2.96336237e-07 0.00014250608506025607 +Body494 2.96336237e-07 0.00014250608506025607 7.07980829e-06 0.10496874808915509 0.0002830915520879843 2.6416972133031833 29.164561498142817 179.8847025710235 47.37482513737826 0.4 0.4 0.4 0.0 0.0 0.0 -495.0 2.96336237e-07 0.005380221359981844 +Body495 2.96336237e-07 0.005380221359981844 7.07980829e-06 3.9630244586470065 0.001250718071607223 7.831364396971 299.152626258313 80.18063960689692 220.34424722803575 0.4 0.4 0.4 0.0 0.0 0.0 -496.0 2.96336237e-07 0.0010596897261804911 +Body496 2.96336237e-07 0.0010596897261804911 7.07980829e-06 0.7805582749190838 0.0013975054818890363 4.884298008228713 324.268561752692 180.9283217090302 120.10113424767462 0.4 0.4 0.4 0.0 0.0 0.0 -497.0 2.96336237e-07 0.003975669049986422 +Body497 2.96336237e-07 0.003975669049986422 7.07980829e-06 2.928443391153569 0.00019889105320171344 6.917866506846601 53.38988957506836 56.96803300644175 52.93302086318209 0.4 0.4 0.4 0.0 0.0 0.0 -498.0 2.96336237e-07 0.00016401256780677155 +Body498 2.96336237e-07 0.00016401256780677155 7.07980829e-06 0.12081023702450965 0.0013348618001110496 8.191123147193156 281.7322152624938 230.89269153751596 24.132095903135788 0.4 0.4 0.4 0.0 0.0 0.0 -499.0 2.96336237e-07 0.00023516729516164113 +Body499 2.96336237e-07 0.00023516729516164113 7.07980829e-06 0.17322219296244507 0.0011407861152418625 1.7214983246331481 310.9919211691427 240.0381065105395 73.29352599760033 0.4 0.4 0.4 0.0 0.0 0.0 -500.0 2.96336237e-07 0.002372935488260879 +Body500 2.96336237e-07 0.002372935488260879 7.07980829e-06 1.7478837299737187 0.0002530022664911261 0.7808132069679781 132.332998689434 23.225140699784063 169.22321380849056 0.4 0.4 0.4 0.0 0.0 0.0 -501.0 2.96336237e-07 0.0008364206062998774 +Body501 2.96336237e-07 0.0008364206062998774 7.07980829e-06 0.6161001748251411 0.0003301383670470987 5.459400528391105 46.31716383973629 305.7668990894059 76.65337789038414 0.4 0.4 0.4 0.0 0.0 0.0 -502.0 2.96336237e-07 0.0004237487750512881 +Body502 2.96336237e-07 0.0004237487750512881 7.07980829e-06 0.31212967784946866 0.0007325283957620936 5.65261886087358 341.3807343417507 44.436293900198685 196.82498772211372 0.4 0.4 0.4 0.0 0.0 0.0 -503.0 2.96336237e-07 0.0002809942841018974 +Body503 2.96336237e-07 0.0002809942841018974 7.07980829e-06 0.20697795613368275 0.0003389102918443133 10.801909255067267 210.45066679552102 128.9542129407433 89.9655687791985 0.4 0.4 0.4 0.0 0.0 0.0 -504.0 2.96336237e-07 0.00021032636207145845 +Body504 2.96336237e-07 0.00021032636207145845 7.07980829e-06 0.1549245767817718 0.00019034547652992633 9.896740981102905 106.97073529266052 173.00512256005695 141.4982023951114 0.4 0.4 0.4 0.0 0.0 0.0 -505.0 2.96336237e-07 0.0001405877294726506 +Body505 2.96336237e-07 0.0001405877294726506 7.07980829e-06 0.10355570397713952 5.588787033835933e-05 0.025148184590135212 339.6974022171061 134.4855494358087 106.9595251566057 0.4 0.4 0.4 0.0 0.0 0.0 -506.0 2.96336237e-07 0.0002616476332737474 +Body506 2.96336237e-07 0.0002616476332737474 7.07980829e-06 0.19272738068428888 0.0011840292720909423 2.1374607043381766 276.3040437338511 74.32516348293399 173.22195104801668 0.4 0.4 0.4 0.0 0.0 0.0 -507.0 2.96336237e-07 0.0001830276335913892 +Body507 2.96336237e-07 0.0001830276335913892 7.07980829e-06 0.13481656980251192 7.772338761572637e-05 2.1436693812878 239.43227036224593 323.59484907154894 257.15734762862957 0.4 0.4 0.4 0.0 0.0 0.0 -508.0 2.96336237e-07 0.0020038800548480675 +Body508 2.96336237e-07 0.0020038800548480675 7.07980829e-06 1.4760406939064297 0.0011508169614244208 8.250037489904742 36.89799320893618 35.08064963050396 58.92373260868641 0.4 0.4 0.4 0.0 0.0 0.0 -509.0 2.96336237e-07 0.00021041196540253537 +Body509 2.96336237e-07 0.00021041196540253537 7.07980829e-06 0.15498763145408004 0.00032656122692631444 3.063724364482827 329.95091023219123 101.64460523053472 160.78145664072994 0.4 0.4 0.4 0.0 0.0 0.0 -510.0 2.96336237e-07 0.00034420033681411346 +Body510 2.96336237e-07 0.00034420033681411346 7.07980829e-06 0.2535349871689057 0.00033342152374707547 1.1857613413900874 324.36341312691667 144.5633870194615 49.563557204289175 0.4 0.4 0.4 0.0 0.0 0.0 -511.0 2.96336237e-07 0.0015832822576863253 +Body511 2.96336237e-07 0.0015832822576863253 7.07980829e-06 1.1662319990815273 0.0019487406036725137 3.0607160983513313 11.225699088239294 351.3300983911463 32.506879328548955 0.4 0.4 0.4 0.0 0.0 0.0 -512.0 2.96336237e-07 0.0001880645524644118 +Body512 2.96336237e-07 0.0001880645524644118 7.07980829e-06 0.13852672062241733 0.001227333136741469 5.359209920502055 342.184172049542 104.16755202122069 158.05339443952155 0.4 0.4 0.4 0.0 0.0 0.0 -513.0 2.96336237e-07 0.0001695592618230741 +Body513 2.96336237e-07 0.0001695592618230741 7.07980829e-06 0.12489588380007507 0.00020491376609093243 9.967337840176775 222.72561471076645 200.2889141067975 329.78545124155136 0.4 0.4 0.4 0.0 0.0 0.0 -514.0 2.96336237e-07 0.00018691819550851435 +Body514 2.96336237e-07 0.00018691819550851435 7.07980829e-06 0.13768232401666558 0.001555586199538783 10.031201567524477 233.12258895874854 238.5593259895004 45.262601699849064 0.4 0.4 0.4 0.0 0.0 0.0 -515.0 2.96336237e-07 0.0002372145015271881 +Body515 2.96336237e-07 0.0002372145015271881 7.07980829e-06 0.17473014744158713 0.0011718121703042283 11.298391017700013 273.7254978829876 169.35877595958758 172.46893054714874 0.4 0.4 0.4 0.0 0.0 0.0 -516.0 2.96336237e-07 0.000487556463853684 +Body516 2.96336237e-07 0.000487556463853684 7.07980829e-06 0.35912986881828135 0.0010875086244021 2.6390881856199 327.05906565898886 41.46149650372694 161.77042037952188 0.4 0.4 0.4 0.0 0.0 0.0 -517.0 2.96336237e-07 0.00037749753986737175 +Body517 2.96336237e-07 0.00037749753986737175 7.07980829e-06 0.27806141856931255 0.00017474096544441254 10.193602074021994 96.01356506043527 32.73445552687746 171.11188339049957 0.4 0.4 0.4 0.0 0.0 0.0 -518.0 2.96336237e-07 0.0007259623387149332 +Body518 2.96336237e-07 0.0007259623387149332 7.07980829e-06 0.5347375715399136 0.0006307112549701429 6.423123416772914 132.89631888091645 152.6344585362946 31.11756389346557 0.4 0.4 0.4 0.0 0.0 0.0 -519.0 2.96336237e-07 0.0013262157694597188 +Body519 2.96336237e-07 0.0013262157694597188 7.07980829e-06 0.9768790501642038 0.0016801546962580637 3.6624407128558283 344.8432510603976 225.88265169610546 61.03331943826858 0.4 0.4 0.4 0.0 0.0 0.0 -520.0 2.96336237e-07 0.00013948893650871826 +Body520 2.96336237e-07 0.00013948893650871826 7.07980829e-06 0.10274634259594391 0.0005862369214162208 7.71693453685987 295.65211563192264 87.19006628973742 2.9786213795126453 0.4 0.4 0.4 0.0 0.0 0.0 -521.0 2.96336237e-07 0.00015929457772364975 +Body521 2.96336237e-07 0.00015929457772364975 7.07980829e-06 0.11733500638917965 0.00046241603580283465 11.030928489656732 169.65241881138567 293.1253864516373 214.18603709260668 0.4 0.4 0.4 0.0 0.0 0.0 -522.0 2.96336237e-07 0.00019824865788944 +Body522 2.96336237e-07 0.00019824865788944 7.07980829e-06 0.14602824447959978 0.0002413067174747541 4.229625827383947 116.24908588305853 10.857662875818633 206.68925611407855 0.4 0.4 0.4 0.0 0.0 0.0 -523.0 2.96336237e-07 0.00021207331037066918 +Body523 2.96336237e-07 0.00021207331037066918 7.07980829e-06 0.1562113637696193 0.0016684263660526643 6.046041305164429 345.6484692547302 292.66639197693917 146.17732450811894 0.4 0.4 0.4 0.0 0.0 0.0 -524.0 2.96336237e-07 0.0005136104792758559 +Body524 2.96336237e-07 0.0005136104792758559 7.07980829e-06 0.37832103093886404 0.001074156993879785 2.1395424495167066 281.75088372571247 303.56480204625746 296.22629924132457 0.4 0.4 0.4 0.0 0.0 0.0 -525.0 2.96336237e-07 0.004109072545859522 +Body525 2.96336237e-07 0.004109072545859522 7.07980829e-06 3.0267072508799453 0.00127398446590752 2.1560406699554804 346.66700089774304 155.95497531651893 1.6343077005043352 0.4 0.4 0.4 0.0 0.0 0.0 -526.0 2.96336237e-07 0.00014930581917609634 +Body526 2.96336237e-07 0.00014930581917609634 7.07980829e-06 0.10997737335015408 0.0012084257180196292 1.3951600642609057 16.76773394168345 8.795909418806362 9.929660069933089 0.4 0.4 0.4 0.0 0.0 0.0 -527.0 2.96336237e-07 0.0002868838371068101 +Body527 2.96336237e-07 0.0002868838371068101 7.07980829e-06 0.2113161498709467 0.0007791354218313612 3.234346128256671 76.11991217262185 136.83240360065855 173.1533929976486 0.4 0.4 0.4 0.0 0.0 0.0 -528.0 2.96336237e-07 0.0001555609431935719 +Body528 2.96336237e-07 0.0001555609431935719 7.07980829e-06 0.11458484352926389 0.0010363406659536396 10.541470655799642 325.59035485038135 265.93712788220773 313.42035876985943 0.4 0.4 0.4 0.0 0.0 0.0 -529.0 2.96336237e-07 0.00021564072526620022 +Body529 2.96336237e-07 0.00021564072526620022 7.07980829e-06 0.15883909068626403 0.0008601114966143062 1.9731166269703835 219.97708142667824 234.306907552938 287.0479249364048 0.4 0.4 0.4 0.0 0.0 0.0 -530.0 2.96336237e-07 0.00021063118430903212 +Body530 2.96336237e-07 0.00021063118430903212 7.07980829e-06 0.1551491062020721 0.0012742398782430151 2.110216655102381 322.4131256335296 156.66338000836896 213.30875362979424 0.4 0.4 0.4 0.0 0.0 0.0 -531.0 2.96336237e-07 0.0003195852526861271 +Body531 2.96336237e-07 0.0003195852526861271 7.07980829e-06 0.23540372937783355 0.0014827207961310713 11.034200232871168 20.075050100885207 297.061404860893 134.27646383235646 0.4 0.4 0.4 0.0 0.0 0.0 -532.0 2.96336237e-07 0.00038029698725507155 +Body532 2.96336237e-07 0.00038029698725507155 7.07980829e-06 0.2801234672706298 0.0009391237366618727 0.961050066133553 130.06618341196372 65.34014485280774 265.5894113155054 0.4 0.4 0.4 0.0 0.0 0.0 -533.0 2.96336237e-07 0.0008086245014997202 +Body533 2.96336237e-07 0.0008086245014997202 7.07980829e-06 0.5956258047560051 0.0017346144564827134 3.419230682901365 224.4906528425378 41.564974205435675 171.21663430141882 0.4 0.4 0.4 0.0 0.0 0.0 -534.0 2.96336237e-07 0.0009378327930594523 +Body534 2.96336237e-07 0.0009378327930594523 7.07980829e-06 0.6907995133174945 0.001605499749195453 9.284357963360389 18.93455793138919 339.4733996745166 319.8812805446561 0.4 0.4 0.4 0.0 0.0 0.0 -535.0 2.96336237e-07 0.00023975902634056496 +Body535 2.96336237e-07 0.00023975902634056496 7.07980829e-06 0.17660442238240123 0.0015568675724954336 11.38693154194754 44.37020689907796 295.86645019371497 177.82671930546547 0.4 0.4 0.4 0.0 0.0 0.0 -536.0 2.96336237e-07 0.0003929351753048108 +Body536 2.96336237e-07 0.0003929351753048108 7.07980829e-06 0.28943264713572475 0.0005699233782748937 1.5567056350737614 227.9860385142784 77.8850459256719 355.6214169541282 0.4 0.4 0.4 0.0 0.0 0.0 -537.0 2.96336237e-07 0.0005262829725743801 +Body537 2.96336237e-07 0.0005262829725743801 7.07980829e-06 0.38765547975311526 0.0003177615026623367 8.827340263326045 199.89821685270525 352.371252920494 13.099545361125765 0.4 0.4 0.4 0.0 0.0 0.0 -538.0 2.96336237e-07 0.0014263756327302175 +Body538 2.96336237e-07 0.0014263756327302175 7.07980829e-06 1.0506559380201834 0.0011850450275658014 6.109575048260612 137.21707874901938 317.54578704073776 298.4847960400838 0.4 0.4 0.4 0.0 0.0 0.0 -539.0 2.96336237e-07 0.00040333645655972814 +Body539 2.96336237e-07 0.00040333645655972814 7.07980829e-06 0.29709414082836405 0.0012408573548279333 5.600605325783357 152.95523816976183 264.91770769590966 7.071477493229634 0.4 0.4 0.4 0.0 0.0 0.0 -540.0 2.96336237e-07 0.0015199855563997338 +Body540 2.96336237e-07 0.0015199855563997338 7.07980829e-06 1.1196081970914764 0.0013138724882288133 1.1787466854789124 244.3058781253184 129.76972788859368 156.95401255974633 0.4 0.4 0.4 0.0 0.0 0.0 -541.0 2.96336237e-07 0.00039472534353346346 +Body541 2.96336237e-07 0.00039472534353346346 7.07980829e-06 0.29075126954929537 0.00037545014934496027 5.765569150437208 61.964196642898294 171.97954045248818 354.7328600184298 0.4 0.4 0.4 0.0 0.0 0.0 -542.0 2.96336237e-07 0.0009011051757505035 +Body542 2.96336237e-07 0.0009011051757505035 7.07980829e-06 0.6637462684852627 0.0007574696521700472 11.096574280070378 336.34868318728115 231.8204350102131 228.9728749303282 0.4 0.4 0.4 0.0 0.0 0.0 -543.0 2.96336237e-07 0.0004267125719876535 +Body543 2.96336237e-07 0.0004267125719876535 7.07980829e-06 0.3143127850049926 0.0007238579750846895 0.5277440721609482 80.37180018466877 103.55653927353048 114.87976373867865 0.4 0.4 0.4 0.0 0.0 0.0 -544.0 2.96336237e-07 0.00020963363183072777 +Body544 2.96336237e-07 0.00020963363183072777 7.07980829e-06 0.1544143176858023 0.00010596757190516148 10.466373300966364 146.7818903901798 36.69076173997252 34.93306695589757 0.4 0.4 0.4 0.0 0.0 0.0 -545.0 2.96336237e-07 0.00029132633094057064 +Body545 2.96336237e-07 0.00029132633094057064 7.07980829e-06 0.21458845235491755 0.001312258673813912 5.263516568737595 330.2344757051127 325.3527645378588 166.22816141416666 0.4 0.4 0.4 0.0 0.0 0.0 -546.0 2.96336237e-07 0.0003716442765482616 +Body546 2.96336237e-07 0.0003716442765482616 7.07980829e-06 0.2737499555003259 0.0005701813356438088 9.435472283986273 50.5993612097436 173.37357873802534 55.87387941263882 0.4 0.4 0.4 0.0 0.0 0.0 -547.0 2.96336237e-07 0.00022121543151980844 +Body547 2.96336237e-07 0.00022121543151980844 7.07980829e-06 0.16294537103323034 0.0010450316087317016 10.629320699054388 250.72526708627996 283.0549912557477 235.35874115592677 0.4 0.4 0.4 0.0 0.0 0.0 -548.0 2.96336237e-07 0.0006338471318379385 +Body548 2.96336237e-07 0.0006338471318379385 7.07980829e-06 0.4668863079130782 9.80881213544338e-05 4.917842409782587 183.5716451313882 137.80102400877854 122.07017831456447 0.4 0.4 0.4 0.0 0.0 0.0 -549.0 2.96336237e-07 0.004398684433331888 +Body549 2.96336237e-07 0.004398684433331888 7.07980829e-06 3.2400328590240277 0.000795174145733708 9.411673637407711 166.69529349617045 322.2493980338734 332.78622466184925 0.4 0.4 0.4 0.0 0.0 0.0 -550.0 2.96336237e-07 0.0002696915901036577 +Body550 2.96336237e-07 0.0002696915901036577 7.07980829e-06 0.19865248962094845 0.0006383917190026313 4.502193781959035 102.46776932906943 299.3886454963272 107.42304201248047 0.4 0.4 0.4 0.0 0.0 0.0 -551.0 2.96336237e-07 0.00018742789541377648 +Body551 2.96336237e-07 0.00018742789541377648 7.07980829e-06 0.13805776455265326 0.00022135125820552654 3.165822612591817 231.2522567846904 284.00788607334607 18.568891102091413 0.4 0.4 0.4 0.0 0.0 0.0 -552.0 2.96336237e-07 0.00018745115705878982 +Body552 2.96336237e-07 0.00018745115705878982 7.07980829e-06 0.13807489887891386 0.00038252357678747435 5.636462188612152 21.26016001601263 38.97144934099217 238.96398622306455 0.4 0.4 0.4 0.0 0.0 0.0 -553.0 2.96336237e-07 0.0007527174634770774 +Body553 2.96336237e-07 0.0007527174634770774 7.07980829e-06 0.5544451647284006 0.0015926903230669928 3.5709289457786735 331.65272711665096 152.2997527431007 67.38730245989973 0.4 0.4 0.4 0.0 0.0 0.0 -554.0 2.96336237e-07 0.0019986589647870623 +Body554 2.96336237e-07 0.0019986589647870623 7.07980829e-06 1.4721948841844608 0.00022013630176110412 1.2170747798596109 184.3562047825064 1.3825637097073917 29.688792239766972 0.4 0.4 0.4 0.0 0.0 0.0 -555.0 2.96336237e-07 0.00022858846842984274 +Body555 2.96336237e-07 0.00022858846842984274 7.07980829e-06 0.16837628616737488 0.0004563697736791034 1.037718489230666 55.32749146467346 234.60174223122448 51.71202442623142 0.4 0.4 0.4 0.0 0.0 0.0 -556.0 2.96336237e-07 0.002995858109066055 +Body556 2.96336237e-07 0.002995858109066055 7.07980829e-06 2.2067231376712 0.00042132883736718585 7.18920001167939 329.5453745377768 154.99871161132532 1.263889070543565 0.4 0.4 0.4 0.0 0.0 0.0 -557.0 2.96336237e-07 0.0008811270370001727 +Body557 2.96336237e-07 0.0008811270370001727 7.07980829e-06 0.6490305445013574 0.0015222806424304506 2.569952590511676 318.10486175424745 143.8423848274806 66.22399625468148 0.4 0.4 0.4 0.0 0.0 0.0 -558.0 2.96336237e-07 0.00024402598794333842 +Body558 2.96336237e-07 0.00024402598794333842 7.07980829e-06 0.17974742934521437 0.0002150961941387449 4.943731950964769 150.82092745036815 154.92037935629455 348.0792764816835 0.4 0.4 0.4 0.0 0.0 0.0 -559.0 2.96336237e-07 0.0008097529907645238 +Body559 2.96336237e-07 0.0008097529907645238 7.07980829e-06 0.5964570401752393 0.0009056928941771672 11.063627159187728 229.76649388304784 251.88631294206922 271.0341809092236 0.4 0.4 0.4 0.0 0.0 0.0 -560.0 2.96336237e-07 0.00033530779260211027 +Body560 2.96336237e-07 0.00033530779260211027 7.07980829e-06 0.24698481611574155 0.0004575492589735706 5.29573681938387 196.6887131179752 295.8424376270973 172.27820863278714 0.4 0.4 0.4 0.0 0.0 0.0 -561.0 2.96336237e-07 0.0035073641574024108 +Body561 2.96336237e-07 0.0035073641574024108 7.07980829e-06 2.5834940630053387 0.0017461636990900654 7.244140409413152 63.206300786279186 337.9878014590007 104.79139588265613 0.4 0.4 0.4 0.0 0.0 0.0 -562.0 2.96336237e-07 0.0001813535469778788 +Body562 2.96336237e-07 0.0001813535469778788 7.07980829e-06 0.13358345210133657 0.0018257665528339558 0.06804701843758584 77.29411815014136 289.8233053967625 44.70554421084728 0.4 0.4 0.4 0.0 0.0 0.0 -563.0 2.96336237e-07 0.00370967526002868 +Body563 2.96336237e-07 0.00370967526002868 7.07980829e-06 2.732514669095504 0.001995822512916354 6.48078290387372 231.67326349644276 62.4395595885095 165.01621451958113 0.4 0.4 0.4 0.0 0.0 0.0 -564.0 2.96336237e-07 0.00018554024250358602 +Body564 2.96336237e-07 0.00018554024250358602 7.07980829e-06 0.13666733576692272 0.0018703754785616086 7.597540731858161 34.349929235997486 283.0074100974388 269.69008152808203 0.4 0.4 0.4 0.0 0.0 0.0 -565.0 2.96336237e-07 0.0015961104296749599 +Body565 2.96336237e-07 0.0015961104296749599 7.07980829e-06 1.175681119470667 0.0012730084315147824 5.377171503588457 303.22071615442695 207.38446726959208 323.23225029635455 0.4 0.4 0.4 0.0 0.0 0.0 -566.0 2.96336237e-07 0.00038398491349272686 +Body566 2.96336237e-07 0.00038398491349272686 7.07980829e-06 0.2828399617982013 0.0008656344622862977 0.6978761551131981 158.93800419606512 215.01005022703546 20.614101759917133 0.4 0.4 0.4 0.0 0.0 0.0 -567.0 2.96336237e-07 0.0001411459851863336 +Body567 2.96336237e-07 0.0001411459851863336 7.07980829e-06 0.10396691030109508 0.00038399114582490725 6.250057689311349 12.23793133378916 169.4460441634575 246.49382276408937 0.4 0.4 0.4 0.0 0.0 0.0 -568.0 2.96336237e-07 0.00015192863370384972 +Body568 2.96336237e-07 0.00015192863370384972 7.07980829e-06 0.1119093158165541 3.5729588432924006e-05 7.225655657371077 201.789567932713 174.36108665329155 129.48783093991912 0.4 0.4 0.4 0.0 0.0 0.0 -569.0 2.96336237e-07 0.00031883766930319916 +Body569 2.96336237e-07 0.00031883766930319916 7.07980829e-06 0.23485306593237423 0.000518575631308253 3.0998582988447634 66.08807509880653 4.722678788284973 249.7975273077748 0.4 0.4 0.4 0.0 0.0 0.0 -570.0 2.96336237e-07 0.0027604374222985994 +Body570 2.96336237e-07 0.0027604374222985994 7.07980829e-06 2.0333142986463963 0.00043570189366228104 7.66004660343979 74.86531219644911 109.11381471164702 63.388254479519375 0.4 0.4 0.4 0.0 0.0 0.0 -571.0 2.96336237e-07 0.00015023702103083965 +Body571 2.96336237e-07 0.00015023702103083965 7.07980829e-06 0.11066328857173478 0.0002025540454515301 1.713521712310485 171.11108479090643 205.51382169603775 290.0568023988995 0.4 0.4 0.4 0.0 0.0 0.0 -572.0 2.96336237e-07 0.00014196229283846236 +Body572 2.96336237e-07 0.00014196229283846236 7.07980829e-06 0.10456819544806491 2.173921362080966e-05 3.073288627352398 10.968423542573241 178.72148059876903 320.74860936554234 0.4 0.4 0.4 0.0 0.0 0.0 -573.0 2.96336237e-07 0.00017644798154518564 +Body573 2.96336237e-07 0.00017644798154518564 7.07980829e-06 0.12997005508799847 0.000934704509277352 1.9203136651672266 294.72119378122954 199.03601184031737 225.6308009153569 0.4 0.4 0.4 0.0 0.0 0.0 -574.0 2.96336237e-07 0.00488950703768421 +Body574 2.96336237e-07 0.00488950703768421 7.07980829e-06 3.6015685386473737 0.0011288535517277043 5.974265923620937 306.34658415429885 203.69236750614562 44.76481984330883 0.4 0.4 0.4 0.0 0.0 0.0 -575.0 2.96336237e-07 0.00031186948806703133 +Body575 2.96336237e-07 0.00031186948806703133 7.07980829e-06 0.2297203639813691 0.0012567479194631834 9.41483183716345 18.332217446078737 331.41003064049977 348.4144705113405 0.4 0.4 0.4 0.0 0.0 0.0 -576.0 2.96336237e-07 0.0001487618405166382 +Body576 2.96336237e-07 0.0001487618405166382 7.07980829e-06 0.10957668338069491 0.0017672399928124682 5.6249568984237825 271.47221073307526 142.67097078512444 42.26206452246715 0.4 0.4 0.4 0.0 0.0 0.0 -577.0 2.96336237e-07 0.0038743964810022463 +Body577 2.96336237e-07 0.0038743964810022463 7.07980829e-06 2.8538468939054225 0.0006506913213680251 0.591259736892407 165.1635937171999 39.0089297437918 129.8573140431278 0.4 0.4 0.4 0.0 0.0 0.0 -578.0 2.96336237e-07 0.0011639056319223877 +Body578 2.96336237e-07 0.0011639056319223877 7.07980829e-06 0.857322808532359 0.0003657736519404083 3.9944348302790336 62.91043468737944 334.19923827705736 101.7599629885375 0.4 0.4 0.4 0.0 0.0 0.0 -579.0 2.96336237e-07 0.0007557338782340886 +Body579 2.96336237e-07 0.0007557338782340886 7.07980829e-06 0.5566670297149183 0.0013819556062958454 8.912729073447055 350.379562278306 170.03008599931147 117.8897306536765 0.4 0.4 0.4 0.0 0.0 0.0 -580.0 2.96336237e-07 0.0007441033838763215 +Body580 2.96336237e-07 0.0007441033838763215 7.07980829e-06 0.5481001082962534 0.0017994302592596633 2.920918678345923 289.36419883741945 37.746177522707 109.52089250377925 0.4 0.4 0.4 0.0 0.0 0.0 -581.0 2.96336237e-07 0.0006404112844241382 +Body581 2.96336237e-07 0.0006404112844241382 7.07980829e-06 0.4717214058595851 3.268654708260321e-05 7.342893652930963 6.708118526039286 300.81672964848804 163.5847131251365 0.4 0.4 0.4 0.0 0.0 0.0 -582.0 2.96336237e-07 0.0004170343646860486 +Body582 2.96336237e-07 0.0004170343646860486 7.07980829e-06 0.30718390132422047 0.00129564052304586 6.772843533548752 132.17508244267017 235.6246930233473 92.41348937785952 0.4 0.4 0.4 0.0 0.0 0.0 -583.0 2.96336237e-07 0.0006142731857822208 +Body583 2.96336237e-07 0.0006142731857822208 7.07980829e-06 0.452468308767536 0.0012831395547548085 0.35693486697819715 289.84203743155155 37.471355251152374 152.76210299600683 0.4 0.4 0.4 0.0 0.0 0.0 -584.0 2.96336237e-07 0.0002186007074490638 +Body584 2.96336237e-07 0.0002186007074490638 7.07980829e-06 0.161019387927396 0.0005285228635833609 9.509448549686741 10.441247455748337 258.7137472871262 13.98555666620972 0.4 0.4 0.4 0.0 0.0 0.0 -585.0 2.96336237e-07 0.00015163266460483272 +Body585 2.96336237e-07 0.00015163266460483272 7.07980829e-06 0.11169130754144252 0.0017351807711539903 8.236934752674342 338.9561331034808 315.03020962224696 281.5056436671877 0.4 0.4 0.4 0.0 0.0 0.0 -586.0 2.96336237e-07 0.00013803807018296932 +Body586 2.96336237e-07 0.00013803807018296932 7.07980829e-06 0.10167764702554646 0.0010788844747734155 2.081152476831487 231.1147779863094 173.32364579351096 16.576167527235604 0.4 0.4 0.4 0.0 0.0 0.0 -587.0 2.96336237e-07 0.00014385587000249536 +Body587 2.96336237e-07 0.00014385587000249536 7.07980829e-06 0.10596298798786918 0.0015337344335405886 5.078489864022907 163.60494002217212 45.97076191655148 197.42281730424295 0.4 0.4 0.4 0.0 0.0 0.0 -588.0 2.96336237e-07 0.0010458551133801324 +Body588 2.96336237e-07 0.0010458551133801324 7.07980829e-06 0.7703678189442542 0.0009797708938080478 11.283297895529412 346.10187303775945 197.66436899732548 139.39949915940022 0.4 0.4 0.4 0.0 0.0 0.0 -589.0 2.96336237e-07 0.0006915718567643916 +Body589 2.96336237e-07 0.0006915718567643916 7.07980829e-06 0.5094058403720506 0.0005370947777134646 2.1924826909073003 303.2572365218713 287.6168495565728 39.50899662075566 0.4 0.4 0.4 0.0 0.0 0.0 -590.0 2.96336237e-07 0.00016045188829099034 +Body590 2.96336237e-07 0.00016045188829099034 7.07980829e-06 0.11818747133025725 0.0009670524569643206 4.577048973494536 255.19398559665547 190.28022421180938 155.2474211536552 0.4 0.4 0.4 0.0 0.0 0.0 -591.0 2.96336237e-07 0.001215267645449028 +Body591 2.96336237e-07 0.001215267645449028 7.07980829e-06 0.8951556228781464 0.001826137463166628 6.073642475279137 64.67987211426808 222.7717361365298 197.18867931288221 0.4 0.4 0.4 0.0 0.0 0.0 -592.0 2.96336237e-07 0.00223801144996431 +Body592 2.96336237e-07 0.00223801144996431 7.07980829e-06 1.6484998518667904 0.00016212374731820305 0.9945919558650346 19.03525850339453 233.4268420634682 199.36203861767825 0.4 0.4 0.4 0.0 0.0 0.0 -593.0 2.96336237e-07 0.00024854336865957183 +Body593 2.96336237e-07 0.00024854336865957183 7.07980829e-06 0.18307489285826092 0.0002707099289692515 9.00702823491124 115.46501288290709 103.59743334648506 126.27403706772289 0.4 0.4 0.4 0.0 0.0 0.0 -594.0 2.96336237e-07 0.001116235676776967 +Body594 2.96336237e-07 0.001116235676776967 7.07980829e-06 0.8222095324153061 0.00016278175432533432 2.9858432167738442 132.34492827913058 224.31294256691262 287.1697667291248 0.4 0.4 0.4 0.0 0.0 0.0 -595.0 2.96336237e-07 0.00023863615306077128 +Body595 2.96336237e-07 0.00023863615306077128 7.07980829e-06 0.1757773236490884 0.0018576596050919468 9.920915714559277 330.2455528634638 130.04346261213527 181.20020042815298 0.4 0.4 0.4 0.0 0.0 0.0 -596.0 2.96336237e-07 0.0005973374935985437 +Body596 2.96336237e-07 0.0005973374935985437 7.07980829e-06 0.4399936245756842 0.001985323158316638 6.144072589369572 246.27913594083248 38.497536024206944 267.37312751789614 0.4 0.4 0.4 0.0 0.0 0.0 -597.0 2.96336237e-07 0.000267870431344185 +Body597 2.96336237e-07 0.000267870431344185 7.07980829e-06 0.19731103985076764 0.0012661897820085283 1.3957219833476502 133.0753112837152 149.68409171850544 13.1900051947497 0.4 0.4 0.4 0.0 0.0 0.0 -598.0 2.96336237e-07 0.00018182297837722762 +Body598 2.96336237e-07 0.00018182297837722762 7.07980829e-06 0.1339292312046117 0.0001441448776271945 9.896120622591337 340.6224666198475 68.34349319183616 253.90966951292768 0.4 0.4 0.4 0.0 0.0 0.0 -599.0 2.96336237e-07 0.0006942814168186987 +Body599 2.96336237e-07 0.0006942814168186987 7.07980829e-06 0.5114016788420551 6.8049624083765325e-06 9.459636655573432 154.44073711328545 304.1283217208743 271.0508981064775 0.4 0.4 0.4 0.0 0.0 0.0 -600.0 2.96336237e-07 0.003251383035479193 +Body600 2.96336237e-07 0.003251383035479193 7.07980829e-06 2.394940585507335 0.001630963008879431 7.576307456712098 102.8245241661817 141.06190766153344 347.97067601007785 0.4 0.4 0.4 0.0 0.0 0.0 -601.0 2.96336237e-07 0.0008037917662087488 +Body601 2.96336237e-07 0.0008037917662087488 7.07980829e-06 0.5920660537943178 0.0007213802108214524 2.389162061972422 131.06788341462484 323.2321573259845 70.0121031471566 0.4 0.4 0.4 0.0 0.0 0.0 -602.0 2.96336237e-07 0.00031217744297902224 +Body602 2.96336237e-07 0.00031217744297902224 7.07980829e-06 0.22994720090251478 0.00030871911273242983 0.3459312765581275 202.62648951170405 203.82198400891744 203.87635197029647 0.4 0.4 0.4 0.0 0.0 0.0 -603.0 2.96336237e-07 0.0019052077650725712 +Body603 2.96336237e-07 0.0019052077650725712 7.07980829e-06 1.4033595398038192 0.0010517567411638877 7.236562515014696 42.94701433835536 253.2677416745719 214.6279211388312 0.4 0.4 0.4 0.0 0.0 0.0 -604.0 2.96336237e-07 0.0005639353501258678 +Body604 2.96336237e-07 0.0005639353501258678 7.07980829e-06 0.415389894971165 0.001251950065233756 0.04115413323433487 123.64172924201583 97.5090925740975 219.3676930750815 0.4 0.4 0.4 0.0 0.0 0.0 -605.0 2.96336237e-07 0.0008162820050460149 +Body605 2.96336237e-07 0.0008162820050460149 7.07980829e-06 0.6012662555508111 0.0007676231845837971 4.744473889977715 57.08898789584103 52.682171100489235 345.59820093224397 0.4 0.4 0.4 0.0 0.0 0.0 -606.0 2.96336237e-07 0.003258024201738965 +Body606 2.96336237e-07 0.003258024201738965 7.07980829e-06 2.3998324110588225 0.0001344199983331823 7.195320590308699 149.8789211769831 232.34004143297224 20.78144650478375 0.4 0.4 0.4 0.0 0.0 0.0 -607.0 2.96336237e-07 0.000818478166276205 +Body607 2.96336237e-07 0.000818478166276205 7.07980829e-06 0.6028839288932338 7.619711362721837e-05 1.582109832541075 66.40045877569965 266.40990238571675 151.5736391228142 0.4 0.4 0.4 0.0 0.0 0.0 -608.0 2.96336237e-07 0.00026181785846330946 +Body608 2.96336237e-07 0.00026181785846330946 7.07980829e-06 0.19285276708469426 0.0016842003747065332 0.037999884642444644 172.67468602923137 328.5727689535254 200.22342970631107 0.4 0.4 0.4 0.0 0.0 0.0 -609.0 2.96336237e-07 0.0005906305617148067 +Body609 2.96336237e-07 0.0005906305617148067 7.07980829e-06 0.4350533566351437 0.0013220093252810908 4.485287553433146 85.1645899361914 15.799195242711468 275.19440166281646 0.4 0.4 0.4 0.0 0.0 0.0 -610.0 2.96336237e-07 0.00032702729366690516 +Body610 2.96336237e-07 0.00032702729366690516 7.07980829e-06 0.24088547231288193 7.239649384495158e-05 9.34505013261343 301.3019304591288 335.6101116776717 235.56122618193643 0.4 0.4 0.4 0.0 0.0 0.0 -611.0 2.96336237e-07 0.005068804676918208 +Body611 2.96336237e-07 0.005068804676918208 7.07980829e-06 3.733637626909645 0.000296354861569827 5.064043667693064 232.80870301152322 288.950474782517 198.78340556645938 0.4 0.4 0.4 0.0 0.0 0.0 -612.0 2.96336237e-07 0.0004350708241459647 +Body612 2.96336237e-07 0.0004350708241459647 7.07980829e-06 0.3204694011586146 0.001607124776444409 1.0855739782503697 31.890025121702593 247.87942399451754 178.5652208474234 0.4 0.4 0.4 0.0 0.0 0.0 -613.0 2.96336237e-07 0.0001445964642723686 +Body613 2.96336237e-07 0.0001445964642723686 7.07980829e-06 0.10650850331318125 0.00012408216834281383 5.256181079391067 53.409562736385524 8.005838299167175 31.765234187618567 0.4 0.4 0.4 0.0 0.0 0.0 -614.0 2.96336237e-07 0.001037340939048294 +Body614 2.96336237e-07 0.001037340939048294 7.07980829e-06 0.7640963518679676 0.00013706352333168513 8.464907155099446 13.166394059277055 330.2140099724791 183.4900568440762 0.4 0.4 0.4 0.0 0.0 0.0 -615.0 2.96336237e-07 0.0001853996130910315 +Body615 2.96336237e-07 0.0001853996130910315 7.07980829e-06 0.13656374935954846 0.0012220329386595716 3.5161206014426596 277.68898473237715 164.25753427871146 175.4559030865875 0.4 0.4 0.4 0.0 0.0 0.0 -616.0 2.96336237e-07 0.0030600086446074476 +Body616 2.96336237e-07 0.0030600086446074476 7.07980829e-06 2.2539758665787524 0.001938170619110775 10.991957090603162 169.56250753355766 253.61474809359726 333.56278601175336 0.4 0.4 0.4 0.0 0.0 0.0 -617.0 2.96336237e-07 0.0001933510892994848 +Body617 2.96336237e-07 0.0001933510892994848 7.07980829e-06 0.14242073787136622 5.59282843625155e-05 2.493053399120122 278.1744327941427 63.62100350694788 315.8316048030788 0.4 0.4 0.4 0.0 0.0 0.0 -618.0 2.96336237e-07 0.0001649118494017696 +Body618 2.96336237e-07 0.0001649118494017696 7.07980829e-06 0.12147264005920569 0.00015945612176493138 5.871601357082228 346.9485775057369 207.28250697682012 95.52624383984607 0.4 0.4 0.4 0.0 0.0 0.0 -619.0 2.96336237e-07 0.00027887053207297185 +Body619 2.96336237e-07 0.00027887053207297185 7.07980829e-06 0.20541361878181558 0.00093405207335318 8.810722728327729 229.82532153182538 238.9585445114894 99.56029732602983 0.4 0.4 0.4 0.0 0.0 0.0 -620.0 2.96336237e-07 0.00022959293197398893 +Body620 2.96336237e-07 0.00022959293197398893 7.07980829e-06 0.16911616531489085 0.00033642908510491933 0.7047005877969347 52.63028151883537 46.299069317996285 148.8642116985476 0.4 0.4 0.4 0.0 0.0 0.0 -621.0 2.96336237e-07 0.0006079587867474103 +Body621 2.96336237e-07 0.0006079587867474103 7.07980829e-06 0.44781717712400537 0.0013185468969901452 7.308664230013674 112.46886738432933 46.86784968040457 285.07913941124656 0.4 0.4 0.4 0.0 0.0 0.0 -622.0 2.96336237e-07 0.0026061845394853432 +Body622 2.96336237e-07 0.0026061845394853432 7.07980829e-06 1.9196929610648872 0.0012083646380991453 6.640368790446349 33.235414808784235 244.45399861956838 50.2951600707005 0.4 0.4 0.4 0.0 0.0 0.0 -623.0 2.96336237e-07 0.0003170110547748826 +Body623 2.96336237e-07 0.0003170110547748826 7.07980829e-06 0.23350759749011243 0.0015671626539036127 5.2729849043237245 212.27489278714967 350.2070572217914 272.5174350775053 0.4 0.4 0.4 0.0 0.0 0.0 -624.0 2.96336237e-07 0.001730607217961456 +Body624 2.96336237e-07 0.001730607217961456 7.07980829e-06 1.2747502889203512 0.0011308593104387016 5.277543759453205 121.65950877291856 122.31688340803859 240.58549078686895 0.4 0.4 0.4 0.0 0.0 0.0 -625.0 2.96336237e-07 0.00045971176710267036 +Body625 2.96336237e-07 0.00045971176710267036 7.07980829e-06 0.3386197063389724 0.0019245478296946632 6.706216859920054 120.32281524162406 290.819121967765 289.80547811454966 0.4 0.4 0.4 0.0 0.0 0.0 -626.0 2.96336237e-07 0.0002908459664453671 +Body626 2.96336237e-07 0.0002908459664453671 7.07980829e-06 0.21423462002792132 0.001969455049293789 11.085891427221117 132.95197570547631 28.5155536215231 27.955901095355458 0.4 0.4 0.4 0.0 0.0 0.0 -627.0 2.96336237e-07 0.0005361763985903277 +Body627 2.96336237e-07 0.0005361763985903277 7.07980829e-06 0.39494289167498225 0.0006466901925786029 1.7275362827264746 52.27335330682294 171.19288612108963 40.59209846221847 0.4 0.4 0.4 0.0 0.0 0.0 -628.0 2.96336237e-07 0.00023450395183713944 +Body628 2.96336237e-07 0.00023450395183713944 7.07980829e-06 0.17273358001446604 0.0012843551732391793 0.240042602593119 204.30976402358672 291.4345369683879 127.56746664520237 0.4 0.4 0.4 0.0 0.0 0.0 -629.0 2.96336237e-07 0.00016800600223417086 +Body629 2.96336237e-07 0.00016800600223417086 7.07980829e-06 0.12375176623880946 0.0009103926418732471 7.69965215426651 72.52068660068198 60.65498279678075 309.48605631919054 0.4 0.4 0.4 0.0 0.0 0.0 -630.0 2.96336237e-07 0.0007723627532455746 +Body630 2.96336237e-07 0.0007723627532455746 7.07980829e-06 0.5689157150349078 0.0019387307530750579 7.7625148511423765 15.896642110598476 241.9063891364222 175.27318973415365 0.4 0.4 0.4 0.0 0.0 0.0 -631.0 2.96336237e-07 0.002486831247250957 +Body631 2.96336237e-07 0.002486831247250957 7.07980829e-06 1.8317783596577595 0.0016743653466072485 0.7366777508667895 3.356802695185532 59.64222825547303 84.47374524883585 0.4 0.4 0.4 0.0 0.0 0.0 -632.0 2.96336237e-07 0.0009871990228380316 +Body632 2.96336237e-07 0.0009871990228380316 7.07980829e-06 0.7271622506388373 0.0004894926225488888 0.8463098189096294 190.14793558849976 239.45267806069756 339.5271823753155 0.4 0.4 0.4 0.0 0.0 0.0 -633.0 2.96336237e-07 0.0024870247797498914 +Body633 2.96336237e-07 0.0024870247797498914 7.07980829e-06 1.8319209140203971 0.0018232071393422975 4.649935149793254 24.48792011915197 256.5074942589969 27.33961953231162 0.4 0.4 0.4 0.0 0.0 0.0 -634.0 2.96336237e-07 0.001226253834333867 +Body634 2.96336237e-07 0.001226253834333867 7.07980829e-06 0.9032479544654253 0.00035321447020389055 7.67738566283 321.6636415432153 24.46232049015446 174.35299257792914 0.4 0.4 0.4 0.0 0.0 0.0 -635.0 2.96336237e-07 0.0001952149125384996 +Body635 2.96336237e-07 0.0001952149125384996 7.07980829e-06 0.14379361392768433 0.0014748479195456098 5.716360603748947 186.838721744644 96.22300231415029 253.21447381830825 0.4 0.4 0.4 0.0 0.0 0.0 -636.0 2.96336237e-07 0.0001421534976608017 +Body636 2.96336237e-07 0.0001421534976608017 7.07980829e-06 0.10470903526428106 0.0004282321287474031 1.8946056877858317 125.71925949311029 37.17364830551126 314.9302159306426 0.4 0.4 0.4 0.0 0.0 0.0 -637.0 2.96336237e-07 0.00013684327484605717 +Body637 2.96336237e-07 0.00013684327484605717 7.07980829e-06 0.10079757112783726 0.0011260152644128496 4.954417366881907 197.40749831124947 246.4163541945344 127.46513997641759 0.4 0.4 0.4 0.0 0.0 0.0 -638.0 2.96336237e-07 0.0032242109199887713 +Body638 2.96336237e-07 0.0032242109199887713 7.07980829e-06 2.3749258405597247 0.0013893562078547517 8.490722761944754 174.42451874149117 109.56331625471293 139.64190938036091 0.4 0.4 0.4 0.0 0.0 0.0 -639.0 2.96336237e-07 0.000255630348446776 +Body639 2.96336237e-07 0.000255630348446776 7.07980829e-06 0.188295100793111 0.0004968066058958826 8.200683059805339 26.93767816334544 184.29122347481268 83.5885263298429 0.4 0.4 0.4 0.0 0.0 0.0 -640.0 2.96336237e-07 0.003560890948578924 +Body640 2.96336237e-07 0.003560890948578924 7.07980829e-06 2.622921433820083 0.0003197885895524075 8.459530567219446 311.9819100543256 211.94534747535357 181.0177979938429 0.4 0.4 0.4 0.0 0.0 0.0 -641.0 2.96336237e-07 0.0026795472569350305 +Body641 2.96336237e-07 0.0026795472569350305 7.07980829e-06 1.9737313033844868 0.0004561766998506409 4.075608711482687 202.22665550882067 124.25186617516704 281.22245218250043 0.4 0.4 0.4 0.0 0.0 0.0 -642.0 2.96336237e-07 0.0004998714824267933 +Body642 2.96336237e-07 0.0004998714824267933 7.07980829e-06 0.3682010048456824 0.0008391449584152692 4.540101495200403 197.81257584084372 128.159905230966 163.6508318701311 0.4 0.4 0.4 0.0 0.0 0.0 -643.0 2.96336237e-07 0.0002474592404428257 +Body643 2.96336237e-07 0.0002474592404428257 7.07980829e-06 0.1822763334028394 0.0003184451665412306 0.04858474776077769 155.96555493402232 337.1480022566122 169.02144916062696 0.4 0.4 0.4 0.0 0.0 0.0 -644.0 2.96336237e-07 0.0009028080095618069 +Body644 2.96336237e-07 0.0009028080095618069 7.07980829e-06 0.6650005611233689 0.00192871250885523 2.033364793084355 35.754249594685135 237.97464340203368 331.7190243653989 0.4 0.4 0.4 0.0 0.0 0.0 -645.0 2.96336237e-07 0.00018159315424751834 +Body645 2.96336237e-07 0.00018159315424751834 7.07980829e-06 0.13375994474104727 9.811202791236438e-05 2.2579088584966875 164.16846395501065 169.46331898131555 187.08397642347268 0.4 0.4 0.4 0.0 0.0 0.0 -646.0 2.96336237e-07 0.0001969438005298225 +Body646 2.96336237e-07 0.0001969438005298225 7.07980829e-06 0.145067097849152 7.98948634108138e-05 5.056301536012419 54.6012366078569 152.94987752228718 293.59100133569535 0.4 0.4 0.4 0.0 0.0 0.0 -647.0 2.96336237e-07 0.00018253913903001993 +Body647 2.96336237e-07 0.00018253913903001993 7.07980829e-06 0.134456748939188 0.0007885297463161409 7.998766353585145 329.66308300857037 142.40091293152295 195.08877923911388 0.4 0.4 0.4 0.0 0.0 0.0 -648.0 2.96336237e-07 0.0010012008611789895 +Body648 2.96336237e-07 0.0010012008611789895 7.07980829e-06 0.7374758834986245 0.0008944335972933425 3.08910296816031 308.0829434011404 88.44126340113061 61.511908742687396 0.4 0.4 0.4 0.0 0.0 0.0 -649.0 2.96336237e-07 0.00017920413203351859 +Body649 2.96336237e-07 0.00017920413203351859 7.07980829e-06 0.13200021166821252 0.001973824026582865 2.9139223601352673 337.9176766578831 339.15607143232756 291.8971934171335 0.4 0.4 0.4 0.0 0.0 0.0 -650.0 2.96336237e-07 0.0005424370023288993 +Body650 2.96336237e-07 0.0005424370023288993 7.07980829e-06 0.3995543981691946 0.0004742912607023718 5.689270060432094 271.4202719848906 1.5739119660578094 227.40922594438504 0.4 0.4 0.4 0.0 0.0 0.0 -651.0 2.96336237e-07 0.0008854653444048179 +Body651 2.96336237e-07 0.0008854653444048179 7.07980829e-06 0.6522261041639429 0.0018448416347183673 4.451400094266383 189.13747672082027 222.415694177009 8.122993879845518 0.4 0.4 0.4 0.0 0.0 0.0 -652.0 2.96336237e-07 0.0008694532655168269 +Body652 2.96336237e-07 0.0008694532655168269 7.07980829e-06 0.6404317455267905 0.0004377978709931798 10.690648451723188 258.4604132749266 240.45445892419482 299.1240070410905 0.4 0.4 0.4 0.0 0.0 0.0 -653.0 2.96336237e-07 0.0005874066758094755 +Body653 2.96336237e-07 0.0005874066758094755 7.07980829e-06 0.43267867019756595 0.0006281792952345125 5.71369078021565 54.584105248947814 341.5389079819305 339.8448963020495 0.4 0.4 0.4 0.0 0.0 0.0 -654.0 2.96336237e-07 0.00015901474490431352 +Body654 2.96336237e-07 0.00015901474490431352 7.07980829e-06 0.11712888395793357 0.00033420516718611843 10.079639002914915 12.72024175587819 54.80935584066693 290.1403830678467 0.4 0.4 0.4 0.0 0.0 0.0 -655.0 2.96336237e-07 0.0008367144613707807 +Body655 2.96336237e-07 0.0008367144613707807 7.07980829e-06 0.6163166259254526 0.0006138384183936136 2.1220325309486077 330.18413832377274 27.996198028777396 126.1181923299269 0.4 0.4 0.4 0.0 0.0 0.0 -656.0 2.96336237e-07 0.000817617054822833 +Body656 2.96336237e-07 0.000817617054822833 7.07980829e-06 0.6022496416542891 0.0007079234911322488 4.880614628768484 112.2946253899763 291.1896120333841 335.56499821019673 0.4 0.4 0.4 0.0 0.0 0.0 -657.0 2.96336237e-07 0.00030642858518189293 +Body657 2.96336237e-07 0.00030642858518189293 7.07980829e-06 0.22571264203682084 0.0001141107467010895 0.5281438837468506 254.84352251320942 61.46898436421913 176.76216336533523 0.4 0.4 0.4 0.0 0.0 0.0 -658.0 2.96336237e-07 0.0004456773618062657 +Body658 2.96336237e-07 0.0004456773618062657 7.07980829e-06 0.3282820849418475 0.0004042465307940946 3.7503005974513846 238.77939024376533 296.06082811160405 91.75212879566924 0.4 0.4 0.4 0.0 0.0 0.0 -659.0 2.96336237e-07 0.00024897193209457867 +Body659 2.96336237e-07 0.00024897193209457867 7.07980829e-06 0.18339056897293657 0.0014900248859833283 11.263834448814169 347.22461050262575 279.3372667732881 191.89560719513707 0.4 0.4 0.4 0.0 0.0 0.0 -660.0 2.96336237e-07 0.00022666457893856436 +Body660 2.96336237e-07 0.00022666457893856436 7.07980829e-06 0.16695916582983994 0.0004164000259568861 10.44010411581719 74.47573238247747 317.3036574166131 128.27636752925542 0.4 0.4 0.4 0.0 0.0 0.0 -661.0 2.96336237e-07 0.0005509794482643657 +Body661 2.96336237e-07 0.0005509794482643657 7.07980829e-06 0.4058466898638688 0.001868474142519383 4.290113023581601 75.15165790995682 77.41956431569024 75.98320995463946 0.4 0.4 0.4 0.0 0.0 0.0 -662.0 2.96336237e-07 0.0008553855328424462 +Body662 2.96336237e-07 0.0008553855328424462 7.07980829e-06 0.6300695754716784 0.0003500264064981754 0.8756494453825668 227.34439867668328 195.10245611576033 306.76358495203453 0.4 0.4 0.4 0.0 0.0 0.0 -663.0 2.96336237e-07 0.00021847646553867044 +Body663 2.96336237e-07 0.00021847646553867044 7.07980829e-06 0.1609278724121906 0.0015707531676115054 5.539447860380739 316.2646884519082 19.14667473997313 195.6501405355072 0.4 0.4 0.4 0.0 0.0 0.0 -664.0 2.96336237e-07 0.0046299207857439595 +Body664 2.96336237e-07 0.0046299207857439595 7.07980829e-06 3.410359553600857 0.001896588298002862 6.312335279795444 332.4966817409635 83.61093784848859 129.63382325605707 0.4 0.4 0.4 0.0 0.0 0.0 -665.0 2.96336237e-07 0.0006675378879534775 +Body665 2.96336237e-07 0.0006675378879534775 7.07980829e-06 0.4917026270908161 0.0018056644096763215 0.03984059849205596 326.2892439770493 154.1995291255449 275.56243137649767 0.4 0.4 0.4 0.0 0.0 0.0 -666.0 2.96336237e-07 0.00016422724719542423 +Body666 2.96336237e-07 0.00016422724719542423 7.07980829e-06 0.12096836800297199 0.0010632375940384557 1.898596693109538 284.6339609263093 177.91170359269552 170.17335060450043 0.4 0.4 0.4 0.0 0.0 0.0 -667.0 2.96336237e-07 0.00013928586120913445 +Body667 2.96336237e-07 0.00013928586120913445 7.07980829e-06 0.1025967590889931 0.0011505802075445371 8.0853667703526 17.643915781547662 37.81574822381601 147.74946480962396 0.4 0.4 0.4 0.0 0.0 0.0 -668.0 2.96336237e-07 0.00030551019102325244 +Body668 2.96336237e-07 0.00030551019102325244 7.07980829e-06 0.2250361608532691 0.0007463695616484125 2.9654372783413208 346.499205866674 192.7895672860623 346.62919463902944 0.4 0.4 0.4 0.0 0.0 0.0 -669.0 2.96336237e-07 0.00046071357116781613 +Body669 2.96336237e-07 0.00046071357116781613 7.07980829e-06 0.33935762653728896 0.0005718751041345676 10.28285976001631 200.006881979692 41.74957018172289 77.92610778956914 0.4 0.4 0.4 0.0 0.0 0.0 -670.0 2.96336237e-07 0.0004757090054981114 +Body670 2.96336237e-07 0.0004757090054981114 7.07980829e-06 0.3504031335978378 0.0016231463843525307 8.030331289553216 15.924355318435744 268.6979116032126 60.52120112419434 0.4 0.4 0.4 0.0 0.0 0.0 -671.0 2.96336237e-07 0.0006120138337095581 +Body671 2.96336237e-07 0.0006120138337095581 7.07980829e-06 0.4508040895978089 0.000265285576125677 6.8369691834517505 316.3659801854172 71.741967981769 201.95398950257825 0.4 0.4 0.4 0.0 0.0 0.0 -672.0 2.96336237e-07 0.0002678933984330214 +Body672 2.96336237e-07 0.0002678933984330214 7.07980829e-06 0.19732795720949928 0.0014827227710590524 9.026813439297806 309.574481788882 64.29359356770362 315.62242388091744 0.4 0.4 0.4 0.0 0.0 0.0 -673.0 2.96336237e-07 0.00018963216147158642 +Body673 2.96336237e-07 0.00018963216147158642 7.07980829e-06 0.13968140784090927 0.0002432662323447128 1.898068040476368 32.77520487590174 187.89963303352357 123.05929733557318 0.4 0.4 0.4 0.0 0.0 0.0 -674.0 2.96336237e-07 0.000434625653282486 +Body674 2.96336237e-07 0.000434625653282486 7.07980829e-06 0.32014149215595433 0.00022612721316125548 10.683120155053267 110.32662597708337 10.31254512885041 235.1266578745043 0.4 0.4 0.4 0.0 0.0 0.0 -675.0 2.96336237e-07 0.0001472189376390587 +Body675 2.96336237e-07 0.0001472189376390587 7.07980829e-06 0.10844019448329664 0.0009411317524646069 6.1396351895991 81.4179177567502 358.59783028280935 140.88338828782435 0.4 0.4 0.4 0.0 0.0 0.0 -676.0 2.96336237e-07 0.000155275679541639 +Body676 2.96336237e-07 0.000155275679541639 7.07980829e-06 0.11437472079376051 0.00014078280759094789 6.80643269318097 100.47008138693961 234.06621211429206 30.227410402726072 0.4 0.4 0.4 0.0 0.0 0.0 -677.0 2.96336237e-07 0.00015085363059412783 +Body677 2.96336237e-07 0.00015085363059412783 7.07980829e-06 0.11111747783593914 0.0019035866271859907 9.206963338815642 143.93390754803625 255.0214135079393 164.96961100176586 0.4 0.4 0.4 0.0 0.0 0.0 -678.0 2.96336237e-07 0.0006284217651180013 +Body678 2.96336237e-07 0.0006284217651180013 7.07980829e-06 0.4628900297732671 0.00047998741958668416 1.0303231727163369 64.52588412504464 11.451639250708514 337.19518620904057 0.4 0.4 0.4 0.0 0.0 0.0 -679.0 2.96336237e-07 0.0005667897074819582 +Body679 2.96336237e-07 0.0005667897074819582 7.07980829e-06 0.41749238987965404 0.0016594297588471735 8.093638105658696 206.58695034847358 20.457138485484986 195.3333738138891 0.4 0.4 0.4 0.0 0.0 0.0 -680.0 2.96336237e-07 0.0003023018289134171 +Body680 2.96336237e-07 0.0003023018289134171 7.07980829e-06 0.22267290910901064 0.0007335787751952187 10.488189469864082 332.07166362509565 297.83121697771855 96.42669951726079 0.4 0.4 0.4 0.0 0.0 0.0 -681.0 2.96336237e-07 0.0002666793468056547 +Body681 2.96336237e-07 0.0002666793468056547 7.07980829e-06 0.19643369729500934 0.0009795508494005235 2.132504721935984 88.01559085201606 259.0222461437196 143.73866315216463 0.4 0.4 0.4 0.0 0.0 0.0 -682.0 2.96336237e-07 0.00018903218193703922 +Body682 2.96336237e-07 0.00018903218193703922 7.07980829e-06 0.13923946811185206 6.602681404781175e-05 4.603002472462074 288.85709177130957 136.40944246624719 329.89625217303643 0.4 0.4 0.4 0.0 0.0 0.0 -683.0 2.96336237e-07 0.00032821229707185543 +Body683 2.96336237e-07 0.00032821229707185543 7.07980829e-06 0.2417583355583105 0.0015448242869727717 10.177886468554314 197.6042898566892 248.32269227881912 224.3736884568563 0.4 0.4 0.4 0.0 0.0 0.0 -684.0 2.96336237e-07 0.0001476157870951627 +Body684 2.96336237e-07 0.0001476157870951627 7.07980829e-06 0.10873251035576964 0.0005980920597091385 8.435273501160374 342.7004387606334 332.6896722540702 309.5558133299631 0.4 0.4 0.4 0.0 0.0 0.0 -685.0 2.96336237e-07 0.00023150245382020737 +Body685 2.96336237e-07 0.00023150245382020737 7.07980829e-06 0.17052270256950486 0.0013616593545773424 10.890136087894044 304.6528113313791 61.04197597194677 92.14557773468027 0.4 0.4 0.4 0.0 0.0 0.0 -686.0 2.96336237e-07 0.002179631735533323 +Body686 2.96336237e-07 0.002179631735533323 7.07980829e-06 1.6054978598112797 0.0018262799514842743 4.4325784016024885 3.7549247937623407 183.00283602981585 201.8865183895837 0.4 0.4 0.4 0.0 0.0 0.0 -687.0 2.96336237e-07 0.0013158755088717858 +Body687 2.96336237e-07 0.0013158755088717858 7.07980829e-06 0.9692625037663991 0.0017704630109185754 8.578872157801683 254.43921029038702 150.26756994645848 147.04436858266612 0.4 0.4 0.4 0.0 0.0 0.0 -688.0 2.96336237e-07 0.0004939073938160034 +Body688 2.96336237e-07 0.0004939073938160034 7.07980829e-06 0.3638079088266409 3.476963813007497e-05 7.372412467124726 174.2397072432993 36.804476049813175 252.09380653575596 0.4 0.4 0.4 0.0 0.0 0.0 -689.0 2.96336237e-07 0.0009275705379094532 +Body689 2.96336237e-07 0.0009275705379094532 7.07980829e-06 0.6832404250497098 0.0012888767115054062 6.14322940730504 289.9180198728175 52.50586858445317 313.02109249593957 0.4 0.4 0.4 0.0 0.0 0.0 -690.0 2.96336237e-07 0.001703767654000007 +Body690 2.96336237e-07 0.001703767654000007 7.07980829e-06 1.2549804985489377 0.0012611754043086853 6.907937339024762 21.593275472050017 306.5247233767375 334.8416878198467 0.4 0.4 0.4 0.0 0.0 0.0 -691.0 2.96336237e-07 0.00014982533379061578 +Body691 2.96336237e-07 0.00014982533379061578 7.07980829e-06 0.11036004331598093 0.0010076489714658532 5.873722340739745 130.13028564258022 280.7695443082286 332.320263822961 0.4 0.4 0.4 0.0 0.0 0.0 -692.0 2.96336237e-07 0.00019578934965292167 +Body692 2.96336237e-07 0.00019578934965292167 7.07980829e-06 0.14421673933128612 0.0015622315821619312 11.09482074137682 159.1055068305897 332.4641004637756 66.24381345940542 0.4 0.4 0.4 0.0 0.0 0.0 -693.0 2.96336237e-07 0.0005403743795116072 +Body693 2.96336237e-07 0.0005403743795116072 7.07980829e-06 0.3980350880652103 0.0011789556791269224 9.365646318173521 179.08988980834505 182.25478313354176 230.60531044742112 0.4 0.4 0.4 0.0 0.0 0.0 -694.0 2.96336237e-07 0.00013842399008811172 +Body694 2.96336237e-07 0.00013842399008811172 7.07980829e-06 0.10196191228543591 0.001511674657718188 6.479749813751055 303.7457569578909 58.507652243295375 15.998340357817439 0.4 0.4 0.4 0.0 0.0 0.0 -695.0 2.96336237e-07 0.000786370680814055 +Body695 2.96336237e-07 0.000786370680814055 7.07980829e-06 0.5792338331669525 0.0015758918681709252 2.223362196868569 345.57393152987873 54.32062551066704 256.30215707274664 0.4 0.4 0.4 0.0 0.0 0.0 -696.0 2.96336237e-07 0.00023215604873114143 +Body696 2.96336237e-07 0.00023215604873114143 7.07980829e-06 0.17100413492047556 0.000896305323811314 1.477365418838949 283.2291601972887 120.31150953749442 10.525291736890637 0.4 0.4 0.4 0.0 0.0 0.0 -697.0 2.96336237e-07 0.0009573509260265156 +Body697 2.96336237e-07 0.0009573509260265156 7.07980829e-06 0.7051764010253001 0.0019473619911553302 5.46883494082748 134.36185274508637 184.44009607520738 171.13748203011968 0.4 0.4 0.4 0.0 0.0 0.0 -698.0 2.96336237e-07 0.000986443639892288 +Body698 2.96336237e-07 0.000986443639892288 7.07980829e-06 0.7266058421029556 0.0017744648819095605 2.4134341797858845 213.37357339309585 70.55466510705511 278.87927999605495 0.4 0.4 0.4 0.0 0.0 0.0 -699.0 2.96336237e-07 0.0005347437515155118 +Body699 2.96336237e-07 0.0005347437515155118 7.07980829e-06 0.3938876162470352 4.179300896003979e-05 8.223098115975583 85.94541014994134 271.8418525346638 50.56502453799913 0.4 0.4 0.4 0.0 0.0 0.0 -700.0 2.96336237e-07 0.0011825627283298537 +Body700 2.96336237e-07 0.0011825627283298537 7.07980829e-06 0.8710654641673258 0.0005109129898239557 7.391471968575326 27.768736733955453 87.73669240747158 148.38631012868396 0.4 0.4 0.4 0.0 0.0 0.0 -701.0 2.96336237e-07 0.0008642834152835138 +Body701 2.96336237e-07 0.0008642834152835138 7.07980829e-06 0.63662367861814 0.0015328328582410093 10.518483860791719 1.324842387549117 251.57031937929105 356.72404795950865 0.4 0.4 0.4 0.0 0.0 0.0 -702.0 2.96336237e-07 0.00017933377161084873 +Body702 2.96336237e-07 0.00017933377161084873 7.07980829e-06 0.13209570305813736 0.001322871106967368 1.783841837906193 146.87654874467452 95.91665072944734 45.62504352116719 0.4 0.4 0.4 0.0 0.0 0.0 -703.0 2.96336237e-07 0.00014018472613653047 +Body703 2.96336237e-07 0.00014018472613653047 7.07980829e-06 0.10325885520994202 0.0017386158889329596 2.9940039457503267 311.39999279407516 208.4438630978695 314.67438404243035 0.4 0.4 0.4 0.0 0.0 0.0 -704.0 2.96336237e-07 0.00015540204600507363 +Body704 2.96336237e-07 0.00015540204600507363 7.07980829e-06 0.11446780123633656 0.0006725612422352022 4.917737372954217 283.5772959714623 71.2268392860552 20.739701307542546 0.4 0.4 0.4 0.0 0.0 0.0 -705.0 2.96336237e-07 0.0010803722366743227 +Body705 2.96336237e-07 0.0010803722366743227 7.07980829e-06 0.7957928330290784 0.001841262773469651 5.178751748100323 325.4814860257893 191.2892219329175 245.12287325303154 0.4 0.4 0.4 0.0 0.0 0.0 -706.0 2.96336237e-07 0.0003336506402990743 +Body706 2.96336237e-07 0.0003336506402990743 7.07980829e-06 0.245764172081003 0.0008654037237796469 9.939631759610565 230.74275967542837 22.980689444767926 193.7582323009708 0.4 0.4 0.4 0.0 0.0 0.0 -707.0 2.96336237e-07 0.0001898928096710243 +Body707 2.96336237e-07 0.0001898928096710243 7.07980829e-06 0.1398733990472856 9.676663150501012e-05 8.314426882477536 147.19261490448886 240.45701745184593 27.02600158549476 0.4 0.4 0.4 0.0 0.0 0.0 -708.0 2.96336237e-07 0.0006354028822312142 +Body708 2.96336237e-07 0.0006354028822312142 7.07980829e-06 0.46803226017927313 0.0005896313259031769 1.5927514004708827 145.89505669147474 320.41144833715174 224.47590179873464 0.4 0.4 0.4 0.0 0.0 0.0 -709.0 2.96336237e-07 0.00034681023979569645 +Body709 2.96336237e-07 0.00034681023979569645 7.07980829e-06 0.25545741910221637 0.0007136334057754165 4.50399133200968 172.94403815595263 133.4379306179208 151.9923540365337 0.4 0.4 0.4 0.0 0.0 0.0 -710.0 2.96336237e-07 0.0004473427981548912 +Body710 2.96336237e-07 0.0004473427981548912 7.07980829e-06 0.3295088309328238 0.00013825366577298724 0.6640671450405241 113.36805573037367 195.17836298394744 272.68190859714724 0.4 0.4 0.4 0.0 0.0 0.0 -711.0 2.96336237e-07 0.0004337909237351195 +Body711 2.96336237e-07 0.0004337909237351195 7.07980829e-06 0.3195266376004942 0.0005762012937554643 6.664872975247961 125.97058901306497 139.46256025551878 194.88332638602157 0.4 0.4 0.4 0.0 0.0 0.0 -712.0 2.96336237e-07 0.00022887849633253414 +Body712 2.96336237e-07 0.00022887849633253414 7.07980829e-06 0.16858991820872643 0.0009324015520148652 3.87237174229875 210.3622711985168 217.76685945633358 226.25184493096793 0.4 0.4 0.4 0.0 0.0 0.0 -713.0 2.96336237e-07 0.0001370280669148757 +Body713 2.96336237e-07 0.0001370280669148757 7.07980829e-06 0.10093368736534727 0.0009578400499910475 7.837345853171855 211.1012710762346 352.555679574253 98.72806588507845 0.4 0.4 0.4 0.0 0.0 0.0 -714.0 2.96336237e-07 0.0003802455491822092 +Body714 2.96336237e-07 0.0003802455491822092 7.07980829e-06 0.280085578431636 0.0012200235046621196 8.03839773670988 118.75583481423674 351.88628181557317 159.5308600334554 0.4 0.4 0.4 0.0 0.0 0.0 -715.0 2.96336237e-07 0.0012710618691298007 +Body715 2.96336237e-07 0.0012710618691298007 7.07980829e-06 0.9362531648385521 0.001960157851242125 10.763840351695578 43.05187730426613 115.02995672645146 27.80931454782792 0.4 0.4 0.4 0.0 0.0 0.0 -716.0 2.96336237e-07 0.00015113095705303057 +Body716 2.96336237e-07 0.00015113095705303057 7.07980829e-06 0.11132175410379613 0.00198126814743763 6.286001060098768 87.14091069310513 338.04209973091486 55.507811122078934 0.4 0.4 0.4 0.0 0.0 0.0 -717.0 2.96336237e-07 0.00050657397189937 +Body717 2.96336237e-07 0.00050657397189937 7.07980829e-06 0.3731380005446354 0.0016662782222925448 3.2831614880553754 78.53670413788092 281.76281833275186 241.33812351763282 0.4 0.4 0.4 0.0 0.0 0.0 -718.0 2.96336237e-07 0.00033871726387646765 +Body718 2.96336237e-07 0.00033871726387646765 7.07980829e-06 0.24949620312889192 0.000652351960471266 9.107336295930738 293.4968146155879 130.3880884808986 356.21004108918163 0.4 0.4 0.4 0.0 0.0 0.0 -719.0 2.96336237e-07 0.0008529081508180829 +Body719 2.96336237e-07 0.0008529081508180829 7.07980829e-06 0.6282447573277652 0.0001692190026859606 0.4135194149743559 183.7778900459685 3.1747878073784532 37.93304287401226 0.4 0.4 0.4 0.0 0.0 0.0 -720.0 2.96336237e-07 0.0014504542485699796 +Body720 2.96336237e-07 0.0014504542485699796 7.07980829e-06 1.0683920379162042 0.0014337151872125485 0.15507329878585382 222.75507709194997 353.7339650120208 253.22449111367806 0.4 0.4 0.4 0.0 0.0 0.0 -721.0 2.96336237e-07 0.0003995851699871754 +Body721 2.96336237e-07 0.0003995851699871754 7.07980829e-06 0.29433097562683586 5.018617293303635e-06 4.606276855402575 196.30495919528175 80.02677322973838 261.5544103562484 0.4 0.4 0.4 0.0 0.0 0.0 -722.0 2.96336237e-07 0.0004663049126723303 +Body722 2.96336237e-07 0.0004663049126723303 7.07980829e-06 0.3434761602660039 0.0014277603419004838 5.4988869942119445 18.336750193775515 61.72061996821379 24.32664588396063 0.4 0.4 0.4 0.0 0.0 0.0 -723.0 2.96336237e-07 0.00016160736072448088 +Body723 2.96336237e-07 0.00016160736072448088 7.07980829e-06 0.11903858231785998 0.0014582262824983866 5.448228802161735 118.05515219608522 99.46467963418462 74.32735266079698 0.4 0.4 0.4 0.0 0.0 0.0 -724.0 2.96336237e-07 0.00030145139394952675 +Body724 2.96336237e-07 0.00030145139394952675 7.07980829e-06 0.22204648607975494 0.0002651624829284599 3.4839261536774204 353.7033605924432 26.63014034431109 258.883489782699 0.4 0.4 0.4 0.0 0.0 0.0 -725.0 2.96336237e-07 0.00019587870513939723 +Body725 2.96336237e-07 0.00019587870513939723 7.07980829e-06 0.14428255780876567 0.0005886921483224232 7.122349866659202 187.9185724288045 277.49814412774685 339.1040220890197 0.4 0.4 0.4 0.0 0.0 0.0 -726.0 2.96336237e-07 0.00018223697272332903 +Body726 2.96336237e-07 0.00018223697272332903 7.07980829e-06 0.1342341758545744 0.001993061737343073 1.5186597635745005 186.16266229109107 120.82284316697938 36.16980590190327 0.4 0.4 0.4 0.0 0.0 0.0 -727.0 2.96336237e-07 0.002208504304487439 +Body727 2.96336237e-07 0.002208504304487439 7.07980829e-06 1.6267651440535622 0.001997985158804577 0.8593148249474335 72.18814289875074 80.88938512039681 349.70856370829034 0.4 0.4 0.4 0.0 0.0 0.0 -728.0 2.96336237e-07 0.0008108208240677552 +Body728 2.96336237e-07 0.0008108208240677552 7.07980829e-06 0.597243596938487 0.0005039148462018542 4.7811402892298025 218.77516459671426 24.768981392881912 280.2967231155555 0.4 0.4 0.4 0.0 0.0 0.0 -729.0 2.96336237e-07 0.001132726282941681 +Body729 2.96336237e-07 0.001132726282941681 7.07980829e-06 0.8343563701002331 0.00039414985266650896 3.6037723479865944 83.15750376306154 75.42354496372273 97.74895243636577 0.4 0.4 0.4 0.0 0.0 0.0 -730.0 2.96336237e-07 0.00032727320517223467 +Body730 2.96336237e-07 0.00032727320517223467 7.07980829e-06 0.24106660859800436 0.00037987141173158616 10.274740295263058 197.91773818633536 352.5865595760306 261.0191288110265 0.4 0.4 0.4 0.0 0.0 0.0 -731.0 2.96336237e-07 0.0009752402802714085 +Body731 2.96336237e-07 0.0009752402802714085 7.07980829e-06 0.7183535444323048 0.0013231086235482108 0.9592225266971143 274.38243588304704 344.23442375404215 260.73810812560674 0.4 0.4 0.4 0.0 0.0 0.0 -732.0 2.96336237e-07 0.0011428393782413875 +Body732 2.96336237e-07 0.0011428393782413875 7.07980829e-06 0.8418055885140829 0.0010192051936423027 2.1830154450298775 22.895436977403044 357.1218738349401 85.62306577590662 0.4 0.4 0.4 0.0 0.0 0.0 -733.0 2.96336237e-07 0.0004572602444272732 +Body733 2.96336237e-07 0.0004572602444272732 7.07980829e-06 0.3368139359675542 0.000555346752112463 6.319773644161184 113.6762916782172 224.86454862560015 165.82655056882967 0.4 0.4 0.4 0.0 0.0 0.0 -734.0 2.96336237e-07 0.00015778980918020817 +Body734 2.96336237e-07 0.00015778980918020817 7.07980829e-06 0.11622660691204703 0.0012360086888716822 3.7103248613231874 141.15874516414368 232.6102120136255 8.479461773646221 0.4 0.4 0.4 0.0 0.0 0.0 -735.0 2.96336237e-07 0.0014942829058571304 +Body735 2.96336237e-07 0.0014942829058571304 7.07980829e-06 1.1006758472982074 0.000349403337070044 0.14346873743832864 76.87539447076438 105.24609325235642 249.8553971165713 0.4 0.4 0.4 0.0 0.0 0.0 -736.0 2.96336237e-07 0.00014637261873858538 +Body736 2.96336237e-07 0.00014637261873858538 7.07980829e-06 0.10781680331070699 0.0012736508360480675 11.221630354955153 129.42714487972242 65.22069766832125 279.98812006676945 0.4 0.4 0.4 0.0 0.0 0.0 -737.0 2.96336237e-07 0.0008608180061731988 +Body737 2.96336237e-07 0.0008608180061731988 7.07980829e-06 0.6340710882794698 0.001511988582795197 4.2441144550867795 249.39391931471766 309.17457420265424 17.839708517509724 0.4 0.4 0.4 0.0 0.0 0.0 -738.0 2.96336237e-07 0.00022551393979595722 +Body738 2.96336237e-07 0.00022551393979595722 7.07980829e-06 0.16611161500244348 0.0017230161759853974 2.754899549887548 284.2214645492094 329.7467797502512 345.5511870893493 0.4 0.4 0.4 0.0 0.0 0.0 -739.0 2.96336237e-07 0.0008344058534459075 +Body739 2.96336237e-07 0.0008344058534459075 7.07980829e-06 0.6146161253215647 0.0011901584859750538 0.6692427980735299 220.04955308835034 17.55046868783327 22.589151763506287 0.4 0.4 0.4 0.0 0.0 0.0 -740.0 2.96336237e-07 0.0003864765014179772 +Body740 2.96336237e-07 0.0003864765014179772 7.07980829e-06 0.28467524388567844 0.0005656004790699498 0.0869755058384638 36.08205324642893 11.74038337500243 191.43021754215243 0.4 0.4 0.4 0.0 0.0 0.0 -741.0 2.96336237e-07 0.00014406405961522867 +Body741 2.96336237e-07 0.00014406405961522867 7.07980829e-06 0.10611633865359367 0.0004104958381684452 5.536332415834654 306.2252048683907 222.88495242694134 297.9257683728652 0.4 0.4 0.4 0.0 0.0 0.0 -742.0 2.96336237e-07 0.0002106722970417079 +Body742 2.96336237e-07 0.0002106722970417079 7.07980829e-06 0.15517938948490648 0.0016045777089143468 6.257405036858542 132.6281615688201 124.58164025052454 209.3185616951079 0.4 0.4 0.4 0.0 0.0 0.0 -743.0 2.96336237e-07 0.00034739878913081577 +Body743 2.96336237e-07 0.00034739878913081577 7.07980829e-06 0.2558909394453656 0.0008848410000050655 1.8800883236189605 22.59000938767972 244.71224492603585 203.02373720932383 0.4 0.4 0.4 0.0 0.0 0.0 -744.0 2.96336237e-07 0.0002416141226863816 +Body744 2.96336237e-07 0.0002416141226863816 7.07980829e-06 0.17797087028476838 0.0018027797509316973 5.535730075592067 144.6725556217197 254.9396114858643 294.6395873317908 0.4 0.4 0.4 0.0 0.0 0.0 -745.0 2.96336237e-07 0.000562846985628491 +Body745 2.96336237e-07 0.000562846985628491 7.07980829e-06 0.4145882151081191 0.0017929642136530707 9.086241206217649 353.3526691916557 314.79294099522104 259.4798715415805 0.4 0.4 0.4 0.0 0.0 0.0 -746.0 2.96336237e-07 0.00028597602580276727 +Body746 2.96336237e-07 0.00028597602580276727 7.07980829e-06 0.21064746392643938 0.0011404320812687437 1.3497302415157837 264.89618015841376 315.938364379284 213.05922299203462 0.4 0.4 0.4 0.0 0.0 0.0 -747.0 2.96336237e-07 0.0005955575301132271 +Body747 2.96336237e-07 0.0005955575301132271 7.07980829e-06 0.4386825188876773 0.001262635271510421 1.019380298177697 326.28037068382815 239.50749192273528 357.0437637912174 0.4 0.4 0.4 0.0 0.0 0.0 -748.0 2.96336237e-07 0.0003194116973814109 +Body748 2.96336237e-07 0.0003194116973814109 7.07980829e-06 0.2352758900434459 0.0009268394605218976 2.8545622521287846 301.8093959116166 73.63705470361427 196.66760197641878 0.4 0.4 0.4 0.0 0.0 0.0 -749.0 2.96336237e-07 0.00021345646348534076 +Body749 2.96336237e-07 0.00021345646348534076 7.07980829e-06 0.15723018237516379 0.0015428543506282974 5.245136896364564 37.46583168672329 98.8444306387554 286.91754980834173 0.4 0.4 0.4 0.0 0.0 0.0 -750.0 2.96336237e-07 0.0018562879648262526 +Body750 2.96336237e-07 0.0018562879648262526 7.07980829e-06 1.3673256386096608 0.00019464130129659486 6.392431451247973 13.671795434653754 256.8057573052545 208.9974818148667 0.4 0.4 0.4 0.0 0.0 0.0 -751.0 2.96336237e-07 0.0003438121044613112 +Body751 2.96336237e-07 0.0003438121044613112 7.07980829e-06 0.25324901858009685 0.0004849968083047293 0.6512227674260226 191.72118211560357 27.38888088806392 215.418613343208 0.4 0.4 0.4 0.0 0.0 0.0 -752.0 2.96336237e-07 0.0007351719490103386 +Body752 2.96336237e-07 0.0007351719490103386 7.07980829e-06 0.5415212907241782 0.0017214586941266883 5.013572365171728 1.1868998491342897 310.0545999201715 263.421684099375 0.4 0.4 0.4 0.0 0.0 0.0 -753.0 2.96336237e-07 0.0001440480205409621 +Body753 2.96336237e-07 0.0001440480205409621 7.07980829e-06 0.10610452441039445 0.001415155758078455 2.9168704913691466 87.34460078326019 115.41238499588349 218.47853766179134 0.4 0.4 0.4 0.0 0.0 0.0 -754.0 2.96336237e-07 0.00016567726861439446 +Body754 2.96336237e-07 0.00016567726861439446 7.07980829e-06 0.12203644122235352 0.0007367694324498964 7.939696829581024 144.80446947266682 334.6934128655556 334.96083232634686 0.4 0.4 0.4 0.0 0.0 0.0 -755.0 2.96336237e-07 0.003357132716724993 +Body755 2.96336237e-07 0.003357132716724993 7.07980829e-06 2.4728348848736057 0.00109460936093632 7.57817818817873 200.93402617764775 38.94546503077487 336.82864362635746 0.4 0.4 0.4 0.0 0.0 0.0 -756.0 2.96336237e-07 0.000239476354339221 +Body756 2.96336237e-07 0.000239476354339221 7.07980829e-06 0.17639620863427682 0.001108603677540412 2.174346842575558 204.07151110596655 298.80659272210426 94.77954703857242 0.4 0.4 0.4 0.0 0.0 0.0 -757.0 2.96336237e-07 0.0002247301690325285 +Body757 2.96336237e-07 0.0002247301690325285 7.07980829e-06 0.16553429624590613 2.286669973466227e-05 8.477343429801845 104.59141545363481 254.52826278341865 156.39407168530036 0.4 0.4 0.4 0.0 0.0 0.0 -758.0 2.96336237e-07 0.00013690457719890955 +Body758 2.96336237e-07 0.00013690457719890955 7.07980829e-06 0.10084272591004262 0.0005270544426914094 1.2430379394875384 18.23871682645244 274.6745175011331 46.74741417981779 0.4 0.4 0.4 0.0 0.0 0.0 -759.0 2.96336237e-07 0.0002564215369937045 +Body759 2.96336237e-07 0.0002564215369937045 7.07980829e-06 0.18887788342473297 0.0013769913442365858 5.516940557693017 57.296249965262085 304.79426021501166 341.6907740411331 0.4 0.4 0.4 0.0 0.0 0.0 -760.0 2.96336237e-07 0.00032523412275674117 +Body760 2.96336237e-07 0.00032523412275674117 7.07980829e-06 0.23956463815011464 0.0004766588720606672 0.6849299933323854 295.98639353183904 117.36140746706391 355.6278987307299 0.4 0.4 0.4 0.0 0.0 0.0 -761.0 2.96336237e-07 0.0006034806082832441 +Body761 2.96336237e-07 0.0006034806082832441 7.07980829e-06 0.44451858965032254 0.0015451262612941163 9.453687588841811 203.39899116099176 75.07410352055902 288.420934960148 0.4 0.4 0.4 0.0 0.0 0.0 -762.0 2.96336237e-07 0.00015674806130235787 +Body762 2.96336237e-07 0.00015674806130235787 7.07980829e-06 0.11545926444722357 0.00022678197602867345 2.51397584832074 154.11481001554114 316.5895802985698 144.8171785524458 0.4 0.4 0.4 0.0 0.0 0.0 -763.0 2.96336237e-07 0.00044591737566831286 +Body763 2.96336237e-07 0.00044591737566831286 7.07980829e-06 0.3284588770740044 0.000582023915909846 1.9042826267649233 183.0490667929288 34.32821351074982 128.09899856474172 0.4 0.4 0.4 0.0 0.0 0.0 -764.0 2.96336237e-07 0.00020874189344392697 +Body764 2.96336237e-07 0.00020874189344392697 7.07980829e-06 0.15375747091293682 0.0013518925712033031 3.9213046414563917 252.88051690821115 346.0891363946157 227.24651734444123 0.4 0.4 0.4 0.0 0.0 0.0 -765.0 2.96336237e-07 0.0005977027995281557 +Body765 2.96336237e-07 0.0005977027995281557 7.07980829e-06 0.44026270575972415 0.001706378820013462 3.665130790550011 279.1441761599938 331.86968339138923 161.08982168644127 0.4 0.4 0.4 0.0 0.0 0.0 -766.0 2.96336237e-07 0.0005462104415519695 +Body766 2.96336237e-07 0.0005462104415519695 7.07980829e-06 0.40233388082124205 0.00045154828716743357 7.549631354241249 166.25274596264225 139.83647490843492 241.36161695412613 0.4 0.4 0.4 0.0 0.0 0.0 -767.0 2.96336237e-07 0.0019508638604603097 +Body767 2.96336237e-07 0.0019508638604603097 7.07980829e-06 1.4369894242642867 0.0019299261931772004 4.408038074230426 123.84920808275756 5.017403188848644 267.46104210371675 0.4 0.4 0.4 0.0 0.0 0.0 -768.0 2.96336237e-07 0.00021438100266887562 +Body768 2.96336237e-07 0.00021438100266887562 7.07980829e-06 0.15791118993083406 0.0019442717872762822 11.39841416830864 231.35322832263287 339.9831170872492 170.62953355543732 0.4 0.4 0.4 0.0 0.0 0.0 -769.0 2.96336237e-07 0.00013637692054304016 +Body769 2.96336237e-07 0.00013637692054304016 7.07980829e-06 0.1004540585870711 0.0001344854299818731 2.9430162092938996 101.18123245946741 16.977350858590118 217.85339551927711 0.4 0.4 0.4 0.0 0.0 0.0 -770.0 2.96336237e-07 0.00039628226188392717 +Body770 2.96336237e-07 0.00039628226188392717 7.07980829e-06 0.2918980821226399 0.0013619973696854474 0.467152728932887 108.18991731689154 176.95159646304947 72.23870735210176 0.4 0.4 0.4 0.0 0.0 0.0 -771.0 2.96336237e-07 0.000698358333406906 +Body771 2.96336237e-07 0.000698358333406906 7.07980829e-06 0.5144047002930133 0.0015421293318597141 11.415702042294306 260.27523332282703 273.2602707005577 186.21628932692565 0.4 0.4 0.4 0.0 0.0 0.0 -772.0 2.96336237e-07 0.00028461336199966497 +Body772 2.96336237e-07 0.00028461336199966497 7.07980829e-06 0.20964373757035026 0.0013800293673098358 8.859667863354286 125.68513477242199 61.52892104688898 229.49254655341616 0.4 0.4 0.4 0.0 0.0 0.0 -773.0 2.96336237e-07 0.0033019090419650742 +Body773 2.96336237e-07 0.0033019090419650742 7.07980829e-06 2.4321576043070934 7.592285081661148e-05 6.75835305766169 278.44449561624015 201.0474604342087 246.68234934394988 0.4 0.4 0.4 0.0 0.0 0.0 -774.0 2.96336237e-07 0.0016086561408426812 +Body774 2.96336237e-07 0.0016086561408426812 7.07980829e-06 1.1849221816653586 0.0012518712973603068 6.07210859808765 329.8140693187001 178.90220086015898 344.2534420910264 0.4 0.4 0.4 0.0 0.0 0.0 -775.0 2.96336237e-07 0.0004057839032363561 +Body775 2.96336237e-07 0.0004057839032363561 7.07980829e-06 0.29889690885438885 0.00030723730352063704 1.3545602077168246 275.29327826163626 16.48766869977107 289.9506131142709 0.4 0.4 0.4 0.0 0.0 0.0 -776.0 2.96336237e-07 0.0005182646094632937 +Body776 2.96336237e-07 0.0005182646094632937 7.07980829e-06 0.3817492229280883 0.0017244210524684127 11.35830215721803 198.9972987687514 15.552954256805542 112.4403775751002 0.4 0.4 0.4 0.0 0.0 0.0 -777.0 2.96336237e-07 0.00025773587547939263 +Body777 2.96336237e-07 0.00025773587547939263 7.07980829e-06 0.18984601377053362 0.0017068426449346299 7.7791974518317195 62.53619149931553 120.73376985616541 225.68366487062107 0.4 0.4 0.4 0.0 0.0 0.0 -778.0 2.96336237e-07 0.0011513744043605825 +Body778 2.96336237e-07 0.0011513744043605825 7.07980829e-06 0.8480924148363507 0.0008740145212589823 9.389156432134588 3.3864525215180348 191.77297733737754 50.34556783248005 0.4 0.4 0.4 0.0 0.0 0.0 -779.0 2.96336237e-07 0.00019069701018462385 +Body779 2.96336237e-07 0.00019069701018462385 7.07980829e-06 0.14046576618086803 0.0016610122416479565 0.3263632448613249 202.3832416550209 148.90572697487266 306.71587259490514 0.4 0.4 0.4 0.0 0.0 0.0 -780.0 2.96336237e-07 0.000183014949797821 +Body780 2.96336237e-07 0.000183014949797821 7.07980829e-06 0.13480722703001688 0.00023870757193003006 10.86745715521768 40.4422116892952 332.72334304633546 102.46487442592486 0.4 0.4 0.4 0.0 0.0 0.0 -781.0 2.96336237e-07 0.00019010035917179903 +Body781 2.96336237e-07 0.00019010035917179903 7.07980829e-06 0.14002627821208505 0.0009745538138515665 2.605842650876843 248.8424013641794 252.33564259715783 158.58573935383882 0.4 0.4 0.4 0.0 0.0 0.0 -782.0 2.96336237e-07 0.00015766445076292833 +Body782 2.96336237e-07 0.00015766445076292833 7.07980829e-06 0.11613426898753848 0.0004009723458603021 7.436470499798395 210.6903181795709 135.90861565498648 100.14814531806343 0.4 0.4 0.4 0.0 0.0 0.0 -783.0 2.96336237e-07 0.00019282317353288035 +Body783 2.96336237e-07 0.00019282317353288035 7.07980829e-06 0.1420318796896713 0.0008492041527252425 0.5663478420982258 17.051067966498163 36.14156681072912 233.47696301941528 0.4 0.4 0.4 0.0 0.0 0.0 -784.0 2.96336237e-07 0.0006785968098311466 +Body784 2.96336237e-07 0.0006785968098311466 7.07980829e-06 0.49984853317071337 0.001056969125782388 2.129281381961314 296.7313175208352 343.9604450772309 237.2496777096723 0.4 0.4 0.4 0.0 0.0 0.0 -785.0 2.96336237e-07 0.00013780632139179854 +Body785 2.96336237e-07 0.00013780632139179854 7.07980829e-06 0.10150694287301791 0.0018115669137227677 2.8103422089756918 349.77158346307993 94.59875697216971 99.73426693191381 0.4 0.4 0.4 0.0 0.0 0.0 -786.0 2.96336237e-07 0.00034073923077270753 +Body786 2.96336237e-07 0.00034073923077270753 7.07980829e-06 0.2509855664335275 0.0017792906836705319 5.520765221365393 215.39140744510857 94.45196463699138 266.26458399959836 0.4 0.4 0.4 0.0 0.0 0.0 -787.0 2.96336237e-07 0.00031320123871055543 +Body787 2.96336237e-07 0.00031320123871055543 7.07980829e-06 0.23070131997183466 0.0003647661258347948 4.728738700627131 308.4240173290373 235.43277837361742 19.86268427021919 0.4 0.4 0.4 0.0 0.0 0.0 -788.0 2.96336237e-07 0.0007908013466746332 +Body788 2.96336237e-07 0.0007908013466746332 7.07980829e-06 0.5824974232683128 0.000733879413242465 10.58163592523781 166.59711091932118 36.80830601645519 282.58301278505724 0.4 0.4 0.4 0.0 0.0 0.0 -789.0 2.96336237e-07 0.00019105301337326078 +Body789 2.96336237e-07 0.00019105301337326078 7.07980829e-06 0.14072799504647168 0.001668655123700562 7.9908431865517064 264.1561725966188 23.582810086009808 292.36425626006894 0.4 0.4 0.4 0.0 0.0 0.0 -790.0 2.96336237e-07 0.0006002588397728856 +Body790 2.96336237e-07 0.0006002588397728856 7.07980829e-06 0.4421454628675441 0.00022178748634611188 11.438400717437004 250.2047538204758 303.4810776677282 204.76040864011122 0.4 0.4 0.4 0.0 0.0 0.0 -791.0 2.96336237e-07 0.00021806349128496557 +Body791 2.96336237e-07 0.00021806349128496557 7.07980829e-06 0.16062367915345274 0.0009804911927767412 1.6584717895438603 226.28492908631438 229.19854234355597 9.353466953393456 0.4 0.4 0.4 0.0 0.0 0.0 -792.0 2.96336237e-07 0.0004540964137523443 +Body792 2.96336237e-07 0.0004540964137523443 7.07980829e-06 0.33448348569258574 0.0011738625331951884 10.662230115006006 267.24057597302476 267.74465579912385 253.2965632707878 0.4 0.4 0.4 0.0 0.0 0.0 -793.0 2.96336237e-07 0.0010488173402543155 +Body793 2.96336237e-07 0.0010488173402543155 7.07980829e-06 0.7725497696055722 0.001095722001517709 9.242402013388748 323.14447834195244 301.491191690332 293.32981193086493 0.4 0.4 0.4 0.0 0.0 0.0 -794.0 2.96336237e-07 0.0005999909388933805 +Body794 2.96336237e-07 0.0005999909388933805 7.07980829e-06 0.4419481293998417 0.0015833703304402554 4.872405037186607 35.12747293707084 153.1253118555626 77.25667586625241 0.4 0.4 0.4 0.0 0.0 0.0 -795.0 2.96336237e-07 0.0002818183472463251 +Body795 2.96336237e-07 0.0002818183472463251 7.07980829e-06 0.20758495390911397 0.00040306205079961504 8.58999362096016 95.19877690553305 242.72105712761459 280.0466839990116 0.4 0.4 0.4 0.0 0.0 0.0 -796.0 2.96336237e-07 0.00019014506892123023 +Body796 2.96336237e-07 0.00019014506892123023 7.07980829e-06 0.14005921102630972 0.0006602959512029577 11.332039920511034 323.92212532949304 203.51644452917097 74.7527947079839 0.4 0.4 0.4 0.0 0.0 0.0 -797.0 2.96336237e-07 0.0004845094202535584 +Body797 2.96336237e-07 0.0004845094202535584 7.07980829e-06 0.35688544289118485 0.00010693699223592864 9.048576338576657 190.51448161289002 98.6305204470717 187.3084468345109 0.4 0.4 0.4 0.0 0.0 0.0 -798.0 2.96336237e-07 0.00015792929540787927 +Body798 2.96336237e-07 0.00015792929540787927 7.07980829e-06 0.11632935125933666 3.897035279878499e-05 11.45903908700319 195.80384686313445 233.2776988816495 359.35301035654265 0.4 0.4 0.4 0.0 0.0 0.0 -799.0 2.96336237e-07 0.0005021740146888711 +Body799 2.96336237e-07 0.0005021740146888711 7.07980829e-06 0.369897030168973 0.0005783785768568472 10.96464741061004 51.22165432560145 112.10159565886289 41.214857697624 0.4 0.4 0.4 0.0 0.0 0.0 -800.0 2.96336237e-07 0.0002652196542834954 +Body800 2.96336237e-07 0.0002652196542834954 7.07980829e-06 0.1953585004247748 0.0015860402110689398 7.970135016600727 33.28395820345033 47.065047089942105 8.642540234570333 0.4 0.4 0.4 0.0 0.0 0.0 -801.0 2.96336237e-07 0.00099556213210484 +Body801 2.96336237e-07 0.00099556213210484 7.07980829e-06 0.7333224444965137 0.0011540216657062665 0.2948520707827325 358.7803936031105 339.4687255490858 120.89997913809488 0.4 0.4 0.4 0.0 0.0 0.0 -802.0 2.96336237e-07 0.0026351289790410228 +Body802 2.96336237e-07 0.0026351289790410228 7.07980829e-06 1.94101318456985 0.0018777704527595757 6.2920679103717365 168.5198178770795 313.068885556533 173.1580935790628 0.4 0.4 0.4 0.0 0.0 0.0 -803.0 2.96336237e-07 0.0004472189018881262 +Body803 2.96336237e-07 0.0004472189018881262 7.07980829e-06 0.3294175700157216 0.001934026663548147 4.665930753879519 188.0777245359656 24.249023206259835 148.43747096583212 0.4 0.4 0.4 0.0 0.0 0.0 -804.0 2.96336237e-07 0.0009541783526290509 +Body804 2.96336237e-07 0.0009541783526290509 7.07980829e-06 0.7028395109366277 2.178248308034613e-05 7.534024626949479 220.92753336090098 156.5092513310764 125.53081160503076 0.4 0.4 0.4 0.0 0.0 0.0 -805.0 2.96336237e-07 0.00017818575131362238 +Body805 2.96336237e-07 0.00017818575131362238 7.07980829e-06 0.13125008124956802 0.00029390144367573754 11.238272718260015 44.728692941629134 244.4748145815674 141.26217597353818 0.4 0.4 0.4 0.0 0.0 0.0 -806.0 2.96336237e-07 0.0007755350636563324 +Body806 2.96336237e-07 0.0007755350636563324 7.07980829e-06 0.5712524114098495 0.0019266172346230073 1.878430788539713 283.4231153555986 2.2596062499485012 183.9729256430123 0.4 0.4 0.4 0.0 0.0 0.0 -807.0 2.96336237e-07 0.00029338105105387744 +Body807 2.96336237e-07 0.00029338105105387744 7.07980829e-06 0.21610194139558708 0.0009800223634739993 7.0601858461868705 65.81941569461553 212.36340422378717 312.9363049828724 0.4 0.4 0.4 0.0 0.0 0.0 -808.0 2.96336237e-07 0.0001839258304776056 +Body808 2.96336237e-07 0.0001839258304776056 7.07980829e-06 0.13547817385011343 0.0006727160750319806 2.882340028183936 295.1627506804039 68.85676814351325 228.03106149519562 0.4 0.4 0.4 0.0 0.0 0.0 -809.0 2.96336237e-07 0.0006015656325230227 +Body809 2.96336237e-07 0.0006015656325230227 7.07980829e-06 0.4431080350898872 0.0016628797571062509 7.129072715261133 290.1742628633195 108.96638613120928 128.99246608530885 0.4 0.4 0.4 0.0 0.0 0.0 -810.0 2.96336237e-07 0.00013888180832424046 +Body810 2.96336237e-07 0.00013888180832424046 7.07980829e-06 0.10229913723325831 0.0005630924347893253 9.278706461480203 267.71603877159674 316.40397628593826 81.80556050635376 0.4 0.4 0.4 0.0 0.0 0.0 -811.0 2.96336237e-07 0.0006476764256898102 +Body811 2.96336237e-07 0.0006476764256898102 7.07980829e-06 0.4770728459965168 0.0007695813520703637 2.493021098908406 150.4916511166996 332.4116821410066 247.0361193746425 0.4 0.4 0.4 0.0 0.0 0.0 -812.0 2.96336237e-07 0.001857003948737935 +Body812 2.96336237e-07 0.001857003948737935 7.07980829e-06 1.3678530261582662 0.0017596352045231752 10.68854821580626 329.79402578262415 259.4447597715369 328.1565524762129 0.4 0.4 0.4 0.0 0.0 0.0 -813.0 2.96336237e-07 0.0008663331149826085 +Body813 2.96336237e-07 0.0008663331149826085 7.07980829e-06 0.6381334696651798 2.928046135023384e-05 5.815041660654898 129.22501519714 213.2823989189814 118.96109333137306 0.4 0.4 0.4 0.0 0.0 0.0 -814.0 2.96336237e-07 0.00026489283030708673 +Body814 2.96336237e-07 0.00026489283030708673 7.07980829e-06 0.1951177647141935 0.00011759470556837991 3.531197956621164 331.29872796235486 4.773729879659973 140.06250876198635 0.4 0.4 0.4 0.0 0.0 0.0 -815.0 2.96336237e-07 0.0010162303462848672 +Body815 2.96336237e-07 0.0010162303462848672 7.07980829e-06 0.7485464720655725 0.0007100241137663527 5.490099494596708 324.98298402852896 274.8809849689539 247.5318900734145 0.4 0.4 0.4 0.0 0.0 0.0 -816.0 2.96336237e-07 0.000347727729247991 +Body816 2.96336237e-07 0.000347727729247991 7.07980829e-06 0.2561332338869088 0.0004507987013529211 3.620170639195692 92.43280629170972 91.6328644393501 151.8214337011307 0.4 0.4 0.4 0.0 0.0 0.0 -817.0 2.96336237e-07 0.002802965923879553 +Body817 2.96336237e-07 0.002802965923879553 7.07980829e-06 2.064640424595143 0.0011544401169181033 5.094307632826079 42.63499315368269 1.2211239273548 334.76305659292217 0.4 0.4 0.4 0.0 0.0 0.0 -818.0 2.96336237e-07 0.0022355737226198336 +Body818 2.96336237e-07 0.0022355737226198336 7.07980829e-06 1.6467042430166545 0.001267457569557079 5.302936231753688 32.68371764101885 353.5751312018522 90.58755046498557 0.4 0.4 0.4 0.0 0.0 0.0 -819.0 2.96336237e-07 0.0002765175125921366 +Body819 2.96336237e-07 0.0002765175125921366 7.07980829e-06 0.20368040501043008 0.000579749287670038 10.557519510639555 80.04140368158535 227.8990205868312 200.62764208554964 0.4 0.4 0.4 0.0 0.0 0.0 -820.0 2.96336237e-07 0.00025127731812467786 +Body820 2.96336237e-07 0.00025127731812467786 7.07980829e-06 0.18508869635703679 0.0012439466918257101 1.6815787713970378 281.7339713158612 63.45528865916926 191.41206074359687 0.4 0.4 0.4 0.0 0.0 0.0 -821.0 2.96336237e-07 0.0003243969593156292 +Body821 2.96336237e-07 0.0003243969593156292 7.07980829e-06 0.2389479908096002 0.0015118202277195345 2.6668616922794715 328.82511142542853 82.03336133179428 168.83579865308715 0.4 0.4 0.4 0.0 0.0 0.0 -822.0 2.96336237e-07 0.0009083701808113307 +Body822 2.96336237e-07 0.0009083701808113307 7.07980829e-06 0.6690976082948853 0.00025961637392022535 7.205434432573989 69.44371066237589 224.96004566756855 200.0052414276524 0.4 0.4 0.4 0.0 0.0 0.0 -823.0 2.96336237e-07 0.0004355681290935779 +Body823 2.96336237e-07 0.0004355681290935779 7.07980829e-06 0.32083571167614394 0.0005817622084768684 2.2490912361513873 52.61862941037551 95.05577134176204 285.75692796158575 0.4 0.4 0.4 0.0 0.0 0.0 -824.0 2.96336237e-07 0.000797513088797965 +Body824 2.96336237e-07 0.000797513088797965 7.07980829e-06 0.58744123438968 0.0018399317866374398 5.370650518781352 263.37964612868376 3.6889272906534942 195.81773461969757 0.4 0.4 0.4 0.0 0.0 0.0 -825.0 2.96336237e-07 0.00017059845221530778 +Body825 2.96336237e-07 0.00017059845221530778 7.07980829e-06 0.1256613424431423 0.001517189447519589 3.3332887759450993 275.16030741344696 301.2390055314444 315.6894181532665 0.4 0.4 0.4 0.0 0.0 0.0 -826.0 2.96336237e-07 0.0033227899288844234 +Body826 2.96336237e-07 0.0033227899288844234 7.07980829e-06 2.447538284774096 9.660561342932512e-05 2.7342205684146665 177.28452929413666 303.60541873955395 123.91807566013593 0.4 0.4 0.4 0.0 0.0 0.0 -827.0 2.96336237e-07 0.0005055089895304048 +Body827 2.96336237e-07 0.0005055089895304048 7.07980829e-06 0.3723535437548778 0.0018186148187213451 9.203022093505952 283.6114261752834 246.85904148851748 262.9477557950902 0.4 0.4 0.4 0.0 0.0 0.0 -828.0 2.96336237e-07 0.000635315421759987 +Body828 2.96336237e-07 0.000635315421759987 7.07980829e-06 0.4679678375536138 0.001999300112822092 8.915870860087727 6.110983399515164 74.87211877631918 225.79948655833374 0.4 0.4 0.4 0.0 0.0 0.0 -829.0 2.96336237e-07 0.0001751333264149705 +Body829 2.96336237e-07 0.0001751333264149705 7.07980829e-06 0.12900169150458152 0.00020038175632658404 7.233274970039065 33.90253649557301 49.37802414776593 162.2065661133979 0.4 0.4 0.4 0.0 0.0 0.0 -830.0 2.96336237e-07 0.00018378643480033245 +Body830 2.96336237e-07 0.00018378643480033245 7.07980829e-06 0.13537549620146275 0.001360339845600366 10.875239413531316 161.6554836466115 83.73152649783016 79.92932738916704 0.4 0.4 0.4 0.0 0.0 0.0 -831.0 2.96336237e-07 0.00013889055865239607 +Body831 2.96336237e-07 0.00013889055865239607 7.07980829e-06 0.10230558264919598 0.00025597517786164737 9.075636286562998 338.08271471426997 353.0506196112916 352.887114895571 0.4 0.4 0.4 0.0 0.0 0.0 -832.0 2.96336237e-07 0.00046757051185114865 +Body832 2.96336237e-07 0.00046757051185114865 7.07980829e-06 0.3444083896604684 0.0018761686833968828 1.4669598373422508 44.87652012756437 177.67362914504258 277.8618957553 0.4 0.4 0.4 0.0 0.0 0.0 -833.0 2.96336237e-07 0.00022908114180874786 +Body833 2.96336237e-07 0.00022908114180874786 7.07980829e-06 0.1687391851115053 0.0010077475692341418 9.107937193226173 7.136521656548504 194.19135352752443 196.3527680670335 0.4 0.4 0.4 0.0 0.0 0.0 -834.0 2.96336237e-07 0.00021727031334741124 +Body834 2.96336237e-07 0.00021727031334741124 7.07980829e-06 0.16003943115392477 0.000739993500523618 3.9730366478446846 296.9687491788795 302.9933737007289 214.05408453261558 0.4 0.4 0.4 0.0 0.0 0.0 -835.0 2.96336237e-07 0.0005924232935996261 +Body835 2.96336237e-07 0.0005924232935996261 7.07980829e-06 0.4363738674156443 0.00024725894484776647 5.085743123157824 71.55973253885118 50.78724890867379 61.5909874775926 0.4 0.4 0.4 0.0 0.0 0.0 -836.0 2.96336237e-07 0.0002814335672288224 +Body836 2.96336237e-07 0.0002814335672288224 7.07980829e-06 0.20730152828058798 0.000749027403100355 6.9645972304617505 60.3604226804254 310.0977903351363 151.78370717308115 0.4 0.4 0.4 0.0 0.0 0.0 -837.0 2.96336237e-07 0.0030778130889382743 +Body837 2.96336237e-07 0.0030778130889382743 7.07980829e-06 2.2670904660784137 0.0019786704159376963 6.529858491445284 335.4186873573771 111.62895536664745 171.68897715927645 0.4 0.4 0.4 0.0 0.0 0.0 -838.0 2.96336237e-07 0.001498847858869942 +Body838 2.96336237e-07 0.001498847858869942 7.07980829e-06 1.104038352152916 0.0015428587562416583 9.936778811770814 70.57570537759302 84.10602504856243 323.5258802143975 0.4 0.4 0.4 0.0 0.0 0.0 -839.0 2.96336237e-07 0.00203066320928066 +Body839 2.96336237e-07 0.00203066320928066 7.07980829e-06 1.4957689335074194 0.0015924422714005465 4.586246084377397 249.62557390036193 211.62955989583318 257.4388242400432 0.4 0.4 0.4 0.0 0.0 0.0 -840.0 2.96336237e-07 0.0011667006416620786 +Body840 2.96336237e-07 0.0011667006416620786 7.07980829e-06 0.8593815885005848 0.001499272202059968 6.8205193906369255 84.64657910167873 239.46586383339405 332.6535290917713 0.4 0.4 0.4 0.0 0.0 0.0 -841.0 2.96336237e-07 0.0017354364389528172 +Body841 2.96336237e-07 0.0017354364389528172 7.07980829e-06 1.278307451279381 0.0016006380667095345 7.82686925837928 191.4754417698664 253.15609398992035 81.93901595863738 0.4 0.4 0.4 0.0 0.0 0.0 -842.0 2.96336237e-07 0.0002532550453718099 +Body842 2.96336237e-07 0.0002532550453718099 7.07980829e-06 0.18654547311927458 0.00012406021956921763 8.109841908874293 270.85693362482044 315.15099460865144 96.14894521079918 0.4 0.4 0.4 0.0 0.0 0.0 -843.0 2.96336237e-07 0.00018634532862649348 +Body843 2.96336237e-07 0.00018634532862649348 7.07980829e-06 0.1372603552326516 0.00023538722443516055 1.4894936849675249 29.459189369441635 67.36450335439682 54.83310544269817 0.4 0.4 0.4 0.0 0.0 0.0 -844.0 2.96336237e-07 0.00029158732454737286 +Body844 2.96336237e-07 0.00029158732454737286 7.07980829e-06 0.21478069798536706 0.0011673470373269362 11.085709061263685 157.76460542425414 246.27746168342864 6.8453046530047255 0.4 0.4 0.4 0.0 0.0 0.0 -845.0 2.96336237e-07 0.00043364524658754777 +Body845 2.96336237e-07 0.00043364524658754777 7.07980829e-06 0.3194193330752219 0.0005270330406529689 6.106343852796523 120.78469905417309 110.64435294021592 215.49307444340332 0.4 0.4 0.4 0.0 0.0 0.0 -846.0 2.96336237e-07 0.0005231633713284643 +Body846 2.96336237e-07 0.0005231633713284643 7.07980829e-06 0.38535760849251127 0.0008634990263518041 7.341507171398043 13.421311492632363 308.85783416097735 42.162340012495825 0.4 0.4 0.4 0.0 0.0 0.0 -847.0 2.96336237e-07 0.00024536499782918075 +Body847 2.96336237e-07 0.00024536499782918075 7.07980829e-06 0.18073373243070323 0.001840481967359855 4.241185462063619 104.16487034797203 201.47379798782168 341.4733827028155 0.4 0.4 0.4 0.0 0.0 0.0 -848.0 2.96336237e-07 0.0007719265143580483 +Body848 2.96336237e-07 0.0007719265143580483 7.07980829e-06 0.5685943852483791 0.0010008140520680474 6.480222534777339 184.32169092200232 103.34919779642523 356.77619199609273 0.4 0.4 0.4 0.0 0.0 0.0 -849.0 2.96336237e-07 0.00023807814028319418 +Body849 2.96336237e-07 0.00023807814028319418 7.07980829e-06 0.17536629626976455 0.0016343601065652842 0.3249529259262394 250.36546856571204 334.7025341217382 118.21873934867935 0.4 0.4 0.4 0.0 0.0 0.0 -850.0 2.96336237e-07 0.00036119262264286574 +Body850 2.96336237e-07 0.00036119262264286574 7.07980829e-06 0.26605135774959376 0.0006346791313101497 5.198710968805152 69.94065044167266 48.948388574773986 182.85169447898264 0.4 0.4 0.4 0.0 0.0 0.0 -851.0 2.96336237e-07 0.00014370289200430812 +Body851 2.96336237e-07 0.00014370289200430812 7.07980829e-06 0.10585030571926211 0.0008869379847759032 7.036548385781691 217.77453992851946 318.4554561270853 6.752281945579717 0.4 0.4 0.4 0.0 0.0 0.0 -852.0 2.96336237e-07 0.0002943846158913051 +Body852 2.96336237e-07 0.0002943846158913051 7.07980829e-06 0.2168411585635174 0.0019843826310521093 9.771476355648222 12.58898431960575 82.51007889246536 49.68333298101479 0.4 0.4 0.4 0.0 0.0 0.0 -853.0 2.96336237e-07 0.0036181905740869944 +Body853 2.96336237e-07 0.0036181905740869944 7.07980829e-06 2.665127841729025 0.0015892742646676375 1.2515737974751457 294.98820419885124 228.7910948770245 204.76071041664952 0.4 0.4 0.4 0.0 0.0 0.0 -854.0 2.96336237e-07 0.0010405906262700396 +Body854 2.96336237e-07 0.0010405906262700396 7.07980829e-06 0.7664900433317653 0.00046992321384812445 8.905411384088065 277.4220633800536 156.90548650393134 73.42355366447521 0.4 0.4 0.4 0.0 0.0 0.0 -855.0 2.96336237e-07 0.003507517870227573 +Body855 2.96336237e-07 0.003507517870227573 7.07980829e-06 2.5836072865411315 0.0012873026248305089 0.6714927881734676 85.46654907224594 218.62623893590367 5.529413848953804 0.4 0.4 0.4 0.0 0.0 0.0 -856.0 2.96336237e-07 0.00042121870808606814 +Body856 2.96336237e-07 0.00042121870808606814 7.07980829e-06 0.31026605243439553 0.001538504517840296 2.299785133154835 182.92903981976596 317.7000092803654 356.8222340252494 0.4 0.4 0.4 0.0 0.0 0.0 -857.0 2.96336237e-07 0.00025589642012622665 +Body857 2.96336237e-07 0.00025589642012622665 7.07980829e-06 0.18849108688789498 0.0012482613808640873 3.4547783623564907 104.61754395223984 177.493497505299 52.3953201643133 0.4 0.4 0.4 0.0 0.0 0.0 -858.0 2.96336237e-07 0.0003499440683809984 +Body858 2.96336237e-07 0.0003499440683809984 7.07980829e-06 0.25776577009779705 0.001200451739714381 5.589758437491127 110.52822608125959 304.65887602596644 285.1524557787873 0.4 0.4 0.4 0.0 0.0 0.0 -859.0 2.96336237e-07 0.00023340484224533388 +Body859 2.96336237e-07 0.00023340484224533388 7.07980829e-06 0.17192398540792114 0.00036678529835194857 9.701014602462163 350.2988638669182 75.93158966813593 359.721039470067 0.4 0.4 0.4 0.0 0.0 0.0 -860.0 2.96336237e-07 0.0003012859326608643 +Body860 2.96336237e-07 0.0003012859326608643 7.07980829e-06 0.2219246087274947 0.0005714322286880682 2.239794572571739 239.93191774307263 295.5484957385658 292.6691114359901 0.4 0.4 0.4 0.0 0.0 0.0 -861.0 2.96336237e-07 0.0011013945629108654 +Body861 2.96336237e-07 0.0011013945629108654 7.07980829e-06 0.8112776964721983 0.0005018275332768457 10.083706033837855 102.82962935920158 251.05942161360068 26.822294015250964 0.4 0.4 0.4 0.0 0.0 0.0 -862.0 2.96336237e-07 0.0005946599085366378 +Body862 2.96336237e-07 0.0005946599085366378 7.07980829e-06 0.43802133860816467 0.001048428201218883 4.1025828039813526 40.600990991843354 239.80380101745874 62.07603929801504 0.4 0.4 0.4 0.0 0.0 0.0 -863.0 2.96336237e-07 0.000644830243600255 +Body863 2.96336237e-07 0.000644830243600255 7.07980829e-06 0.47497637291855616 0.0013321768983939044 4.63432393570585 45.083707155219024 301.3977548929328 239.62704853879058 0.4 0.4 0.4 0.0 0.0 0.0 -864.0 2.96336237e-07 0.0018338196731331666 +Body864 2.96336237e-07 0.0018338196731331666 7.07980829e-06 1.3507756895339567 0.001297586822510243 7.9497211836853365 348.46108412918124 87.62476857679734 103.32036290834739 0.4 0.4 0.4 0.0 0.0 0.0 -865.0 2.96336237e-07 0.0002663604970815203 +Body865 2.96336237e-07 0.0002663604970815203 7.07980829e-06 0.1961988353495927 0.0014513812053653485 7.576126394985915 348.84703759168565 304.9628712857538 337.6984736486929 0.4 0.4 0.4 0.0 0.0 0.0 -866.0 2.96336237e-07 0.00024146287214828595 +Body866 2.96336237e-07 0.00024146287214828595 7.07980829e-06 0.1778594604483042 9.184822468081804e-05 11.169429029020852 68.42320619800215 75.12601964025916 21.785360489624612 0.4 0.4 0.4 0.0 0.0 0.0 -867.0 2.96336237e-07 0.00021814842997838415 +Body867 2.96336237e-07 0.00021814842997838415 7.07980829e-06 0.1606862442594179 0.0017400031243608673 7.347710628140643 223.60600683349512 122.49114370433226 107.17786152085814 0.4 0.4 0.4 0.0 0.0 0.0 -868.0 2.96336237e-07 0.0007497335046502527 +Body868 2.96336237e-07 0.0007497335046502527 7.07980829e-06 0.5522472064989752 0.0007622626132573405 7.291097000588904 313.4202166141992 134.58901635813177 193.878916798132 0.4 0.4 0.4 0.0 0.0 0.0 -869.0 2.96336237e-07 0.0001667481985630033 +Body869 2.96336237e-07 0.0001667481985630033 7.07980829e-06 0.12282527894776799 0.0014162630721568541 5.217098764177743 337.3804679201184 173.53323786741743 353.3966084016116 0.4 0.4 0.4 0.0 0.0 0.0 -870.0 2.96336237e-07 0.00031250176198306017 +Body870 2.96336237e-07 0.00031250176198306017 7.07980829e-06 0.23018609147214195 0.0015562575272119795 9.361382981745848 48.47024895045403 23.02355121536537 121.03929246247257 0.4 0.4 0.4 0.0 0.0 0.0 -871.0 2.96336237e-07 0.00023059340795823506 +Body871 2.96336237e-07 0.00023059340795823506 7.07980829e-06 0.1698531072603185 0.0019813387627493403 9.279340087444739 2.0250013283920247 270.51162903123645 97.37548932556639 0.4 0.4 0.4 0.0 0.0 0.0 -872.0 2.96336237e-07 0.0002204659791078828 +Body872 2.96336237e-07 0.0002204659791078828 7.07980829e-06 0.16239333087719793 0.0012809206122057952 0.42712771391559484 197.06203490560554 347.4089646137663 67.49418715611142 0.4 0.4 0.4 0.0 0.0 0.0 -873.0 2.96336237e-07 0.00027345697966011924 +Body873 2.96336237e-07 0.00027345697966011924 7.07980829e-06 0.20142604295828573 0.0018116840747689782 10.674508764160732 103.56691137629706 266.9193441476812 326.2393207943043 0.4 0.4 0.4 0.0 0.0 0.0 -874.0 2.96336237e-07 0.00026916832336908836 +Body874 2.96336237e-07 0.00026916832336908836 7.07980829e-06 0.19826705587598786 0.00039683896467854684 0.35179682592842354 325.2166765580088 98.71526095385327 3.9673545628655678 0.4 0.4 0.4 0.0 0.0 0.0 -875.0 2.96336237e-07 0.0022229132327439348 +Body875 2.96336237e-07 0.0022229132327439348 7.07980829e-06 1.6373786358195543 0.0006605613446908923 7.3615331574055025 252.2233729738277 22.284879677551952 229.69276267720048 0.4 0.4 0.4 0.0 0.0 0.0 -876.0 2.96336237e-07 0.00018777834971615669 +Body876 2.96336237e-07 0.00018777834971615669 7.07980829e-06 0.138315906156696 0.0011872852358163328 10.140241012719367 349.1506501093582 312.2512600928142 285.213085940648 0.4 0.4 0.4 0.0 0.0 0.0 -877.0 2.96336237e-07 0.00020212037530735753 +Body877 2.96336237e-07 0.00020212037530735753 7.07980829e-06 0.14888011799883888 0.00015537661070074625 7.218086014392529 182.46051259244547 316.96550885841606 169.6637749668604 0.4 0.4 0.4 0.0 0.0 0.0 -878.0 2.96336237e-07 0.0001739000727617808 +Body878 2.96336237e-07 0.0001739000727617808 7.07980829e-06 0.12809328754416846 3.088396781264784e-05 6.4272787336170945 63.778122100059875 253.59048138502038 215.1941927139361 0.4 0.4 0.4 0.0 0.0 0.0 -879.0 2.96336237e-07 0.0003886205487771876 +Body879 2.96336237e-07 0.0003886205487771876 7.07980829e-06 0.28625453060206685 0.001570610688246003 4.596643792009561 305.35365538701126 285.97542830086036 349.34165196516363 0.4 0.4 0.4 0.0 0.0 0.0 -880.0 2.96336237e-07 0.0009222337930440628 +Body880 2.96336237e-07 0.0009222337930440628 7.07980829e-06 0.6793094250004531 0.0011367893271683742 2.6439443194291687 285.7982116353794 170.4396408737005 121.80530388570517 0.4 0.4 0.4 0.0 0.0 0.0 -881.0 2.96336237e-07 0.0005536935198694872 +Body881 2.96336237e-07 0.0005536935198694872 7.07980829e-06 0.4078458515031312 0.0018133452871063858 1.4457615059152908 91.22783846390665 329.90668562817825 253.22700314937367 0.4 0.4 0.4 0.0 0.0 0.0 -882.0 2.96336237e-07 0.00018278613111823822 +Body882 2.96336237e-07 0.00018278613111823822 7.07980829e-06 0.13463868117230798 0.0011331933115473899 9.86274096834836 69.03072764321948 218.86072425030633 180.10823421827652 0.4 0.4 0.4 0.0 0.0 0.0 -883.0 2.96336237e-07 0.0001960632599862665 +Body883 2.96336237e-07 0.0001960632599862665 7.07980829e-06 0.14441849931064232 0.0012861487147670608 2.5576684866102952 208.59094625454324 305.7005612521587 21.26041328596223 0.4 0.4 0.4 0.0 0.0 0.0 -884.0 2.96336237e-07 0.0005423752586368978 +Body884 2.96336237e-07 0.0005423752586368978 7.07980829e-06 0.39950891830039414 0.0015637046464971854 7.027440341287953 233.80729957048158 209.340402563229 311.3583501969673 0.4 0.4 0.4 0.0 0.0 0.0 -885.0 2.96336237e-07 0.00013943092042929199 +Body885 2.96336237e-07 0.00013943092042929199 7.07980829e-06 0.10270360845428364 0.0005159228348304664 5.944858672896004 69.95225801877062 174.7276120972792 28.822418951690324 0.4 0.4 0.4 0.0 0.0 0.0 -886.0 2.96336237e-07 0.0004005939203667401 +Body886 2.96336237e-07 0.0004005939203667401 7.07980829e-06 0.2950740124201952 0.0007439613777354018 4.246019729481516 110.28612280210407 152.0147394483259 181.0295145568587 0.4 0.4 0.4 0.0 0.0 0.0 -887.0 2.96336237e-07 0.0005581300249991568 +Body887 2.96336237e-07 0.0005581300249991568 7.07980829e-06 0.41111374275953355 0.001641221658129226 3.537297275366544 345.8387738825924 59.96632429562442 149.0526849684242 0.4 0.4 0.4 0.0 0.0 0.0 -888.0 2.96336237e-07 0.00021660729245310455 +Body888 2.96336237e-07 0.00021660729245310455 7.07980829e-06 0.159551055705235 0.0007892488059156157 1.7915838548160363 115.39063975714294 182.44918518147443 350.9235637043461 0.4 0.4 0.4 0.0 0.0 0.0 -889.0 2.96336237e-07 0.003164410622959606 +Body889 2.96336237e-07 0.003164410622959606 7.07980829e-06 2.3308774596652744 2.7772058913318547e-05 7.672750487076867 351.61488935551984 140.60487486378307 293.05304585644706 0.4 0.4 0.4 0.0 0.0 0.0 -890.0 2.96336237e-07 0.004587781522415004 +Body890 2.96336237e-07 0.004587781522415004 7.07980829e-06 3.3793201371775554 0.0009792748409096067 9.49626835683781 138.20231916057185 19.125111032545025 284.81908775422175 0.4 0.4 0.4 0.0 0.0 0.0 -891.0 2.96336237e-07 0.00021244089566533318 +Body891 2.96336237e-07 0.00021244089566533318 7.07980829e-06 0.1564821239142163 0.0013817427484116704 9.982107239203284 64.62388065890237 162.42173072740277 247.13863850664836 0.4 0.4 0.4 0.0 0.0 0.0 -892.0 2.96336237e-07 0.00042874284555031636 +Body892 2.96336237e-07 0.00042874284555031636 7.07980829e-06 0.3158082669281759 0.0002685727501766675 10.783700828009044 81.17210301083347 317.9386637033409 267.4309864608306 0.4 0.4 0.4 0.0 0.0 0.0 -893.0 2.96336237e-07 0.0016517438476905757 +Body893 2.96336237e-07 0.0016517438476905757 7.07980829e-06 1.2166602133707667 0.0016764679152562712 4.70497587780575 238.60777089204234 153.80807142934077 28.448304618780632 0.4 0.4 0.4 0.0 0.0 0.0 -894.0 2.96336237e-07 0.0016763443702606448 +Body894 2.96336237e-07 0.0016763443702606448 7.07980829e-06 1.2347807452443866 0.0009170286725977459 7.525170965998676 277.7130339289491 226.47276480764017 253.76637763823024 0.4 0.4 0.4 0.0 0.0 0.0 -895.0 2.96336237e-07 0.0011638058295318644 +Body895 2.96336237e-07 0.0011638058295318644 7.07980829e-06 0.8572492949558327 0.0008700423009628168 9.981524212140938 98.86559967641855 170.53910254755223 100.58524057055833 0.4 0.4 0.4 0.0 0.0 0.0 -896.0 2.96336237e-07 0.002936364382214191 +Body896 2.96336237e-07 0.002936364382214191 7.07980829e-06 2.1629005737143157 7.756112803423427e-05 11.203056729757954 86.29368061239245 43.411670622833604 338.40781629557614 0.4 0.4 0.4 0.0 0.0 0.0 -897.0 2.96336237e-07 0.0002474161427641772 +Body897 2.96336237e-07 0.0002474161427641772 7.07980829e-06 0.18224458802599205 0.001079508198632446 6.842173578076072 8.919350620653807 65.9391414835763 218.61113668757775 0.4 0.4 0.4 0.0 0.0 0.0 -898.0 2.96336237e-07 0.0001622493777332493 +Body898 2.96336237e-07 0.0001622493777332493 7.07980829e-06 0.11951148648636527 0.000938253938961925 10.679087500356292 335.22452069738205 213.1717272391943 122.17723318475782 0.4 0.4 0.4 0.0 0.0 0.0 -899.0 2.96336237e-07 0.0003122324229346243 +Body899 2.96336237e-07 0.0003122324229346243 7.07980829e-06 0.22998769866166033 0.0015136721058106677 2.682422781035682 280.03553763851926 230.61767521277147 344.2296842122416 0.4 0.4 0.4 0.0 0.0 0.0 -900.0 2.96336237e-07 0.00021203945051390856 +Body900 2.96336237e-07 0.00021203945051390856 7.07980829e-06 0.1561864228923709 0.001765045682968018 11.422249892962794 345.8666862049946 180.58605285731926 319.09691026620914 0.4 0.4 0.4 0.0 0.0 0.0 -901.0 2.96336237e-07 0.0002273306449758014 +Body901 2.96336237e-07 0.0002273306449758014 7.07980829e-06 0.1674497843044399 0.00039029297664267936 10.413884131713067 254.63805790852138 312.1469638623364 253.9856842053702 0.4 0.4 0.4 0.0 0.0 0.0 -902.0 2.96336237e-07 0.00027837990138805533 +Body902 2.96336237e-07 0.00027837990138805533 7.07980829e-06 0.20505222446838656 8.898162310285005e-05 2.5301508178227907 158.05436831881912 50.59492182468012 164.42547164960322 0.4 0.4 0.4 0.0 0.0 0.0 -903.0 2.96336237e-07 0.0008690958013977799 +Body903 2.96336237e-07 0.0008690958013977799 7.07980829e-06 0.6401684405524991 0.0005103352043887674 8.079126775697432 104.99864058693485 172.60913273339662 181.89105730929109 0.4 0.4 0.4 0.0 0.0 0.0 -904.0 2.96336237e-07 0.0004262945653432144 +Body904 2.96336237e-07 0.0004262945653432144 7.07980829e-06 0.3140048849308226 0.0004068762402332769 10.246111286380062 199.8177194802882 324.28121763384036 38.813978610555196 0.4 0.4 0.4 0.0 0.0 0.0 -905.0 2.96336237e-07 0.0005797269109412859 +Body905 2.96336237e-07 0.0005797269109412859 7.07980829e-06 0.4270218219058451 0.0004148968294459902 0.9308775351703481 234.71882840320092 96.08242228494359 85.3661114561507 0.4 0.4 0.4 0.0 0.0 0.0 -906.0 2.96336237e-07 0.0007447631040431821 +Body906 2.96336237e-07 0.0007447631040431821 7.07980829e-06 0.5485860524576922 0.0002497401557252757 11.091004923880098 30.463723661868443 109.8090314106109 32.45174612970782 0.4 0.4 0.4 0.0 0.0 0.0 -907.0 2.96336237e-07 0.0011740321433804258 +Body907 2.96336237e-07 0.0011740321433804258 7.07980829e-06 0.8647819091722458 0.0005357039357688908 8.6536979165979 346.454961363041 263.17586156314053 31.037511257599284 0.4 0.4 0.4 0.0 0.0 0.0 -908.0 2.96336237e-07 0.0018510889647867837 +Body908 2.96336237e-07 0.0018510889647867837 7.07980829e-06 1.3634961002062462 0.00014126241631399 1.4214869125410696 39.61105736997827 83.07875977519102 134.15938861187436 0.4 0.4 0.4 0.0 0.0 0.0 -909.0 2.96336237e-07 0.00023462688073896192 +Body909 2.96336237e-07 0.00023462688073896192 7.07980829e-06 0.17282412837892938 0.0017705139720229762 10.763198940284598 260.38595677013 187.39030393342694 85.08779752218953 0.4 0.4 0.4 0.0 0.0 0.0 -910.0 2.96336237e-07 0.0001500746714962574 +Body910 2.96336237e-07 0.0001500746714962574 7.07980829e-06 0.11054370331058086 0.000281278337030201 7.299413573808814 136.49636937293405 102.25244427475243 310.49680731457863 0.4 0.4 0.4 0.0 0.0 0.0 -911.0 2.96336237e-07 0.00019619635152198428 +Body911 2.96336237e-07 0.00019619635152198428 7.07980829e-06 0.14451653338322 0.00017314515611592754 8.354513792245776 38.52556308984034 292.7928653960391 98.19102238346747 0.4 0.4 0.4 0.0 0.0 0.0 -912.0 2.96336237e-07 0.0014594514605221617 +Body912 2.96336237e-07 0.0014594514605221617 7.07980829e-06 1.0750193063203148 0.0004736592387483617 10.525175396992385 354.1327714293186 177.29058917698717 135.57871242297458 0.4 0.4 0.4 0.0 0.0 0.0 -913.0 2.96336237e-07 0.0004900684755729853 +Body913 2.96336237e-07 0.0004900684755729853 7.07980829e-06 0.3609801948955772 7.059808878859866e-05 2.7253547110759446 46.58756017502697 247.45595632197276 257.4521187175939 0.4 0.4 0.4 0.0 0.0 0.0 -914.0 2.96336237e-07 0.0003497168329852906 +Body914 2.96336237e-07 0.0003497168329852906 7.07980829e-06 0.25759839047327854 0.001965306184034864 9.563434786642063 292.28406608674385 251.4582104887518 355.1915687853607 0.4 0.4 0.4 0.0 0.0 0.0 -915.0 2.96336237e-07 0.00013859536374337858 +Body915 2.96336237e-07 0.00013859536374337858 7.07980829e-06 0.10208814463573322 8.257253637475793e-06 0.4855986306531283 139.0604079346995 112.81281039522419 299.8312400393687 0.4 0.4 0.4 0.0 0.0 0.0 -916.0 2.96336237e-07 0.0001933392197641028 +Body916 2.96336237e-07 0.0001933392197641028 7.07980829e-06 0.14241199487439932 0.0018796159120632928 7.449758077618493 10.90734683153995 321.51599993791405 184.8920986736227 0.4 0.4 0.4 0.0 0.0 0.0 -917.0 2.96336237e-07 0.00024570843099537825 +Body917 2.96336237e-07 0.00024570843099537825 7.07980829e-06 0.18098670232664 0.0009508845867033116 1.5928860717515263 303.13456573570323 204.50757147870775 191.47934446511255 0.4 0.4 0.4 0.0 0.0 0.0 -918.0 2.96336237e-07 0.0008660757753783367 +Body918 2.96336237e-07 0.0008660757753783367 7.07980829e-06 0.637943915541349 0.0018668982720163895 6.658079751187519 87.9919399839599 246.36657869117042 149.15534322130247 0.4 0.4 0.4 0.0 0.0 0.0 -919.0 2.96336237e-07 0.0016615592487689134 +Body919 2.96336237e-07 0.0016615592487689134 7.07980829e-06 1.223890152799321 0.001421622572581398 5.1610356923745595 264.9771993652235 40.19201047952638 278.0236849242551 0.4 0.4 0.4 0.0 0.0 0.0 -920.0 2.96336237e-07 0.001603657692579818 +Body920 2.96336237e-07 0.001603657692579818 7.07980829e-06 1.181240367963724 3.685176165738216e-05 1.6420859189574308 130.56188251548426 140.90512522455236 336.48806457761 0.4 0.4 0.4 0.0 0.0 0.0 -921.0 2.96336237e-07 0.001397686753371511 +Body921 2.96336237e-07 0.001397686753371511 7.07980829e-06 1.0295239579430457 0.0017914896317848858 11.252344408486978 267.67377709144375 277.9361470120739 268.5109911132014 0.4 0.4 0.4 0.0 0.0 0.0 -922.0 2.96336237e-07 0.0017560473979587865 +Body922 2.96336237e-07 0.0017560473979587865 7.07980829e-06 1.2934893051830842 0.0001158813985735487 7.979966579999663 273.9413454619434 47.43960388209858 236.0072840421206 0.4 0.4 0.4 0.0 0.0 0.0 -923.0 2.96336237e-07 0.0007621621848392839 +Body923 2.96336237e-07 0.0007621621848392839 7.07980829e-06 0.5614020646883041 0.000713239837599196 7.5270807760887815 61.75097790549843 174.57744167115027 271.8218476694562 0.4 0.4 0.4 0.0 0.0 0.0 -924.0 2.96336237e-07 0.00017089341444879782 +Body924 2.96336237e-07 0.00017089341444879782 7.07980829e-06 0.12587860906982662 0.0010331661463704816 11.310459107843037 356.98065710606045 56.798708831950776 329.3070601388 0.4 0.4 0.4 0.0 0.0 0.0 -925.0 2.96336237e-07 0.0003475085127644576 +Body925 2.96336237e-07 0.0003475085127644576 7.07980829e-06 0.2559717609236506 8.063217974700513e-05 0.6224293583547946 124.40429076478733 71.81562824723706 141.66885873276337 0.4 0.4 0.4 0.0 0.0 0.0 -926.0 2.96336237e-07 0.003112920782245804 +Body926 2.96336237e-07 0.003112920782245804 7.07980829e-06 2.292950488920464 0.0012268090307240697 10.728770587782575 340.62230336033423 216.29033228044932 157.05766776364314 0.4 0.4 0.4 0.0 0.0 0.0 -927.0 2.96336237e-07 0.00033547189080752464 +Body927 2.96336237e-07 0.00033547189080752464 7.07980829e-06 0.24710568943268615 0.0015196161689792866 0.6899233683709616 88.94224942027253 214.4230545720397 276.6010138005357 0.4 0.4 0.4 0.0 0.0 0.0 -928.0 2.96336237e-07 0.0004253133838612374 +Body928 2.96336237e-07 0.0004253133838612374 7.07980829e-06 0.3132821551486675 0.0007120727472340359 9.106731138982164 319.4754144242723 310.64917536138154 126.13269863021297 0.4 0.4 0.4 0.0 0.0 0.0 -929.0 2.96336237e-07 0.00024231766837550515 +Body929 2.96336237e-07 0.00024231766837550515 7.07980829e-06 0.17848909594635745 0.000582710938667069 2.5165912778794906 314.3199004524181 357.3118023762465 224.97487607442832 0.4 0.4 0.4 0.0 0.0 0.0 -930.0 2.96336237e-07 0.00016665571708055534 +Body930 2.96336237e-07 0.00016665571708055534 7.07980829e-06 0.12275715788872771 0.0001996971746856274 4.755013017812427 298.8461973517313 236.9987112242499 122.60336003968959 0.4 0.4 0.4 0.0 0.0 0.0 -931.0 2.96336237e-07 0.0011458622256510802 +Body931 2.96336237e-07 0.0011458622256510802 7.07980829e-06 0.8440321917368563 0.0015919258009235721 0.050627567583707594 307.90525771874314 70.82616332779979 151.67221763977068 0.4 0.4 0.4 0.0 0.0 0.0 -932.0 2.96336237e-07 0.0003185660980161783 +Body932 2.96336237e-07 0.0003185660980161783 7.07980829e-06 0.23465302887428308 0.0008616327888656786 1.3646300797339588 92.86887888927751 169.57093262294586 136.36646901125172 0.4 0.4 0.4 0.0 0.0 0.0 -933.0 2.96336237e-07 0.00017301998407785504 +Body933 2.96336237e-07 0.00017301998407785504 7.07980829e-06 0.1274450218415491 0.0009832415846796373 7.534952392781988 188.0735046660178 46.94571173047234 325.12927952800834 0.4 0.4 0.4 0.0 0.0 0.0 -934.0 2.96336237e-07 0.00017929256067435054 +Body934 2.96336237e-07 0.00017929256067435054 7.07980829e-06 0.13206534743921788 0.0014183729364793134 9.448867289289323 102.96675853797645 253.93257299631134 159.6978646781303 0.4 0.4 0.4 0.0 0.0 0.0 -935.0 2.96336237e-07 0.0003863368281993399 +Body935 2.96336237e-07 0.0003863368281993399 7.07980829e-06 0.28457236180246254 0.000888160443355646 4.1802766015432535 130.71026300243284 77.05772571539467 312.5231300249637 0.4 0.4 0.4 0.0 0.0 0.0 -936.0 2.96336237e-07 0.00018020809151091216 +Body936 2.96336237e-07 0.00018020809151091216 7.07980829e-06 0.13273971952452396 0.000954720677358364 3.781611671128357 86.59490665478535 218.8644239532834 257.03107035409835 0.4 0.4 0.4 0.0 0.0 0.0 -937.0 2.96336237e-07 0.00013852529342309162 +Body937 2.96336237e-07 0.00013852529342309162 7.07980829e-06 0.10203653144465007 0.0014604833997294586 3.6529460849484523 234.00092849065598 297.1160112326384 336.3256323449483 0.4 0.4 0.4 0.0 0.0 0.0 -938.0 2.96336237e-07 0.0005121982142226524 +Body938 2.96336237e-07 0.0005121982142226524 7.07980829e-06 0.3772807687315193 0.0004918646428922008 11.372738889176471 203.8576062272574 186.04307420989318 137.3162745936581 0.4 0.4 0.4 0.0 0.0 0.0 -939.0 2.96336237e-07 0.0003612424968544203 +Body939 2.96336237e-07 0.0003612424968544203 7.07980829e-06 0.2660880946618919 0.0012522462747390918 2.3336207876186714 33.72314577304029 351.18940081152004 312.24372550510225 0.4 0.4 0.4 0.0 0.0 0.0 -940.0 2.96336237e-07 0.00020039859797553946 +Body940 2.96336237e-07 0.00020039859797553946 7.07980829e-06 0.147611871727581 0.0003302271416131716 7.906221530658699 34.26814032180242 125.39790450977469 111.22749608626296 0.4 0.4 0.4 0.0 0.0 0.0 -941.0 2.96336237e-07 0.0003016544051248369 +Body941 2.96336237e-07 0.0003016544051248369 7.07980829e-06 0.2221960223533211 0.00034568242946911244 0.3094325084357767 82.4728732578794 144.70477273697668 5.612271501423794 0.4 0.4 0.4 0.0 0.0 0.0 -942.0 2.96336237e-07 0.0017318366453486073 +Body942 2.96336237e-07 0.0017318366453486073 7.07980829e-06 1.2756558744863375 0.00113569105556339 11.116242048126862 249.09496606643057 47.771023520745274 237.73234968632318 0.4 0.4 0.4 0.0 0.0 0.0 -943.0 2.96336237e-07 0.0002690118256463962 +Body943 2.96336237e-07 0.0002690118256463962 7.07980829e-06 0.19815178100879285 0.0013539827861898711 3.18150775198909 111.76818070956686 19.606030246044075 288.92966931597437 0.4 0.4 0.4 0.0 0.0 0.0 -944.0 2.96336237e-07 0.0029001700963420364 +Body944 2.96336237e-07 0.0029001700963420364 7.07980829e-06 2.1362401761995384 0.0003159380215570494 5.514532240030428 32.79351781650099 63.5250969796889 206.50573852382644 0.4 0.4 0.4 0.0 0.0 0.0 -945.0 2.96336237e-07 0.00021330535508806603 +Body945 2.96336237e-07 0.00021330535508806603 7.07980829e-06 0.1571188772383973 0.00018089683554716642 8.720015163429723 77.51771133589922 244.9843816940459 350.9514638838498 0.4 0.4 0.4 0.0 0.0 0.0 -946.0 2.96336237e-07 0.00025520310194109973 +Body946 2.96336237e-07 0.00025520310194109973 7.07980829e-06 0.18798039471717506 0.000498428427346686 8.467466822253689 10.456225088945663 233.40446105050938 203.41064615006937 0.4 0.4 0.4 0.0 0.0 0.0 -947.0 2.96336237e-07 0.00016549421931184313 +Body947 2.96336237e-07 0.00016549421931184313 7.07980829e-06 0.12190160869138278 0.0009178253598946444 4.75514175557383 340.3535534538125 148.36917743145676 297.2912537647712 0.4 0.4 0.4 0.0 0.0 0.0 -948.0 2.96336237e-07 0.00040035279118295214 +Body948 2.96336237e-07 0.00040035279118295214 7.07980829e-06 0.2948963987517032 0.0013138752553493239 3.3576335327672404 50.85479916051726 301.2286638812889 220.74045454943635 0.4 0.4 0.4 0.0 0.0 0.0 -949.0 2.96336237e-07 0.000285480858760384 +Body949 2.96336237e-07 0.000285480858760384 7.07980829e-06 0.21028272817138718 0.0014023500153727342 6.337903481467864 224.1884139697174 73.89985298832633 51.546935726864305 0.4 0.4 0.4 0.0 0.0 0.0 -950.0 2.96336237e-07 0.0013858975257163215 +Body950 2.96336237e-07 0.0013858975257163215 7.07980829e-06 1.0208401149522006 0.0018940614327674413 1.848873587406221 190.43226813540824 280.5625437975362 308.817550256019 0.4 0.4 0.4 0.0 0.0 0.0 -951.0 2.96336237e-07 0.001052652002039967 +Body951 2.96336237e-07 0.001052652002039967 7.07980829e-06 0.7753743482670024 0.0013849169643145925 7.011026598611074 334.4076414167877 257.5505584243084 296.3064892675258 0.4 0.4 0.4 0.0 0.0 0.0 -952.0 2.96336237e-07 0.0016153416493503315 +Body952 2.96336237e-07 0.0016153416493503315 7.07980829e-06 1.1898466693326095 2.613348257784218e-05 4.937533708443644 142.3452936426748 151.70237022125707 230.49088117151877 0.4 0.4 0.4 0.0 0.0 0.0 -953.0 2.96336237e-07 0.0017051179432337625 +Body953 2.96336237e-07 0.0017051179432337625 7.07980829e-06 1.2559751099044152 0.0019156727899918755 2.8945065616128502 24.996113996404127 262.60281692979856 150.1397892119794 0.4 0.4 0.4 0.0 0.0 0.0 -954.0 2.96336237e-07 0.0013195877705214655 +Body954 2.96336237e-07 0.0013195877705214655 7.07980829e-06 0.9719969235477123 0.0015740751678921254 9.299530719572873 116.84233709368452 223.50093449549743 245.37283756444006 0.4 0.4 0.4 0.0 0.0 0.0 -955.0 2.96336237e-07 0.0004102460698317077 +Body955 2.96336237e-07 0.0004102460698317077 7.07980829e-06 0.3021837021241728 0.00035554080270896657 2.6519256374613476 251.19016945519695 318.6678358289691 142.7111516622103 0.4 0.4 0.4 0.0 0.0 0.0 -956.0 2.96336237e-07 0.00024167065264447027 +Body956 2.96336237e-07 0.00024167065264447027 7.07980829e-06 0.17801250976232183 0.0009665892019281847 4.502199852684603 323.8900125494872 100.80453312749627 214.0618920813722 0.4 0.4 0.4 0.0 0.0 0.0 -957.0 2.96336237e-07 0.0009466043491808458 +Body957 2.96336237e-07 0.0009466043491808458 7.07980829e-06 0.6972605655909263 0.0019802403653123375 0.7888060136048444 306.8805064809969 282.50984888295784 352.56112767493175 0.4 0.4 0.4 0.0 0.0 0.0 -958.0 2.96336237e-07 0.00018695352823005392 +Body958 2.96336237e-07 0.00018695352823005392 7.07980829e-06 0.1377083497933545 0.0007637836181920838 4.569634942627846 139.37121999073983 67.43502251913877 332.4186808804151 0.4 0.4 0.4 0.0 0.0 0.0 -959.0 2.96336237e-07 0.0037034203517796937 +Body959 2.96336237e-07 0.0037034203517796937 7.07980829e-06 2.727907357849595 0.00146266418574885 9.626222885297471 213.93243792835034 245.51731066063286 75.89340605050207 0.4 0.4 0.4 0.0 0.0 0.0 -960.0 2.96336237e-07 0.000373511443845889 +Body960 2.96336237e-07 0.000373511443845889 7.07980829e-06 0.275125294761257 0.0012760803381254955 1.2094857559534204 79.07672523194096 264.5777821313358 76.72573920333284 0.4 0.4 0.4 0.0 0.0 0.0 -961.0 2.96336237e-07 0.00039442763362750277 +Body961 2.96336237e-07 0.00039442763362750277 7.07980829e-06 0.29053197901086525 0.0014417868317733395 11.41598090400923 156.72159484209047 7.72719848001625 185.43652858762405 0.4 0.4 0.4 0.0 0.0 0.0 -962.0 2.96336237e-07 0.00020500322527754812 +Body962 2.96336237e-07 0.00020500322527754812 7.07980829e-06 0.15100360032011528 0.00030171279342584156 1.4120336481863598 172.0684637181415 92.67238877088263 160.71866360160317 0.4 0.4 0.4 0.0 0.0 0.0 -963.0 2.96336237e-07 0.0007085940877853797 +Body963 2.96336237e-07 0.0007085940877853797 7.07980829e-06 0.5219442683220008 0.0005234297891182462 4.097317522810404 333.94283962717805 317.556416326482 164.74610674255527 0.4 0.4 0.4 0.0 0.0 0.0 -964.0 2.96336237e-07 0.00014947946804124763 +Body964 2.96336237e-07 0.00014947946804124763 7.07980829e-06 0.11010528160034792 0.0008975475009067994 10.322701472999627 326.6226849149638 168.79718850314603 119.17626470159382 0.4 0.4 0.4 0.0 0.0 0.0 -965.0 2.96336237e-07 0.0010586172297893071 +Body965 2.96336237e-07 0.0010586172297893071 7.07980829e-06 0.7797682833656346 0.00016487428505234443 8.752058115225326 130.82154975364693 87.02897050604159 93.10471368544235 0.4 0.4 0.4 0.0 0.0 0.0 -966.0 2.96336237e-07 0.00022758994635737866 +Body966 2.96336237e-07 0.00022758994635737866 7.07980829e-06 0.16764078345644415 0.0009489750126910459 6.401127999449354 2.285091354335331 303.6446873244932 228.97229775105836 0.4 0.4 0.4 0.0 0.0 0.0 -967.0 2.96336237e-07 0.000999277512501037 +Body967 2.96336237e-07 0.000999277512501037 7.07980829e-06 0.7360591615195017 0.0018949678770281517 2.87369291606918 56.67813336159815 123.49991022508948 285.23540579935207 0.4 0.4 0.4 0.0 0.0 0.0 -968.0 2.96336237e-07 0.001291167167389695 +Body968 2.96336237e-07 0.001291167167389695 7.07980829e-06 0.9510625534159438 0.00048414046083810925 0.038185085019309936 139.91628422613323 331.77350842486277 234.9446144529372 0.4 0.4 0.4 0.0 0.0 0.0 -969.0 2.96336237e-07 0.0016073709303560204 +Body969 2.96336237e-07 0.0016073709303560204 7.07980829e-06 1.18397550675138 0.0012098443018083715 9.646477689381754 31.621294470619585 126.17811718834633 334.5105864118128 0.4 0.4 0.4 0.0 0.0 0.0 -970.0 2.96336237e-07 0.0034709429840917563 +Body970 2.96336237e-07 0.0034709429840917563 7.07980829e-06 2.556666542168309 0.0007600022860671346 11.316786818393913 258.5630322140128 332.7233936354956 299.4496346844978 0.4 0.4 0.4 0.0 0.0 0.0 -971.0 2.96336237e-07 0.0003385735361366209 +Body971 2.96336237e-07 0.0003385735361366209 7.07980829e-06 0.2493903345204671 0.0006619383365492601 6.918466133956221 34.08709733785606 41.67273369273931 169.08779374597916 0.4 0.4 0.4 0.0 0.0 0.0 -972.0 2.96336237e-07 0.00050944360942722 +Body972 2.96336237e-07 0.00050944360942722 7.07980829e-06 0.3752517506953094 0.0019324612115266307 10.802402793584992 212.13550421956228 82.64100064809932 358.327784724528 0.4 0.4 0.4 0.0 0.0 0.0 -973.0 2.96336237e-07 0.001229790121697113 +Body973 2.96336237e-07 0.001229790121697113 7.07980829e-06 0.9058527531113671 0.0019972782738101407 8.070688417828606 170.93848526477916 286.36681005572785 11.702196432894826 0.4 0.4 0.4 0.0 0.0 0.0 -974.0 2.96336237e-07 0.0008650449636453158 +Body974 2.96336237e-07 0.0008650449636453158 7.07980829e-06 0.6371846285460949 0.0009740192551011546 3.532833541688154 331.1815313747915 250.47137135834765 279.6190711788757 0.4 0.4 0.4 0.0 0.0 0.0 -975.0 2.96336237e-07 0.002961099957296551 +Body975 2.96336237e-07 0.002961099957296551 7.07980829e-06 2.181120584098874 5.6510615072364866e-05 5.138204604312275 122.391328210872 56.07153820108413 286.4349957165175 0.4 0.4 0.4 0.0 0.0 0.0 -976.0 2.96336237e-07 0.0006799189019085471 +Body976 2.96336237e-07 0.0006799189019085471 7.07980829e-06 0.5008223747450198 0.001866120847901651 6.4065430644434676 222.15782786186904 168.83609464143038 178.13873495994855 0.4 0.4 0.4 0.0 0.0 0.0 -977.0 2.96336237e-07 0.004828142098697655 +Body977 2.96336237e-07 0.004828142098697655 7.07980829e-06 3.5563676560376067 0.001177565972191332 2.2812645152918685 356.4603873337414 307.1163678613121 303.8837059895023 0.4 0.4 0.4 0.0 0.0 0.0 -978.0 2.96336237e-07 0.000141646097163809 +Body978 2.96336237e-07 0.000141646097163809 7.07980829e-06 0.10433528845251076 0.001606147555238029 8.552526312184236 139.34496706570155 211.07561174914002 265.0884024681136 0.4 0.4 0.4 0.0 0.0 0.0 -979.0 2.96336237e-07 0.0005109812736103546 +Body979 2.96336237e-07 0.0005109812736103546 7.07980829e-06 0.376384380815749 0.0018168962500772184 8.186136241961707 173.48400684429888 254.6603408381069 50.17427136135035 0.4 0.4 0.4 0.0 0.0 0.0 -980.0 2.96336237e-07 0.0002598404969961439 +Body980 2.96336237e-07 0.0002598404969961439 7.07980829e-06 0.19139625975281196 2.0898093658894817e-05 1.570997656758336 277.31444846549095 299.90080452120395 59.28785330492891 0.4 0.4 0.4 0.0 0.0 0.0 -981.0 2.96336237e-07 0.0003856543733284739 +Body981 2.96336237e-07 0.0003856543733284739 7.07980829e-06 0.2840696714549461 0.0018994182556429312 6.299140599034355 188.7934353057022 314.490493699651 52.82133332577567 0.4 0.4 0.4 0.0 0.0 0.0 -982.0 2.96336237e-07 0.0007677979183114158 +Body982 2.96336237e-07 0.0007677979183114158 7.07980829e-06 0.5655532971559121 0.0007504200853511277 2.4239440934296557 295.55688315737433 41.24680176624648 98.2982458846315 0.4 0.4 0.4 0.0 0.0 0.0 -983.0 2.96336237e-07 0.001368007221170845 +Body983 2.96336237e-07 0.001368007221170845 7.07980829e-06 1.0076622715620158 0.0011230732994190636 6.916651351080801 79.4090970845436 331.0348072724332 253.98022025170627 0.4 0.4 0.4 0.0 0.0 0.0 -984.0 2.96336237e-07 0.000408044664239916 +Body984 2.96336237e-07 0.000408044664239916 7.07980829e-06 0.3005621658304129 0.000862785366571587 8.224997779033004 4.44990334992864 28.905921968573782 27.49431333688353 0.4 0.4 0.4 0.0 0.0 0.0 -985.0 2.96336237e-07 0.00040727545945343756 +Body985 2.96336237e-07 0.00040727545945343756 7.07980829e-06 0.29999557624634926 0.0011676625751051118 3.055021078867999 256.9847919768008 164.61755869715932 54.083333897413326 0.4 0.4 0.4 0.0 0.0 0.0 -986.0 2.96336237e-07 0.00019081952515606263 +Body986 2.96336237e-07 0.00019081952515606263 7.07980829e-06 0.14055600964779558 0.0006255484448296172 4.197820752524388 212.36644452501898 273.32646812567185 296.0458302579175 0.4 0.4 0.4 0.0 0.0 0.0 -987.0 2.96336237e-07 0.0002079176483392447 +Body987 2.96336237e-07 0.0002079176483392447 7.07980829e-06 0.15315033910715795 0.001205282231944934 2.7062419360122356 263.1550680592602 239.03960080387805 266.1389806298129 0.4 0.4 0.4 0.0 0.0 0.0 -988.0 2.96336237e-07 0.0005356291778285949 +Body988 2.96336237e-07 0.0005356291778285949 7.07980829e-06 0.3945398136010656 0.0014083723635099636 7.44772565198021 271.94654997981996 318.713146901804 271.098975185176 0.4 0.4 0.4 0.0 0.0 0.0 -989.0 2.96336237e-07 0.00031289836564658895 +Body989 2.96336237e-07 0.00031289836564658895 7.07980829e-06 0.2304782262959327 0.001996157571664623 1.7953675532218945 157.30520641324463 97.28381007133018 168.826782524686 0.4 0.4 0.4 0.0 0.0 0.0 -990.0 2.96336237e-07 0.00014013209994440944 +Body990 2.96336237e-07 0.00014013209994440944 7.07980829e-06 0.10322009121259194 0.0010882833278620838 5.078082735136406 9.2520530552408 132.5894578402618 331.3155501776673 0.4 0.4 0.4 0.0 0.0 0.0 -991.0 2.96336237e-07 0.00233082373662703 +Body991 2.96336237e-07 0.00233082373662703 7.07980829e-06 1.7168645784267693 0.0016271650341297165 4.114544153927535 351.25334548400645 138.95504074018666 185.8353351547235 0.4 0.4 0.4 0.0 0.0 0.0 -992.0 2.96336237e-07 0.002636986233870952 +Body992 2.96336237e-07 0.002636986233870952 7.07980829e-06 1.9423812223929209 0.0019692418167083325 11.425318652008995 185.73262580174244 252.03030092015973 207.56120933659767 0.4 0.4 0.4 0.0 0.0 0.0 -993.0 2.96336237e-07 0.00016402183333624496 +Body993 2.96336237e-07 0.00016402183333624496 7.07980829e-06 0.12081706193327614 0.0003224994503120344 7.709563804183875 257.0939616583555 85.40420498679829 110.05836070945647 0.4 0.4 0.4 0.0 0.0 0.0 -994.0 2.96336237e-07 0.0012377043699630425 +Body994 2.96336237e-07 0.0012377043699630425 7.07980829e-06 0.9116823198431324 0.00022287062354428208 9.300229676165964 280.63884189171 318.62871983717224 296.0717146606687 0.4 0.4 0.4 0.0 0.0 0.0 -995.0 2.96336237e-07 0.002260220280143841 +Body995 2.96336237e-07 0.002260220280143841 7.07980829e-06 1.6648586838386625 0.0007465494368326222 7.4287326086969925 112.11905360177528 291.5900905227579 109.71810904858756 0.4 0.4 0.4 0.0 0.0 0.0 -996.0 2.96336237e-07 0.00026215899699463027 +Body996 2.96336237e-07 0.00026215899699463027 7.07980829e-06 0.19310404677245338 0.0006067378650827866 3.6110927080088966 97.28106390217381 324.10608453382685 168.11069126980863 0.4 0.4 0.4 0.0 0.0 0.0 -997.0 2.96336237e-07 0.00018069785172300103 +Body997 2.96336237e-07 0.00018069785172300103 7.07980829e-06 0.13310047265520683 0.0005521152215102571 4.912658693805361 93.03184991783085 132.10056259281993 305.7467862413506 0.4 0.4 0.4 0.0 0.0 0.0 -998.0 2.96336237e-07 0.0014835722645703342 +Body998 2.96336237e-07 0.0014835722645703342 7.07980829e-06 1.092786481685282 0.00022519760218844083 0.28299231052296037 293.16727028839244 89.60460664524368 269.71206597351477 0.4 0.4 0.4 0.0 0.0 0.0 -999.0 2.96336237e-07 0.0006542284424778668 +Body999 2.96336237e-07 0.0006542284424778668 7.07980829e-06 0.48189900481921283 5.8469340653842034e-05 8.6347131557263 320.3038606133154 3.7362594166049425 297.8745781037441 0.4 0.4 0.4 0.0 0.0 0.0 -1000.0 2.96336237e-07 0.0023860635951898344 +Body1000 2.96336237e-07 0.0023860635951898344 7.07980829e-06 1.7575537798423284 0.0015923584364734404 0.7497659565533127 258.13390529900033 164.1276557227987 234.5342373211746 0.4 0.4 0.4 0.0 0.0 0.0 -1001.0 2.96336237e-07 0.00016412719469400177 +Body1001 2.96336237e-07 0.00016412719469400177 7.07980829e-06 0.12089467019692349 0.0006199101143477205 3.528817814353401 42.290001410886 340.89543332710036 171.86047583604415 0.4 0.4 0.4 0.0 0.0 0.0 -1002.0 2.96336237e-07 0.004941936846687636 +Body1002 2.96336237e-07 0.004941936846687636 7.07980829e-06 3.6401878818937763 0.001361898468997319 2.167593142033261 16.21639790039635 4.730174650782885 58.251883556586385 0.4 0.4 0.4 0.0 0.0 0.0 -1003.0 2.96336237e-07 0.00022503263383578275 +Body1003 2.96336237e-07 0.00022503263383578275 7.07980829e-06 0.16575708920050317 0.001966846897325159 9.99588265829861 161.46885212574486 120.73838153799245 190.69422150670002 0.4 0.4 0.4 0.0 0.0 0.0 -1004.0 2.96336237e-07 0.0006111785368094322 +Body1004 2.96336237e-07 0.0006111785368094322 7.07980829e-06 0.4501888171352197 0.001266552287936059 3.4753217655037876 293.8923905613918 150.86042915093037 112.98897163665784 0.4 0.4 0.4 0.0 0.0 0.0 -1005.0 2.96336237e-07 0.0014933101478686677 +Body1005 2.96336237e-07 0.0014933101478686677 7.07980829e-06 1.0999593221884236 0.0003932826201052038 11.015694261113268 197.1351304007129 80.23041820280649 256.5820864126465 0.4 0.4 0.4 0.0 0.0 0.0 -1006.0 2.96336237e-07 0.00018406461078391325 +Body1006 2.96336237e-07 0.00018406461078391325 7.07980829e-06 0.13558039822184031 0.0018493648780547522 8.220110340024462 55.73290020366385 260.5081647359973 247.1075065232204 0.4 0.4 0.4 0.0 0.0 0.0 -1007.0 2.96336237e-07 0.00019456058361372848 +Body1007 2.96336237e-07 0.00019456058361372848 7.07980829e-06 0.14331164090847814 0.0010977637225908158 2.4063330147587334 280.25718138195566 174.4845719313416 50.162734252997346 0.4 0.4 0.4 0.0 0.0 0.0 -1008.0 2.96336237e-07 0.00024237110581885066 +Body1008 2.96336237e-07 0.00024237110581885066 7.07980829e-06 0.17852845750433366 0.0015150721806043333 2.593896114664551 1.5867521368020707 50.3209565059869 286.4748774211602 0.4 0.4 0.4 0.0 0.0 0.0 -1009.0 2.96336237e-07 0.0002880594378219669 +Body1009 2.96336237e-07 0.0002880594378219669 7.07980829e-06 0.2121820871765049 0.0011051968447009415 0.9220451361420159 213.93920419758638 101.13182462569537 87.28103445701775 0.4 0.4 0.4 0.0 0.0 0.0 -1010.0 2.96336237e-07 0.001835451666065534 +Body1010 2.96336237e-07 0.001835451666065534 7.07980829e-06 1.3519778013941521 0.0012681262242561415 8.64584690347934 157.36434888906416 144.07645513624757 80.24977045653176 0.4 0.4 0.4 0.0 0.0 0.0 -1011.0 2.96336237e-07 0.00031003391026964154 +Body1011 2.96336237e-07 0.00031003391026964154 7.07980829e-06 0.22836829327273386 0.0014620575872105336 7.427938697241293 90.3044091402035 81.87800973534473 358.49381627511474 0.4 0.4 0.4 0.0 0.0 0.0 -1012.0 2.96336237e-07 0.00017192364762639922 +Body1012 2.96336237e-07 0.00017192364762639922 7.07980829e-06 0.1266374699061692 0.0018842981448954994 3.4713185050926847 76.79269848254022 92.0385212581749 214.5312215545811 0.4 0.4 0.4 0.0 0.0 0.0 -1013.0 2.96336237e-07 0.0011995594696174474 +Body1013 2.96336237e-07 0.0011995594696174474 7.07980829e-06 0.8835851166004101 0.000669592468330938 1.2977853266371469 325.7330316843859 1.5205524389952982 206.46145338562224 0.4 0.4 0.4 0.0 0.0 0.0 -1014.0 2.96336237e-07 0.0004297236435249972 +Body1014 2.96336237e-07 0.0004297236435249972 7.07980829e-06 0.31653071422217804 0.0003968290223471482 10.695383872637636 235.65535308705591 285.04481948708445 4.037853790044544 0.4 0.4 0.4 0.0 0.0 0.0 -1015.0 2.96336237e-07 0.0009663190570397225 +Body1015 2.96336237e-07 0.0009663190570397225 7.07980829e-06 0.7117822486616155 1.0582720333339041e-05 1.0331708911946655 20.22623311598944 318.3578681583923 174.8102790417449 0.4 0.4 0.4 0.0 0.0 0.0 -1016.0 2.96336237e-07 0.00019430233859558718 +Body1016 2.96336237e-07 0.00019430233859558718 7.07980829e-06 0.14312141986463225 0.000694789513369331 1.1919133893280893 144.64146687271867 33.42514348436069 1.7437790912856979 0.4 0.4 0.4 0.0 0.0 0.0 -1017.0 2.96336237e-07 0.0002351421165249028 +Body1017 2.96336237e-07 0.0002351421165249028 7.07980829e-06 0.17320364659668183 0.00011020940322937086 6.6717830165939 106.49474151879747 116.21484599903383 168.11514233105655 0.4 0.4 0.4 0.0 0.0 0.0 -1018.0 2.96336237e-07 0.0006374122183839503 +Body1018 2.96336237e-07 0.0006374122183839503 7.07980829e-06 0.46951231978763164 1.0313885841382204e-05 0.283485576361803 248.40949874465076 61.78537628740118 69.80315322742248 0.4 0.4 0.4 0.0 0.0 0.0 -1019.0 2.96336237e-07 0.0016238205834913815 +Body1019 2.96336237e-07 0.0016238205834913815 7.07980829e-06 1.196092178789557 0.00044029218790311245 9.294952685150736 192.9432720942652 219.75438615459558 8.593013571751802 0.4 0.4 0.4 0.0 0.0 0.0 -1020.0 2.96336237e-07 0.0002359911786367202 +Body1020 2.96336237e-07 0.0002359911786367202 7.07980829e-06 0.1738290583949901 0.0016860917119783944 7.070809732901793 50.61554168251882 82.35194741251726 122.93934305630053 0.4 0.4 0.4 0.0 0.0 0.0 -1021.0 2.96336237e-07 0.0013374222699180736 +Body1021 2.96336237e-07 0.0013374222699180736 7.07980829e-06 0.985133661348538 0.0016013894048395488 0.1937721644334621 310.06595705801703 328.0680479331346 324.315639311186 0.4 0.4 0.4 0.0 0.0 0.0 -1022.0 2.96336237e-07 0.0005509336475663367 +Body1022 2.96336237e-07 0.0005509336475663367 7.07980829e-06 0.40581295346635515 0.00177184140930115 4.72270518835129 13.777991578702514 29.103319407207273 209.48918113436866 0.4 0.4 0.4 0.0 0.0 0.0 -1023.0 2.96336237e-07 0.00041610279811663437 +Body1023 2.96336237e-07 0.00041610279811663437 7.07980829e-06 0.30649771745697174 0.0009590960375982868 0.3398205898598721 4.114269656502745 119.46390049602921 202.11512779386223 0.4 0.4 0.4 0.0 0.0 0.0 -1024.0 2.96336237e-07 0.0001403860693474923 +Body1024 2.96336237e-07 0.0001403860693474923 7.07980829e-06 0.1034071628754145 0.0014866370983263651 0.4388100867792128 156.1246806954142 299.55046831024754 184.84512699514002 0.4 0.4 0.4 0.0 0.0 0.0 -1025.0 2.96336237e-07 0.0004904100706912027 +Body1025 2.96336237e-07 0.0004904100706912027 7.07980829e-06 0.36123181090129014 0.0005275158958782995 6.040658312413581 289.57784927223867 106.22818791374922 246.0010122010286 0.4 0.4 0.4 0.0 0.0 0.0 -1026.0 2.96336237e-07 0.0002115872709214439 +Body1026 2.96336237e-07 0.0002115872709214439 7.07980829e-06 0.1558533513206383 0.00017962305255114086 2.228555718939646 221.69083506261506 335.55035580083063 68.78998943071673 0.4 0.4 0.4 0.0 0.0 0.0 -1027.0 2.96336237e-07 0.0012054461730928302 +Body1027 2.96336237e-07 0.0012054461730928302 7.07980829e-06 0.8879212113989006 0.0018184438677694458 9.604726975252321 256.33122715191917 110.65660729704527 307.36242303481583 0.4 0.4 0.4 0.0 0.0 0.0 -1028.0 2.96336237e-07 0.0002301953665735905 +Body1028 2.96336237e-07 0.0002301953665735905 7.07980829e-06 0.16955991342360516 0.001875700972295152 8.812230202795027 318.4987276783344 313.5618824324488 232.72945395306718 0.4 0.4 0.4 0.0 0.0 0.0 -1029.0 2.96336237e-07 0.0003830711229494787 +Body1029 2.96336237e-07 0.0003830711229494787 7.07980829e-06 0.2821668715978782 0.0018646047988924999 10.4842960126124 87.79503469486153 142.14901778290115 169.28619961043805 0.4 0.4 0.4 0.0 0.0 0.0 -1030.0 2.96336237e-07 0.00013616362117447619 +Body1030 2.96336237e-07 0.00013616362117447619 7.07980829e-06 0.1002969441194545 0.0019340938484324966 9.257468575255746 98.6643320398618 100.47235147951874 223.44457800245482 0.4 0.4 0.4 0.0 0.0 0.0 -1031.0 2.96336237e-07 0.0010567519895469774 +Body1031 2.96336237e-07 0.0010567519895469774 7.07980829e-06 0.7783943635569466 0.001679773904269816 1.2027233467654006 183.8272709991961 232.37589915408836 235.10407255216268 0.4 0.4 0.4 0.0 0.0 0.0 -1032.0 2.96336237e-07 0.0006595442619462101 +Body1032 2.96336237e-07 0.0006595442619462101 7.07980829e-06 0.485814591402228 0.0010034907372722369 3.273195681562454 229.21049828043255 132.60304900464524 14.233912459494354 0.4 0.4 0.4 0.0 0.0 0.0 -1033.0 2.96336237e-07 0.00023664997581116507 +Body1033 2.96336237e-07 0.00023664997581116507 7.07980829e-06 0.17431432268820896 0.0016827982976985647 5.078435328585683 62.29790054827389 41.22978729775912 107.23698746785354 0.4 0.4 0.4 0.0 0.0 0.0 -1034.0 2.96336237e-07 0.001318705638331831 +Body1034 2.96336237e-07 0.001318705638331831 7.07980829e-06 0.9713471526164856 0.0018570382735186622 7.035178345537015 353.5214098527756 257.39567363852177 183.11732818206784 0.4 0.4 0.4 0.0 0.0 0.0 -1035.0 2.96336237e-07 0.0005118746339964803 +Body1035 2.96336237e-07 0.0005118746339964803 7.07980829e-06 0.37704242233926993 0.0005823099511214891 7.468921656685116 229.6514522787109 181.28691418249238 167.59896969912432 0.4 0.4 0.4 0.0 0.0 0.0 -1036.0 2.96336237e-07 0.00015029486112446563 +Body1036 2.96336237e-07 0.00015029486112446563 7.07980829e-06 0.11070589308377869 0.00018389956348444143 1.9961843041263327 158.13156629323322 291.93559238946756 147.74549322555492 0.4 0.4 0.4 0.0 0.0 0.0 -1037.0 2.96336237e-07 0.00043842515077565096 +Body1037 2.96336237e-07 0.00043842515077565096 7.07980829e-06 0.32294016910407747 0.0015694793242154081 4.926590245765692 301.9847715564752 193.4474659331788 270.15259927024186 0.4 0.4 0.4 0.0 0.0 0.0 -1038.0 2.96336237e-07 0.0006671725313668756 +Body1038 2.96336237e-07 0.0006671725313668756 7.07980829e-06 0.49143350859327606 0.0015771093149727837 10.224654773938632 111.27785703678904 48.8195507283246 90.33356191746999 0.4 0.4 0.4 0.0 0.0 0.0 -1039.0 2.96336237e-07 0.0007178575227925163 +Body1039 2.96336237e-07 0.0007178575227925163 7.07980829e-06 0.5287676343227806 0.0014126630019065758 9.776440869136062 187.9378440567246 159.39709706456992 19.349416992256124 0.4 0.4 0.4 0.0 0.0 0.0 -1040.0 2.96336237e-07 0.0002798437797408352 +Body1040 2.96336237e-07 0.0002798437797408352 7.07980829e-06 0.20613050458520504 0.0016509289679437099 4.723892716345665 91.14449265725597 85.21589055108116 98.32164075727847 0.4 0.4 0.4 0.0 0.0 0.0 -1041.0 2.96336237e-07 0.0002263422882310149 +Body1041 2.96336237e-07 0.0002263422882310149 7.07980829e-06 0.16672176928584023 0.0004714213343695067 0.22170557888045386 54.607112841276376 12.205015472013512 173.46043809374353 0.4 0.4 0.4 0.0 0.0 0.0 -1042.0 2.96336237e-07 0.0009296457461436903 +Body1042 2.96336237e-07 0.0009296457461436903 7.07980829e-06 0.6847690054628205 0.0006431313423143502 0.7775645891294196 13.438885358051545 201.28512538898056 237.90695576201654 0.4 0.4 0.4 0.0 0.0 0.0 -1043.0 2.96336237e-07 0.00014471154854085126 +Body1043 2.96336237e-07 0.00014471154854085126 7.07980829e-06 0.1065932733886645 0.0013576679540193398 5.468547562720859 36.06169947612996 221.1108065224926 121.64906093398862 0.4 0.4 0.4 0.0 0.0 0.0 -1044.0 2.96336237e-07 0.00037877024306155 +Body1044 2.96336237e-07 0.00037877024306155 7.07980829e-06 0.2789988807199672 0.0011132428485285735 5.050474666995423 249.74545118406445 258.5653900199572 92.29764359239104 0.4 0.4 0.4 0.0 0.0 0.0 -1045.0 2.96336237e-07 0.001114328815806798 +Body1045 2.96336237e-07 0.001114328815806798 7.07980829e-06 0.8208049551389457 0.0002629442756225448 6.163105710226599 271.7004838770167 98.10963662399806 23.94590526447956 0.4 0.4 0.4 0.0 0.0 0.0 -1046.0 2.96336237e-07 0.0001582092222130898 +Body1046 2.96336237e-07 0.0001582092222130898 7.07980829e-06 0.11653554291976381 0.00023376293046817017 8.835825709860268 263.8062967986066 31.365484807908 308.687475111338 0.4 0.4 0.4 0.0 0.0 0.0 -1047.0 2.96336237e-07 0.0001380216644816069 +Body1047 2.96336237e-07 0.0001380216644816069 7.07980829e-06 0.10166556272800358 0.00045162508055423043 1.5132402918154233 326.71546075352586 327.68305493129543 29.18082087489584 0.4 0.4 0.4 0.0 0.0 0.0 -1048.0 2.96336237e-07 0.0006949747121783435 +Body1048 2.96336237e-07 0.0006949747121783435 7.07980829e-06 0.5119123541997226 0.0018713396984367957 7.02135922104862 303.3858597951343 78.44703853152163 145.1418248146341 0.4 0.4 0.4 0.0 0.0 0.0 -1049.0 2.96336237e-07 0.00041090676352630105 +Body1049 2.96336237e-07 0.00041090676352630105 7.07980829e-06 0.3026703633777083 0.0018193201285857054 4.736122465093243 192.76873790004578 123.35136201021704 226.6478029131528 0.4 0.4 0.4 0.0 0.0 0.0 -1050.0 2.96336237e-07 0.0005190460990146181 +Body1050 2.96336237e-07 0.0005190460990146181 7.07980829e-06 0.382324861363546 0.00036914350456759447 7.0531347201912356 319.30383186798866 186.0442457047016 45.41161522402716 0.4 0.4 0.4 0.0 0.0 0.0 -1051.0 2.96336237e-07 0.0005570896423234391 +Body1051 2.96336237e-07 0.0005570896423234391 7.07980829e-06 0.4103474058907777 0.00019454636651792913 3.308658013346352 259.4879647052133 198.29000308840256 121.88790531858048 0.4 0.4 0.4 0.0 0.0 0.0 -1052.0 2.96336237e-07 0.00015004376774584662 +Body1052 2.96336237e-07 0.00015004376774584662 7.07980829e-06 0.11052093987566852 0.0005132108209643012 5.847971496400572 358.2931626537533 52.74559372288429 341.8253704638137 0.4 0.4 0.4 0.0 0.0 0.0 -1053.0 2.96336237e-07 0.0002698064447930371 +Body1053 2.96336237e-07 0.0002698064447930371 7.07980829e-06 0.19873709059045247 4.0859603511946685e-05 9.177085749947818 74.85375525962608 51.57071985092971 71.96201861419884 0.4 0.4 0.4 0.0 0.0 0.0 -1054.0 2.96336237e-07 0.0012305098304465736 +Body1054 2.96336237e-07 0.0012305098304465736 7.07980829e-06 0.9063828843432212 8.347532413762518e-05 11.039263844273759 351.14137820165297 198.23851222477109 203.36588365669812 0.4 0.4 0.4 0.0 0.0 0.0 -1055.0 2.96336237e-07 0.0001568172138124013 +Body1055 2.96336237e-07 0.0001568172138124013 7.07980829e-06 0.11551020158723 0.0009641443679568011 6.060219043124053 250.67097763803443 73.7144156562964 61.69380447177951 0.4 0.4 0.4 0.0 0.0 0.0 -1056.0 2.96336237e-07 0.0007784718672315925 +Body1056 2.96336237e-07 0.0007784718672315925 7.07980829e-06 0.5734156354893578 0.00037805965343345397 9.20178855576056 185.31494995190826 272.62312850782456 244.0037955450334 0.4 0.4 0.4 0.0 0.0 0.0 -1057.0 2.96336237e-07 0.0020016415139744647 +Body1057 2.96336237e-07 0.0020016415139744647 7.07980829e-06 1.474391804085696 0.0017615842823230773 6.886427957908099 232.2819884863594 20.386138671028082 287.0942892242212 0.4 0.4 0.4 0.0 0.0 0.0 -1058.0 2.96336237e-07 0.0003128786308940594 +Body1058 2.96336237e-07 0.0003128786308940594 7.07980829e-06 0.23046368984813118 0.00026034657543586693 0.9965960172825522 282.2271432222122 109.64538903982367 30.26113287739992 0.4 0.4 0.4 0.0 0.0 0.0 -1059.0 2.96336237e-07 0.002280948538736275 +Body1059 2.96336237e-07 0.002280948538736275 7.07980829e-06 1.6801269396018885 0.0018814136632662839 4.401712167064789 142.60240528002035 323.0208336955997 201.17599880588443 0.4 0.4 0.4 0.0 0.0 0.0 -1060.0 2.96336237e-07 0.0010794162761996403 +Body1060 2.96336237e-07 0.0010794162761996403 7.07980829e-06 0.7950886808224714 0.0006422835491610436 7.311343469200093 3.3195965949378676 195.64747664798455 301.5916100882996 0.4 0.4 0.4 0.0 0.0 0.0 -1061.0 2.96336237e-07 0.0038205438966614834 +Body1061 2.96336237e-07 0.0038205438966614834 7.07980829e-06 2.8141795466674058 0.00119787361542321 10.667509696747311 52.83677312459824 41.02571442700538 313.93040156906204 0.4 0.4 0.4 0.0 0.0 0.0 -1062.0 2.96336237e-07 0.0007444726066210494 +Body1062 2.96336237e-07 0.0007444726066210494 7.07980829e-06 0.5483720745723865 0.0003865067453184975 0.5355920908152287 342.9518172608334 309.11372912966795 118.04505970639424 0.4 0.4 0.4 0.0 0.0 0.0 -1063.0 2.96336237e-07 0.0030820512703673723 +Body1063 2.96336237e-07 0.0030820512703673723 7.07980829e-06 2.2702122738145465 0.001414595339723291 3.0183779331408984 44.040931617179766 165.14070943364828 170.9325128444665 0.4 0.4 0.4 0.0 0.0 0.0 -1064.0 2.96336237e-07 0.001292023450921525 +Body1064 2.96336237e-07 0.001292023450921525 7.07980829e-06 0.9516932844496926 0.001255124176185626 9.410447615755132 103.77112988217213 98.92626620219501 36.37866204625916 0.4 0.4 0.4 0.0 0.0 0.0 -1065.0 2.96336237e-07 0.0005006501267576775 +Body1065 2.96336237e-07 0.0005006501267576775 7.07980829e-06 0.3687745475164047 0.00012010083746096664 11.332153792172592 82.36163994190758 221.29234376821722 312.489878003404 0.4 0.4 0.4 0.0 0.0 0.0 -1066.0 2.96336237e-07 0.00024312721614488058 +Body1066 2.96336237e-07 0.00024312721614488058 7.07980829e-06 0.17908540182223479 0.0007928811065615938 9.090241652441014 148.41938777280106 66.55238686381871 122.48896513542098 0.4 0.4 0.4 0.0 0.0 0.0 -1067.0 2.96336237e-07 0.000484561114979234 +Body1067 2.96336237e-07 0.000484561114979234 7.07980829e-06 0.3569235207784181 0.0002450194070024846 4.327457613923389 154.34903842078862 184.03496751066874 141.03467043934236 0.4 0.4 0.4 0.0 0.0 0.0 -1068.0 2.96336237e-07 0.0002295281745818022 +Body1068 2.96336237e-07 0.0002295281745818022 7.07980829e-06 0.169068465580634 0.0014182095016049016 4.076850747292395 285.9512621452999 304.0626748996221 13.733221199055034 0.4 0.4 0.4 0.0 0.0 0.0 -1069.0 2.96336237e-07 0.0003594752961708292 +Body1069 2.96336237e-07 0.0003594752961708292 7.07980829e-06 0.2647863899431045 0.0002604205926253782 9.280674865620604 145.2491426198426 8.796817478925986 128.45810995912268 0.4 0.4 0.4 0.0 0.0 0.0 -1070.0 2.96336237e-07 0.00014172518222536575 +Body1070 2.96336237e-07 0.00014172518222536575 7.07980829e-06 0.10439354182394157 9.839221898313551e-05 2.1156677281913794 24.852002854809896 92.69018327719559 148.89039267610767 0.4 0.4 0.4 0.0 0.0 0.0 -1071.0 2.96336237e-07 0.0002016479386200088 +Body1071 2.96336237e-07 0.0002016479386200088 7.07980829e-06 0.14853212522645015 0.0017914163418180427 11.068928719328813 114.12056238330297 311.59906008741643 291.70201700840965 0.4 0.4 0.4 0.0 0.0 0.0 -1072.0 2.96336237e-07 0.00029647910859208323 +Body1072 2.96336237e-07 0.00029647910859208323 7.07980829e-06 0.21838394374767 0.0005146041736322796 9.504245913579787 265.097773326478 182.73670388417793 51.957204708288096 0.4 0.4 0.4 0.0 0.0 0.0 -1073.0 2.96336237e-07 0.00027367525859549297 +Body1073 2.96336237e-07 0.00027367525859549297 7.07980829e-06 0.20158682533168915 0.00018687907075023996 9.319915790288432 282.55201858549447 141.6311126988207 131.21227760057155 0.4 0.4 0.4 0.0 0.0 0.0 -1074.0 2.96336237e-07 0.00015525822331078113 +Body1074 2.96336237e-07 0.00015525822331078113 7.07980829e-06 0.11436186268528936 0.0004119016832350737 6.574991289388891 105.77935988116378 236.0611136901257 109.28511887744698 0.4 0.4 0.4 0.0 0.0 0.0 -1075.0 2.96336237e-07 0.0003583433710142642 +Body1075 2.96336237e-07 0.0003583433710142642 7.07980829e-06 0.2639526236757552 0.0008337956289715744 1.3376216652307844 121.92448780471639 34.07719270560039 77.69917625943664 0.4 0.4 0.4 0.0 0.0 0.0 -1076.0 2.96336237e-07 0.00038670760067879823 +Body1076 2.96336237e-07 0.00038670760067879823 7.07980829e-06 0.2848454695997766 0.0016887729407050614 2.0032196718865887 5.268555024531614 305.5550610348134 87.36285255817019 0.4 0.4 0.4 0.0 0.0 0.0 -1077.0 2.96336237e-07 0.0005852817156672451 +Body1077 2.96336237e-07 0.0005852817156672451 7.07980829e-06 0.4311134429599012 4.2331792720825e-05 8.59969096301321 63.37516804763427 165.06484164761468 4.724447309546279 0.4 0.4 0.4 0.0 0.0 0.0 -1078.0 2.96336237e-07 0.0015676661151334862 +Body1078 2.96336237e-07 0.0015676661151334862 7.07980829e-06 1.1547292837198626 0.0011981035748268721 8.969251150946953 305.463305609603 217.13849671607755 101.181996737649 0.4 0.4 0.4 0.0 0.0 0.0 -1079.0 2.96336237e-07 0.00014305620178764748 +Body1079 2.96336237e-07 0.00014305620178764748 7.07980829e-06 0.10537395930629548 0.0009062114287953925 8.535513578982753 200.6263462199005 138.64084794365152 240.50625521460537 0.4 0.4 0.4 0.0 0.0 0.0 -1080.0 2.96336237e-07 0.0004940068971867729 +Body1080 2.96336237e-07 0.0004940068971867729 7.07980829e-06 0.36388120214780617 0.0011787048296460743 2.2700663210263694 157.0025718585469 106.5254491912733 193.52066864297382 0.4 0.4 0.4 0.0 0.0 0.0 -1081.0 2.96336237e-07 0.00034215807366096336 +Body1081 2.96336237e-07 0.00034215807366096336 7.07980829e-06 0.25203067381720473 0.00033240376352644557 5.8095471421992055 294.8529110644031 32.43864947017361 108.02452531613245 0.4 0.4 0.4 0.0 0.0 0.0 -1082.0 2.96336237e-07 0.0005257134897729528 +Body1082 2.96336237e-07 0.0005257134897729528 7.07980829e-06 0.38723600365355887 0.0014176988844195625 1.7020679685604367 154.24226598932938 249.80038110010247 217.66315089733828 0.4 0.4 0.4 0.0 0.0 0.0 -1083.0 2.96336237e-07 0.00013922216074144442 +Body1083 2.96336237e-07 0.00013922216074144442 7.07980829e-06 0.10254983787616709 0.001955802223468188 6.566427553036517 285.0325186657339 202.16052389944963 135.84081277325714 0.4 0.4 0.4 0.0 0.0 0.0 -1084.0 2.96336237e-07 0.0002073898952932506 +Body1084 2.96336237e-07 0.0002073898952932506 7.07980829e-06 0.15276160078405535 0.0007628203986920079 10.56800929369996 333.12847419347 204.0299708421488 12.049520689477403 0.4 0.4 0.4 0.0 0.0 0.0 -1085.0 2.96336237e-07 0.00017702811622741558 +Body1085 2.96336237e-07 0.00017702811622741558 7.07980829e-06 0.13039737727070405 0.00036806562946591764 7.391982068575776 17.506082273198004 89.500369236383 15.26719944960728 0.4 0.4 0.4 0.0 0.0 0.0 -1086.0 2.96336237e-07 0.00020397807847560232 +Body1086 2.96336237e-07 0.00020397807847560232 7.07980829e-06 0.15024848606403035 0.0015049857013671706 1.2247498246658155 268.0571666819836 169.12252482509325 35.3722225357901 0.4 0.4 0.4 0.0 0.0 0.0 -1087.0 2.96336237e-07 0.00014807870410146713 +Body1087 2.96336237e-07 0.00014807870410146713 7.07980829e-06 0.10907349101354584 0.0006756310625710788 1.2383196196555968 64.40501108361362 318.89784866832827 311.5312956004794 0.4 0.4 0.4 0.0 0.0 0.0 -1088.0 2.96336237e-07 0.0002733111251738441 +Body1088 2.96336237e-07 0.0002733111251738441 7.07980829e-06 0.20131860780686034 0.001126384587638148 3.43465132561609 184.4402950800669 242.44812792063072 237.3097094630739 0.4 0.4 0.4 0.0 0.0 0.0 -1089.0 2.96336237e-07 0.00015277565689980917 +Body1089 2.96336237e-07 0.00015277565689980917 7.07980829e-06 0.11253322576709932 0.0009290556457821281 8.960476834173825 258.69701166205476 210.9678169871424 193.3540846978131 0.4 0.4 0.4 0.0 0.0 0.0 -1090.0 2.96336237e-07 0.0043134087862902485 +Body1090 2.96336237e-07 0.0043134087862902485 7.07980829e-06 3.177219555938278 0.0008815486955619425 3.6471376972641885 187.12691492260888 208.12911881504223 127.41614600761226 0.4 0.4 0.4 0.0 0.0 0.0 -1091.0 2.96336237e-07 0.00037712157611909835 +Body1091 2.96336237e-07 0.00037712157611909835 7.07980829e-06 0.27778448692834806 0.0005856039772976977 0.7362629193989895 352.3748924239602 122.29468759528565 358.21764314401554 0.4 0.4 0.4 0.0 0.0 0.0 -1092.0 2.96336237e-07 0.00024348957256648923 +Body1092 2.96336237e-07 0.00024348957256648923 7.07980829e-06 0.17935231042422356 5.080273648972676e-05 3.472841125950471 87.14731508665045 200.7294349087714 23.581240140004677 0.4 0.4 0.4 0.0 0.0 0.0 -1093.0 2.96336237e-07 0.0019968678097743524 +Body1093 2.96336237e-07 0.0019968678097743524 7.07980829e-06 1.4708755349142997 0.0008350197432291574 6.939407722721982 184.84798594437146 215.22131590969263 274.3975154363176 0.4 0.4 0.4 0.0 0.0 0.0 -1094.0 2.96336237e-07 0.0002513942749606196 +Body1094 2.96336237e-07 0.0002513942749606196 7.07980829e-06 0.1851748457494931 0.0012729795107657288 3.968846002826205 15.515048045390435 316.7696316507825 94.76644295378343 0.4 0.4 0.4 0.0 0.0 0.0 -1095.0 2.96336237e-07 0.0001559672886350869 +Body1095 2.96336237e-07 0.0001559672886350869 7.07980829e-06 0.11488415406235117 0.0006109202926005335 3.789764151004609 278.57890670487143 14.385308236382837 334.617191068131 0.4 0.4 0.4 0.0 0.0 0.0 -1096.0 2.96336237e-07 0.0005494382458640973 +Body1096 2.96336237e-07 0.0005494382458640973 7.07980829e-06 0.404711453523331 0.0018056648021694045 6.125582872164304 212.4724906745584 14.141381811132613 308.585487497957 0.4 0.4 0.4 0.0 0.0 0.0 -1097.0 2.96336237e-07 0.0002965408486382183 +Body1097 2.96336237e-07 0.0002965408486382183 7.07980829e-06 0.2184294209309568 0.0018885208812988777 11.317354301511031 164.26963701178843 297.40431351980413 270.4945984891715 0.4 0.4 0.4 0.0 0.0 0.0 -1098.0 2.96336237e-07 0.0002576039217105266 +Body1098 2.96336237e-07 0.0002576039217105266 7.07980829e-06 0.18974881776716537 0.00033002858484475775 4.498053807254714 33.645734868988015 295.597646549693 234.4151171811031 0.4 0.4 0.4 0.0 0.0 0.0 -1099.0 2.96336237e-07 0.0001958825246323774 +Body1099 2.96336237e-07 0.0001958825246323774 7.07980829e-06 0.14428537121421636 0.0017137044394379005 4.029642428036966 271.67316889786736 106.54609382292395 138.21725331441138 0.4 0.4 0.4 0.0 0.0 0.0 -1100.0 2.96336237e-07 0.00016611157008233055 +Body1100 2.96336237e-07 0.00016611157008233055 7.07980829e-06 0.12235634392239092 0.001657358982362942 0.5373922338997845 225.46337325647366 197.13129345073978 114.94304125662089 0.4 0.4 0.4 0.0 0.0 0.0 -1101.0 2.96336237e-07 0.001308605507277351 +Body1101 2.96336237e-07 0.001308605507277351 7.07980829e-06 0.9639074835533934 0.0010432942754127976 10.412349198039687 114.9249921105892 32.56533325561457 288.25205278496304 0.4 0.4 0.4 0.0 0.0 0.0 -1102.0 2.96336237e-07 0.0003442049054244555 +Body1102 2.96336237e-07 0.0003442049054244555 7.07980829e-06 0.25353835236771743 0.0008680211886097618 7.07908811460832 184.72976734274292 234.14267202181568 36.374336712281284 0.4 0.4 0.4 0.0 0.0 0.0 -1103.0 2.96336237e-07 0.00262679764649654 +Body1103 2.96336237e-07 0.00262679764649654 7.07980829e-06 1.9348763971706382 0.001429152651771894 6.217100494758238 51.181217194967104 134.40266278121493 62.68811212560275 0.4 0.4 0.4 0.0 0.0 0.0 -1104.0 2.96336237e-07 0.00013666754181719987 +Body1104 2.96336237e-07 0.00013666754181719987 7.07980829e-06 0.10066812770070735 0.0010243846983094584 9.311950281761822 220.50938404411406 259.8318109894018 285.0754878105018 0.4 0.4 0.4 0.0 0.0 0.0 -1105.0 2.96336237e-07 0.00019553250780010182 +Body1105 2.96336237e-07 0.00019553250780010182 7.07980829e-06 0.14402755184686397 0.0015210580561077288 1.9378674420443527 31.802333045565963 246.72956575146446 163.22157357298997 0.4 0.4 0.4 0.0 0.0 0.0 -1106.0 2.96336237e-07 0.0011042330330908016 +Body1106 2.96336237e-07 0.0011042330330908016 7.07980829e-06 0.8133684890243221 4.150335338481837e-05 7.261073943736824 269.56939767535096 179.46353685386686 260.9257799412304 diff --git a/examples/symba_clement_2018/sun_MsunAUYR.in b/examples/symba_clement_2018/sun_MsunAUYR.in index fbe9bc7ed..20c47c397 100644 --- a/examples/symba_clement_2018/sun_MsunAUYR.in +++ b/examples/symba_clement_2018/sun_MsunAUYR.in @@ -1,4 +1,4 @@ -0 +Sun 39.476926408897626 0.004650467260962157 0.0 diff --git a/examples/symba_mars_disk/testnetcdf.ipynb b/examples/symba_mars_disk/testnetcdf.ipynb index 1fb3af422..d04fa73bd 100644 --- a/examples/symba_mars_disk/testnetcdf.ipynb +++ b/examples/symba_mars_disk/testnetcdf.ipynb @@ -36,7 +36,7 @@ "Reading Swiftest file param.in\n", "\n", "Creating Dataset\n", - "Successfully converted 2 output frames.\n", + "Successfully converted 17 output frames.\n", "Swiftest simulation data stored as xarray DataSet .ds\n" ] } @@ -405,22 +405,22 @@ " stroke: currentColor;\n", " fill: currentColor;\n", "}\n", - "
<xarray.DataArray 'origin_type' (id: 1521)>\n",
+       "
<xarray.DataArray 'origin_type' (id: 2612)>\n",
        "array(['Initial conditions', 'Initial conditions', 'Initial conditions',\n",
        "       ..., 'Supercatastrophic', 'Supercatastrophic', 'Supercatastrophic'],\n",
-       "      dtype='<U18')\n",
+       "      dtype='<U20')\n",
        "Coordinates:\n",
-       "  * id       (id) int32 0 1 2 3 4 5 6 7 ... 1514 1515 1516 1517 1518 1519 1520
    • id
      (id)
      int32
      0 1 2 3 4 ... 2608 2609 2610 2611
      array([   0,    1,    2, ..., 2609, 2610, 2611], dtype=int32)
  • " ], "text/plain": [ - "\n", + "\n", "array(['Initial conditions', 'Initial conditions', 'Initial conditions',\n", " ..., 'Supercatastrophic', 'Supercatastrophic', 'Supercatastrophic'],\n", - " dtype='
    <xarray.DataArray 'name' ()>\n",
    -       "array(b'1322', dtype='|S32')\n",
    +       "
    <xarray.DataArray 'origin_type' (id: 2612)>\n",
    +       "array(['Initial conditions', 'Initial conditions', 'Initial conditions',\n",
    +       "       ..., 'Supercatastrophic', 'Supercatastrophic', 'Supercatastrophic'],\n",
    +       "      dtype='<U20')\n",
            "Coordinates:\n",
    -       "    id       int32 1321
    " + " * id (id) int32 0 1 2 3 4 5 6 7 ... 2605 2606 2607 2608 2609 2610 2611
    " ], "text/plain": [ - "\n", - "array(b'1322', dtype='|S32')\n", + "\n", + "array(['Initial conditions', 'Initial conditions', 'Initial conditions',\n", + " ..., 'Supercatastrophic', 'Supercatastrophic', 'Supercatastrophic'],\n", + " dtype=' Date: Sat, 28 Aug 2021 13:24:30 -0400 Subject: [PATCH 084/154] Fixed array indexing problem when re-indexing the pl-pl encounter lists after a rearray operation. --- src/symba/symba_util.f90 | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/symba/symba_util.f90 b/src/symba/symba_util.f90 index b8428dd99..51af8159d 100644 --- a/src/symba/symba_util.f90 +++ b/src/symba/symba_util.f90 @@ -418,7 +418,7 @@ module subroutine symba_util_rearray_pl(self, system, param) class(symba_parameters), intent(in) :: param !! Current run configuration parameters ! Internals class(symba_pl), allocatable :: tmp !! The discarded body list. - integer(I4B) :: i, j, k, npl + integer(I4B) :: i, j, k, npl, nencmin logical, dimension(:), allocatable :: lmask class(symba_plplenc), allocatable :: plplenc_old logical :: lencounter @@ -500,8 +500,10 @@ module subroutine symba_util_rearray_pl(self, system, param) call move_alloc(levelm_orig_pl, pl%levelm) call move_alloc(nplenc_orig_pl, pl%nplenc) + ! Re-index the encounter list as the index values may have changed associate(idnew1 => system%plplenc_list%id1, idnew2 => system%plplenc_list%id2, idold1 => plplenc_old%id1, idold2 => plplenc_old%id2) - do k = 1, system%plplenc_list%nenc + nencmin = min(system%plplenc_list%nenc, plplenc_old%nenc) + do k = 1, nencmin if ((idnew1(k) == idold1(k)) .and. (idnew2(k) == idold2(k))) then ! This is an encounter we already know about, so save the old information system%plplenc_list%lvdotr(k) = plplenc_old%lvdotr(k) From 3a796246814f6f005d39315364f329c9c3338062 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Sat, 28 Aug 2021 14:04:28 -0400 Subject: [PATCH 085/154] Improved reporting of collisions with body names and ids --- src/discard/discard.f90 | 18 +++++++++--- src/symba/symba_collision.f90 | 52 ++++++++++++++++++++++++++++++++--- src/symba/symba_discard.f90 | 6 ++-- 3 files changed, 65 insertions(+), 11 deletions(-) diff --git a/src/discard/discard.f90 b/src/discard/discard.f90 index 5c6f704e1..1d9922207 100644 --- a/src/discard/discard.f90 +++ b/src/discard/discard.f90 @@ -125,14 +125,14 @@ subroutine discard_cb_tp(tp, system, param) tp%status(i) = DISCARDED_RMAX write(idstr, *) tp%id(i) write(timestr, *) param%t - write(*, *) "Particle " // trim(adjustl(idstr)) // " too far from the central body at t = " // trim(adjustl(timestr)) + write(*, *) "Particle " // trim(adjustl(tp%info(i)%name)) // " (" // trim(adjustl(idstr)) // ")" // " too far from the central body at t = " // trim(adjustl(timestr)) 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(idstr, *) tp%id(i) write(timestr, *) param%t - write(*, *) "Particle " // trim(adjustl(idstr)) // " too close to the central body at t = " // trim(adjustl(timestr)) + write(*, *) "Particle " // trim(adjustl(tp%info(i)%name)) // " (" // trim(adjustl(idstr)) // ")" // " too close to the central body at t = " // trim(adjustl(timestr)) tp%ldiscard(i) = .true. tp%lmask(i) = .false. else if (param%rmaxu >= 0.0_DP) then @@ -143,7 +143,7 @@ subroutine discard_cb_tp(tp, system, param) tp%status(i) = DISCARDED_RMAXU write(idstr, *) tp%id(i) write(timestr, *) param%t - write(*, *) "Particle " // trim(adjustl(idstr)) // " is unbound and too far from barycenter at t = " // trim(adjustl(timestr)) + write(*, *) "Particle " // trim(adjustl(tp%info(i)%name)) // " (" // trim(adjustl(idstr)) // ")" // " is unbound and too far from barycenter at t = " // trim(adjustl(timestr)) tp%ldiscard(i) = .true. tp%lmask(i) = .false. end if @@ -173,6 +173,7 @@ subroutine discard_peri_tp(tp, system, param) integer(I4B) :: i, j, ih real(DP) :: r2 real(DP), dimension(NDIM) :: dx + character(len=STRMAX) :: idstr, timestr associate(cb => system%cb, ntp => tp%nbody, pl => system%pl, npl => system%pl%nbody, t => param%t) call tp%get_peri(system, param) @@ -190,7 +191,9 @@ subroutine discard_peri_tp(tp, system, param) (tp%atp(i) <= param%qmin_ahi) .and. & (tp%peri(i) <= param%qmin)) then tp%status(i) = DISCARDED_PERI - write(*, *) "Particle ", tp%id(i), " perihelion distance too small at t = ", t + write(idstr, *) tp%id(i) + write(timestr, *) param%t + write(*, *) "Particle " // trim(adjustl(tp%info(i)%name)) // " (" // trim(adjustl(idstr)) // ")" // " perihelion distance too small at t = " // trim(adjustl(timestr)) tp%ldiscard(i) = .true. end if end if @@ -219,6 +222,7 @@ subroutine discard_pl_tp(tp, system, param) integer(I4B) :: i, j, isp real(DP) :: r2min, radius real(DP), dimension(NDIM) :: dx, dv + character(len=STRMAX) :: idstri, idstrj, timestr associate(ntp => tp%nbody, pl => system%pl, npl => system%pl%nbody, t => param%t, dt => param%dt) do i = 1, ntp @@ -233,6 +237,12 @@ subroutine discard_pl_tp(tp, system, param) tp%lmask(i) = .false. pl%ldiscard(j) = .true. write(*, *) "Particle ", tp%id(i), " too close to massive body ", pl%id(j), " at t = ", t + write(idstri, *) tp%id(i) + write(idstrj, *) pl%id(j) + write(timestr, *) param%t + write(*, *) "Particle " // trim(adjustl(tp%info(i)%name)) // " (" // trim(adjustl(idstri)) // ")" & + // " too close to massive body " // trim(adjustl(pl%info(i)%name)) // " (" // trim(adjustl(idstrj)) & + // " at t = " // trim(adjustl(timestr)) tp%ldiscard(i) = .true. exit end if diff --git a/src/symba/symba_collision.f90 b/src/symba/symba_collision.f90 index a8619e35e..cf4fdb131 100644 --- a/src/symba/symba_collision.f90 +++ b/src/symba/symba_collision.f90 @@ -30,8 +30,11 @@ module function symba_collision_casedisruption(system, param, family, x, v, mass real(DP), dimension(:), allocatable :: m_frag, rad_frag integer(I4B), dimension(:), allocatable :: id_frag logical :: lfailure + character(len=STRMAX) :: collider_message - write(*, '("Disruption between bodies ",I8,99(:,",",I8))') system%pl%id(family(:)) + collider_message = "Disruption between" + call symba_collision_collider_message(system%pl, family, collider_message) + write(*,*) trim(adjustl(collider_message)) ! Collisional fragments will be uniformly distributed around the pre-impact barycenter nfrag = NFRAG_DISRUPT @@ -125,8 +128,12 @@ module function symba_collision_casehitandrun(system, param, family, x, v, mass, integer(I4B), dimension(:), allocatable :: id_frag logical :: lpure logical, dimension(system%pl%nbody) :: lmask + character(len=STRMAX) :: collider_message + character(len=NAMELEN) :: idstr - write(*, '("Hit and run between bodies ",I8,99(:,",",I8))') system%pl%id(family(:)) + collider_message = "Hit and run between" + call symba_collision_collider_message(system%pl, family, collider_message) + write(*,*) trim(adjustl(collider_message)) mtot = sum(mass(:)) xcom(:) = (mass(1) * x(:,1) + mass(2) * x(:,2)) / mtot @@ -232,10 +239,15 @@ module function symba_collision_casemerge(system, param, family, x, v, mass, rad real(DP), dimension(NDIM, 1) :: vb_frag, xb_frag, rot_frag, Ip_frag real(DP), dimension(1) :: m_frag, rad_frag integer(I4B), dimension(1) :: id_frag + character(len=STRMAX) :: collider_message + character(len=NAMELEN) :: idstr + + collider_message = "Merging" + call symba_collision_collider_message(system%pl, family, collider_message) + write(*,*) trim(adjustl(collider_message)) select type(pl => system%pl) class is (symba_pl) - write(*, '("Merging bodies ",I8,99(:,",",I8))') pl%id(family(:)) ibiggest = family(maxloc(pl%Gmass(family(:)), dim=1)) id_frag(1) = pl%id(ibiggest) @@ -338,8 +350,12 @@ module function symba_collision_casesupercatastrophic(system, param, family, x, integer(I4B), dimension(:), allocatable :: id_frag logical :: lfailure logical, dimension(system%pl%nbody) :: lmask + character(len=STRMAX) :: collider_message + character(len=NAMELEN) :: idstr - write(*, '("Supercatastrophic disruption between bodies ",I8,99(:,",",I8))') system%pl%id(family(:)) + collider_message = "Supercatastrophic disruption between" + call symba_collision_collider_message(system%pl, family, collider_message) + write(*,*) trim(adjustl(collider_message)) ! Collisional fragments will be uniformly distributed around the pre-impact barycenter nfrag = NFRAG_SUPERCAT @@ -403,6 +419,34 @@ module function symba_collision_casesupercatastrophic(system, param, family, x, end function symba_collision_casesupercatastrophic + subroutine symba_collision_collider_message(pl, family, collider_message) + !! author: David A. Minton + !! + !! Prints a nicely formatted message about which bodies collided, including their names and ids. + !! This subroutine appends the body names and ids to an input message. + implicit none + ! Arguments + class(swiftest_pl), intent(in) :: pl !! Swiftest massive body object + integer(I4B), dimension(:), intent(in) :: family !! Index of collisional family members + character(*), intent(inout) :: collider_message !! The message to print to the screen. + ! Internals + integer(I4B) :: i, n + character(len=STRMAX) :: idstr + + n = size(family) + if (n == 0) return + + do i = 1, n + if (i > 1) collider_message = trim(adjustl(collider_message)) // " and " + collider_message = " " // trim(adjustl(collider_message)) // " " // trim(adjustl(pl%info(family(i))%name)) + write(idstr, '(I10)') pl%id(family(i)) + collider_message = trim(adjustl(collider_message)) // " (" // trim(adjustl(idstr)) // ") " + end do + + return + end subroutine symba_collision_collider_message + + module function symba_collision_check_encounter(self, system, param, t, dt, irec) result(lany_collision) !! author: David A. Minton !! diff --git a/src/symba/symba_discard.f90 b/src/symba/symba_discard.f90 index acd233cba..b1a433fca 100644 --- a/src/symba/symba_discard.f90 +++ b/src/symba/symba_discard.f90 @@ -36,14 +36,14 @@ subroutine symba_discard_cb_pl(pl, system, param) pl%status(i) = DISCARDED_RMAX write(idstr, *) pl%id(i) write(timestr, *) param%t - write(*, *) "Massive body " // trim(adjustl(idstr)) // " too far from the central body at t = " // trim(adjustl(timestr)) + write(*, *) "Massive body " // trim(adjustl(pl%info(i)%name)) // " (" // trim(adjustl(idstr)) // ")" // " too far from the central body at t = " // trim(adjustl(timestr)) 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(idstr, *) pl%id(i) write(timestr, *) param%t - write(*, *) "Massive body " // trim(adjustl(idstr)) // " too close to the central body at t = " // trim(adjustl(timestr)) + write(*, *) "Massive body " // trim(adjustl(pl%info(i)%name)) // " (" // trim(adjustl(idstr)) // ")" // " too close to the central body at t = " // trim(adjustl(timestr)) 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)) @@ -54,7 +54,7 @@ subroutine symba_discard_cb_pl(pl, system, param) pl%status(i) = DISCARDED_RMAXU write(idstr, *) pl%id(i) write(timestr, *) param%t - write(*, *) "Massive body " // trim(adjustl(idstr)) // " is unbound and too far from barycenter at t = " // trim(adjustl(timestr)) + write(*, *) "Massive body " // trim(adjustl(pl%info(i)%name)) // " (" // trim(adjustl(idstr)) // ")" // " is unbound and too far from barycenter at t = " // trim(adjustl(timestr)) end if end if end if From 2b2027d1f8d1a212c6d1d3d61fbb4cd43faad1d9 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Sat, 28 Aug 2021 15:34:18 -0400 Subject: [PATCH 086/154] Fixed issues related to gaps in the id record that were causing the processing code to fail because of empty string values if idslots were not filled between writes. Now particle info is dumped to the bin file in NetCDF mode after a rearray operation to catch all newly created bodies and fill all id slots. --- src/io/io.f90 | 70 ++++++++++--------- src/modules/swiftest_classes.f90 | 18 +++-- src/modules/symba_classes.f90 | 2 +- src/netcdf/netcdf.f90 | 111 ++++++++++++++++++++++--------- src/setup/setup.f90 | 11 +-- src/symba/symba_collision.f90 | 1 - src/symba/symba_util.f90 | 40 ++++++----- 7 files changed, 154 insertions(+), 99 deletions(-) diff --git a/src/io/io.f90 b/src/io/io.f90 index b3cd08b59..c3417f094 100644 --- a/src/io/io.f90 +++ b/src/io/io.f90 @@ -145,7 +145,7 @@ module subroutine io_dump_particle_info_base(self, param, idx) implicit none ! Arguments class(swiftest_base), intent(inout) :: self !! Swiftest base object (can be cb, pl, or tp) - class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + class(swiftest_parameters), intent(inout) :: param !! Current run configuration parameters integer(I4B), dimension(:), optional, intent(in) :: idx !! Array of test particle indices to append to the particle file ! Internals @@ -154,41 +154,47 @@ module subroutine io_dump_particle_info_base(self, param, idx) integer(I4B) :: i character(STRMAX) :: errmsg - if (lfirst) then - select case(param%out_stat) - case('APPEND') - open(unit = LUN, file = param%particle_out, status = 'OLD', position = 'APPEND', form = 'UNFORMATTED', err = 667, iomsg = errmsg) - case('NEW', 'UNKNOWN', 'REPLACE') - open(unit = LUN, file = param%particle_out, status = param%out_stat, form = 'UNFORMATTED', err = 667, iomsg = errmsg) - case default - write(*,*) 'Invalid status code',trim(adjustl(param%out_stat)) - call util_exit(FAILURE) - end select - - lfirst = .false. - else - open(unit = LUN, file = param%particle_out, status = 'OLD', position = 'APPEND', form = 'UNFORMATTED', err = 667, iomsg = errmsg) - end if + if ((param%out_type == REAL4_TYPE) .or. (param%out_type == REAL8_TYPE)) then + if (lfirst) then + select case(param%out_stat) + case('APPEND') + open(unit = LUN, file = param%particle_out, status = 'OLD', position = 'APPEND', form = 'UNFORMATTED', err = 667, iomsg = errmsg) + case('NEW', 'UNKNOWN', 'REPLACE') + open(unit = LUN, file = param%particle_out, status = param%out_stat, form = 'UNFORMATTED', err = 667, iomsg = errmsg) + case default + write(*,*) 'Invalid status code',trim(adjustl(param%out_stat)) + call util_exit(FAILURE) + end select - select type(self) - class is (swiftest_cb) - write(LUN, err = 667, iomsg = errmsg) self%id - call self%info%dump(LUN) - class is (swiftest_body) - if (present(idx)) then - do i = 1, size(idx) - write(LUN, err = 667, iomsg = errmsg) self%id(idx(i)) - call self%info(idx(i))%dump(LUN) - end do + lfirst = .false. else - do i = 1, self%nbody - write(LUN, err = 667, iomsg = errmsg) self%id(i) - call self%info(i)%dump(LUN) - end do + open(unit = LUN, file = param%particle_out, status = 'OLD', position = 'APPEND', form = 'UNFORMATTED', err = 667, iomsg = errmsg) end if - end select - close(unit = LUN, err = 667, iomsg = errmsg) + select type(self) + class is (swiftest_cb) + write(LUN, err = 667, iomsg = errmsg) self%id + call self%info%dump(LUN) + class is (swiftest_body) + if (present(idx)) then + do i = 1, size(idx) + write(LUN, err = 667, iomsg = errmsg) self%id(idx(i)) + call self%info(idx(i))%dump(LUN) + end do + else + do i = 1, self%nbody + write(LUN, err = 667, iomsg = errmsg) self%id(i) + call self%info(i)%dump(LUN) + end do + end if + end select + + close(unit = LUN, err = 667, iomsg = errmsg) + else if ((param%out_type == NETCDF_FLOAT_TYPE) .or. (param%out_type == NETCDF_DOUBLE_TYPE)) then + call param%nciu%open(param) + call self%write_particle_info(param%nciu) + call param%nciu%close(param) + end if return diff --git a/src/modules/swiftest_classes.f90 b/src/modules/swiftest_classes.f90 index 45ea97f15..75b792b57 100644 --- a/src/modules/swiftest_classes.f90 +++ b/src/modules/swiftest_classes.f90 @@ -179,10 +179,12 @@ module swiftest_classes !! An abstract superclass for a generic Swiftest object contains !! The minimal methods that all systems must have - procedure :: dump => io_dump_base !! Dump contents to file - procedure :: dump_particle_info => io_dump_particle_info_base !! Dump contents of particle information metadata to file - procedure :: write_frame_netcdf => netcdf_write_frame_base !! I/O routine for writing out a single frame of time-series data for all bodies in the system in NetCDF format - generic :: write_frame => write_frame_netcdf !! Set up generic procedure that will switch between NetCDF or Fortran binary depending on arguments + procedure :: dump => io_dump_base !! Dump contents to file + procedure :: dump_particle_info => io_dump_particle_info_base !! Dump contents of particle information metadata to file + procedure :: write_frame_netcdf => netcdf_write_frame_base !! I/O routine for writing out a single frame of time-series data for all bodies in the system in NetCDF format + procedure :: write_particle_info_netcdf => netcdf_write_particle_info_base !! Writes out the particle information metadata to NetCDF file + generic :: write_frame => write_frame_netcdf !! Set up generic procedure that will switch between NetCDF or Fortran binary depending on arguments + generic :: write_particle_info => write_particle_info_netcdf end type swiftest_base !******************************************************************************************************************************** @@ -652,7 +654,7 @@ end subroutine io_dump_param module subroutine io_dump_particle_info_base(self, param, idx) implicit none class(swiftest_base), intent(inout) :: self !! Swiftest base object (can be cb, pl, or tp) - class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + class(swiftest_parameters), intent(inout) :: param !! Current run configuration parameters integer(I4B), dimension(:), optional, intent(in) :: idx !! Array of test particle indices to append to the particle file end subroutine io_dump_particle_info_base @@ -913,6 +915,12 @@ module subroutine netcdf_write_hdr_system(self, iu, param) class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters end subroutine netcdf_write_hdr_system + module subroutine netcdf_write_particle_info_base(self, iu) + implicit none + class(swiftest_base), intent(in) :: self !! Swiftest particle object + class(netcdf_parameters), intent(inout) :: iu !! Parameters used to identify a particular NetCDF dataset + end subroutine netcdf_write_particle_info_base + module subroutine obl_acc_body(self, system) implicit none class(swiftest_body), intent(inout) :: self !! Swiftest body object diff --git a/src/modules/symba_classes.f90 b/src/modules/symba_classes.f90 index 3a9e37fce..60dbd4feb 100644 --- a/src/modules/symba_classes.f90 +++ b/src/modules/symba_classes.f90 @@ -571,7 +571,7 @@ module subroutine symba_util_rearray_pl(self, system, param) implicit none 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 + class(symba_parameters), intent(inout) :: param !! Current run configuration parameters with SyMBA additions end subroutine symba_util_rearray_pl end interface diff --git a/src/netcdf/netcdf.f90 b/src/netcdf/netcdf.f90 index d2f7a0f80..e37703782 100644 --- a/src/netcdf/netcdf.f90 +++ b/src/netcdf/netcdf.f90 @@ -238,26 +238,22 @@ module subroutine netcdf_write_frame_base(self, iu, param) integer(I4B), dimension(:), allocatable :: ind character(len=:), allocatable :: charstring + call self%write_particle_info(iu) + tslot = int(param%ioutput, kind=I4B) + 1 select type(self) class is (swiftest_body) associate(n => self%nbody) if (n == 0) return + + allocate(ind(n)) call util_sort(self%id(1:n), ind) do i = 1, n j = ind(i) idslot = self%id(j) + 1 - call check( nf90_put_var(iu%ncid, iu%id_varid, self%id(j), start=[idslot]) ) - charstring = trim(adjustl(self%info(j)%name)) - strlen = len(charstring) - call check( nf90_put_var(iu%ncid, iu%name_varid, charstring, start=[1, idslot], count=[strlen, 1]) ) - - charstring = trim(adjustl(self%info(j)%particle_type)) - strlen = len(charstring) - call check( nf90_put_var(iu%ncid, iu%ptype_varid, charstring, start=[1, idslot], count=[strlen, 1]) ) if ((param%out_form == XV) .or. (param%out_form == XVEL)) then call check( nf90_put_var(iu%ncid, iu%xhx_varid, self%xh(1, j), start=[idslot, tslot]) ) @@ -277,19 +273,6 @@ module subroutine netcdf_write_frame_base(self, iu, param) call check( nf90_put_var(iu%ncid, iu%capm_varid, self%capm(j), start=[idslot, tslot]) ) end if - if (iu%ltrack_origin) then - charstring = trim(adjustl(self%info(j)%origin_type)) - strlen = len(charstring) - call check( nf90_put_var(iu%ncid, iu%origin_type_varid, charstring, start=[1, idslot], count=[strlen, 1]) ) - call check( nf90_put_var(iu%ncid, iu%origin_time_varid, self%info(j)%origin_time, start=[idslot]) ) - call check( nf90_put_var(iu%ncid, iu%origin_xhx_varid, self%info(j)%origin_xh(1), start=[idslot]) ) - call check( nf90_put_var(iu%ncid, iu%origin_xhy_varid, self%info(j)%origin_xh(2), start=[idslot]) ) - call check( nf90_put_var(iu%ncid, iu%origin_xhz_varid, self%info(j)%origin_xh(3), start=[idslot]) ) - call check( nf90_put_var(iu%ncid, iu%origin_vhx_varid, self%info(j)%origin_vh(1), start=[idslot]) ) - call check( nf90_put_var(iu%ncid, iu%origin_vhy_varid, self%info(j)%origin_vh(2), start=[idslot]) ) - call check( nf90_put_var(iu%ncid, iu%origin_vhz_varid, self%info(j)%origin_vh(3), start=[idslot]) ) - end if - select type(self) class is (swiftest_pl) ! Additional output if the passed polymorphic object is a massive body call check( nf90_put_var(iu%ncid, iu%Gmass_varid, self%Gmass(j), start=[idslot, tslot]) ) @@ -342,23 +325,85 @@ module subroutine netcdf_write_frame_base(self, iu, param) call check( nf90_put_var(iu%ncid, iu%Q_varid, self%Q, start=[idslot, tslot]) ) end if - if (iu%ltrack_origin) then - charstring = trim(adjustl(self%info%origin_type)) - strlen = len(charstring) - call check( nf90_put_var(iu%ncid, iu%origin_type_varid, charstring, start=[1, idslot], count=[strlen, 1]) ) - call check( nf90_put_var(iu%ncid, iu%origin_time_varid, self%info%origin_time, start=[idslot]) ) - call check( nf90_put_var(iu%ncid, iu%origin_xhx_varid, self%info%origin_xh(1), start=[idslot]) ) - call check( nf90_put_var(iu%ncid, iu%origin_xhy_varid, self%info%origin_xh(2), start=[idslot]) ) - call check( nf90_put_var(iu%ncid, iu%origin_xhz_varid, self%info%origin_xh(3), start=[idslot]) ) - call check( nf90_put_var(iu%ncid, iu%origin_vhx_varid, self%info%origin_vh(1), start=[idslot]) ) - call check( nf90_put_var(iu%ncid, iu%origin_vhy_varid, self%info%origin_vh(2), start=[idslot]) ) - call check( nf90_put_var(iu%ncid, iu%origin_vhz_varid, self%info%origin_vh(3), start=[idslot]) ) - end if end select return end subroutine netcdf_write_frame_base + + module subroutine netcdf_write_particle_info_base(self, iu) + !! author: Carlisle A. Wishard, Dana Singh, and David A. Minton + !! + !! Write all current particle to file + implicit none + ! Arguments + class(swiftest_base), intent(in) :: self !! Swiftest particle object + class(netcdf_parameters), intent(inout) :: iu !! Parameters used to identify a particular NetCDF dataset + ! Internals + integer(I4B) :: i, j, tslot, strlen, idslot + integer(I4B), dimension(:), allocatable :: ind + character(len=:), allocatable :: charstring + + + select type(self) + class is (swiftest_body) + associate(n => self%nbody) + if (n == 0) return + allocate(ind(n)) + call util_sort(self%id(1:n), ind) + + do i = 1, n + j = ind(i) + idslot = self%id(j) + 1 + call check( nf90_put_var(iu%ncid, iu%id_varid, self%id(j), start=[idslot]) ) + charstring = trim(adjustl(self%info(j)%name)) + strlen = len(charstring) + call check( nf90_put_var(iu%ncid, iu%name_varid, charstring, start=[1, idslot], count=[strlen, 1]) ) + + charstring = trim(adjustl(self%info(j)%particle_type)) + strlen = len(charstring) + call check( nf90_put_var(iu%ncid, iu%ptype_varid, charstring, start=[1, idslot], count=[strlen, 1]) ) + + charstring = trim(adjustl(self%info(j)%origin_type)) + strlen = len(charstring) + call check( nf90_put_var(iu%ncid, iu%origin_type_varid, charstring, start=[1, idslot], count=[strlen, 1]) ) + call check( nf90_put_var(iu%ncid, iu%origin_time_varid, self%info(j)%origin_time, start=[idslot]) ) + call check( nf90_put_var(iu%ncid, iu%origin_xhx_varid, self%info(j)%origin_xh(1), start=[idslot]) ) + call check( nf90_put_var(iu%ncid, iu%origin_xhy_varid, self%info(j)%origin_xh(2), start=[idslot]) ) + call check( nf90_put_var(iu%ncid, iu%origin_xhz_varid, self%info(j)%origin_xh(3), start=[idslot]) ) + call check( nf90_put_var(iu%ncid, iu%origin_vhx_varid, self%info(j)%origin_vh(1), start=[idslot]) ) + call check( nf90_put_var(iu%ncid, iu%origin_vhy_varid, self%info(j)%origin_vh(2), start=[idslot]) ) + call check( nf90_put_var(iu%ncid, iu%origin_vhz_varid, self%info(j)%origin_vh(3), start=[idslot]) ) + end do + end associate + + class is (swiftest_cb) + idslot = self%id + 1 + call check( nf90_put_var(iu%ncid, iu%id_varid, self%id, start=[idslot]) ) + + charstring = trim(adjustl(self%info%name)) + strlen = len(charstring) + call check( nf90_put_var(iu%ncid, iu%name_varid, charstring, start=[1, idslot], count=[strlen, 1]) ) + + charstring = trim(adjustl(self%info%particle_type)) + strlen = len(charstring) + call check( nf90_put_var(iu%ncid, iu%ptype_varid, charstring, start=[1, idslot], count=[strlen, 1]) ) + + charstring = trim(adjustl(self%info%origin_type)) + strlen = len(charstring) + call check( nf90_put_var(iu%ncid, iu%origin_type_varid, charstring, start=[1, idslot], count=[strlen, 1]) ) + call check( nf90_put_var(iu%ncid, iu%origin_time_varid, self%info%origin_time, start=[idslot]) ) + call check( nf90_put_var(iu%ncid, iu%origin_xhx_varid, self%info%origin_xh(1), start=[idslot]) ) + call check( nf90_put_var(iu%ncid, iu%origin_xhy_varid, self%info%origin_xh(2), start=[idslot]) ) + call check( nf90_put_var(iu%ncid, iu%origin_xhz_varid, self%info%origin_xh(3), start=[idslot]) ) + call check( nf90_put_var(iu%ncid, iu%origin_vhx_varid, self%info%origin_vh(1), start=[idslot]) ) + call check( nf90_put_var(iu%ncid, iu%origin_vhy_varid, self%info%origin_vh(2), start=[idslot]) ) + call check( nf90_put_var(iu%ncid, iu%origin_vhz_varid, self%info%origin_vh(3), start=[idslot]) ) + end select + + return + end subroutine netcdf_write_particle_info_base + module subroutine netcdf_write_hdr_system(self, iu, param) !! author: David A. Minton diff --git a/src/setup/setup.f90 b/src/setup/setup.f90 index 342818672..11bd69fd1 100644 --- a/src/setup/setup.f90 +++ b/src/setup/setup.f90 @@ -175,15 +175,8 @@ module subroutine setup_initialize_particle_info_system(self, param) end if cb%info%particle_type = CB_TYPE_NAME - call cb%dump_particle_info(param) - if (npl > 0) then - pl%info(1:npl)%particle_type = PL_TYPE_NAME - call pl%dump_particle_info(param) - end if - if (ntp > 0) then - tp%info(1:ntp)%particle_type = TP_TYPE_NAME - call tp%dump_particle_info(param) - end if + if (npl > 0) pl%info(1:npl)%particle_type = PL_TYPE_NAME + if (ntp > 0) tp%info(1:ntp)%particle_type = TP_TYPE_NAME end associate diff --git a/src/symba/symba_collision.f90 b/src/symba/symba_collision.f90 index cf4fdb131..7a68a56cd 100644 --- a/src/symba/symba_collision.f90 +++ b/src/symba/symba_collision.f90 @@ -907,7 +907,6 @@ subroutine symba_collision_mergeaddsub(system, param, family, id_frag, Ip_frag, ! Copy over identification, information, and physical properties of the new bodies from the fragment list plnew%id(1:nfrag) = id_frag(1:nfrag) - param%maxid = param%maxid + nfrag plnew%xb(:, 1:nfrag) = xb_frag(:, 1:nfrag) plnew%vb(:, 1:nfrag) = vb_frag(:, 1:nfrag) do i = 1, nfrag diff --git a/src/symba/symba_util.f90 b/src/symba/symba_util.f90 index 51af8159d..150bf7825 100644 --- a/src/symba/symba_util.f90 +++ b/src/symba/symba_util.f90 @@ -291,15 +291,6 @@ module subroutine symba_util_index_eucl_plpl(self, param) npl = int(self%nbody, kind=I8B) call pl%sort("mass", ascending=.false.) - select type(param) - class is (symba_parameters) - pl%lmtiny(1:npl) = pl%Gmass(1:npl) < param%GMTINY - where(pl%lmtiny(1:npl)) - pl%info(1:npl)%particle_type = PL_TINY_TYPE_NAME - elsewhere - pl%info(1:npl)%particle_type = PL_TYPE_NAME - end where - end select nplm = count(.not. pl%lmtiny(1:npl)) pl%nplm = int(nplm, kind=I4B) @@ -415,11 +406,11 @@ module subroutine symba_util_rearray_pl(self, system, param) ! Arguments 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 + class(symba_parameters), intent(inout) :: param !! Current run configuration parameters ! Internals class(symba_pl), allocatable :: tmp !! The discarded body list. integer(I4B) :: i, j, k, npl, nencmin - logical, dimension(:), allocatable :: lmask + logical, dimension(:), allocatable :: lmask, ldump_mask class(symba_plplenc), allocatable :: plplenc_old logical :: lencounter integer(I4B), dimension(:), allocatable :: levelg_orig_pl, levelm_orig_pl, levelg_orig_tp, levelm_orig_tp, nplenc_orig_pl, nplenc_orig_tp, ntpenc_orig_pl @@ -450,16 +441,16 @@ module subroutine symba_util_rearray_pl(self, system, param) ! Append the adds to the main pl object call pl%append(pl_adds, lsource_mask=[(.true., i=1, nadd)]) - allocate(lmask(npl+nadd)) - lmask(1:npl) = .false. - lmask(npl+1:npl+nadd) = pl%status(npl+1:npl+nadd) == NEW_PARTICLE - + allocate(ldump_mask(npl+nadd)) ! This mask is used only to append the original Fortran binary particle.dat file with new bodies. This is ignored for NetCDF output + ldump_mask(1:npl) = .false. + ldump_mask(npl+1:npl+nadd) = pl%status(npl+1:npl+nadd) == NEW_PARTICLE npl = pl%nbody - call pl%dump_particle_info(param, idx=pack([(i, i=1, npl)], lmask)) - - deallocate(lmask) + else + allocate(ldump_mask(npl)) + ldump_mask(:) = .false. end if + ! Reset all of the status flags for this body where(pl%status(1:npl) /= INACTIVE) pl%status(1:npl) = ACTIVE @@ -471,6 +462,19 @@ module subroutine symba_util_rearray_pl(self, system, param) pl%lmask(1:npl) = .false. end where + select type(param) + class is (symba_parameters) + pl%lmtiny(1:npl) = pl%Gmass(1:npl) < param%GMTINY + where(pl%lmtiny(1:npl)) + pl%info(1:npl)%particle_type = PL_TINY_TYPE_NAME + elsewhere + pl%info(1:npl)%particle_type = PL_TYPE_NAME + end where + end select + + call pl%dump_particle_info(param, idx=pack([(i, i=1, npl)], ldump_mask)) + deallocate(ldump_mask) + ! Reindex the new list of bodies call pl%index(param) From 9292e37a3c0e10f087b4544fbd947726d03dc711 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Sat, 28 Aug 2021 15:39:48 -0400 Subject: [PATCH 087/154] Put the nan initializer back into the Makefile.Defines, as it was never the true source of problems before. --- Makefile.Defines | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Makefile.Defines b/Makefile.Defines index 83f1df3f3..e764b40ee 100644 --- a/Makefile.Defines +++ b/Makefile.Defines @@ -51,13 +51,13 @@ ADVIXE_FLAGS = -g -O2 -qopt-report=5 -vec -vecabi=cmdtarget -simd -shared-intel VTUNE_FLAGS = -g -O2 -vec -simd -shared-intel -qopenmp -debug inline-debug-info -parallel-source-info=2 -parallel -DTBB_DEBUG -DTBB_USE_THREADING_TOOLS -qopenmp -fp-model no-except -mp1 -xhost -traceback #Be sure to set the environment variable KMP_FORKJOIN_FRAMES=1 for OpenMP debuging in vtune -IDEBUG = -O0 -nogen-interfaces -no-pie -no-ftz -fpe-all=0 -g -traceback -mp1 -fp-model strict -fpe0 -debug all -align all -pad -ip -prec-div -prec-sqrt -assume protect-parens -CB -no-wrap-margin +IDEBUG = -O0 -init=snan,arrays -nogen-interfaces -no-pie -no-ftz -fpe-all=0 -g -traceback -mp1 -fp-model strict -fpe0 -debug all -align all -pad -ip -prec-div -prec-sqrt -assume protect-parens -CB -no-wrap-margin STRICTREAL = -fp-model strict -fp-model no-except -prec-div -prec-sqrt -assume protect-parens SIMDVEC = -simd -xhost -align all -assume contiguous_assumed_shape -vecabi=cmdtarget -prec-div -prec-sqrt -assume protect-parens PAR = -qopenmp #-parallel #Something goes wrong in SyMBA at the moment with auto-paralellization enabled HEAPARR = -heap-arrays 1048576 OPTREPORT = -qopt-report=5 -IPRODUCTION = -no-wrap-margin -O3 $(STRICTREAL) $(PAR) $(SIMDVEC) $(HEAPARR) +IPRODUCTION = -init=snan,arrays -no-wrap-margin -O3 $(STRICTREAL) $(PAR) $(SIMDVEC) $(HEAPARR) #gfortran flags GDEBUG = -g -Og -fbacktrace -fbounds-check -ffree-line-length-none From 4275b8212c7f15c961c193ab2f907b9559e7decb Mon Sep 17 00:00:00 2001 From: David A Minton Date: Sat, 28 Aug 2021 15:50:24 -0400 Subject: [PATCH 088/154] Updated Chambers example with new style --- examples/symba_chambers_2013/init_cond.py | 19 +- examples/symba_chambers_2013/param.in | 4 +- .../symba_chambers_2013/pl_chambers_2013.in | 940 +++++++++--------- examples/symba_chambers_2013/sun_MsunAUYR.in | 2 +- examples/symba_mars_disk/testnetcdf.ipynb | 859 ---------------- 5 files changed, 487 insertions(+), 1337 deletions(-) delete mode 100644 examples/symba_mars_disk/testnetcdf.ipynb diff --git a/examples/symba_chambers_2013/init_cond.py b/examples/symba_chambers_2013/init_cond.py index 7fe0c93b8..eff7f4839 100755 --- a/examples/symba_chambers_2013/init_cond.py +++ b/examples/symba_chambers_2013/init_cond.py @@ -38,7 +38,8 @@ sim.param['CHK_RMAX'] = 1000.0 sim.param['CHK_EJECT'] = 1000.0 sim.param['IN_FORM'] = 'EL' -sim.param['OUT_FORM'] = 'EL' +sim.param['OUT_FORM'] = 'XVEL' +sim.param['OUT_TYPE'] = 'NETCDF_DOUBLE' # Add central body sim.add("Sun") @@ -78,12 +79,20 @@ Rhs = avals * (GMvals / (3 * GMcb))**(1.0/3.0) # Give the bodies unique ids -idb = np.arange(100, 100 + Nb) -ids = np.arange(100 + Nb, 100 + Nb + Ns) +idb = np.arange(10, 10 + Nb) +ids = np.arange(11 + Nb, 11 + Nb + Ns) + +nameb = [] +for i in idb: + nameb.append(f"BigBody{i-10:0.4g}") +names = [] +for i in ids: + names.append(f"SmallBody{i-10:0.4g}") + # Populate the simulation object with the two types of bodies -sim.addp(idb, avalb, evalb, incvalb, capomvalb, omegavalb, capmvalb, GMpl=GMvalb, Rpl=Rvalb, rhill=Rhb) -sim.addp(ids, avals, evals, incvals, capomvals, omegavals, capmvals, GMpl=GMvals, Rpl=Rvals, rhill=Rhs) +sim.addp(idb, nameb, avalb, evalb, incvalb, capomvalb, omegavalb, capmvalb, GMpl=GMvalb, Rpl=Rvalb, rhill=Rhb) +sim.addp(ids, names, avals, evals, incvals, capomvals, omegavals, capmvals, GMpl=GMvals, Rpl=Rvals, rhill=Rhs) # Save everything to a set of initial conditions files sim.save("param.in") diff --git a/examples/symba_chambers_2013/param.in b/examples/symba_chambers_2013/param.in index 7bc67e7bf..b1d279019 100644 --- a/examples/symba_chambers_2013/param.in +++ b/examples/symba_chambers_2013/param.in @@ -4,8 +4,8 @@ TSTOP 300000000.0 DT 0.01642710472279261 ISTEP_OUT 60876 ISTEP_DUMP 60876 -OUT_FORM EL -OUT_TYPE REAL8 +OUT_FORM XVEL +OUT_TYPE NETCDF_DOUBLE OUT_STAT REPLACE IN_TYPE ASCII PL_IN pl_chambers_2013.in diff --git a/examples/symba_chambers_2013/pl_chambers_2013.in b/examples/symba_chambers_2013/pl_chambers_2013.in index 9f07ba581..6151b7b10 100644 --- a/examples/symba_chambers_2013/pl_chambers_2013.in +++ b/examples/symba_chambers_2013/pl_chambers_2013.in @@ -1,937 +1,937 @@ 156 -5 0.037692251088985676735 0.35527124629249231394 +Jupiter 0.037692251088985676735 0.35527132160755719005 0.00046732617030490929307 -5.2035240151214816606 0.048518677336151047608 1.303568872392780964 -100.51672855018520636 273.38350380059858935 317.24733983021741324 +5.203525118232844804 0.04851860564816618676 1.3035691661895258964 +100.51674233424300553 273.38304127662058818 317.663122660171382 0.0 0.0 0.27560000000000001164 --80.96882015576837074 -2387.9972166758053216 5008.7356633679251408 -6 0.011285899820091272997 0.4376627522796287038 +-80.968403371628011836 -2387.9972308074941552 5008.7356633679251408 +Saturn 0.011285899820091272997 0.43766379465266665196 0.00038925687730393611812 -9.581843040035108672 0.052193289679895830957 2.486259885154824989 -113.5952699440524043 335.70375572759667193 225.29914557362599226 +9.5818658609281062155 0.052205424243311190913 2.4862597472377250263 +113.59526896860690215 335.6868332999574136 225.48455056285450837 0.0 0.0 0.22000000000000000111 -441.93102714484842597 378.52937229654824397 5135.9113502360652523 -100 1.1053539394491336042e-05 0.0024942259412694431663 +441.93109321068034775 378.52929516502754512 5135.9113502360652523 +BigBody0 1.1053539394491336042e-05 0.008528824599778775939 2.3653347588909066005e-05 -0.54986599948168679575 0.00790211437739073673 0.17380192597475080385 -107.43156870400773073 276.28353146985244848 194.7142891976026533 +1.8802268813604403608 0.0034577859413208434335 0.20794489945719352164 +116.242322863494550234 358.09542459575311568 304.1535424267980261 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -101 1.1053539394491336042e-05 0.004438085330891615839 +BigBody1 1.1053539394491336042e-05 0.0059690494989390618847 2.3653347588909066005e-05 -0.9784006275765486649 0.008894460002898382789 0.06959456688275278413 -230.72372262612213945 175.80689672313920369 127.98999815613836972 +1.3159102045981110329 0.0036523142822058084558 0.16300211835552913531 +70.81394155502881915 342.55883603006623161 54.136608497372229465 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -102 1.1053539394491336042e-05 0.0022118749019394030531 +BigBody2 1.1053539394491336042e-05 0.005052057603777761473 2.3653347588909066005e-05 -0.48762014040490725408 0.007065173882583869816 0.08255052734200557518 -59.69880211598947284 257.706889533954552 96.36252359516613808 +1.1137542344405522154 0.0072840872640179358394 0.22240338257676339762 +222.71628592255183321 288.921923370197419 92.574120388092254075 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -103 1.1053539394491336042e-05 0.0050274480066339513537 +BigBody3 1.1053539394491336042e-05 0.008820409406923653894 2.3653347588909066005e-05 -1.1083289116955583609 0.004924644152842923804 0.24223522245862766367 -188.40224626199380964 313.44855208036375416 129.90947721881380517 +1.9445083759762775699 0.0070581282930688585622 0.4537120652082861083 +88.34935150484484723 251.72864441608038533 152.56079513094485378 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -104 1.1053539394491336042e-05 0.005497178565716073497 +BigBody4 1.1053539394491336042e-05 0.0043985248115830084884 2.3653347588909066005e-05 -1.2118836294471209136 0.0006636314586658864428 0.21679091691902274697 -292.58786958533733014 349.21714004172918067 92.84912374945815827 +0.9696792907763345237 0.007528169003062028415 0.457734929544543645 +338.01823746004760096 276.8234782165463912 29.31485745878157445 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -105 1.1053539394491336042e-05 0.0058680503539993149066 +BigBody5 1.1053539394491336042e-05 0.0046551615123747859965 2.3653347588909066005e-05 -1.2936443806163331338 0.004833849563252618463 0.008567844508054200947 -328.27890426256050205 131.98075608160368688 322.13564633221562872 +1.0262562807152380007 0.0043961574801766592144 0.28711745105524327792 +233.15202689156717497 278.38726074673456878 121.530061504206173595 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -106 1.1053539394491336042e-05 0.002694510776600401099 +BigBody6 1.1053539394491336042e-05 0.005006625370130645683 2.3653347588909066005e-05 -0.5940199068475252586 0.0067237368733709312538 0.060288304615935095487 -79.16558592832937791 133.19532279503386007 105.316435864485242746 +1.1037384455139314099 0.0020211417817972299887 0.4414365163938446246 +50.42909229312481756 248.7156337605344163 88.127412340235309784 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -107 1.1053539394491336042e-05 0.00894284236059420335 +BigBody7 1.1053539394491336042e-05 0.0062302636945590992105 2.3653347588909066005e-05 -1.9714994024609464596 0.0012301078319352542253 0.24539756157331871211 -30.202531544478411263 131.4722075501692018 190.3346811342855176 +1.3734963287646788643 0.003284048646794181063 0.29726687779842847492 +274.57090965904603763 131.66391666318924081 158.84925050402665647 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -108 1.1053539394491336042e-05 0.00847142435998454647 +BigBody8 1.1053539394491336042e-05 0.0074737606895573080315 2.3653347588909066005e-05 -1.8675726788270168299 0.008026755773111227815 0.4017258251905144184 -133.3423586393701612 179.84390448017239805 225.68364681866682986 +1.6476321665385271764 0.0051051784849983454506 0.33643916637153092886 +53.76286556014000695 114.94625551330999258 331.9130531888574751 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -109 1.1053539394491336042e-05 0.007174596670026274337 +BigBody9 1.1053539394491336042e-05 0.004160663550733341382 2.3653347588909066005e-05 -1.5816797923423595584 0.0031475338026421342819 0.4360851322619670456 -63.04925866997809436 321.46581691044519857 79.431408115766444666 +0.9172414511359892053 0.009838312525106383821 0.18305346601295341413 +329.20200341844741843 353.39532922142575444 283.615736735883047 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -110 1.1053539394491336042e-05 0.0081372984647778109835 +BigBody10 1.1053539394491336042e-05 0.008893323580690212565 2.3653347588909066005e-05 -1.7939127644300645326 0.0019829617212629392295 0.33499759592398342667 -335.2559643572936352 187.7176940339578266 256.98389267937642444 +1.9605827116533913745 0.0067739209011702531185 0.46943231065629464904 +307.18407738324981437 299.20369618829118963 229.02822238698416868 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -111 1.1053539394491336042e-05 0.005574526073514087418 +BigBody11 1.1053539394491336042e-05 0.005284153980059674703 2.3653347588909066005e-05 -1.2289353183013898008 0.0087975519315924410185 0.0931356879078180655 -38.076421761989216463 246.32382787018278236 116.79845254567619861 +1.1649211731724051777 0.003955590755475825275 0.24091863890394393799 +341.82285906978518142 354.6568377939822767 184.99977149020475053 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -112 1.1053539394491336042e-05 0.0024200689107431695442 +BigBody12 1.1053539394491336042e-05 0.0026579413908231734066 2.3653347588909066005e-05 -0.53351766911023290607 0.0035617909124576263916 0.42026149289799202835 -131.64906776807390543 176.17113073415276858 35.570566593488898377 +0.5859579820923875859 0.006632063244305479166 0.16775989049041784007 +27.20019477149550724 279.74596003486641393 327.6212083468928995 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -113 1.1053539394491336042e-05 0.0047743187507997904987 +BigBody13 1.1053539394491336042e-05 0.0051385647895537602423 2.3653347588909066005e-05 -1.0525251575310632379 0.0047905759606499866837 0.077107525060287229746 -10.342512502279181064 88.664376332507956135 298.3693887978787984 +1.1328252253167268027 0.006171984666579787178 0.4427718223948383658 +107.83457765693708552 6.9738506997831350986 173.32578598950007631 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -114 1.1053539394491334998e-06 0.0027667873593623189602 +SmallBody15 1.1053539394491334998e-06 0.003965920256829754137 1.0978911404624207108e-05 -1.3141053718928097371 0.0034379157133108007721 0.41062772150774839997 -117.94487904653206556 135.95661427482011163 357.92535799856455014 +1.8836420863219696109 0.00083078406930939708176 0.06635858690178686459 +323.06500151110822117 223.479512701876871 180.32306345539035419 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -115 1.1053539394491334998e-06 0.0020116765919858510565 +SmallBody16 1.1053539394491334998e-06 0.0014930561726806290352 1.0978911404624207108e-05 -0.95546013216169445315 0.0060206064844968258665 0.07110023689215083653 -180.02093341162267848 11.570684680871377026 52.45363865763020783 +0.7091376684291115229 0.0074165290527274220847 0.16041991537260708034 +97.8551304528232464 194.39999141865840215 111.523194158961615585 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -116 1.1053539394491334998e-06 0.0033395287462686999945 +SmallBody17 1.1053539394491334998e-06 0.003916740972575052582 1.0978911404624207108e-05 -1.586132974842564547 0.00645121634259801513 0.096969056514780882505 -171.91023859938232476 254.67841176708233775 313.28806379016128858 +1.8602840348236275858 0.0068953273747443368305 0.38095682124591934148 +269.789420394791307 66.45754651052922668 281.4678606370854368 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -117 1.1053539394491334998e-06 0.00371593566160539721 +SmallBody18 1.1053539394491334998e-06 0.00080932657540582023503 1.0978911404624207108e-05 -1.7649101214808080584 0.0023577563737892525027 0.48595446091290439572 -47.606286791272218295 202.27273102322442355 347.88058470986658222 +0.38439542408547117125 0.002798999239863538685 0.3941004343151243705 +124.84899501740618177 211.15221271210285181 29.144252829021478846 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -118 1.1053539394491334998e-06 0.0015295236196825508856 +SmallBody19 1.1053539394491334998e-06 0.0032101876354546605832 1.0978911404624207108e-05 -0.72645814224228044687 0.0020370449700726233656 0.3606883424967191054 -274.4280316761291374 280.74766948740551697 24.536589249099783672 +1.5247014926030020288 0.0035659021143455739422 0.28726784725956733269 +305.26683999664834346 237.6590433520821648 189.34085106677034105 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -119 1.1053539394491334998e-06 0.0033834333628134683705 +SmallBody20 1.1053539394491334998e-06 0.0031334439057496713725 1.0978911404624207108e-05 -1.6069857853258651126 0.0098416039402617061516 0.44624727946733649953 -222.77492385480474013 170.8759481887598497 79.99493114501900948 +1.4882515113194170198 0.008406522751564652132 0.09743791038730081899 +182.41313627988012058 240.08302063346957311 226.69806193018246177 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -120 1.1053539394491334998e-06 0.0040359986896511094793 +SmallBody21 1.1053539394491334998e-06 0.002318563101422126877 1.0978911404624207108e-05 -1.9169263373551235219 0.0029802273191661932637 0.230406336919138921 -310.79966407192694078 1.4550646525895816197 252.0063452744394965 +1.101218066629267911 2.3817568879540563625e-05 0.33838972038816461652 +150.79556741229683325 282.89580965142215518 23.878283687633977905 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -121 1.1053539394491334998e-06 0.0031542038750952466353 +SmallBody22 1.1053539394491334998e-06 0.0012750969215099122365 1.0978911404624207108e-05 -1.4981116066914148544 0.006503703527213184135 0.26407165396100124033 -26.062848056125357488 210.56488681239142124 301.56600646968121282 +0.6056163689523108573 0.0083862008640609771865 0.28205301454095604852 +168.88081394329302043 66.51585258832571412 123.579634987953141945 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -122 1.1053539394491334998e-06 0.0018880288863730688365 +SmallBody23 1.1053539394491334998e-06 0.0009972153932821939899 1.0978911404624207108e-05 -0.8967327732925158834 0.007238336978075715633 0.033528086738177642623 -69.065440349257514185 293.81947043939737796 286.96470672499521015 +0.47363455699333534277 0.008223686359273599603 0.45829335098125117964 +332.887696649695215 224.83461963531169658 56.68973281012301868 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -123 1.1053539394491334998e-06 0.0012989977425082224311 +SmallBody24 1.1053539394491334998e-06 0.0025111857965660877644 1.0978911404624207108e-05 -0.61696823419784485587 0.0019528884250943146297 0.47321436840562031145 -249.99391755383430791 343.34598728791138456 346.86912583193304727 +1.1927055882780186469 0.009445402404313582925 0.2826526105232125552 +81.65691402455405523 319.28094528076371716 285.4796954001860172 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -124 1.1053539394491334998e-06 0.0021375309010602413823 +SmallBody25 1.1053539394491334998e-06 0.0035077853428683975809 1.0978911404624207108e-05 -1.0152355330687710122 0.0024575205682447810208 0.49078797741929608422 -336.94314367642243724 93.98747142904542784 343.1238225943502016 +1.666047644359857749 0.00780508176633639382 0.3915267218229046553 +349.7700899820581526 103.620959441678763824 190.0130222471377408 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -125 1.1053539394491334998e-06 0.0021886806744636735113 +SmallBody26 1.1053539394491334998e-06 0.002616178816288626711 1.0978911404624207108e-05 -1.0395294824296072989 0.0015032750981988285063 0.09664665566612262726 -261.27453454035151026 87.106680576905262114 281.8545767584969326 +1.2425727711541307841 0.0059671677576496086337 0.040591307271055199202 +249.8380759041125998 172.84395937673110666 116.2823571530794311 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -126 1.1053539394491334998e-06 0.0009572790019622815113 +SmallBody27 1.1053539394491334998e-06 0.0014624993815020629117 1.0978911404624207108e-05 -0.45466648335734549669 0.007148101776801299087 0.14093359206177985543 -154.4274485437105966 76.386907113986950435 65.4137928754450968 +0.69462450271737596896 0.002509422369573702672 0.3563096511224873586 +326.30240761342378164 99.402500501397057064 33.00720407437324866 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -127 1.1053539394491334998e-06 0.003729812565234214185 +SmallBody28 1.1053539394491334998e-06 0.0021389824887149377763 1.0978911404624207108e-05 -1.7715010557433059635 0.0048324755718385462716 0.43641352554780121764 -301.99915691100079584 305.68759778831190488 138.29375135377947004 +1.015924974969087291 0.0013605389397748734841 0.37043249792133786658 +40.362475475710553496 144.82896127558345256 267.48146434768148083 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -128 1.1053539394491334998e-06 0.0016846822255838862265 +SmallBody29 1.1053539394491334998e-06 0.0026004238204672692798 1.0978911404624207108e-05 -0.80015182774377024977 0.0036167730417621802956 0.30363913306983342233 -217.30104253608558906 127.25594694684403407 68.62323143700560024 +1.2350898236218830206 0.0022389905398143704514 0.027582496424290670056 +253.62523056238714503 134.43399262017697993 87.61567399908518894 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -129 1.1053539394491334998e-06 0.0028156518271099348789 +SmallBody30 1.1053539394491334998e-06 0.0018595270433249734511 1.0978911404624207108e-05 -1.3373138990477930754 0.0015358743297277000113 0.07854569816442086294 -195.79544064919386415 111.78591391871525218 42.72825320073468447 +0.8831956198384895984 0.0093748321201790139195 0.15306614007396368571 +32.49007980188935818 312.47276611996448992 204.6772536877609241 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -130 1.1053539394491334998e-06 0.0025544219135459682557 +SmallBody31 1.1053539394491334998e-06 0.0023041613246169277259 1.0978911404624207108e-05 -1.2132408901293838532 0.0045333183675212128383 0.42641938966810982725 -335.4707082103248581 340.32782670462358965 78.71452296875966681 +1.0943778401115078491 0.00910193752843261282 0.4261907295499119397 +70.748502810014073816 13.655344195174929922 194.09865473575752048 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -131 1.1053539394491334998e-06 0.0017385535134058515513 +SmallBody32 1.1053539394491334998e-06 0.0038244892574693115303 1.0978911404624207108e-05 -0.82573837977064679094 0.00947228661087365191 0.23945040316916776924 -19.579735631200563262 154.31747127598504221 359.85036935042643336 +1.8164684253672074288 0.0017344662236440178474 0.00040903376803846924759 +59.8833868869903867 42.472681151302708713 233.09999986567706287 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -132 1.1053539394491334998e-06 0.0012114779308318496938 +SmallBody33 1.1053539394491334998e-06 0.0016063083513415578069 1.0978911404624207108e-05 -0.5754000759937840659 0.008441518730336730614 0.075040026844357343716 -322.159144370426759 120.90343932105199087 100.737894230941492424 +0.7629275976960977479 0.0065616077232138123043 0.12701470276996179587 +208.21085395120184103 224.54004801606461683 36.813460817990929286 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -133 1.1053539394491334998e-06 0.004078388748157303896 +SmallBody34 1.1053539394491334998e-06 0.0025445731499428134166 1.0978911404624207108e-05 -1.9370597977055710182 0.0047539556352681408558 0.3644800323507790818 -343.45071951804578703 154.80672968106802045 201.89115733144456044 +1.2085631496757802683 0.0047985387630170017736 0.4632494968073996855 +241.05066411065314469 328.81491334014680206 131.68473045002352251 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -134 1.1053539394491334998e-06 0.0036039203608008465391 +SmallBody35 1.1053539394491334998e-06 0.001047943309379953965 1.0978911404624207108e-05 -1.7117076561654485101 0.006971012371901982689 0.10052614663363507175 -301.49565382461685203 343.23510866942172015 146.10462884072774159 +0.49772814222077332857 0.0029061071793044248278 0.12960075213423966067 +155.73347709155672192 84.35449874309856 289.45180387803600297 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -135 1.1053539394491334998e-06 0.0026929339739795838812 +SmallBody36 1.1053539394491334998e-06 0.0026029481051308368118 1.0978911404624207108e-05 -1.2790281802410847778 0.0073399150338953915093 0.22998077022595031504 -236.3867911788404399 68.590499117694676556 211.12134048117644625 +1.2362887506103832358 0.0052503463521577789855 0.39421104664957734576 +232.78768364560565374 152.4465616008079678 262.08575226692556726 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -136 1.1053539394491334998e-06 0.0010561758343539430626 +SmallBody37 1.1053539394491334998e-06 0.0030638297692394653602 1.0978911404624207108e-05 -0.5016382386204670807 0.009262343459015066546 0.25431397403127209422 -240.85528397317872873 280.3614716393232129 287.26674439180794707 +1.4551877811277245112 0.008675136231728216435 0.45565417212897607602 +160.12532605266272867 45.356797121355818092 207.55389444211135697 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -137 1.1053539394491334998e-06 0.0028006595358145995742 +SmallBody38 1.1053539394491334998e-06 0.0012379047660899184597 1.0978911404624207108e-05 -1.3301932034650567616 0.00022993810281455418594 0.08342160340369197957 -70.66457523971979526 275.49054890145470154 246.17193312636263158 +0.5879516897118539642 0.008863952046974160268 0.004871947750551219869 +291.7929722033654798 87.72125563281429095 301.4985684783306965 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -138 1.1053539394491334998e-06 0.0031345916538533425973 +SmallBody39 1.1053539394491334998e-06 0.0020203414546642405008 1.0978911404624207108e-05 -1.4887966424598750859 0.0042935099714141999883 0.29314963965799401002 -18.314807368556046185 317.45412549425219595 74.96719911477174492 +0.9595755704348436499 0.0032823959415707250516 0.36231618128498471743 +357.5523446581528333 140.63194771525292026 320.62512669923916064 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -139 1.1053539394491334998e-06 0.0031727769387009091975 +SmallBody40 1.1053539394491334998e-06 0.0021619748273928422718 1.0978911404624207108e-05 -1.5069330155987958886 0.00042623156360929617507 0.45965895515338095478 -20.129300049819683238 327.29502018496526716 59.231125864523988866 +1.0268453500628844655 0.0029510979342795397654 0.17200839693427560917 +86.24968012545755869 72.78534928310089924 39.274115808944131345 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -140 1.1053539394491334998e-06 0.0029468534902006606923 +SmallBody41 1.1053539394491334998e-06 0.0024650228414904151912 1.0978911404624207108e-05 -1.399629063849084698 0.007272282375730997235 0.20432669181302576256 -187.73561134042344634 233.75900696254421973 213.69939588190965196 +1.1707801638170043379 0.00084383852112471572065 0.44417323723969309723 +166.30850841454468991 233.52138330631103713 349.3701749884398282 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -141 1.1053539394491334998e-06 0.0017889952492140027216 +SmallBody42 1.1053539394491334998e-06 0.0011494655829696986032 1.0978911404624207108e-05 -0.8496960416302725694 0.00931974963626281197 0.08786331420963222616 -125.44242963323571871 213.90820310140793481 297.45792212645267227 +0.54594686948928417003 0.0073746126625160376977 0.29560517114275930428 +26.677876967304161582 2.9383852082894490465 235.62759414701335459 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -142 1.1053539394491334998e-06 0.0008745444542327522458 +SmallBody43 1.1053539394491334998e-06 0.003264557522307860051 1.0978911404624207108e-05 -0.4153711203636550886 0.005598789000554379308 0.28860546557484068053 -292.6804153683137315 293.15323963175370636 16.632979010081850646 +1.550524857792678457 0.006855910395679264309 0.052845126544926068757 +148.49370087394166262 245.6507471059472607 49.154351554646346756 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -143 1.1053539394491334998e-06 0.00173576060783876918 +SmallBody44 1.1053539394491334998e-06 0.0022017288538633278715 1.0978911404624207108e-05 -0.8244118693698843092 0.0011315413061166990603 0.44860347344260603775 -182.34383300537979267 131.24180851437259321 59.650805508873453675 +1.04572680821414421 0.0076940762442233648355 0.18695834780422621035 +186.24536246289451924 209.5758013639246542 201.39838185512508062 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -144 1.1053539394491334998e-06 0.002134797181745330879 +SmallBody45 1.1053539394491334998e-06 0.004177140733055960152 1.0978911404624207108e-05 -1.0139371336002267476 0.007289343253590587976 0.4634087498204931821 -69.447553734797935476 272.51215072362390401 180.88652358187317759 +1.9839627566197359787 0.00081961714887728747466 0.2135493543574670805 +101.192900958177077086 93.105553169601165564 161.53073494194276805 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -145 1.1053539394491334998e-06 0.0029149732559586442152 +SmallBody46 1.1053539394491334998e-06 0.0035270692540920479557 1.0978911404624207108e-05 -1.3844873194237774516 0.00093405874852250936335 0.49831837684007984635 -52.65042390426480523 132.1570385313290501 335.1642645009007424 +1.6752066754087575617 0.0051909332532851107725 0.4097943495140765613 +262.29384437991438972 291.42131387222036665 172.62099421016796441 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -146 1.1053539394491334998e-06 0.0009297558019152983528 +SmallBody47 1.1053539394491334998e-06 0.0031824870893333604256 1.0978911404624207108e-05 -0.44159414337030833408 0.0020058824691861665453 0.2050019411895118715 -258.613537774471979 316.83987106637459874 136.16219228862655655 +1.5115449208342359722 0.008474861491332898178 0.23696328042397618585 +303.88198790793740045 243.16694917270854148 162.96827879419998908 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -147 1.1053539394491334998e-06 0.0030225941590539279168 +SmallBody48 1.1053539394491334998e-06 0.0041919001326894561326 1.0978911404624207108e-05 -1.4356026342335368451 0.008673339650493765152 0.44714004675905749675 -263.19836098306842587 200.28114364179853624 93.21390608694554203 +1.9909728386481431173 0.0031161195922749587717 0.26294671201488906132 +307.4797827097971208 259.2394012562882608 164.19654679575444334 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -148 1.1053539394491334998e-06 0.0038587364317993124525 +SmallBody49 1.1053539394491334998e-06 0.001029626898232924747 1.0978911404624207108e-05 -1.8327343648536362775 0.0023968869061356022979 0.4162622981093172525 -150.99202022316734428 214.42374102088223253 234.46673681709688708 +0.4890286322274733921 0.0016789299820979420447 0.25125269592494270388 +347.9448828508308793 68.2032792277530433 113.95671636992425135 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -149 1.1053539394491334998e-06 0.0039857019664824380383 +SmallBody50 1.1053539394491334998e-06 0.0038377798107606164424 1.0978911404624207108e-05 -1.8930375502819491995 0.0054042423153714269635 0.280354479114709787 -309.89818193102905752 339.47805287826588483 108.2834163186351617 +1.8227808683586907978 0.007278564707354728998 0.4021962803889706506 +158.00800895167876092 62.120145774820663576 338.3524603761762819 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -150 1.1053539394491334998e-06 0.002526214410417571716 +SmallBody51 1.1053539394491334998e-06 0.0025752915599265981195 1.0978911404624207108e-05 -1.199843535517624904 0.00807200501209657216 0.29297227617312499026 -311.1092985416864849 134.93278660564592997 298.0184908095267815 +1.2231530773907171028 0.008180773825256060228 0.49500640013808755446 +215.58419051019205881 238.11054770931033886 62.812965789585732068 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -151 1.1053539394491334998e-06 0.0036581411698850117867 +SmallBody52 1.1053539394491334998e-06 0.0041729107831517003945 1.0978911404624207108e-05 -1.7374602158064242907 0.007153689989388728465 0.44052283973240657922 -237.80983305122521188 259.39413015086012138 14.914034897260304291 +1.981953711770945592 0.0048392368899002205854 0.3439364072598658506 +140.49484117857338106 18.628480746247863209 292.76153894725842974 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -152 1.1053539394491334998e-06 0.000802372644126310084 +SmallBody53 1.1053539394491334998e-06 0.0018463049351976143146 1.0978911404624207108e-05 -0.3810926048719686654 0.006030170704880976132 0.26258916301020024386 -0.15571237391343473178 101.42157830594325674 191.6534478425715804 +0.876915685365348585 0.008414142640979114726 0.4865439996116162069 +25.84749855806933283 147.59552825474432325 351.5883167468276156 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -153 1.1053539394491334998e-06 0.0008778988031953014719 +SmallBody54 1.1053539394491334998e-06 0.003956761570869228732 1.0978911404624207108e-05 -0.41696429230582593428 0.0089104527399628801615 0.18935210551241321575 -290.94348385697963977 194.03201349755511274 246.1264492528840151 +1.8792921031620857253 0.002984509339591897778 0.14521761596090265733 +244.65011115033149736 159.52306947113194724 247.8509476040788968 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -154 1.1053539394491334998e-06 0.0019399977622078306769 +SmallBody55 1.1053539394491334998e-06 0.0022375767585976735108 1.0978911404624207108e-05 -0.9214157611898694533 0.0074622525238668066527 0.044888899465576392878 -352.50451572365290076 314.09425533244291273 232.43445962578101671 +1.0627530260125956918 0.009221146035204222727 0.2774484485756325003 +54.974773353537798926 192.71826493446795325 115.03720651882959203 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -155 1.1053539394491334998e-06 0.0031391545550959035403 +SmallBody56 1.1053539394491334998e-06 0.003569113589554936672 1.0978911404624207108e-05 -1.4909638249193351012 0.0014758841420516332667 0.0055864793798309220207 -218.56254662217830287 78.14339758395870206 316.430657512916639 +1.6951759321362349642 0.00029328152838550283158 0.12854405399432916601 +123.759610708168693805 28.642969205068872895 59.9453124910687265 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -156 1.1053539394491334998e-06 0.0019439900334437632077 +SmallBody57 1.1053539394491334998e-06 0.003838073039724368385 1.0978911404624207108e-05 -0.9233119188614880013 0.0035238992618186449311 0.15216969786581269197 -87.51270655933404896 92.86798277740109597 135.18235847560532648 +1.822920139544514706 0.002427257726946776585 0.3478287098983082748 +175.60627375154865604 261.21004876719126742 102.5765639749250937 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -157 1.1053539394491334998e-06 0.0013581656022498558282 +SmallBody58 1.1053539394491334998e-06 0.0037821584480800916802 1.0978911404624207108e-05 -0.64507043080026138515 0.006017967999349400042 0.044024484429886545644 -243.82486182874328051 313.91412429654531024 17.842738258345278268 +1.7963631058070641533 0.0021913818779026750933 0.2277714432057212357 +127.64574510289172338 286.48389918379018582 351.4955198015076121 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -158 1.1053539394491334998e-06 0.0007957084646394230086 +SmallBody59 1.1053539394491334998e-06 0.0032090764608138491496 1.0978911404624207108e-05 -0.37792740533708479855 0.00079709924865743134875 0.49822584694119959048 -117.10532475856990686 273.82529416769699537 142.59754259648363472 +1.5241737322893442741 0.0051795655611637280227 0.37004071826046752713 +220.09047138550891987 85.25328121777833701 155.14257439202265232 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -159 1.1053539394491334998e-06 0.0025211857007434836788 +SmallBody60 1.1053539394491334998e-06 0.001251952383047329137 1.0978911404624207108e-05 -1.1974551140243550051 0.0020342978333770613854 0.05030793806922934097 -329.78186071094091858 192.3131026578458318 69.88335078328420025 +0.5946237054862358873 0.008964827144955677535 0.11220341486493962124 +355.46676640997060304 293.65836711181913188 135.58653747694026492 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -160 1.1053539394491334998e-06 0.0029456358665218289093 +SmallBody61 1.1053539394491334998e-06 0.0034286826689865096638 1.0978911404624207108e-05 -1.399050744806284996 0.008335673423392558901 0.37206739455989384924 -343.64590296578933248 312.07849532760184275 256.63764061611948364 +1.6284772657300985443 0.0055865188113676115048 0.009295182349638275721 +281.14377556523862722 311.47981280814713045 17.970788876634557596 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -161 1.1053539394491334998e-06 0.0021827320107767314121 +SmallBody62 1.1053539394491334998e-06 0.0024123456722281855242 1.0978911404624207108e-05 -1.0367041222225272801 0.00029136466928890268494 0.11776130787270561173 -350.3069098964570003 208.28777218518968084 13.916149934058807958 +1.1457607669091200986 0.0059942816043978908516 0.20544766408447995287 +331.65266199253352397 67.908967452709333656 331.3349063308830864 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -162 1.1053539394491334998e-06 0.0039978967833819220262 +SmallBody63 1.1053539394491334998e-06 0.00070926620825757897553 1.0978911404624207108e-05 -1.898829565466142677 0.0007690667793557670953 0.05189455759954236802 -143.58325146495602098 143.25676647476683456 249.32199351899294015 +0.33687103969860016095 0.0071611781196035881325 0.25924949443614342393 +330.94730198197396476 94.214661441576183165 61.868231242313015628 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -163 1.1053539394491334998e-06 0.003272058425080806188 +SmallBody64 1.1053539394491334998e-06 0.0037496693687355927613 1.0978911404624207108e-05 -1.5540874650145959368 0.008269972669539046167 0.06961212410979411569 -95.125280555953153794 23.840220641634189747 215.57362311616685702 +1.780932186061826572 0.009928144041807798401 0.48322239522126919642 +29.863534255917500104 193.6213362397997173 261.59011579676081283 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -164 1.1053539394491334998e-06 0.002084380419276098977 +SmallBody65 1.1053539394491334998e-06 0.0012736281298308463319 1.0978911404624207108e-05 -0.9899913330058756067 0.001806727826544205634 0.24664641966640482584 -215.72125982122091159 64.54893275208473824 83.09008589262639077 +0.6049187558780279028 0.0015091166639728593492 0.21853541766376521904 +343.27239511068603406 327.27856875910737244 218.61156947625917724 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -165 1.1053539394491334998e-06 0.0026146669636595032606 +SmallBody66 1.1053539394491334998e-06 0.0038448787389546260301 1.0978911404624207108e-05 -1.241854705974774431 0.0073163913270025450475 0.43641130899208679939 -308.0761874808885068 218.62011086494891288 148.7932624505823469 +1.8261525548899533167 0.0051995677384110115804 0.31065813156730226474 +333.06925492853127935 306.6948175209735723 318.41411463851756025 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -166 1.1053539394491334998e-06 0.0027294558735364785618 +SmallBody67 1.1053539394491334998e-06 0.0008288368759312896654 1.0978911404624207108e-05 -1.2963745166832558731 0.0034043325384798118864 0.33020015938329294602 -73.96163975096013132 354.886841550204565 206.63567540075379725 +0.39366198034647403858 0.0046883091977471943665 0.0132479346083514970545 +261.21488538826179138 126.85930642388336764 249.97227049855567316 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -167 1.1053539394491334998e-06 0.0023440737884687683454 +SmallBody68 1.1053539394491334998e-06 0.0027031517150100666755 1.0978911404624207108e-05 -1.1133345492260346976 0.0011591388934861801031 0.48103431467001306343 -226.41816836110476174 173.94407663538297015 144.67436636749943091 +1.2838811691530558345 0.0049121456620970583087 0.07255473068979628737 +69.26560015966929029 305.8875197413007072 134.63575408635963981 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -168 1.1053539394491334998e-06 0.0012672577499801911835 +SmallBody69 1.1053539394491334998e-06 0.0036973458793854774706 1.0978911404624207108e-05 -0.60189309857392880865 0.0083767637767715036334 0.018624213155859659086 -229.40491160703805917 289.0753963788822034 22.11230128196215361 +1.756080771948452135 0.0009601252277977257105 0.1695493446614180777 +134.78798723652712965 157.09044357175469031 86.40744012700496057 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -169 1.1053539394491334998e-06 0.0016816587455295810122 +SmallBody70 1.1053539394491334998e-06 0.0024226359340959145194 1.0978911404624207108e-05 -0.7987158043472744051 0.00047420727998471746663 0.46591218774088305477 -43.025524209519325325 126.20059793122902647 6.7084425859654972513 +1.1506482001095099665 0.005674234583021546194 0.062224739795935124498 +118.63742114361265578 189.83674534297023229 261.05238102013146317 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -170 1.1053539394491334998e-06 0.0027469802655764696665 +SmallBody71 1.1053539394491334998e-06 0.00093424490574192736807 1.0978911404624207108e-05 -1.3046978515579010782 0.009718325881772035477 0.2879767022977701152 -233.91150510083792824 254.98840830964169868 219.45043790648659865 +0.44372627522120611232 0.0030334359757953079616 0.37391057552349776794 +283.89092391956961592 259.95137404118332825 346.16472723124888944 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -171 1.1053539394491334998e-06 0.0031926528968724679073 +SmallBody72 1.1053539394491334998e-06 0.00402765939824776902 1.0978911404624207108e-05 -1.5163732435644108332 0.0029295138139127110087 0.32840722977188846476 -323.51936544562488507 34.22854017443987118 126.816058110113985435 +1.9129655314790134923 0.0070964021998901963273 0.10810520726298006311 +30.878255376390765008 42.882658122567953285 200.72893583876941648 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -172 1.1053539394491334998e-06 0.0035052067479395476428 +SmallBody73 1.1053539394491334998e-06 0.0033292669766640747785 1.0978911404624207108e-05 -1.6648229223238577568 0.002654112317870128794 0.17083834486027260624 -48.117742607139220468 178.38978668204242695 226.22621143244791142 +1.5812590742455658877 0.0075533749864811006516 0.034121039683396359177 +12.444814241754089679 179.89151615168688636 24.585029489733646102 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -173 1.1053539394491334998e-06 0.001838393003548669653 +SmallBody74 1.1053539394491334998e-06 0.003240825693085024002 1.0978911404624207108e-05 -0.8731578570498674807 0.00043382965833911770045 0.14108441272084493168 -290.24618248374150653 358.88384573110090514 10.601402057842364002 +1.5392532563951069058 0.007790252254965330213 0.13892538626639078236 +141.39967666810218816 332.89551723271819128 160.49050452598243055 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -174 1.1053539394491334998e-06 0.00093067278714692325337 +SmallBody75 1.1053539394491334998e-06 0.0034714994099128829643 1.0978911404624207108e-05 -0.44202967204031873294 0.008257710081936825083 0.34599096908411330897 -203.48739340960284494 195.89940138259203195 17.082183487022412294 +1.6488133819364620969 0.0020113095285093731714 0.2250088606724180984 +121.56584291487612859 261.9173061622969385 204.9625551145382758 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -175 1.1053539394491334998e-06 0.0017450042528889666407 +SmallBody76 1.1053539394491334998e-06 0.0028822325406752456014 1.0978911404624207108e-05 -0.8288022044548091216 0.006115886185979944184 0.25529116017821090745 -53.829490571961741807 219.33778473703310397 343.53534427898989634 +1.3689368833962529681 0.0066549127060297960656 0.48400569827392897482 +323.0385985342796289 300.57860189094759562 326.29641894563383175 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -176 1.1053539394491334998e-06 0.0011667698358213854431 +SmallBody77 1.1053539394491334998e-06 0.002359251110792053277 1.0978911404624207108e-05 -0.5541656476877772075 0.0016390618557769155109 0.3104864966220892697 -176.9572515015768488 104.788569746962281215 77.14886608478597907 +1.1205431266139891378 0.00187266540976202653 0.2899909357581830216 +297.41659583594747573 84.110180689059419024 193.95555654830641856 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -177 1.1053539394491334998e-06 0.0015849004106428059382 +SmallBody78 1.1053539394491334998e-06 0.0020392119957311834948 1.0978911404624207108e-05 -0.75275974371259668505 0.009038114731466031712 0.015702172595620456086 -283.44398352098153282 81.58770635648234304 350.55144207852117688 +0.9685382683822236771 0.005796291689317471449 0.18032954869133310805 +210.61736569565172772 339.83162500243662407 286.56658480991978877 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -178 1.1053539394491334998e-06 0.0014779839130640572598 +SmallBody79 1.1053539394491334998e-06 0.0012902589705479611569 1.0978911404624207108e-05 -0.70197899132236596387 0.0027532363280162652427 0.31837156736772159737 -179.79513291005125097 214.85384715268216382 69.9170103997386434 +0.61281769218460813153 0.0051275432937355307217 0.26015155293290603833 +252.79427964190173839 243.58645523218484641 94.5849664301508426 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -179 1.1053539394491334998e-06 0.0024947503142784889404 +SmallBody80 1.1053539394491334998e-06 0.002569631786099053519 1.0978911404624207108e-05 -1.1848994388496214558 0.0028306863944576278122 0.39380634232213529433 -257.86875984787252492 39.217060266705907168 307.09409211912384308 +1.2204649274809282744 0.009774416274180727782 0.18879104486517794825 +297.42495064236146618 167.18624634577579968 262.85679182442186175 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -180 1.1053539394491334998e-06 0.0024209039871307366447 +SmallBody81 1.1053539394491334998e-06 0.0012458382627007142979 1.0978911404624207108e-05 -1.1498255995568971155 0.005869562964554509224 0.49891729637140685982 -22.952690308212837067 27.786705678660602814 76.562922938223778146 +0.5917197604596338145 0.0059329588692788991916 0.12473018336564589692 +304.73001514884600738 226.65939866595209651 16.465072799066366116 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -181 1.1053539394491334998e-06 0.0024519234158279439095 +SmallBody82 1.1053539394491334998e-06 0.0022377586318457351852 1.0978911404624207108e-05 -1.1645584982547720898 0.00089326472872355627483 0.17352040769354859506 -189.10428527863840031 248.98443834165630051 196.70913584086514447 +1.0628394080077543382 0.006038988883799283232 0.35429140209491377655 +134.2063281554704588 28.068140033037273895 102.45187320676993181 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -182 1.1053539394491334998e-06 0.001024322156351863638 +SmallBody83 1.1053539394491334998e-06 0.0035347112204193382299 1.0978911404624207108e-05 -0.48650910727055229898 0.0062340291869955035894 0.31558320184418009458 -60.187390464613173435 212.04805898225171745 213.57189992478367913 +1.6788362817710009711 0.005393162353996002606 0.40916585652483161706 +321.51399261729824275 85.275218183474947864 13.380081092205875493 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -183 1.1053539394491334998e-06 0.0037527897284826381195 +SmallBody84 1.1053539394491334998e-06 0.0013173890271765144052 1.0978911404624207108e-05 -1.7824142231587343232 0.008076098062902195909 0.22731699318437420532 -241.33034681508564745 91.29964040867220376 77.55454829343980805 +0.62570330590360201395 0.0021190727883600257546 0.063937686380848790524 +358.49903571823466564 261.8252697425855331 329.52545912534344552 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -184 1.1053539394491334998e-06 0.002433831311738762775 +SmallBody85 1.1053539394491334998e-06 0.0026742519704062899805 1.0978911404624207108e-05 -1.1559655244969635479 0.0016380661739020753367 0.235790930269410004 -321.19446586376886899 54.22389316392560943 271.04642625993039928 +1.2701550295197931995 0.003093091606578978088 0.164766088603622185 +65.416173843145656974 99.08915094286399494 221.51994734982011437 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -185 1.1053539394491334998e-06 0.0029350973355299183975 +SmallBody86 1.1053539394491334998e-06 0.0015944882125721168941 1.0978911404624207108e-05 -1.3940453944162498612 0.00077841784491747170564 0.28092453139431766695 -44.344994449764591593 339.67291104634369958 151.12443679878529679 +0.757313538559648336 0.0017118846522998633179 0.09482340810856743074 +180.97094221219410315 340.1787807327712585 241.56066273233966513 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -186 1.1053539394491334998e-06 0.0038169290788321545519 +SmallBody87 1.1053539394491334998e-06 0.0040002027295242097347 1.0978911404624207108e-05 -1.8128776646511952642 0.009577144155417962462 0.102383372042556208825 -58.42283688193803215 102.30186777369159756 98.086142829228379014 +1.8999247910181251697 0.009304028507485592389 0.21361492145653071528 +245.92756844748836897 0.50288013040264978315 12.128504315564425653 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -187 1.1053539394491334998e-06 0.0037092087455415407268 +SmallBody88 1.1053539394491334998e-06 0.0032832760165585669895 1.0978911404624207108e-05 -1.7617151247616444909 0.006801862124626666291 0.49660760298493189513 -219.13814363048163614 188.94648500227631871 13.318695124000999641 +1.5594153400212324989 0.00037893859811106712617 0.32653593805682129547 +311.4097123200511419 338.66774555916367717 147.39784950675996811 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -188 1.1053539394491334998e-06 0.0035179805920149388823 +SmallBody89 1.1053539394491334998e-06 0.0040775826436979433924 1.0978911404624207108e-05 -1.6708899505912782057 0.0013143444126650139815 0.16851823163657153604 -268.10095886723007652 100.026140809892083894 105.8844956443853107 +1.9366769326484614133 0.0062074179873753800377 0.45176793352172295304 +67.54036593010991396 8.225425679737066176 175.74568379456468392 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -189 1.1053539394491334998e-06 0.0017793602037805589573 +SmallBody90 1.1053539394491334998e-06 0.0026437150028610220674 1.0978911404624207108e-05 -0.84511980814428544484 0.0018945620033825627017 0.36108250227350330297 -191.93161504103943571 34.666401519514842278 212.80421272965310209 +1.2556512791839518073 0.0020446823287433558113 0.27311501221477701984 +148.59595005915571164 126.34646048684935238 23.641531776338045034 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -190 1.1053539394491334998e-06 0.001337398180775289937 +SmallBody91 1.1053539394491334998e-06 0.003416497150947439354 1.0978911404624207108e-05 -0.63520679598649709696 0.0014330566748994245842 0.015380000441147401169 -57.881111666861649212 31.610168368282963058 120.38149686642903191 +1.6226896671059203303 0.0044050688871926290888 0.17024510243746560079 +250.9509925834948092 299.29960623843152234 285.30964167173664237 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -191 1.1053539394491334998e-06 0.0020675986630140241381 +SmallBody92 1.1053539394491334998e-06 0.002401362336633064 1.0978911404624207108e-05 -0.9820207182858231576 0.0038878276442858871777 0.32469455752036718854 -105.35731765914751179 257.3843644363531098 192.07302426945980756 +1.1405441534032028095 0.0072032600981295734355 0.1568913846604371165 +23.861181509211903062 121.431863197952594646 243.68934136993257766 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -192 1.1053539394491334998e-06 0.0025029455637043175103 +SmallBody93 1.1053539394491334998e-06 0.0010510350719675327177 1.0978911404624207108e-05 -1.1887918309620983948 0.0064629091304864109274 0.12679380439923110258 -352.71774998892141184 147.45947326342127326 232.0002771188475208 +0.4991965968930148767 0.009078045669567351081 0.14766305581499117316 +224.96635719118671659 47.37255544667560514 355.94205723897465532 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -193 1.1053539394491334998e-06 0.00094512130272425033487 +SmallBody94 1.1053539394491334998e-06 0.0012593951334772171438 1.0978911404624207108e-05 -0.44889209747095193404 0.0053373915614944849456 0.32941854539394571644 -305.71069304813414647 172.2992104392735655 91.00916799981128236 +0.5981586928384361457 0.0018442473258474324001 0.48443807652551473808 +340.1585757515797468 80.290634330682280506 76.0201822161276084 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -194 1.1053539394491334998e-06 0.0034092625577608660855 +SmallBody95 1.1053539394491334998e-06 0.0016132609485169218172 1.0978911404624207108e-05 -1.6192535455197185623 0.0030470668778012624175 0.41462701601666840379 -140.33788510416528084 61.311580446985658455 259.46790100376045984 +0.7662297832673294895 0.008855545801541802806 0.44350051768946618935 +253.4211815280780229 310.82659001777676622 195.55695808992521734 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -195 1.1053539394491334998e-06 0.0031194310802934548436 +SmallBody96 1.1053539394491334998e-06 0.0039273174105778759005 1.0978911404624207108e-05 -1.4815960200164444149 0.00027725778011730597798 0.15321623213376195372 -26.125021238802005996 230.51083794879502875 172.17747993701027553 +1.8653073894186134041 0.0041961814167760982247 0.25521367294838631645 +12.882291052690050037 198.21528606358461388 215.72559762339224676 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -196 1.1053539394491334998e-06 0.0030603886610092652493 +SmallBody97 1.1053539394491334998e-06 0.0037651995006149393317 1.0978911404624207108e-05 -1.4535534022531539922 0.0069977768552927210183 0.34106957969408180364 -170.36755571685284849 106.74391944489579487 243.93856426771816359 +1.7883083328624815866 0.0010078752183982652747 0.02577853096094878671 +71.11397056481432344 200.83927602827213832 264.96685257874128183 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -197 1.1053539394491334998e-06 0.00074818681152074183633 +SmallBody98 1.1053539394491334998e-06 0.001185620800859618772 1.0978911404624207108e-05 -0.35535665755873779847 0.0058593579788037497905 0.2210846705896606923 -93.32630747998547349 93.38559488248714047 144.73647810339707576 +0.5631190478608267824 0.003059639106271775516 0.34118161769295923813 +146.64875137025669005 225.66678455336588627 95.93283454161746704 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -198 1.1053539394491334998e-06 0.0010189341349627265995 +SmallBody99 1.1053539394491334998e-06 0.0033015903140253701294 1.0978911404624207108e-05 -0.48395002811783771612 0.004355929018771392998 0.3148147651486025711 -104.37134461938777008 148.3206361948264771 319.21143480785696056 +1.5681138461070474044 0.0047690418770962791917 0.104294320166698484265 +54.223539465643227686 315.33007220613569643 268.01705063763682801 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -199 1.1053539394491334998e-06 0.0012841975153201117172 +SmallBody100 1.1053539394491334998e-06 0.0027949972967621498463 1.0978911404624207108e-05 -0.6099387608314446041 0.008206854224227476402 0.36303861724155556123 -167.05504491633865882 55.509667745005231154 62.54928443720996256 +1.3275038826791325519 0.0074182924067507927113 0.1398377407057855848 +154.44256669268099813 24.608962888651074508 93.007569133222744995 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -200 1.1053539394491334998e-06 0.0017521184176711138835 +SmallBody101 1.1053539394491334998e-06 0.003992235866447200529 1.0978911404624207108e-05 -0.8321811277121804462 0.0074729471446112610833 0.27027343319120750165 -83.909248607546928156 177.97057268141455211 292.71160190085106478 +1.8961408726294546323 0.009496479632133238494 0.21468181838894312419 +9.376804482463917623 101.881442440233584534 295.18997529788072143 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -201 1.1053539394491334998e-06 0.0011400563073696778689 +SmallBody102 1.1053539394491334998e-06 0.0010080293063265012185 1.0978911404624207108e-05 -0.54147786699447120196 0.0075253498170819400556 0.36311252466536780847 -132.13500697470266232 8.066085135284627228 85.49238498185923163 +0.47877070205147276294 0.0007815655215245819994 0.13118381398226147683 +155.82338848749665772 309.05685925931902602 189.74619427179570152 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -202 1.1053539394491334998e-06 0.0007266806633034729832 +SmallBody103 1.1053539394491334998e-06 0.0035828809889099322783 1.0978911404624207108e-05 -0.34514215921451030233 0.003138712621743231651 0.44549759279474399065 -172.0718978485695061 126.04240106870447846 60.443420132649201548 +1.7017148565635762392 0.0078012604149201173268 0.30551670213562293066 +35.505130876376483684 120.78189364849589538 97.791574975481793786 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -203 1.1053539394491334998e-06 0.0021270971459522370655 +SmallBody104 1.1053539394491334998e-06 0.0010339926893446762294 1.0978911404624207108e-05 -1.0102799467314087511 0.008936437059711933514 0.12275610939039000025 -166.58882157985800632 112.606652616931071975 258.1699258129560235 +0.49110219582573877428 0.005988483180863304542 0.24370575264438143481 +131.03466363087656532 40.866170770556671243 13.883550784796074851 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -204 1.1053539394491334998e-06 0.0039396547555080155497 +SmallBody105 1.1053539394491334998e-06 0.00076653787489025262456 1.0978911404624207108e-05 -1.8711670993065925295 0.0041692516961832964614 0.27372930913918147589 -318.97638827684272655 79.61204505900145989 245.10666614701753474 +0.36407262587203004234 0.008636617535491592987 0.2092320469700378327 +234.74128999562717013 3.2198734071443135818 286.18883606922651097 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -205 1.1053539394491334998e-06 0.0022620131795458212741 +SmallBody106 1.1053539394491334998e-06 0.003569486662021974079 1.0978911404624207108e-05 -1.0743592782708812905 0.0075169185908215887387 0.20882146866135353758 -234.88520970008934796 17.095830900992531554 138.43215727509851831 +1.6953531255628928598 0.0087632182443418363965 0.46446558295746426248 +93.673096737565316516 284.09048681624364008 3.3921253231597292555 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -206 1.1053539394491334998e-06 0.0026566875365635395124 +SmallBody107 1.1053539394491334998e-06 0.0020655336029156220287 1.0978911404624207108e-05 -1.2618126765055976968 0.0051193244260370820986 0.44677877859452302944 -150.47122191491908438 343.37990617736471677 301.97701769135204586 +0.98103990327688905815 0.0008080663836135304522 0.26398591508525298677 +215.1705210123592451 13.491047695534055251 293.9000446053132123 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -207 1.1053539394491334998e-06 0.0034560287471722631767 +SmallBody108 1.1053539394491334998e-06 0.00090433309374782441307 1.0978911404624207108e-05 -1.6414654804270103483 0.0037589487554753808415 0.09860035604127542763 -128.45161012695862723 138.12513353072444033 5.526087606209117986 +0.42951944696912175425 0.005297739638715663786 0.27005745103297529308 +10.740103884040387072 237.22605466326461965 158.33780673462703703 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -208 1.1053539394491334998e-06 0.002304056067954902178 +SmallBody109 1.1053539394491334998e-06 0.0019991073350657544734 1.0978911404624207108e-05 -1.0943278477098412615 0.009219538533139311556 0.095222162006226629405 -88.84804456629333913 324.895702579789031 92.17463967125601698 +0.949490274021527636 0.0034695504087138276036 0.47598267696206147948 +198.07373469054741122 220.41034279657506545 113.817295977641350646 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -209 1.1053539394491334998e-06 0.0023066637656628765428 +SmallBody110 1.1053539394491334998e-06 0.002251483284792258904 1.0978911404624207108e-05 -1.0955663923181668817 0.0023950527694435730375 0.46421151527080745103 -324.69082920897227496 153.43578428037761796 41.923263645731672966 +1.0693580297237896826 0.004035515964109191722 0.038937608095047426815 +280.28181613799023353 335.51906774754201024 103.42152042735344253 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -210 1.1053539394491334998e-06 0.002666806636181415379 +SmallBody111 1.1053539394491334998e-06 0.0021119591611738492167 1.0978911404624207108e-05 -1.2666188149757524606 0.003488235603050726663 0.19193371390053609593 -347.20274230104041635 274.35539277308657802 284.14459644239968839 +1.0030900529907145202 0.0047801409420897148297 0.36554603793164414105 +238.97153389107484145 336.94275740825520415 354.4088285517665895 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -211 1.1053539394491334998e-06 0.0025343612448345294427 +SmallBody112 1.1053539394491334998e-06 0.003750697645708955891 1.0978911404624207108e-05 -1.2037129325766431354 0.005956303872558349824 0.3559311915280667371 -48.760650502383171556 87.16581688184170673 276.1874380855203981 +1.7814205735376178463 0.008216991237457019204 0.37632371665336056266 +89.342006467283596294 125.82022150851074116 319.9007496683395857 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -212 1.1053539394491334998e-06 0.002164860753990135927 +SmallBody113 1.1053539394491334998e-06 0.0027159022397352150873 1.0978911404624207108e-05 -1.0282160414647947277 0.003302246673230939747 0.45300872701331695858 -8.341266489676053553 174.76177078024284128 139.30465877858190993 +1.2899371217289095082 0.0027102260511703557544 0.49570586801303845315 +105.723856149928764125 214.67075718408133866 198.22402209155814035 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -213 1.1053539394491334998e-06 0.0040843078728013477335 +SmallBody114 1.1053539394491334998e-06 0.00250098952292614985 1.0978911404624207108e-05 -1.9398711281337372991 0.0032104583781716335665 0.49487356206707699968 -44.65480097070717136 319.46209090426640387 209.69564164397232275 +1.1878627954561591373 0.0055269486194088170497 0.28582563402598959446 +198.15652198877376122 50.825175292553865347 38.458878742928611416 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -214 1.1053539394491334998e-06 0.0040395756391825065194 +SmallBody115 1.1053539394491334998e-06 0.0031140745262582451406 1.0978911404624207108e-05 -1.9186252350236749908 0.00069040374099674673303 0.28080790407379557783 -219.22548593736834732 69.77143869502911855 223.94515672652107696 +1.4790518865077075805 0.006118278412732922056 0.3086911846887249733 +209.00522198253077022 209.0447667763183972 302.3997529416504335 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -215 1.1053539394491334998e-06 0.00091136450338093370237 +SmallBody116 1.1053539394491334998e-06 0.002627832958283806611 1.0978911404624207108e-05 -0.43285906507876115157 0.00578665741605939761 0.2520692500298778449 -44.834183261530739628 285.77456721148087126 192.38915101002694996 +1.2481079889397856952 0.0053051121161105732615 0.3299746252761422416 +133.87850351417839079 250.47308287578673003 301.9918008789680357 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -216 1.1053539394491334998e-06 0.00089616742587646485246 +SmallBody117 1.1053539394491334998e-06 0.0031597121301605122381 1.0978911404624207108e-05 -0.42564110482673200853 0.0005533013370391437393 0.053116133899315576272 -231.8805534469131544 245.91272374704527692 14.578357422055852055 +1.5007277916853674071 0.007573092642192360939 0.13642247448670236087 +88.025380854098912664 120.144181413174720774 318.87396349165152287 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -217 1.1053539394491334998e-06 0.0023193968496302787142 +SmallBody118 1.1053539394491334998e-06 0.00093094972396938369424 1.0978911404624207108e-05 -1.101614061281849688 0.002375347752201917382 0.09571246417006856744 -2.1596347900400880704 186.47676216633470858 354.55084390332558542 +0.44216120515754175901 0.00886881958774052466 0.41844036187083433198 +20.163186214228115745 337.03851824104918933 156.84154111341879911 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -218 1.1053539394491334998e-06 0.0025152446923543384353 +SmallBody119 1.1053539394491334998e-06 0.0037723189778824764127 1.0978911404624207108e-05 -1.1946333897555136971 0.008334727953654641475 0.018759532069737849813 -64.0613065617537103 229.64622309479892692 219.95966530084248802 +1.7916897793226445046 0.001098164024120308396 0.30931507299879934525 +332.77979531452609763 167.04470469364389373 355.07028692488006527 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -219 1.1053539394491334998e-06 0.0032400431175406403072 +SmallBody120 1.1053539394491334998e-06 0.0037653266656142048815 1.0978911404624207108e-05 -1.5388815665638277963 0.0038596927309883745025 0.07238357784374110926 -10.920921913452374952 45.915301829139480105 239.98713144054397617 +1.7883687307850346659 0.006371715457058402428 0.082470207424121366735 +235.80874892467014092 254.5021145150402333 43.003779741307269546 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -220 1.1053539394491334998e-06 0.0014717978465589673241 +SmallBody121 1.1053539394491334998e-06 0.0020643614208088825627 1.0978911404624207108e-05 -0.69904087495512245987 0.0002590716396011583187 0.47895548340827731604 -134.11954212847601298 251.59803103538556002 309.99281161383004246 +0.98048316703256199744 0.0022536360259029640692 0.2657233991482298996 +201.9224168131107433 35.510966049397936217 269.0479325637503507 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -221 1.1053539394491334998e-06 0.0013681262389589482948 +SmallBody122 1.1053539394491334998e-06 0.0012493819934868600675 1.0978911404624207108e-05 -0.64980130618271503273 0.0025999932632500477245 0.30082009587089675318 -74.681300459323509244 205.48992092596844827 205.89842465713653041 +0.59340288064841817395 0.0024430042115868256733 0.3060539089368434218 +4.141252475781271869 288.81343355757388736 245.01300887770881332 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -222 1.1053539394491334998e-06 0.0007066410520629793092 +SmallBody123 1.1053539394491334998e-06 0.001358949686478997836 1.0978911404624207108e-05 -0.33562420305764623096 0.0057440840623750911986 0.49342242728993979117 -120.04528088590963364 66.99678235535563431 33.598980329756699348 +0.645442837192117036 0.00680655598933405364 0.37332907634182399548 +142.76890287293809934 240.01228369288145359 199.05279648688636485 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -223 1.1053539394491334998e-06 0.0029659316169642682108 +SmallBody124 1.1053539394491334998e-06 0.001372467998698668969 1.0978911404624207108e-05 -1.4086903561023089715 0.004259341892601368508 0.14267186104797779933 -14.54174899091190909 269.45780351797532148 187.85278880815860703 +0.6518634559095917158 0.004859331047906131039 0.10133584662204236926 +223.88750283359757987 260.86881228241998087 140.45156031392056661 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -224 1.1053539394491334998e-06 0.0017923632718833247994 +SmallBody125 1.1053539394491334998e-06 0.003145893994423096287 1.0978911404624207108e-05 -0.85129570799691123284 0.0035517834521794121663 0.33564765636087789957 -60.086176349130006713 71.36287420486030442 34.692133839275442142 +1.4941647696516584531 0.008393567717643860351 0.1951188989893116732 +200.22793560214802255 102.89583384607908556 47.7458985350726266 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -225 1.1053539394491334998e-06 0.0025792465993613212239 +SmallBody126 1.1053539394491334998e-06 0.00085991395374624328017 1.0978911404624207108e-05 -1.225031551553044995 0.007727504177897022257 0.43707332848336299946 -222.49856223195729399 67.49883181549482458 155.70267988055215369 +0.40842225990361852306 0.009925563889294575573 0.07832748266555661365 +53.17607097807006511 332.93429864214544978 200.16735258876744297 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -226 1.1053539394491334998e-06 0.0025218031217037754374 +SmallBody127 1.1053539394491334998e-06 0.0020912214038404363845 1.0978911404624207108e-05 -1.1977483625090616925 0.0063833015042883698223 0.35426145269927189485 -158.78039132816695655 326.73787900488514424 196.37060773228171229 +0.9932405073721715105 0.0020658612770351634721 0.17106687565709588483 +208.88869138521144464 120.983163700799536855 49.37968505744140657 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -227 1.1053539394491334998e-06 0.0037271560089606554719 +SmallBody128 1.1053539394491334998e-06 0.0037117773832440165345 1.0978911404624207108e-05 -1.7702393054110998616 0.009025891821731380285 0.42491523235654526935 -153.68685705365447802 110.118312544184320245 339.71639203889168357 +1.7629351175420249209 0.0032481182990924764055 0.24616989531905253408 +147.11975344892698558 136.13717547777136474 281.30407881784151414 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -228 1.1053539394491334998e-06 0.0020252561485106393543 +SmallBody129 1.1053539394491334998e-06 0.0024032375471735127028 1.0978911404624207108e-05 -0.96190983929829898536 0.005028390165655082303 0.10997122163472444756 -176.66660117126502882 284.4337634361459095 342.56504716502763586 +1.1414347980117576231 0.0041502652786197550758 0.08454980233453107674 +229.99908908688681208 44.5578445821387632 67.002250085263554524 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -229 1.1053539394491334998e-06 0.0022163078324654828465 +SmallBody130 1.1053539394491334998e-06 0.001767467028496686351 1.0978911404624207108e-05 -1.0526511979880723846 0.0072927562709262181567 0.36442810076757331528 -311.91609402259734907 83.16466928132197722 145.73476099765306913 +0.83947105979486336125 0.00016077274532254272246 0.39130968768011842318 +335.08715148259341277 228.63942269662831563 359.0911028463757475 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -230 1.1053539394491334998e-06 0.0021864883259347588167 +SmallBody131 1.1053539394491334998e-06 0.0026430902300121048054 1.0978911404624207108e-05 -1.0384882108735697948 0.004272215538613700729 0.48261188771066088066 -5.0174868989032495037 63.042328755519697836 134.43975920341418373 +1.2553545388673543748 0.0025769333010502780239 0.12589489115239127504 +255.52745736528126486 212.70128728982925281 244.94843935268181667 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -231 1.1053539394491334998e-06 0.003586532509954617801 +SmallBody132 1.1053539394491334998e-06 0.0032882512617878725745 1.0978911404624207108e-05 -1.7034491725037455012 0.00091850208316692221085 0.4865720816280050265 -186.59166544767518303 328.54463528608755496 169.13916587264412783 +1.5617783681954762187 0.004948006327108393776 0.34078014567581271788 +176.22761230380203301 5.155392124877287152 89.585872570524358594 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -232 1.1053539394491334998e-06 0.0019971223755757787394 +SmallBody133 1.1053539394491334998e-06 0.0012831312069338747407 1.0978911404624207108e-05 -0.9485475033673462786 0.0024845240039717132567 0.42570943759153928587 -266.1136976489871131 251.90747956373090233 134.63749761808043104 +0.60943231006510478753 0.0061437650448469506223 0.075499238771577492635 +178.83721349122171773 298.9789356869800372 25.027632544203186171 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -233 1.1053539394491334998e-06 0.0018117777664029862334 +SmallBody134 1.1053539394491334998e-06 0.0026382347801195862704 1.0978911404624207108e-05 -0.8605167605127614916 0.008511268700557947375 0.14756130233560865728 -207.83259904623565717 241.90873517882627652 66.39053522116275019 +1.2530484083419548558 0.0086514879756291844515 0.41341953068728581888 +229.0983678706646458 261.02130278752747472 166.5931723152342272 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -234 1.1053539394491334998e-06 0.0041112960409139540064 +SmallBody135 1.1053539394491334998e-06 0.0035699538420565724963 1.0978911404624207108e-05 -1.9526893508910134756 0.0053017033825177826978 0.18168625664735371661 -107.23622785654312395 264.34294940319352918 139.24585411098206578 +1.6955750160493552325 0.0011432190566918820976 0.06560289215472481228 +151.50679626869310823 58.08436171306480844 271.85287368639353645 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -235 1.1053539394491334998e-06 0.00084542567454914067173 +SmallBody136 1.1053539394491334998e-06 0.0012462497121113039665 1.0978911404624207108e-05 -0.4015409484584254729 0.004569942210221058891 0.20513364186354821062 -147.04352523756176652 145.80768674791906392 141.08054790192051087 +0.5919151812890981468 0.0094315073904481742245 0.39860349008798984238 +132.68495221114258698 220.62094792819442546 239.06532584793680485 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -236 1.1053539394491334998e-06 0.0027510687630676706793 +SmallBody137 1.1053539394491334998e-06 0.0040900465170436520375 1.0978911404624207108e-05 -1.3066397125751481045 0.0014607117158009586076 0.17392330571108188808 -41.268742310849482635 50.34908495498763159 131.26010660592496038 +1.942596738109030774 0.00085894138299823284775 0.3540861393320458017 +84.657989801255880025 285.9942938027552941 43.06626227900954973 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -237 1.1053539394491334998e-06 0.0018516760523599570933 +SmallBody138 1.1053539394491334998e-06 0.0026321784367130867263 1.0978911404624207108e-05 -0.87946673573509115407 0.0069253255867478746496 0.42639371801740005852 -183.18023072835251241 66.90390603052549068 269.9485162822036841 +1.25017190488476726 0.001035518339557566338 0.22991215033825823655 +291.55028201024350665 284.70513762060340923 312.21379878133922148 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -238 1.1053539394491334998e-06 0.0009976837669774952503 +SmallBody139 1.1053539394491334998e-06 0.0018316989583566004745 1.0978911404624207108e-05 -0.47385701441745431417 0.008776175977294868938 0.2420535467050825007 -13.241003135370498001 29.930518870899959438 264.79758292300277844 +0.8699784725854904366 0.00040252767386671385727 0.15574484799388010892 +8.5800417750262134575 129.27886023199005194 305.03511084637750628 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -239 1.1053539394491334998e-06 0.002403879454815229617 +SmallBody140 1.1053539394491334998e-06 0.0027152985394420051477 1.0978911404624207108e-05 -1.141739676620294297 0.0052954006268846765676 0.39314436349414877414 -268.12797354862044585 89.01621607348261023 283.2200310651768973 +1.2896503899728040121 0.00542740198905945076 0.45310649794265428492 +341.809792373788639 113.82747539427856509 247.91497334638845018 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -240 1.1053539394491334998e-06 0.003342777170318209772 +SmallBody141 1.1053539394491334998e-06 0.0036602812116765727579 1.0978911404624207108e-05 -1.5876758369924879322 0.0075782735246336385693 0.18385331654242520472 -33.490939838720102273 95.664683550198063244 192.41953657540850031 +1.7384766439048284781 0.0032945029965048724767 0.17661293162929425637 +324.49650636688886607 14.8923843223844354355 291.25435855870654223 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -241 1.1053539394491334998e-06 0.0034831354783670050171 +SmallBody142 1.1053539394491334998e-06 0.0038094090876577454437 1.0978911404624207108e-05 -1.654340015565003208 0.007918655724342917382 0.36378558708580316372 -210.66813303450092576 38.317401760357086005 89.57021493780356991 +1.8093059912569828818 0.008653814027203068915 0.39558567978807523957 +152.01949489017039241 245.78383843322686175 192.08442194631814459 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -242 1.1053539394491334998e-06 0.0015733736610314644142 +SmallBody143 1.1053539394491334998e-06 0.0032982900468595283284 1.0978911404624207108e-05 -0.74728503184741801313 0.0032172058887935338876 0.34763922608101577305 -330.30756327774741976 78.395884514425375755 154.66807042402732009 +1.5665463606995986279 0.006009483925970214059 0.38831677230782329913 +254.46309759358049973 35.7461201936248969 296.39612354554310514 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -243 1.1053539394491334998e-06 0.0015024124635363894444 +SmallBody144 1.1053539394491334998e-06 0.0030634256646320016972 1.0978911404624207108e-05 -0.71358150544207954447 0.005098169278581456132 0.354132981158384208 -101.241415954006015454 226.88387410856495308 213.36195978437388021 +1.4549958487648424477 0.0042019944515554741304 0.103702341899099270695 +28.581569847499295633 307.20222382027014874 306.62611247928236935 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -244 1.1053539394491334998e-06 0.0024256195223060660179 +SmallBody145 1.1053539394491334998e-06 0.0040865138550243042622 1.0978911404624207108e-05 -1.1520652765903638404 0.00039979469491987498168 0.2619806069247970215 -129.34836716938255563 32.698660384755541486 47.76954843794489136 +1.9409188751099109016 0.0010500141747999292442 0.15765471770149258601 +43.99728845349395101 12.378161652724681829 225.46205282476034881 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -245 1.1053539394491334998e-06 0.0010295582610689521239 +SmallBody146 1.1053539394491334998e-06 0.002109241822064289481 1.0978911404624207108e-05 -0.4889960325173501321 0.00953330627798549754 0.032636225049778477825 -30.945257375386532317 8.9502855637170739556 281.9619345119862146 +1.0017994334174236126 0.0065873200112985001373 0.44933340912200309125 +255.35329387166856918 259.26783636729476257 307.03948715962786764 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -246 1.1053539394491334998e-06 0.0040735004214879100807 +SmallBody147 1.1053539394491334998e-06 0.0020702331248985193483 1.0978911404624207108e-05 -1.9347380521207213633 0.0061709428962725245207 0.18206378926998395551 -268.40431808929264434 139.72384314612651224 97.64478403540555007 +0.9832719747305034286 0.006643360427983963437 0.38337657172513023296 +338.87403685252746754 212.09324525218809754 90.86376618933867633 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -247 1.1053539394491334998e-06 0.0039790977499327418195 +SmallBody148 1.1053539394491334998e-06 0.0016976701006517697416 1.0978911404624207108e-05 -1.889900830571367818 0.0059630702111043397406 0.44802136438877876445 -344.6465255333775417 236.14941078506609529 93.97870420135595282 +0.80632051155621620175 0.002373623883236905107 0.4938933358938096263 +228.9834606765335252 97.13181363461184503 82.37470004717647498 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -248 1.1053539394491334998e-06 0.0021148161915397994054 +SmallBody149 1.1053539394491334998e-06 0.0031278599433041361999 1.0978911404624207108e-05 -1.004447019921639539 0.0061398326141391566454 0.24818031299564763392 -77.2653313418328338 16.855370968656181674 295.22318336849701836 +1.4855993685657300496 0.0022376413513541305346 0.24129161476336913328 +4.5963354373523879204 193.07560146926255129 67.33203953027762623 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -249 1.1053539394491334998e-06 0.002161969124119271856 +SmallBody150 1.1053539394491334998e-06 0.0006418232920025271226 1.0978911404624207108e-05 -1.0268426412524618296 0.0020303539850371954065 0.4545716073597971807 -101.72505014017664848 353.0747641621397861 17.310508232021199149 +0.3048385460387668111 0.0066988423982709457277 0.117546375927761515 +285.06880360673568475 149.40827372648249138 144.57986758582379139 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -250 1.1053539394491334998e-06 0.0013500001344871598864 +SmallBody151 1.1053539394491334998e-06 0.0009829595240749040168 1.0978911404624207108e-05 -0.6411921837009073588 0.008810306621742310801 0.30869615351986745555 -355.9149898972989945 358.0328710131873322 174.7162073679091634 +0.46686363032891009528 0.008499308628501150986 0.34053342820077781017 +209.39838432125981171 82.769614540913750034 86.68430849061675758 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -251 1.1053539394491334998e-06 0.0014155631438375293998 +SmallBody152 1.1053539394491334998e-06 0.0023496093753247095933 1.0978911404624207108e-05 -0.6723318021805277933 0.00842670699769050742 0.4283300305564463062 -192.77762805609106067 180.17735441882669534 255.90801647172918365 +1.1159637156487294263 0.0053380903741851813 0.37830349306169885892 +350.2143556697128588 198.60142248144447308 138.80606990835988768 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -252 1.1053539394491334998e-06 0.0020923628796454186781 +SmallBody153 1.1053539394491334998e-06 0.0032584963875012445194 1.0978911404624207108e-05 -0.9937826594396721447 0.006172407155352415374 0.19106488268036120326 -257.4605374263549038 85.1732723860656904 228.11893704313536091 +1.5476460786258632307 0.008427187777420793585 0.19769962836446186571 +272.7555605558899856 109.36660148695808914 88.2209819361593901 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -253 1.1053539394491334998e-06 0.0024110010975998127964 +SmallBody154 1.1053539394491334998e-06 0.0012963852453560645777 1.0978911404624207108e-05 -1.1451221516082092933 0.008873912374514099713 0.012132993003118819342 -198.23741779484768699 261.31906330910709357 268.37623845258082156 +0.61572741005930442526 0.00083496920154526362706 0.3536340306533050648 +166.14122344102605666 312.85186907946501833 237.33755609293859834 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 diff --git a/examples/symba_chambers_2013/sun_MsunAUYR.in b/examples/symba_chambers_2013/sun_MsunAUYR.in index 2c02b8009..b7b871b22 100644 --- a/examples/symba_chambers_2013/sun_MsunAUYR.in +++ b/examples/symba_chambers_2013/sun_MsunAUYR.in @@ -1,4 +1,4 @@ -0 +Sun 39.476926408897626 0.004650467260962157 4.7535806948127355e-12 diff --git a/examples/symba_mars_disk/testnetcdf.ipynb b/examples/symba_mars_disk/testnetcdf.ipynb deleted file mode 100644 index d04fa73bd..000000000 --- a/examples/symba_mars_disk/testnetcdf.ipynb +++ /dev/null @@ -1,859 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'/home/daminton/git/swiftest/examples/symba_mars_disk'" - ] - }, - "execution_count": 1, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "import swiftest\n", - "import os\n", - "import xarray as xr\n", - "import numpy as np\n", - "os.getcwd()" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Reading Swiftest file param.in\n", - "\n", - "Creating Dataset\n", - "Successfully converted 17 output frames.\n", - "Swiftest simulation data stored as xarray DataSet .ds\n" - ] - } - ], - "source": [ - "sim = swiftest.Simulation(param_file=\"param.in\")\n", - "sim.bin2xr()\n" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "
    <xarray.DataArray 'origin_type' (id: 2612)>\n",
    -       "array(['Initial conditions', 'Initial conditions', 'Initial conditions',\n",
    -       "       ..., 'Supercatastrophic', 'Supercatastrophic', 'Supercatastrophic'],\n",
    -       "      dtype='<U20')\n",
    -       "Coordinates:\n",
    -       "  * id       (id) int32 0 1 2 3 4 5 6 7 ... 2605 2606 2607 2608 2609 2610 2611
    " - ], - "text/plain": [ - "\n", - "array(['Initial conditions', 'Initial conditions', 'Initial conditions',\n", - " ..., 'Supercatastrophic', 'Supercatastrophic', 'Supercatastrophic'],\n", - " dtype='\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "
    <xarray.DataArray 'origin_type' (id: 2612)>\n",
    -       "array(['Initial conditions', 'Initial conditions', 'Initial conditions',\n",
    -       "       ..., 'Supercatastrophic', 'Supercatastrophic', 'Supercatastrophic'],\n",
    -       "      dtype='<U20')\n",
    -       "Coordinates:\n",
    -       "  * id       (id) int32 0 1 2 3 4 5 6 7 ... 2605 2606 2607 2608 2609 2610 2611
    " - ], - "text/plain": [ - "\n", - "array(['Initial conditions', 'Initial conditions', 'Initial conditions',\n", - " ..., 'Supercatastrophic', 'Supercatastrophic', 'Supercatastrophic'],\n", - " dtype=' Date: Sat, 28 Aug 2021 16:21:51 -0400 Subject: [PATCH 089/154] Updated the animation script for the symba_mars_disk example to use the new NetCDF-formatted output files --- examples/symba_mars_disk/aescattermovie.py | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/examples/symba_mars_disk/aescattermovie.py b/examples/symba_mars_disk/aescattermovie.py index 0171b4a4b..909b674fb 100755 --- a/examples/symba_mars_disk/aescattermovie.py +++ b/examples/symba_mars_disk/aescattermovie.py @@ -13,6 +13,7 @@ ymin = 1e-6 ymax = 1.0 framejump = 1 +ncutoff = 1e20 class AnimatedScatter(object): """An animated scatter plot using matplotlib.animations.FuncAnimation.""" @@ -22,8 +23,10 @@ def __init__(self, ds, param): nframes = int(ds['time'].size / framejump) self.ds = ds self.param = param + self.Rcb = self.ds['radius'].sel(id=0, time=0).values self.ds['radmarker'] = self.ds['radius'].fillna(0) - self.ds['radmarker'] = self.ds['radmarker'] / self.ds['radmarker'].max() * radscale + np.where(self.ds['radmarker'] > ncutoff, 0, self.ds['radmarker']) + self.ds['radmarker'] = (self.ds['radmarker'] / self.Rcb) * radscale self.clist = {'Initial conditions' : 'xkcd:faded blue', 'Disruption' : 'xkcd:marigold', @@ -38,14 +41,14 @@ def __init__(self, ds, param): self.ax.set_xlim(xmin, xmax) self.ax.set_ylim(ymin, ymax) fig.add_axes(self.ax) - self.ani = animation.FuncAnimation(fig, self.update, interval=1, frames=nframes, init_func=self.setup_plot, blit=False) - self.ani.save('aescatter.mp4', fps=30, dpi=300, extra_args=['-vcodec', 'mpeg4']) + self.ani = animation.FuncAnimation(fig, self.update, interval=1, frames=nframes, init_func=self.setup_plot, blit=True) + self.ani.save('aescatter.mp4', fps=30, dpi=300, extra_args=['-vcodec', 'libx264']) print('Finished writing aescattter.mp4') def scatters(self, pl, radmarker, origin): scat = [] for key, value in self.clist.items(): - idx = origin == value + idx = origin == key s = self.ax.scatter(pl[idx, 0], pl[idx, 1], marker='o', s=radmarker[idx], c=value, alpha=0.75, label=key) scat.append(s) return scat @@ -62,7 +65,7 @@ def setup_plot(self): self.ax.set_yscale('log') self.title = self.ax.text(0.50, 1.05, "", bbox={'facecolor': 'w', 'alpha': 0.5, 'pad': 5}, transform=self.ax.transAxes, - ha="center") + ha="center", animated=True) self.title.set_text(f"{titletext} - Time = ${t / 24 / 3600:4.1f}$ days with ${npl:f}$ particles") slist = self.scatters(pl, radmarker, origin) @@ -76,15 +79,18 @@ def setup_plot(self): def data_stream(self, frame=0): while True: d = self.ds.isel(time=frame) - d = d.where(np.invert(np.isnan(d['a'])), drop=True) + d = d.where(d['a'] < ncutoff, drop=True) + radius = d['radmarker'].values + d = d.where(d['a'] > self.Rcb, drop=True) + Gmass = d['Gmass'].values - a = d['a'].values / RMars + a = d['a'].values / self.Rcb e = d['e'].values name = d['id'].values npl = d.id.count().values radmarker = d['radmarker'] - origin = d['origin_type'] + origin = d['origin_type'].values t = self.ds.coords['time'].values[frame] From e753b4123968750b552af12b5c469587dcefb0f8 Mon Sep 17 00:00:00 2001 From: David Minton Date: Sat, 28 Aug 2021 16:22:35 -0400 Subject: [PATCH 090/154] Updated encoder to the one that's compatible on the RCAC clusters --- examples/symba_mars_disk/aescattermovie.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/symba_mars_disk/aescattermovie.py b/examples/symba_mars_disk/aescattermovie.py index 909b674fb..eaaa4d9b4 100755 --- a/examples/symba_mars_disk/aescattermovie.py +++ b/examples/symba_mars_disk/aescattermovie.py @@ -42,7 +42,7 @@ def __init__(self, ds, param): self.ax.set_ylim(ymin, ymax) fig.add_axes(self.ax) self.ani = animation.FuncAnimation(fig, self.update, interval=1, frames=nframes, init_func=self.setup_plot, blit=True) - self.ani.save('aescatter.mp4', fps=30, dpi=300, extra_args=['-vcodec', 'libx264']) + self.ani.save('aescatter.mp4', fps=30, dpi=300, extra_args=['-vcodec', 'mpeg4']) print('Finished writing aescattter.mp4') def scatters(self, pl, radmarker, origin): From 2eac89dbd308a9ab2f6d4fb621a6ca9e964bcfa3 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Sat, 28 Aug 2021 16:28:32 -0400 Subject: [PATCH 091/154] Updated defaults in python script to NetCDF --- examples/symba_chambers_2013/init_cond.py | 1 + examples/symba_chambers_2013/param.in | 2 +- .../symba_chambers_2013/pl_chambers_2013.in | 924 +++---- examples/symba_mars_disk/testnetcdf.ipynb | 2435 +++++++++++++++++ python/swiftest/swiftest/simulation_class.py | 4 +- 5 files changed, 2901 insertions(+), 465 deletions(-) create mode 100644 examples/symba_mars_disk/testnetcdf.ipynb diff --git a/examples/symba_chambers_2013/init_cond.py b/examples/symba_chambers_2013/init_cond.py index eff7f4839..cf9baa290 100755 --- a/examples/symba_chambers_2013/init_cond.py +++ b/examples/symba_chambers_2013/init_cond.py @@ -40,6 +40,7 @@ sim.param['IN_FORM'] = 'EL' sim.param['OUT_FORM'] = 'XVEL' sim.param['OUT_TYPE'] = 'NETCDF_DOUBLE' +sim.param['BIN_OUT'] = 'bin.nc' # Add central body sim.add("Sun") diff --git a/examples/symba_chambers_2013/param.in b/examples/symba_chambers_2013/param.in index b1d279019..8f200df67 100644 --- a/examples/symba_chambers_2013/param.in +++ b/examples/symba_chambers_2013/param.in @@ -11,7 +11,7 @@ IN_TYPE ASCII PL_IN pl_chambers_2013.in TP_IN tp.in CB_IN sun_MsunAUYR.in -BIN_OUT bin.dat +BIN_OUT bin.nc CHK_QMIN -1.0 CHK_RMIN -1.0 CHK_RMAX 1000.0 diff --git a/examples/symba_chambers_2013/pl_chambers_2013.in b/examples/symba_chambers_2013/pl_chambers_2013.in index 6151b7b10..bae3d0a91 100644 --- a/examples/symba_chambers_2013/pl_chambers_2013.in +++ b/examples/symba_chambers_2013/pl_chambers_2013.in @@ -11,927 +11,927 @@ Saturn 0.011285899820091272997 0.43766379465266665196 113.59526896860690215 335.6868332999574136 225.48455056285450837 0.0 0.0 0.22000000000000000111 441.93109321068034775 378.52929516502754512 5135.9113502360652523 -BigBody0 1.1053539394491336042e-05 0.008528824599778775939 +BigBody0 1.1053539394491336042e-05 0.0063075596499805015168 2.3653347588909066005e-05 -1.8802268813604403608 0.0034577859413208434335 0.20794489945719352164 -116.242322863494550234 358.09542459575311568 304.1535424267980261 +1.3905366526104205871 0.0051551549664398807135 0.3092444066234905642 +228.58509335446049704 334.67460737226542733 216.69401173037385888 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -BigBody1 1.1053539394491336042e-05 0.0059690494989390618847 +BigBody1 1.1053539394491336042e-05 0.0060310909831888406354 2.3653347588909066005e-05 -1.3159102045981110329 0.0036523142822058084558 0.16300211835552913531 -70.81394155502881915 342.55883603006623161 54.136608497372229465 +1.3295875953195663843 0.0059376373304325580013 0.37911239701313403927 +49.836771644804038317 353.35838600309818958 98.50291362894803626 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -BigBody2 1.1053539394491336042e-05 0.005052057603777761473 +BigBody2 1.1053539394491336042e-05 0.0035241167077997471306 2.3653347588909066005e-05 -1.1137542344405522154 0.0072840872640179358394 0.22240338257676339762 -222.71628592255183321 288.921923370197419 92.574120388092254075 +0.77691115458376436287 0.0035957008056896190389 0.42835300354068150952 +347.5342864326624408 7.965633467666743961 71.65897451799423834 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -BigBody3 1.1053539394491336042e-05 0.008820409406923653894 +BigBody3 1.1053539394491336042e-05 0.007837878259153562561 2.3653347588909066005e-05 -1.9445083759762775699 0.0070581282930688585622 0.4537120652082861083 -88.34935150484484723 251.72864441608038533 152.56079513094485378 +1.7279039125829078749 0.0045575169313139419353 0.30382866814111919584 +253.64737905496954795 267.12833283229065273 189.10836150338562334 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -BigBody4 1.1053539394491336042e-05 0.0043985248115830084884 +BigBody4 1.1053539394491336042e-05 0.0026272209025122289392 2.3653347588909066005e-05 -0.9696792907763345237 0.007528169003062028415 0.457734929544543645 -338.01823746004760096 276.8234782165463912 29.31485745878157445 +0.57918547935710384955 0.0035229707266752063877 0.19534986609695992321 +351.2858699045939943 331.00199448212464404 260.0567726858896549 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -BigBody5 1.1053539394491336042e-05 0.0046551615123747859965 +BigBody5 1.1053539394491336042e-05 0.0025768241135549523954 2.3653347588909066005e-05 -1.0262562807152380007 0.0043961574801766592144 0.28711745105524327792 -233.15202689156717497 278.38726074673456878 121.530061504206173595 +0.56807522656398412586 0.009587363144368176923 0.47985543902781624404 +208.04744805740477887 152.82398397889099328 222.69294085751820944 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -BigBody6 1.1053539394491336042e-05 0.005006625370130645683 +BigBody6 1.1053539394491336042e-05 0.0026065591161533988347 2.3653347588909066005e-05 -1.1037384455139314099 0.0020211417817972299887 0.4414365163938446246 -50.42909229312481756 248.7156337605344163 88.127412340235309784 +0.5746304734856257923 0.0025001534530765868493 0.26243591511318342668 +250.28064959229163833 58.357636473165307223 223.37515017006040807 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -BigBody7 1.1053539394491336042e-05 0.0062302636945590992105 +BigBody7 1.1053539394491336042e-05 0.005273184794616913636 2.3653347588909066005e-05 -1.3734963287646788643 0.003284048646794181063 0.29726687779842847492 -274.57090965904603763 131.66391666318924081 158.84925050402665647 +1.1625029551524634908 0.009502371963720513889 0.48925430380691231624 +282.8532270407699798 11.300947267125426521 252.28305802704849725 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -BigBody8 1.1053539394491336042e-05 0.0074737606895573080315 +BigBody8 1.1053539394491336042e-05 0.0013743091219513574427 2.3653347588909066005e-05 -1.6476321665385271764 0.0051051784849983454506 0.33643916637153092886 -53.76286556014000695 114.94625551330999258 331.9130531888574751 +0.30297409967357413763 0.006153085722489816216 0.24413190643541238245 +200.54313002395986132 95.676151272770198375 285.05850827347865106 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -BigBody9 1.1053539394491336042e-05 0.004160663550733341382 +BigBody9 1.1053539394491336042e-05 0.0014400388191713955921 2.3653347588909066005e-05 -0.9172414511359892053 0.009838312525106383821 0.18305346601295341413 -329.20200341844741843 353.39532922142575444 283.615736735883047 +0.31746457748454987025 0.0082836787198065416765 0.3458292101729332213 +109.10988633396883074 190.8784377815383948 83.709048009304211746 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -BigBody10 1.1053539394491336042e-05 0.008893323580690212565 +BigBody10 1.1053539394491336042e-05 0.006356298033710497025 2.3653347588909066005e-05 -1.9605827116533913745 0.0067739209011702531185 0.46943231065629464904 -307.18407738324981437 299.20369618829118963 229.02822238698416868 +1.4012813007352717953 0.003165171108998443561 0.20197461359785090496 +246.39263065184604784 174.9762417406147108 321.5192778374650402 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -BigBody11 1.1053539394491336042e-05 0.005284153980059674703 +BigBody11 1.1053539394491336042e-05 0.0074989071844086092277 2.3653347588909066005e-05 -1.1649211731724051777 0.003955590755475825275 0.24091863890394393799 -341.82285906978518142 354.6568377939822767 184.99977149020475053 +1.6531758513732035532 0.0022871815438197298093 0.0070104389974737779667 +354.36533178823532353 311.093700682041856 310.25114822903884715 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -BigBody12 1.1053539394491336042e-05 0.0026579413908231734066 +BigBody12 1.1053539394491336042e-05 0.0024899092426714881184 2.3653347588909066005e-05 -0.5859579820923875859 0.006632063244305479166 0.16775989049041784007 -27.20019477149550724 279.74596003486641393 327.6212083468928995 +0.54891435923540754516 0.0022069297624748274687 0.27749529254220250962 +114.30900274612675105 243.56280767632020456 21.231447431177706164 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -BigBody13 1.1053539394491336042e-05 0.0051385647895537602423 +BigBody13 1.1053539394491336042e-05 0.008449694968226453511 2.3653347588909066005e-05 -1.1328252253167268027 0.006171984666579787178 0.4427718223948383658 -107.83457765693708552 6.9738506997831350986 173.32578598950007631 +1.8627823133996121996 0.006977961045014737136 0.48710585020453461835 +143.59149899463938027 274.8740789951295369 245.2333786693829154 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody15 1.1053539394491334998e-06 0.003965920256829754137 +SmallBody15 1.1053539394491334998e-06 0.0017906229980958408579 1.0978911404624207108e-05 -1.8836420863219696109 0.00083078406930939708176 0.06635858690178686459 -323.06500151110822117 223.479512701876871 180.32306345539035419 +0.85046915256070887423 0.00392301989673250924 0.2688494315152081815 +273.16219120632564454 50.115914721428694634 165.84879211345474914 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody16 1.1053539394491334998e-06 0.0014930561726806290352 +SmallBody16 1.1053539394491334998e-06 0.0017924083782442332348 1.0978911404624207108e-05 -0.7091376684291115229 0.0074165290527274220847 0.16041991537260708034 -97.8551304528232464 194.39999141865840215 111.523194158961615585 +0.8513171315844434428 0.007552464623893690235 0.39603425460827951232 +81.47723026955590342 106.604362386465339796 332.7343601414484624 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody17 1.1053539394491334998e-06 0.003916740972575052582 +SmallBody17 1.1053539394491334998e-06 0.0029193442700291086804 1.0978911404624207108e-05 -1.8602840348236275858 0.0068953273747443368305 0.38095682124591934148 -269.789420394791307 66.45754651052922668 281.4678606370854368 +1.3865633637035013059 0.0080003725369993655 0.25584505360144360608 +138.51987810492843778 326.46995736065861138 306.6642035347931028 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody18 1.1053539394491334998e-06 0.00080932657540582023503 +SmallBody18 1.1053539394491334998e-06 0.00083210543813983783056 1.0978911404624207108e-05 -0.38439542408547117125 0.002798999239863538685 0.3941004343151243705 -124.84899501740618177 211.15221271210285181 29.144252829021478846 +0.39521440725853312914 0.00857965444976194723 0.4462197941140798596 +34.92615520153869113 191.44938410333966772 76.45598120928450214 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody19 1.1053539394491334998e-06 0.0032101876354546605832 +SmallBody19 1.1053539394491334998e-06 0.0014997120748366796664 1.0978911404624207108e-05 -1.5247014926030020288 0.0035659021143455739422 0.28726784725956733269 -305.26683999664834346 237.6590433520821648 189.34085106677034105 +0.7122989365867320455 0.0095012482862691580165 0.22540652816168355033 +25.333112836017342318 252.23481776709510882 62.533664756602398427 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody20 1.1053539394491334998e-06 0.0031334439057496713725 +SmallBody20 1.1053539394491334998e-06 0.0009222365084692850775 1.0978911404624207108e-05 -1.4882515113194170198 0.008406522751564652132 0.09743791038730081899 -182.41313627988012058 240.08302063346957311 226.69806193018246177 +0.43802280136716942316 0.004781612088389226682 0.16753228279959353486 +271.35984601722304888 68.325986632106989305 352.8125464325211169 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody21 1.1053539394491334998e-06 0.002318563101422126877 +SmallBody21 1.1053539394491334998e-06 0.0020208271999879728366 1.0978911404624207108e-05 -1.101218066629267911 2.3817568879540563625e-05 0.33838972038816461652 -150.79556741229683325 282.89580965142215518 23.878283687633977905 +0.9598062786376726496 0.003605982751920797525 0.1569186298203504859 +245.49110527946089633 57.92230959367861942 324.0334343406562425 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody22 1.1053539394491334998e-06 0.0012750969215099122365 +SmallBody22 1.1053539394491334998e-06 0.0039602711035984731796 1.0978911404624207108e-05 -0.6056163689523108573 0.0083862008640609771865 0.28205301454095604852 -168.88081394329302043 66.51585258832571412 123.579634987953141945 +1.8809589807400564077 0.007251369815475449017 0.38064872111638359264 +306.61046955850400764 181.36712055864495596 155.52039454636368987 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody23 1.1053539394491334998e-06 0.0009972153932821939899 +SmallBody23 1.1053539394491334998e-06 0.0019682776333037484235 1.0978911404624207108e-05 -0.47363455699333534277 0.008223686359273599603 0.45829335098125117964 -332.887696649695215 224.83461963531169658 56.68973281012301868 +0.9348474874834820092 0.0098458579465244763784 0.18502955450711011665 +307.05002984880451322 140.36370226483856527 85.95578402340959201 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody24 1.1053539394491334998e-06 0.0025111857965660877644 +SmallBody24 1.1053539394491334998e-06 0.0022414635714275113668 1.0978911404624207108e-05 -1.1927055882780186469 0.009445402404313582925 0.2826526105232125552 -81.65691402455405523 319.28094528076371716 285.4796954001860172 +1.0645990954627644332 0.0084373716687540078335 0.4460803209227525712 +190.65913682739514456 191.5789014687326528 246.52257502088281171 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody25 1.1053539394491334998e-06 0.0035077853428683975809 +SmallBody25 1.1053539394491334998e-06 0.0021578231801338408073 1.0978911404624207108e-05 -1.666047644359857749 0.00780508176633639382 0.3915267218229046553 -349.7700899820581526 103.620959441678763824 190.0130222471377408 +1.0248734956134282204 0.005065996629560730498 0.14626119997104242154 +240.98330390541326551 220.41241905441205517 189.21797176247514471 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody26 1.1053539394491334998e-06 0.002616178816288626711 +SmallBody26 1.1053539394491334998e-06 0.0029827362662033012827 1.0978911404624207108e-05 -1.2425727711541307841 0.0059671677576496086337 0.040591307271055199202 -249.8380759041125998 172.84395937673110666 116.2823571530794311 +1.4166718440048984284 0.0025266126922014230452 0.29821242045816626076 +133.43125921208502405 189.91995919972310958 82.880462421090214775 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody27 1.1053539394491334998e-06 0.0014624993815020629117 +SmallBody27 1.1053539394491334998e-06 0.0027039346261452628856 1.0978911404624207108e-05 -0.69462450271737596896 0.002509422369573702672 0.3563096511224873586 -326.30240761342378164 99.402500501397057064 33.00720407437324866 +1.2842530183755827 0.0046897109457686584136 0.21496551660303919729 +112.39385384106159904 215.8952064205250565 354.25306544481526316 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody28 1.1053539394491334998e-06 0.0021389824887149377763 +SmallBody28 1.1053539394491334998e-06 0.003236657978466086267 1.0978911404624207108e-05 -1.015924974969087291 0.0013605389397748734841 0.37043249792133786658 -40.362475475710553496 144.82896127558345256 267.48146434768148083 +1.5372737706385561918 0.008236569108027860103 0.41764153867254960595 +38.342904015669752482 190.88468085878071179 189.19919955010038848 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody29 1.1053539394491334998e-06 0.0026004238204672692798 +SmallBody29 1.1053539394491334998e-06 0.0014865754187823128504 1.0978911404624207108e-05 -1.2350898236218830206 0.0022389905398143704514 0.027582496424290670056 -253.62523056238714503 134.43399262017697993 87.61567399908518894 +0.7060595881845728172 0.0067468676596185196692 0.45043008242521387352 +236.91404942165763714 21.927133499684750007 28.172244007534004595 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody30 1.1053539394491334998e-06 0.0018595270433249734511 +SmallBody30 1.1053539394491334998e-06 0.0006483419933024542547 1.0978911404624207108e-05 -0.8831956198384895984 0.0093748321201790139195 0.15306614007396368571 -32.49007980188935818 312.47276611996448992 204.6772536877609241 +0.30793464967210609773 0.008069936872778109976 0.2724959287926068674 +358.70308062571780283 225.49128516561441415 199.72976304561231586 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody31 1.1053539394491334998e-06 0.0023041613246169277259 +SmallBody31 1.1053539394491334998e-06 0.002018210243469286887 1.0978911404624207108e-05 -1.0943778401115078491 0.00910193752843261282 0.4261907295499119397 -70.748502810014073816 13.655344195174929922 194.09865473575752048 +0.9585633364912231613 0.009009905756055591741 0.31963549148297148994 +27.366823661514217747 315.7263950336954963 72.26266493943053604 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody32 1.1053539394491334998e-06 0.0038244892574693115303 +SmallBody32 1.1053539394491334998e-06 0.00091189020915312874153 1.0978911404624207108e-05 -1.8164684253672074288 0.0017344662236440178474 0.00040903376803846924759 -59.8833868869903867 42.472681151302708713 233.09999986567706287 +0.43310875278133753596 0.0009226434312926524257 3.7871736713213088876e-05 +140.28680626290937994 198.6519961479969254 188.39714836428248645 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody33 1.1053539394491334998e-06 0.0016063083513415578069 +SmallBody33 1.1053539394491334998e-06 0.0014458168785057989686 1.0978911404624207108e-05 -0.7629275976960977479 0.0065616077232138123043 0.12701470276996179587 -208.21085395120184103 224.54004801606461683 36.813460817990929286 +0.68670102904317897874 0.0013277259838060907152 0.29757365508293343037 +358.03703640013964105 256.17728183625638394 172.02261627369821895 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody34 1.1053539394491334998e-06 0.0025445731499428134166 +SmallBody34 1.1053539394491334998e-06 0.0014390149238434223788 1.0978911404624207108e-05 -1.2085631496757802683 0.0047985387630170017736 0.4632494968073996855 -241.05066411065314469 328.81491334014680206 131.68473045002352251 +0.68347039220693850403 0.009030013891107387461 0.23770174057769000164 +28.788093527018038031 297.1203224520854178 347.65300912374004838 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody35 1.1053539394491334998e-06 0.001047943309379953965 +SmallBody35 1.1053539394491334998e-06 0.0012625053685361255998 1.0978911404624207108e-05 -0.49772814222077332857 0.0029061071793044248278 0.12960075213423966067 -155.73347709155672192 84.35449874309856 289.45180387803600297 +0.5996359211425668079 0.00029626288583441075155 0.04027165425420448086 +92.97568107878895205 251.9501186448117096 217.31372830682673225 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody36 1.1053539394491334998e-06 0.0026029481051308368118 +SmallBody36 1.1053539394491334998e-06 0.0039596359940901068546 1.0978911404624207108e-05 -1.2362887506103832358 0.0052503463521577789855 0.39421104664957734576 -232.78768364560565374 152.4465616008079678 262.08575226692556726 +1.8806573309533967109 0.0099750025372931476475 0.30898084325688157659 +69.326066836276083905 193.05576292211591749 19.749320687752476289 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody37 1.1053539394491334998e-06 0.0030638297692394653602 +SmallBody37 1.1053539394491334998e-06 0.0027287215096217574358 1.0978911404624207108e-05 -1.4551877811277245112 0.008675136231728216435 0.45565417212897607602 -160.12532605266272867 45.356797121355818092 207.55389444211135697 +1.2960257253090312624 0.00034691773709094597677 0.029246476333898208111 +131.63716530630554757 211.34034504873113747 98.226995574387899524 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody38 1.1053539394491334998e-06 0.0012379047660899184597 +SmallBody38 1.1053539394491334998e-06 0.0033772431763425540378 1.0978911404624207108e-05 -0.5879516897118539642 0.008863952046974160268 0.004871947750551219869 -291.7929722033654798 87.72125563281429095 301.4985684783306965 +1.6040457121514952732 0.00016590685794708791919 0.38000365951495623795 +129.05280805195508265 322.10721881350264084 19.370815517117634386 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody39 1.1053539394491334998e-06 0.0020203414546642405008 +SmallBody39 1.1053539394491334998e-06 0.003896112452102458823 1.0978911404624207108e-05 -0.9595755704348436499 0.0032823959415707250516 0.36231618128498471743 -357.5523446581528333 140.63194771525292026 320.62512669923916064 +1.8504863720305302355 0.00047515625553996469277 0.45527381432526925487 +236.085725999933004 210.21818181641509682 137.83196137498174494 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody40 1.1053539394491334998e-06 0.0021619748273928422718 +SmallBody40 1.1053539394491334998e-06 0.0034576435287466804158 1.0978911404624207108e-05 -1.0268453500628844655 0.0029510979342795397654 0.17200839693427560917 -86.24968012545755869 72.78534928310089924 39.274115808944131345 +1.6422324324423847042 0.0054180737848693325334 0.3633074328433625877 +318.57279378603777786 344.63336593785294326 145.55306177607735663 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody41 1.1053539394491334998e-06 0.0024650228414904151912 +SmallBody41 1.1053539394491334998e-06 0.0027505018335353342132 1.0978911404624207108e-05 -1.1707801638170043379 0.00084383852112471572065 0.44417323723969309723 -166.30850841454468991 233.52138330631103713 349.3701749884398282 +1.3063704453539404238 0.006063652581356089241 0.26150027322263946772 +281.12447238732357846 237.65962840401968492 131.73191153344592408 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody42 1.1053539394491334998e-06 0.0011494655829696986032 +SmallBody42 1.1053539394491334998e-06 0.0018598838998215439473 1.0978911404624207108e-05 -0.54594686948928417003 0.0073746126625160376977 0.29560517114275930428 -26.677876967304161582 2.9383852082894490465 235.62759414701335459 +0.88336511137442252917 0.00021332665852522470374 0.49452520848202163872 +128.64442400907418573 305.79449185728265093 272.11975853427526317 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody43 1.1053539394491334998e-06 0.003264557522307860051 +SmallBody43 1.1053539394491334998e-06 0.0038787297493011350567 1.0978911404624207108e-05 -1.550524857792678457 0.006855910395679264309 0.052845126544926068757 -148.49370087394166262 245.6507471059472607 49.154351554646346756 +1.8422303334694387633 0.0017691531576543284825 0.42914608465831793893 +90.33060632601211637 298.92072716920284847 155.60340000412523409 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody44 1.1053539394491334998e-06 0.0022017288538633278715 +SmallBody44 1.1053539394491334998e-06 0.0040205050284578732577 1.0978911404624207108e-05 -1.04572680821414421 0.0076940762442233648355 0.18695834780422621035 -186.24536246289451924 209.5758013639246542 201.39838185512508062 +1.9095675125667193051 0.0030801669204009039967 0.15953646867409598809 +209.08679797383152277 320.77246942730693036 198.45127398866443968 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody45 1.1053539394491334998e-06 0.004177140733055960152 +SmallBody45 1.1053539394491334998e-06 0.0010656801230813612627 1.0978911404624207108e-05 -1.9839627566197359787 0.00081961714887728747466 0.2135493543574670805 -101.192900958177077086 93.105553169601165564 161.53073494194276805 +0.50615236827718168566 0.0024434709549745249092 0.17777835590219637218 +184.54384211440816443 235.74454741983433337 193.59681355350048193 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody46 1.1053539394491334998e-06 0.0035270692540920479557 +SmallBody46 1.1053539394491334998e-06 0.0012848279975201385693 1.0978911404624207108e-05 -1.6752066754087575617 0.0051909332532851107725 0.4097943495140765613 -262.29384437991438972 291.42131387222036665 172.62099421016796441 +0.61023821284503521056 0.003987143732529693438 0.001365418664104667279 +343.87442064134455677 332.11360135906141977 211.12253475805300695 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody47 1.1053539394491334998e-06 0.0031824870893333604256 +SmallBody47 1.1053539394491334998e-06 0.001586855972994529395 1.0978911404624207108e-05 -1.5115449208342359722 0.008474861491332898178 0.23696328042397618585 -303.88198790793740045 243.16694917270854148 162.96827879419998908 +0.7536885519864870986 0.0068545946072486622566 0.47875353005964926822 +268.6816988781197324 118.55357784026483614 28.10015400805450625 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody48 1.1053539394491334998e-06 0.0041919001326894561326 +SmallBody48 1.1053539394491334998e-06 0.0022330250179423978959 1.0978911404624207108e-05 -1.9909728386481431173 0.0031161195922749587717 0.26294671201488906132 -307.4797827097971208 259.2394012562882608 164.19654679575444334 +1.0605911443535949168 0.0022050845762832060014 0.17006705206962935417 +60.87397436452053512 63.78368846451786567 329.77954502722860752 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody49 1.1053539394491334998e-06 0.001029626898232924747 +SmallBody49 1.1053539394491334998e-06 0.0028707184422754971512 1.0978911404624207108e-05 -0.4890286322274733921 0.0016789299820979420447 0.25125269592494270388 -347.9448828508308793 68.2032792277530433 113.95671636992425135 +1.363468180314170386 0.005942764201040959607 0.37173945785205231296 +29.57191054050963075 100.41312169995346437 72.46300737457485752 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody50 1.1053539394491334998e-06 0.0038377798107606164424 +SmallBody50 1.1053539394491334998e-06 0.0013589924201308696665 1.0978911404624207108e-05 -1.8227808683586907978 0.007278564707354728998 0.4021962803889706506 -158.00800895167876092 62.120145774820663576 338.3524603761762819 +0.6454631338445848687 0.003687156220124645535 0.47108622959286672316 +214.35473118646626745 160.7608961783459165 180.69048975870487084 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody51 1.1053539394491334998e-06 0.0025752915599265981195 +SmallBody51 1.1053539394491334998e-06 0.0011543345402911547252 1.0978911404624207108e-05 -1.2231530773907171028 0.008180773825256060228 0.49500640013808755446 -215.58419051019205881 238.11054770931033886 62.812965789585732068 +0.5482594154643087858 0.0058273827372787257925 0.47155791843593697354 +114.383916488962867675 222.32926951962554085 161.00772323788964968 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody52 1.1053539394491334998e-06 0.0041729107831517003945 +SmallBody52 1.1053539394491334998e-06 0.003625757501063538497 1.0978911404624207108e-05 -1.981953711770945592 0.0048392368899002205854 0.3439364072598658506 -140.49484117857338106 18.628480746247863209 292.76153894725842974 +1.7220793615402316679 0.0067582117965574381446 0.473313138490892793 +19.264507554706526093 306.34719154839370958 350.14073181346304864 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody53 1.1053539394491334998e-06 0.0018463049351976143146 +SmallBody53 1.1053539394491334998e-06 0.00071857240099922700467 1.0978911404624207108e-05 -0.876915685365348585 0.008414142640979114726 0.4865439996116162069 -25.84749855806933283 147.59552825474432325 351.5883167468276156 +0.34129108225528154152 0.0007615613901554241444 0.06859795886339431492 +197.15917765141804807 158.25617293553941067 27.519089489610109922 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody54 1.1053539394491334998e-06 0.003956761570869228732 +SmallBody54 1.1053539394491334998e-06 0.0011716620583187394159 1.0978911404624207108e-05 -1.8792921031620857253 0.002984509339591897778 0.14521761596090265733 -244.65011115033149736 159.52306947113194724 247.8509476040788968 +0.5564892436238774165 0.0045826378199643122424 0.24195292989213706969 +239.72284529330184455 132.21214770785758219 305.41153045395969912 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody55 1.1053539394491334998e-06 0.0022375767585976735108 +SmallBody55 1.1053539394491334998e-06 0.0024615255028710602107 1.0978911404624207108e-05 -1.0627530260125956918 0.009221146035204222727 0.2774484485756325003 -54.974773353537798926 192.71826493446795325 115.03720651882959203 +1.1691190779184184034 0.0068687080516668854585 0.10666014510077265198 +275.99872699417227295 169.73889419589309568 248.90290020737802479 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody56 1.1053539394491334998e-06 0.003569113589554936672 +SmallBody56 1.1053539394491334998e-06 0.0017321756455436248891 1.0978911404624207108e-05 -1.6951759321362349642 0.00029328152838550283158 0.12854405399432916601 -123.759610708168693805 28.642969205068872895 59.9453124910687265 +0.8227091659820937597 0.00843319774766918516 0.22884853768953594688 +304.30606168405762446 25.93584871510447698 4.848633998416511659 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody57 1.1053539394491334998e-06 0.003838073039724368385 +SmallBody57 1.1053539394491334998e-06 0.0023910402872564365214 1.0978911404624207108e-05 -1.822920139544514706 0.002427257726946776585 0.3478287098983082748 -175.60627375154865604 261.21004876719126742 102.5765639749250937 +1.1356416224989502872 0.0007665109352532950343 0.1419214571706507999 +240.43439932382597135 298.9062599161678122 58.015459116669731543 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody58 1.1053539394491334998e-06 0.0037821584480800916802 +SmallBody58 1.1053539394491334998e-06 0.0019350973663502399923 1.0978911404624207108e-05 -1.7963631058070641533 0.0021913818779026750933 0.2277714432057212357 -127.64574510289172338 286.48389918379018582 351.4955198015076121 +0.9190882832580831163 0.0064336379372377438743 0.21851798864023092017 +154.82954330295854106 356.93189278963092192 194.69117686773361697 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody59 1.1053539394491334998e-06 0.0032090764608138491496 +SmallBody59 1.1053539394491334998e-06 0.0037561789778854402514 1.0978911404624207108e-05 -1.5241737322893442741 0.0051795655611637280227 0.37004071826046752713 -220.09047138550891987 85.25328121777833701 155.14257439202265232 +1.7840239713136967215 0.006148371953439728775 0.25679832782220995968 +294.159436987109018 13.667963580601236728 109.71022344892682554 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody60 1.1053539394491334998e-06 0.001251952383047329137 +SmallBody60 1.1053539394491334998e-06 0.0013611814389692063118 1.0978911404624207108e-05 -0.5946237054862358873 0.008964827144955677535 0.11220341486493962124 -355.46676640997060304 293.65836711181913188 135.58653747694026492 +0.64650282394035563094 0.00210355505260503969 0.05531076625953512682 +1.2066583847071798985 19.662168359747298041 42.088447685333754578 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody61 1.1053539394491334998e-06 0.0034286826689865096638 +SmallBody61 1.1053539394491334998e-06 0.0036842862982039128794 1.0978911404624207108e-05 -1.6284772657300985443 0.0055865188113676115048 0.009295182349638275721 -281.14377556523862722 311.47981280814713045 17.970788876634557596 +1.749878030806350182 0.0058877624633116307576 0.25927135724151134655 +106.54193156547684396 309.62159619247529463 198.30883233401769417 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody62 1.1053539394491334998e-06 0.0024123456722281855242 +SmallBody62 1.1053539394491334998e-06 0.002352457282817648111 1.0978911404624207108e-05 -1.1457607669091200986 0.0059942816043978908516 0.20544766408447995287 -331.65266199253352397 67.908967452709333656 331.3349063308830864 +1.1173163496061098154 0.008722730655786280901 0.45532722119645963055 +7.669255186594696738 328.27376432936614492 283.993162943758648 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody63 1.1053539394491334998e-06 0.00070926620825757897553 +SmallBody63 1.1053539394491334998e-06 0.0041865789707916299196 1.0978911404624207108e-05 -0.33687103969860016095 0.0071611781196035881325 0.25924949443614342393 -330.94730198197396476 94.214661441576183165 61.868231242313015628 +1.98844551488725374 0.0071526190521102421538 0.44868034424472752475 +202.41141669675778303 86.25518321577487768 248.93971582039534951 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody64 1.1053539394491334998e-06 0.0037496693687355927613 +SmallBody64 1.1053539394491334998e-06 0.0038156990777683893855 1.0978911404624207108e-05 -1.780932186061826572 0.009928144041807798401 0.48322239522126919642 -29.863534255917500104 193.6213362397997173 261.59011579676081283 +1.8122934668812227255 0.0046607119651452099535 0.18959887351040988213 +103.753167455451190904 251.98883746225675395 79.68459651017317924 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody65 1.1053539394491334998e-06 0.0012736281298308463319 +SmallBody65 1.1053539394491334998e-06 0.0020349210108043651083 1.0978911404624207108e-05 -0.6049187558780279028 0.0015091166639728593492 0.21853541766376521904 -343.27239511068603406 327.27856875910737244 218.61156947625917724 +0.9665002345145459195 0.009888737196005765312 0.031496742813291678242 +331.12496419413429294 92.43097071039983348 51.154372128609594483 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody66 1.1053539394491334998e-06 0.0038448787389546260301 +SmallBody66 1.1053539394491334998e-06 0.0007519970150145614117 1.0978911404624207108e-05 -1.8261525548899533167 0.0051995677384110115804 0.31065813156730226474 -333.06925492853127935 306.6948175209735723 318.41411463851756025 +0.35716634085886211913 0.009812992174250710631 0.19330764764073876671 +294.8736717732407442 59.943598965498772202 37.415260394651753018 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody67 1.1053539394491334998e-06 0.0008288368759312896654 +SmallBody67 1.1053539394491334998e-06 0.0017422896962019374534 1.0978911404624207108e-05 -0.39366198034647403858 0.0046883091977471943665 0.0132479346083514970545 -261.21488538826179138 126.85930642388336764 249.97227049855567316 +0.82751290641292607475 0.004483101404917193278 0.42444650766319869106 +284.08737987214851728 20.66202219747616553 244.94157667031407755 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody68 1.1053539394491334998e-06 0.0027031517150100666755 +SmallBody68 1.1053539394491334998e-06 0.0009990898270396054195 1.0978911404624207108e-05 -1.2838811691530558345 0.0049121456620970583087 0.07255473068979628737 -69.26560015966929029 305.8875197413007072 134.63575408635963981 +0.47452483266325140576 0.0024462445739371319574 0.2497100598204521904 +38.56617039404348901 71.18453251440668339 355.36891313147475557 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody69 1.1053539394491334998e-06 0.0036973458793854774706 +SmallBody69 1.1053539394491334998e-06 0.0033996536056487195092 1.0978911404624207108e-05 -1.756080771948452135 0.0009601252277977257105 0.1695493446614180777 -134.78798723652712965 157.09044357175469031 86.40744012700496057 +1.6146897052426172348 0.0015219920533292442388 0.17922372150567844606 +12.159534634854507473 344.35229701092345067 10.8997608537475052515 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody70 1.1053539394491334998e-06 0.0024226359340959145194 +SmallBody70 1.1053539394491334998e-06 0.0018534897741513436611 1.0978911404624207108e-05 -1.1506482001095099665 0.005674234583021546194 0.062224739795935124498 -118.63742114361265578 189.83674534297023229 261.05238102013146317 +0.88032817582412259405 0.008005928497239050978 0.32284168761100751066 +272.37506606187326952 58.34741166490307762 222.9991401165076752 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody71 1.1053539394491334998e-06 0.00093424490574192736807 +SmallBody71 1.1053539394491334998e-06 0.0031561172624764302416 1.0978911404624207108e-05 -0.44372627522120611232 0.0030334359757953079616 0.37391057552349776794 -283.89092391956961592 259.95137404118332825 346.16472723124888944 +1.4990203836625171085 0.005123403698736885524 0.0565805471353558187 +222.61764027553329015 15.581020765914104231 49.313482304184191207 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody72 1.1053539394491334998e-06 0.00402765939824776902 +SmallBody72 1.1053539394491334998e-06 0.0024433392566886891639 1.0978911404624207108e-05 -1.9129655314790134923 0.0070964021998901963273 0.10810520726298006311 -30.878255376390765008 42.882658122567953285 200.72893583876941648 +1.1604813907026119146 0.007303514048424671924 0.13882682659903528011 +140.85830088218762057 70.182013379350649984 354.88230752734301632 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody73 1.1053539394491334998e-06 0.0033292669766640747785 +SmallBody73 1.1053539394491334998e-06 0.002840560638411957164 1.0978911404624207108e-05 -1.5812590742455658877 0.0075533749864811006516 0.034121039683396359177 -12.444814241754089679 179.89151615168688636 24.585029489733646102 +1.3491445164708089077 0.005720642229715540601 0.14981819009776592422 +352.3487865630142437 211.34103074075423478 192.0694520334756703 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody74 1.1053539394491334998e-06 0.003240825693085024002 +SmallBody74 1.1053539394491334998e-06 0.0031444797715256892693 1.0978911404624207108e-05 -1.5392532563951069058 0.007790252254965330213 0.13892538626639078236 -141.39967666810218816 332.89551723271819128 160.49050452598243055 +1.4934930744090704202 0.0031276427636128647028 0.3214666381100500514 +175.07919233828184247 35.481995834318553307 260.6360034601860889 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody75 1.1053539394491334998e-06 0.0034714994099128829643 +SmallBody75 1.1053539394491334998e-06 0.003459255021998138457 1.0978911404624207108e-05 -1.6488133819364620969 0.0020113095285093731714 0.2250088606724180984 -121.56584291487612859 261.9173061622969385 204.9625551145382758 +1.6429978226453376688 0.009295252819063579489 0.49102576894325750123 +345.02654860489548128 345.52660132514841962 310.74654593341955433 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody76 1.1053539394491334998e-06 0.0028822325406752456014 +SmallBody76 1.1053539394491334998e-06 0.0022873662080603565067 1.0978911404624207108e-05 -1.3689368833962529681 0.0066549127060297960656 0.48400569827392897482 -323.0385985342796289 300.57860189094759562 326.29641894563383175 +1.0864008798243816045 0.008384640338494970396 0.27205559161590919803 +253.52651755208796658 290.75194124657178918 159.72113624314474123 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody77 1.1053539394491334998e-06 0.002359251110792053277 +SmallBody77 1.1053539394491334998e-06 0.0012272542532064478338 1.0978911404624207108e-05 -1.1205431266139891378 0.00187266540976202653 0.2899909357581830216 -297.41659583594747573 84.110180689059419024 193.95555654830641856 +0.5828931527244621824 0.0019247710050318911704 0.35217059511512804892 +128.04935681999808139 128.25988178793110706 38.454554612780782463 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody78 1.1053539394491334998e-06 0.0020392119957311834948 +SmallBody78 1.1053539394491334998e-06 0.0026543878147870777827 1.0978911404624207108e-05 -0.9685382683822236771 0.005796291689317471449 0.18032954869133310805 -210.61736569565172772 339.83162500243662407 286.56658480991978877 +1.2607204072605178169 0.0096473280615230992685 0.42213107167069263692 +216.82569867369645067 235.68868231250542067 139.71833578625705741 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody79 1.1053539394491334998e-06 0.0012902589705479611569 +SmallBody79 1.1053539394491334998e-06 0.0009780107056720420075 1.0978911404624207108e-05 -0.61281769218460813153 0.0051275432937355307217 0.26015155293290603833 -252.79427964190173839 243.58645523218484641 94.5849664301508426 +0.46451315376419793912 0.008467739880838711167 0.09984937286937312084 +25.346273704217509248 167.68809971291636884 218.82435230989008801 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody80 1.1053539394491334998e-06 0.002569631786099053519 +SmallBody80 1.1053539394491334998e-06 0.0015585452504019390022 1.0978911404624207108e-05 -1.2204649274809282744 0.009774416274180727782 0.18879104486517794825 -297.42495064236146618 167.18624634577579968 262.85679182442186175 +0.7402421725546883824 0.00081815707488439471263 0.027275888583668805865 +78.168111726190360855 118.103475439356216725 271.37806527923407884 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody81 1.1053539394491334998e-06 0.0012458382627007142979 +SmallBody81 1.1053539394491334998e-06 0.0036228037421964175176 1.0978911404624207108e-05 -0.5917197604596338145 0.0059329588692788991916 0.12473018336564589692 -304.73001514884600738 226.65939866595209651 16.465072799066366116 +1.7206764527184079672 0.0020388197417552213556 0.2779771865718832502 +188.21340057803570289 56.037973252133966184 346.32195813540357676 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody82 1.1053539394491334998e-06 0.0022377586318457351852 +SmallBody82 1.1053539394491334998e-06 0.0028566024176281324616 1.0978911404624207108e-05 -1.0628394080077543382 0.006038988883799283232 0.35429140209491377655 -134.2063281554704588 28.068140033037273895 102.45187320676993181 +1.3567636738199855273 0.0064602626792048187254 0.49422002485399357807 +305.31013000174260696 158.96334607327713684 9.2952725232621382645 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody83 1.1053539394491334998e-06 0.0035347112204193382299 +SmallBody83 1.1053539394491334998e-06 0.0030364083037735251215 1.0978911404624207108e-05 -1.6788362817710009711 0.005393162353996002606 0.40916585652483161706 -321.51399261729824275 85.275218183474947864 13.380081092205875493 +1.4421637607048936047 0.003164481042823339297 0.14375208160874736185 +280.5711764965416819 198.45145802447700589 122.38992208970854847 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody84 1.1053539394491334998e-06 0.0013173890271765144052 +SmallBody84 1.1053539394491334998e-06 0.0018847712591592793446 1.0978911404624207108e-05 -0.62570330590360201395 0.0021190727883600257546 0.063937686380848790524 -358.49903571823466564 261.8252697425855331 329.52545912534344552 +0.89518554003413797204 0.008354232084976069214 0.32514509699956206656 +72.82349432517753485 24.921837702544884507 116.15812089477469726 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody85 1.1053539394491334998e-06 0.0026742519704062899805 +SmallBody85 1.1053539394491334998e-06 0.0032273771675824087141 1.0978911404624207108e-05 -1.2701550295197931995 0.003093091606578978088 0.164766088603622185 -65.416173843145656974 99.08915094286399494 221.51994734982011437 +1.5328657833761838436 0.0061896190689282827233 0.34623152187383665623 +352.86954858625608722 142.80960466527201902 269.9476990871480666 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody86 1.1053539394491334998e-06 0.0015944882125721168941 +SmallBody86 1.1053539394491334998e-06 0.0040634164063012070394 1.0978911404624207108e-05 -0.757313538559648336 0.0017118846522998633179 0.09482340810856743074 -180.97094221219410315 340.1787807327712585 241.56066273233966513 +1.9299485772511566495 0.0031536402555862341236 0.3950675392513491313 +139.96088035745842149 181.76039716652948641 296.43536960581485573 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody87 1.1053539394491334998e-06 0.0040002027295242097347 +SmallBody87 1.1053539394491334998e-06 0.0037177872852294766954 1.0978911404624207108e-05 -1.8999247910181251697 0.009304028507485592389 0.21361492145653071528 -245.92756844748836897 0.50288013040264978315 12.128504315564425653 +1.7657895633153577464 0.008302463231769427812 0.008650241018383963976 +326.76492167094011165 248.04800625477449216 143.12774627005794059 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody88 1.1053539394491334998e-06 0.0032832760165585669895 +SmallBody88 1.1053539394491334998e-06 0.0029394228179550476069 1.0978911404624207108e-05 -1.5594153400212324989 0.00037893859811106712617 0.32653593805682129547 -311.4097123200511419 338.66774555916367717 147.39784950675996811 +1.3960998131165724967 0.009864572886023466672 0.16006323209123973772 +161.58563417885309832 300.60320078078825645 271.84316795198083128 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody89 1.1053539394491334998e-06 0.0040775826436979433924 +SmallBody89 1.1053539394491334998e-06 0.0021301474391629660392 1.0978911404624207108e-05 -1.9366769326484614133 0.0062074179873753800377 0.45176793352172295304 -67.54036593010991396 8.225425679737066176 175.74568379456468392 +1.0117287052276131565 0.0027700618814613365247 0.06101905242943728158 +90.188877701137116105 0.14553788257543054385 151.58365796171364082 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody90 1.1053539394491334998e-06 0.0026437150028610220674 +SmallBody90 1.1053539394491334998e-06 0.0030529567836454087592 1.0978911404624207108e-05 -1.2556512791839518073 0.0020446823287433558113 0.27311501221477701984 -148.59595005915571164 126.34646048684935238 23.641531776338045034 +1.4500235791411446584 0.0051415674121213740186 0.035783766155871643555 +19.607471849850583112 137.4149541556064662 295.3619168323355666 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody91 1.1053539394491334998e-06 0.003416497150947439354 +SmallBody91 1.1053539394491334998e-06 0.00064875962033329815164 1.0978911404624207108e-05 -1.6226896671059203303 0.0044050688871926290888 0.17024510243746560079 -250.9509925834948092 299.29960623843152234 285.30964167173664237 +0.30813300460633064048 0.0068435724329741955824 0.25415063445939684028 +113.703628424172109135 315.29312159144251382 30.016315228589590447 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody92 1.1053539394491334998e-06 0.002401362336633064 +SmallBody92 1.1053539394491334998e-06 0.0031774066214905104554 1.0978911404624207108e-05 -1.1405441534032028095 0.0072032600981295734355 0.1568913846604371165 -23.861181509211903062 121.431863197952594646 243.68934136993257766 +1.5091319164298944155 0.008761774007885180307 0.3729577687009506537 +86.71738414973454212 203.68279937784481604 178.04985347510225324 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody93 1.1053539394491334998e-06 0.0010510350719675327177 +SmallBody93 1.1053539394491334998e-06 0.0013602341599096074799 1.0978911404624207108e-05 -0.4991965968930148767 0.009078045669567351081 0.14766305581499117316 -224.96635719118671659 47.37255544667560514 355.94205723897465532 +0.64605290700088136013 0.0028866588611838571443 0.123745735802174794404 +354.80506939301045577 301.26726001571074676 20.783162938658389152 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody94 1.1053539394491334998e-06 0.0012593951334772171438 +SmallBody94 1.1053539394491334998e-06 0.004066691095601753041 1.0978911404624207108e-05 -0.5981586928384361457 0.0018442473258474324001 0.48443807652551473808 -340.1585757515797468 80.290634330682280506 76.0201822161276084 +1.9315039142692205232 0.0022152965415877636304 0.48054874999633290233 +133.09052109598391667 191.53766059844949154 81.83111779972121269 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody95 1.1053539394491334998e-06 0.0016132609485169218172 +SmallBody95 1.1053539394491334998e-06 0.0021660555110931399977 1.0978911404624207108e-05 -0.7662297832673294895 0.008855545801541802806 0.44350051768946618935 -253.4211815280780229 310.82659001777676622 195.55695808992521734 +1.0287834998644624918 0.0048806432832589697127 0.40599080267573434133 +284.29323859414336084 206.50267632987038269 32.181201191434148257 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody96 1.1053539394491334998e-06 0.0039273174105778759005 +SmallBody96 1.1053539394491334998e-06 0.0012256412334758639172 1.0978911404624207108e-05 -1.8653073894186134041 0.0041961814167760982247 0.25521367294838631645 -12.882291052690050037 198.21528606358461388 215.72559762339224676 +0.58212703750937100367 0.006815394001574134712 0.07111194936362880137 +356.8708968589809274 272.2075288690623438 105.15655667544666585 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody97 1.1053539394491334998e-06 0.0037651995006149393317 +SmallBody97 1.1053539394491334998e-06 0.003625916465309114207 1.0978911404624207108e-05 -1.7883083328624815866 0.0010078752183982652747 0.02577853096094878671 -71.11397056481432344 200.83927602827213832 264.96685257874128183 +1.7221548627414147159 0.003762997164236574557 0.24815013062447038861 +147.28961407645965664 218.03440726170023822 1.8591648258108683933 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody98 1.1053539394491334998e-06 0.001185620800859618772 +SmallBody98 1.1053539394491334998e-06 0.0008081494427977152585 1.0978911404624207108e-05 -0.5631190478608267824 0.003059639106271775516 0.34118161769295923813 -146.64875137025669005 225.66678455336588627 95.93283454161746704 +0.383836336565244296 0.0040007873825194332357 0.08120615205831077654 +124.07811978970127598 166.61704692849599496 199.01689105952982572 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody99 1.1053539394491334998e-06 0.0033015903140253701294 +SmallBody99 1.1053539394491334998e-06 0.003021340601443785476 1.0978911404624207108e-05 -1.5681138461070474044 0.0047690418770962791917 0.104294320166698484265 -54.223539465643227686 315.33007220613569643 268.01705063763682801 +1.4350072481140032643 0.004057562854776786479 0.16489395982405652408 +92.709269128307440155 214.9999281263282569 57.464246578171120916 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody100 1.1053539394491334998e-06 0.0027949972967621498463 +SmallBody100 1.1053539394491334998e-06 0.0009475797808058692764 1.0978911404624207108e-05 -1.3275038826791325519 0.0074182924067507927113 0.1398377407057855848 -154.44256669268099813 24.608962888651074508 93.007569133222744995 +0.450059769154431355 0.0037395517851033176736 0.45479598440039348262 +26.317730599306557338 23.931789830584875745 143.91842879072783035 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody101 1.1053539394491334998e-06 0.003992235866447200529 +SmallBody101 1.1053539394491334998e-06 0.0026909717843638427215 1.0978911404624207108e-05 -1.8961408726294546323 0.009496479632133238494 0.21468181838894312419 -9.376804482463917623 101.881442440233584534 295.18997529788072143 +1.2780962243009246215 0.0035555600141111065246 0.3257354511083095927 +192.7416849222909434 164.91900290185728295 333.67905845802670228 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody102 1.1053539394491334998e-06 0.0010080293063265012185 +SmallBody102 1.1053539394491334998e-06 0.0041810760162440572295 1.0978911404624207108e-05 -0.47877070205147276294 0.0007815655215245819994 0.13118381398226147683 -155.82338848749665772 309.05685925931902602 189.74619427179570152 +1.9858318474119498465 0.007254756249778001459 0.41576480580086311312 +105.64094867962499791 318.98199615126588924 22.47872975241655169 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody103 1.1053539394491334998e-06 0.0035828809889099322783 +SmallBody103 1.1053539394491334998e-06 0.0007996094815216030466 1.0978911404624207108e-05 -1.7017148565635762392 0.0078012604149201173268 0.30551670213562293066 -35.505130876376483684 120.78189364849589538 97.791574975481793786 +0.37978022110312864568 0.0047214882095757814556 0.01341383505492060868 +103.99287880664391537 101.414451660559109314 179.41217948023177087 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody104 1.1053539394491334998e-06 0.0010339926893446762294 +SmallBody104 1.1053539394491334998e-06 0.0041316235921579503004 1.0978911404624207108e-05 -0.49110219582573877428 0.005988483180863304542 0.24370575264438143481 -131.03466363087656532 40.866170770556671243 13.883550784796074851 +1.962344066204342985 0.001297636502650572005 0.4471175237115694867 +84.38714843221671913 15.1728657372036792594 321.65176691418702148 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody105 1.1053539394491334998e-06 0.00076653787489025262456 +SmallBody105 1.1053539394491334998e-06 0.0006468297403521850707 1.0978911404624207108e-05 -0.36407262587203004234 0.008636617535491592987 0.2092320469700378327 -234.74128999562717013 3.2198734071443135818 286.18883606922651097 +0.3072163943573689715 0.002069552547494897185 0.06067182285957134491 +14.403233133169720759 137.80158957237256345 145.80670189311638296 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody106 1.1053539394491334998e-06 0.003569486662021974079 +SmallBody106 1.1053539394491334998e-06 0.0015291286852166491375 1.0978911404624207108e-05 -1.6953531255628928598 0.0087632182443418363965 0.46446558295746426248 -93.673096737565316516 284.09048681624364008 3.3921253231597292555 +0.7262705653034777775 0.0036886731925131191132 0.307053270062749184 +259.23562206716201217 48.774316930331721665 261.170258806677964 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody107 1.1053539394491334998e-06 0.0020655336029156220287 +SmallBody107 1.1053539394491334998e-06 0.0023265433330934118486 1.0978911404624207108e-05 -0.98103990327688905815 0.0008080663836135304522 0.26398591508525298677 -215.1705210123592451 13.491047695534055251 293.9000446053132123 +1.1050083345270516055 0.0021619185594817648226 0.32733237728798875166 +10.142047630130853975 212.86498766789461001 117.3267626732119453 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody108 1.1053539394491334998e-06 0.00090433309374782441307 +SmallBody108 1.1053539394491334998e-06 0.0011665670476203062816 1.0978911404624207108e-05 -0.42951944696912175425 0.005297739638715663786 0.27005745103297529308 -10.740103884040387072 237.22605466326461965 158.33780673462703703 +0.55406933198664720663 0.0049526344715693608467 0.2827810313805791953 +155.34731745098386568 309.39073596933502586 84.99503647176723575 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody109 1.1053539394491334998e-06 0.0019991073350657544734 +SmallBody109 1.1053539394491334998e-06 0.003262805107546985368 1.0978911404624207108e-05 -0.949490274021527636 0.0034695504087138276036 0.47598267696206147948 -198.07373469054741122 220.41034279657506545 113.817295977641350646 +1.54969253591465006 0.0014634230002845761195 0.34160518035174364249 +161.22273174154071285 313.478568111725167 211.56542262438233593 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody110 1.1053539394491334998e-06 0.002251483284792258904 +SmallBody110 1.1053539394491334998e-06 0.0015382966919372130521 1.0978911404624207108e-05 -1.0693580297237896826 0.004035515964109191722 0.038937608095047426815 -280.28181613799023353 335.51906774754201024 103.42152042735344253 +0.73062497542475979273 0.0018662111938524982881 0.47978521949566910187 +42.599778446102199325 323.68686590233079414 260.06072539586818948 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody111 1.1053539394491334998e-06 0.0021119591611738492167 +SmallBody111 1.1053539394491334998e-06 0.0030189705886898708342 1.0978911404624207108e-05 -1.0030900529907145202 0.0047801409420897148297 0.36554603793164414105 -238.97153389107484145 336.94275740825520415 354.4088285517665895 +1.4338815936683029229 0.007854986736292183039 0.034614304523278571768 +220.97166421899538591 100.270100143954621785 69.89976223012565981 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody112 1.1053539394491334998e-06 0.003750697645708955891 +SmallBody112 1.1053539394491334998e-06 0.0012520764056687804838 1.0978911404624207108e-05 -1.7814205735376178463 0.008216991237457019204 0.37632371665336056266 -89.342006467283596294 125.82022150851074116 319.9007496683395857 +0.5946826109140541661 0.004228441446919988314 0.48169411754613156162 +211.7494079431474745 247.34135423949993537 271.44979516436404765 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody113 1.1053539394491334998e-06 0.0027159022397352150873 +SmallBody113 1.1053539394491334998e-06 0.0020341208345655149776 1.0978911404624207108e-05 -1.2899371217289095082 0.0027102260511703557544 0.49570586801303845315 -105.723856149928764125 214.67075718408133866 198.22402209155814035 +0.96612018510801100923 0.0038251263510292701948 0.10211507788692092413 +94.997718911079232385 72.20047856021278676 177.12490005041385643 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody114 1.1053539394491334998e-06 0.00250098952292614985 +SmallBody114 1.1053539394491334998e-06 0.0036771750591194379922 1.0978911404624207108e-05 -1.1878627954561591373 0.0055269486194088170497 0.28582563402598959446 -198.15652198877376122 50.825175292553865347 38.458878742928611416 +1.746500497129936269 0.0058508507173112688643 0.041718288224785682328 +343.583602423471973 2.3923430163143555305 21.049002232435121584 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody115 1.1053539394491334998e-06 0.0031140745262582451406 +SmallBody115 1.1053539394491334998e-06 0.0037508323771434353573 1.0978911404624207108e-05 -1.4790518865077075805 0.006118278412732922056 0.3086911846887249733 -209.00522198253077022 209.0447667763183972 302.3997529416504335 +1.7814845651924926528 0.0070428576311776583396 0.42896385937108449937 +225.1566819158494468 49.358015725800711948 130.80343322774197645 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody116 1.1053539394491334998e-06 0.002627832958283806611 +SmallBody116 1.1053539394491334998e-06 0.0020312318442109675703 1.0978911404624207108e-05 -1.2481079889397856952 0.0053051121161105732615 0.3299746252761422416 -133.87850351417839079 250.47308287578673003 301.9918008789680357 +0.96474803855276136666 0.0010046447322486307206 0.11664706284615694587 +77.674155996469721686 249.84767415263414136 55.65928972394180363 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody117 1.1053539394491334998e-06 0.0031597121301605122381 +SmallBody117 1.1053539394491334998e-06 0.000974112043281249845 1.0978911404624207108e-05 -1.5007277916853674071 0.007573092642192360939 0.13642247448670236087 -88.025380854098912664 120.144181413174720774 318.87396349165152287 +0.46266145628061638995 0.0063666039556358813845 0.44153244695566923328 +293.91178927167914026 5.1655049063911606666 314.89223144009667976 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody118 1.1053539394491334998e-06 0.00093094972396938369424 +SmallBody118 1.1053539394491334998e-06 0.003556444135703642334 1.0978911404624207108e-05 -0.44216120515754175901 0.00886881958774052466 0.41844036187083433198 -20.163186214228115745 337.03851824104918933 156.84154111341879911 +1.6891584847496128319 0.00046239007278428225943 0.4111588368317175557 +274.4195616566905187 310.5383527188005246 290.2995654268337944 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody119 1.1053539394491334998e-06 0.0037723189778824764127 +SmallBody119 1.1053539394491334998e-06 0.0026110924430802409018 1.0978911404624207108e-05 -1.7916897793226445046 0.001098164024120308396 0.30931507299879934525 -332.77979531452609763 167.04470469364389373 355.07028692488006527 +1.2401569619543475476 0.0055636321901455041555 0.124411556495122033184 +80.591271036595884425 93.531937081230040576 91.02581530568424739 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody120 1.1053539394491334998e-06 0.0037653266656142048815 +SmallBody120 1.1053539394491334998e-06 0.0022292651491043821605 1.0978911404624207108e-05 -1.7883687307850346659 0.006371715457058402428 0.082470207424121366735 -235.80874892467014092 254.5021145150402333 43.003779741307269546 +1.058805367856919144 0.008856431115937380902 0.22985551372836227069 +103.40731004504169732 278.42753807868166405 161.92298625486941432 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody121 1.1053539394491334998e-06 0.0020643614208088825627 +SmallBody121 1.1053539394491334998e-06 0.0023714005649848728144 1.0978911404624207108e-05 -0.98048316703256199744 0.0022536360259029640692 0.2657233991482298996 -201.9224168131107433 35.510966049397936217 269.0479325637503507 +1.1263135964574069181 0.00017054783801896290373 0.4551410040723882222 +105.3440152261756424 219.93423944623813782 353.84921407221094114 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody122 1.1053539394491334998e-06 0.0012493819934868600675 +SmallBody122 1.1053539394491334998e-06 0.0017365893716236742182 1.0978911404624207108e-05 -0.59340288064841817395 0.0024430042115868256733 0.3060539089368434218 -4.141252475781271869 288.81343355757388736 245.01300887770881332 +0.8248054966351270334 0.0055371318107404737113 0.18749094029727253474 +305.60396836315686642 61.663571188350786656 195.18191086891513919 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody123 1.1053539394491334998e-06 0.001358949686478997836 +SmallBody123 1.1053539394491334998e-06 0.0017727724852365723844 1.0978911404624207108e-05 -0.645442837192117036 0.00680655598933405364 0.37332907634182399548 -142.76890287293809934 240.01228369288145359 199.05279648688636485 +0.84199092427907729075 0.0043065589255132140714 0.2675084388459675333 +38.470555172757549656 257.86123937948008233 183.30306588402953594 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody124 1.1053539394491334998e-06 0.001372467998698668969 +SmallBody124 1.1053539394491334998e-06 0.00094409454073867135766 1.0978911404624207108e-05 -0.6518634559095917158 0.004859331047906131039 0.10133584662204236926 -223.88750283359757987 260.86881228241998087 140.45156031392056661 +0.4484044295494042376 0.005010474032756404364 0.15668152843086047277 +147.71326304493319981 322.57992193070856501 156.73534881298201071 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody125 1.1053539394491334998e-06 0.003145893994423096287 +SmallBody125 1.1053539394491334998e-06 0.0032754931475123096045 1.0978911404624207108e-05 -1.4941647696516584531 0.008393567717643860351 0.1951188989893116732 -200.22793560214802255 102.89583384607908556 47.7458985350726266 +1.5557188109085715588 0.007473354630028248083 0.34840638866081469205 +52.632633320882533212 35.15462414717750761 124.31246142990700321 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody126 1.1053539394491334998e-06 0.00085991395374624328017 +SmallBody126 1.1053539394491334998e-06 0.0025963640847439910755 1.0978911404624207108e-05 -0.40842225990361852306 0.009925563889294575573 0.07832748266555661365 -53.17607097807006511 332.93429864214544978 200.16735258876744297 +1.2331616232112614373 0.008238562530627425301 0.42399484169233947473 +63.706532055494825784 25.70985870870202561 86.201329802784854905 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody127 1.1053539394491334998e-06 0.0020912214038404363845 +SmallBody127 1.1053539394491334998e-06 0.0038812889913659328306 1.0978911404624207108e-05 -0.9932405073721715105 0.0020658612770351634721 0.17106687565709588483 -208.88869138521144464 120.983163700799536855 49.37968505744140657 +1.8434458637247526092 0.004680365985859572496 0.27780307484521127304 +44.297859819313217145 319.2557910969932209 56.73815808854173781 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody128 1.1053539394491334998e-06 0.0037117773832440165345 +SmallBody128 1.1053539394491334998e-06 0.0028165808881701460246 1.0978911404624207108e-05 -1.7629351175420249209 0.0032481182990924764055 0.24616989531905253408 -147.11975344892698558 136.13717547777136474 281.30407881784151414 +1.3377551632186404085 0.003719109121861046384 0.3140927561272534585 +43.246668183993357104 193.2453748363514876 49.380547237145876238 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody129 1.1053539394491334998e-06 0.0024032375471735127028 +SmallBody129 1.1053539394491334998e-06 0.001979252152895991799 1.0978911404624207108e-05 -1.1414347980117576231 0.0041502652786197550758 0.08454980233453107674 -229.99908908688681208 44.5578445821387632 67.002250085263554524 +0.9400599137660112792 0.0030979164694139040524 0.12701535332402813516 +84.99503342739515688 226.20476970399542438 171.66651562275484366 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody130 1.1053539394491334998e-06 0.001767467028496686351 +SmallBody130 1.1053539394491334998e-06 0.0017130867917206263939 1.0978911404624207108e-05 -0.83947105979486336125 0.00016077274532254272246 0.39130968768011842318 -335.08715148259341277 228.63942269662831563 359.0911028463757475 +0.8136427788355728996 0.0073092069346394495516 0.085814698783936105286 +212.90921320180737553 9.763998354941886504 196.01088884421542957 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody131 1.1053539394491334998e-06 0.0026430902300121048054 +SmallBody131 1.1053539394491334998e-06 0.0022358482630314104035 1.0978911404624207108e-05 -1.2553545388673543748 0.0025769333010502780239 0.12589489115239127504 -255.52745736528126486 212.70128728982925281 244.94843935268181667 +1.061932064726491376 0.0019027594188349805475 0.44476175906320358777 +157.18551589009481972 298.71764639949674347 262.90690529651982388 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody132 1.1053539394491334998e-06 0.0032882512617878725745 +SmallBody132 1.1053539394491334998e-06 0.0030586636594471469293 1.0978911404624207108e-05 -1.5617783681954762187 0.004948006327108393776 0.34078014567581271788 -176.22761230380203301 5.155392124877287152 89.585872570524358594 +1.4527341004692158055 0.0062927146114276216737 0.4423521059459766258 +302.02420770009632633 148.5803921871369937 246.85928425279297471 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody133 1.1053539394491334998e-06 0.0012831312069338747407 +SmallBody133 1.1053539394491334998e-06 0.0026878291059565319547 1.0978911404624207108e-05 -0.60943231006510478753 0.0061437650448469506223 0.075499238771577492635 -178.83721349122171773 298.9789356869800372 25.027632544203186171 +1.2766035867972855833 0.007637980856047291156 0.4059059184123336994 +161.50116546845228527 77.850685558381286455 264.8286603906785217 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody134 1.1053539394491334998e-06 0.0026382347801195862704 +SmallBody134 1.1053539394491334998e-06 0.0027943947444222948776 1.0978911404624207108e-05 -1.2530484083419548558 0.0086514879756291844515 0.41341953068728581888 -229.0983678706646458 261.02130278752747472 166.5931723152342272 +1.3272176961516530813 0.004701184643604254705 0.36952456793924481904 +47.269844566301287614 4.9163514335424984836 355.22962273370120556 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody135 1.1053539394491334998e-06 0.0035699538420565724963 +SmallBody135 1.1053539394491334998e-06 0.0031563510355617611948 1.0978911404624207108e-05 -1.6955750160493552325 0.0011432190566918820976 0.06560289215472481228 -151.50679626869310823 58.08436171306480844 271.85287368639353645 +1.4991314158552144775 0.00015436034423323640417 0.1917380856368509634 +172.68410025626315019 292.7689313206145698 242.35314712175855334 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody136 1.1053539394491334998e-06 0.0012462497121113039665 +SmallBody136 1.1053539394491334998e-06 0.00079256183150516454785 1.0978911404624207108e-05 -0.5919151812890981468 0.0094315073904481742245 0.39860349008798984238 -132.68495221114258698 220.62094792819442546 239.06532584793680485 +0.3764328895077013737 0.005331669234970675547 0.037038119773405431268 +137.29879269110134032 276.60344003919925626 318.224575012218736 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody137 1.1053539394491334998e-06 0.0040900465170436520375 +SmallBody137 1.1053539394491334998e-06 0.0024729521662073515708 1.0978911404624207108e-05 -1.942596738109030774 0.00085894138299823284775 0.3540861393320458017 -84.657989801255880025 285.9942938027552941 43.06626227900954973 +1.1745462530940675716 0.0025436198446592396885 0.19726208266038036676 +200.11200833959856027 328.50318859698677443 25.032545226553306605 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody138 1.1053539394491334998e-06 0.0026321784367130867263 +SmallBody138 1.1053539394491334998e-06 0.003141353993759099369 1.0978911404624207108e-05 -1.25017190488476726 0.001035518339557566338 0.22991215033825823655 -291.55028201024350665 284.70513762060340923 312.21379878133922148 +1.4920084639851722841 0.008895169829864444169 0.40742482505034210982 +125.08982552404354749 13.6810870370561410425 125.89960225777221581 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody139 1.1053539394491334998e-06 0.0018316989583566004745 +SmallBody139 1.1053539394491334998e-06 0.0024697651374539426903 1.0978911404624207108e-05 -0.8699784725854904366 0.00040252767386671385727 0.15574484799388010892 -8.5800417750262134575 129.27886023199005194 305.03511084637750628 +1.1730325510775176934 0.009714048229482108096 0.4495197610396466925 +276.1486670185516914 249.96765269618634875 38.405693580368897244 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody140 1.1053539394491334998e-06 0.0027152985394420051477 +SmallBody140 1.1053539394491334998e-06 0.0009277239963550222287 1.0978911404624207108e-05 -1.2896503899728040121 0.00542740198905945076 0.45310649794265428492 -341.809792373788639 113.82747539427856509 247.91497334638845018 +0.4406291228412222427 0.0011498177626615313941 0.24676970418810539876 +215.50167505295402748 65.33626690753465027 206.42806807478683595 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody141 1.1053539394491334998e-06 0.0036602812116765727579 +SmallBody141 1.1053539394491334998e-06 0.0033835772813540165789 1.0978911404624207108e-05 -1.7384766439048284781 0.0032945029965048724767 0.17661293162929425637 -324.49650636688886607 14.8923843223844354355 291.25435855870654223 +1.6070541404622327164 0.004719441710564133141 0.4984568824987272717 +47.33899341199827404 82.97698800601314417 283.4966539407437267 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody142 1.1053539394491334998e-06 0.0038094090876577454437 +SmallBody142 1.1053539394491334998e-06 0.0029520691321285031499 1.0978911404624207108e-05 -1.8093059912569828818 0.008653814027203068915 0.39558567978807523957 -152.01949489017039241 245.78383843322686175 192.08442194631814459 +1.4021062701483164581 3.6003378605201640536e-05 0.4090674261173213866 +121.20788516521034239 247.02993176949499343 145.1606631047432927 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody143 1.1053539394491334998e-06 0.0032982900468595283284 +SmallBody143 1.1053539394491334998e-06 0.0021549829461906115147 1.0978911404624207108e-05 -1.5665463606995986279 0.006009483925970214059 0.38831677230782329913 -254.46309759358049973 35.7461201936248969 296.39612354554310514 +1.0235245062631623814 0.007773773829953017217 0.17819203426573304583 +133.79316693748211264 145.67071914831808499 74.72284817886242081 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody144 1.1053539394491334998e-06 0.0030634256646320016972 +SmallBody144 1.1053539394491334998e-06 0.0026211917416770771317 1.0978911404624207108e-05 -1.4549958487648424477 0.0042019944515554741304 0.103702341899099270695 -28.581569847499295633 307.20222382027014874 306.62611247928236935 +1.2449536957884614896 0.0009156041969351491616 0.26838610331624801475 +191.78935301636164468 61.319754558406870615 198.83867506070333775 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody145 1.1053539394491334998e-06 0.0040865138550243042622 +SmallBody145 1.1053539394491334998e-06 0.002779232403688257159 1.0978911404624207108e-05 -1.9409188751099109016 0.0010500141747999292442 0.15765471770149258601 -43.99728845349395101 12.378161652724681829 225.46205282476034881 +1.3200162343762673611 0.0011825034198607953326 0.3931650954771686024 +199.15447694467161455 110.263445447020046686 357.83521607737361592 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody146 1.1053539394491334998e-06 0.002109241822064289481 +SmallBody146 1.1053539394491334998e-06 0.0007386121576737557171 1.0978911404624207108e-05 -1.0017994334174236126 0.0065873200112985001373 0.44933340912200309125 -255.35329387166856918 259.26783636729476257 307.03948715962786764 +0.35080910748707688773 0.0027024900833699395247 0.19622296338412259509 +292.6436334273752209 93.80156934406009839 28.132779645617151942 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody147 1.1053539394491334998e-06 0.0020702331248985193483 +SmallBody147 1.1053539394491334998e-06 0.00087410562446381314443 1.0978911404624207108e-05 -0.9832719747305034286 0.006643360427983963437 0.38337657172513023296 -338.87403685252746754 212.09324525218809754 90.86376618933867633 +0.41516269503788583162 0.008753675790044105481 0.049200587066592693652 +245.22266454023861115 133.22745192774976886 358.34006313094175766 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody148 1.1053539394491334998e-06 0.0016976701006517697416 +SmallBody148 1.1053539394491334998e-06 0.0040583585328557611443 1.0978911404624207108e-05 -0.80632051155621620175 0.002373623883236905107 0.4938933358938096263 -228.9834606765335252 97.13181363461184503 82.37470004717647498 +1.9275463042168652361 0.008863374200234029263 0.11472348585362174278 +68.51868890765923936 343.0156047967958557 250.37058077253891497 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody149 1.1053539394491334998e-06 0.0031278599433041361999 +SmallBody149 1.1053539394491334998e-06 0.0028701976421156316045 1.0978911404624207108e-05 -1.4855993685657300496 0.0022376413513541305346 0.24129161476336913328 -4.5963354373523879204 193.07560146926255129 67.33203953027762623 +1.3632208225671262891 0.00037100362980518777727 0.40857805997329038616 +138.99534285941138023 75.25892901304128202 102.39451884516589075 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody150 1.1053539394491334998e-06 0.0006418232920025271226 +SmallBody150 1.1053539394491334998e-06 0.0028371368040875375277 1.0978911404624207108e-05 -0.3048385460387668111 0.0066988423982709457277 0.117546375927761515 -285.06880360673568475 149.40827372648249138 144.57986758582379139 +1.3475183419608791624 0.00923347856029827288 0.111868912647413332184 +163.972662313269268 324.1674645569764266 326.5948943827923472 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody151 1.1053539394491334998e-06 0.0009829595240749040168 +SmallBody151 1.1053539394491334998e-06 0.002298777012902104625 1.0978911404624207108e-05 -0.46686363032891009528 0.008499308628501150986 0.34053342820077781017 -209.39838432125981171 82.769614540913750034 86.68430849061675758 +1.0918205228950430552 0.0038962200559046968225 0.07185178854072693522 +95.25129914312677215 288.83172427646081815 113.743637781598437186 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody152 1.1053539394491334998e-06 0.0023496093753247095933 +SmallBody152 1.1053539394491334998e-06 0.0026756500371529266427 1.0978911404624207108e-05 -1.1159637156487294263 0.0053380903741851813 0.37830349306169885892 -350.2143556697128588 198.60142248144447308 138.80606990835988768 +1.2708190512834474095 0.0031796818189825425474 0.34148938686865598635 +240.33583276715017973 159.13444408059913826 16.850108154309943131 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody153 1.1053539394491334998e-06 0.0032584963875012445194 +SmallBody153 1.1053539394491334998e-06 0.0030031099519741718352 1.0978911404624207108e-05 -1.5476460786258632307 0.008427187777420793585 0.19769962836446186571 -272.7555605558899856 109.36660148695808914 88.2209819361593901 +1.4263484712405121169 0.008772238975162893054 0.2928674262574444409 +332.10498285516734995 307.4942771576799032 198.04833839322409972 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody154 1.1053539394491334998e-06 0.0012963852453560645777 +SmallBody154 1.1053539394491334998e-06 0.0037055221237351476841 1.0978911404624207108e-05 -0.61572741005930442526 0.00083496920154526362706 0.3536340306533050648 -166.14122344102605666 312.85186907946501833 237.33755609293859834 +1.7599641374645813574 0.0075196173991873881473 0.31916489509013851178 +47.261748044667832858 81.10596844478185119 286.61303054015036196 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 diff --git a/examples/symba_mars_disk/testnetcdf.ipynb b/examples/symba_mars_disk/testnetcdf.ipynb new file mode 100644 index 000000000..405947b38 --- /dev/null +++ b/examples/symba_mars_disk/testnetcdf.ipynb @@ -0,0 +1,2435 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'/home/daminton/git/swiftest/examples/symba_mars_disk'" + ] + }, + "execution_count": 1, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import swiftest\n", + "import os\n", + "import xarray as xr\n", + "import numpy as np\n", + "os.getcwd()" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Reading Swiftest file param.in\n", + "\n", + "Creating Dataset\n", + "Successfully converted 2 output frames.\n", + "Swiftest simulation data stored as xarray DataSet .ds\n" + ] + } + ], + "source": [ + "sim = swiftest.Simulation(param_file=\"param.in\")\n", + "sim.bin2xr()\n" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
    \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
    <xarray.DataArray 'origin_type' (id: 1533)>\n",
    +       "array(['Initial conditions', 'Initial conditions', 'Initial conditions',\n",
    +       "       ..., 'Disruption', 'Disruption', 'Disruption'], dtype='<U18')\n",
    +       "Coordinates:\n",
    +       "  * id       (id) int32 0 1 2 3 4 5 6 7 ... 1526 1527 1528 1529 1530 1531 1532
    " + ], + "text/plain": [ + "\n", + "array(['Initial conditions', 'Initial conditions', 'Initial conditions',\n", + " ..., 'Disruption', 'Disruption', 'Disruption'], dtype='\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
    <xarray.DataArray 'xhx' (time: 2)>\n",
    +       "array([      0.      , 2742814.426863])\n",
    +       "Coordinates:\n",
    +       "  * time     (time) float64 0.0 6e+03\n",
    +       "    id       int32 1510
    " + ], + "text/plain": [ + "\n", + "array([ 0. , 2742814.426863])\n", + "Coordinates:\n", + " * time (time) float64 0.0 6e+03\n", + " id int32 1510" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "sim.ds.sel(id=1510)['xhx']" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[3.38950000e+06 7.07643092e+03 4.84234399e+03 ... 9.96920997e+36\n", + " 9.96920997e+36 9.96920997e+36]\n", + "[3.38950000e+06 7.07643092e+03 4.84234399e+03 ... 9.96920997e+36\n", + " 9.96920997e+36 9.96920997e+36]\n" + ] + } + ], + "source": [ + "for n in sim.ds['radius']:\n", + " print(n.values)" + ] + }, + { + "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/python/swiftest/swiftest/simulation_class.py b/python/swiftest/swiftest/simulation_class.py index e28d31587..b2736c96d 100644 --- a/python/swiftest/swiftest/simulation_class.py +++ b/python/swiftest/swiftest/simulation_class.py @@ -24,8 +24,8 @@ def __init__(self, codename="Swiftest", param_file=""): 'IN_FORM': "EL", 'ISTEP_OUT': "1", 'ISTEP_DUMP': "1", - 'BIN_OUT': "bin.dat", - 'OUT_TYPE': 'REAL8', + 'BIN_OUT': "bin.nc", + 'OUT_TYPE': 'NETCDF_DOUBLE', 'OUT_FORM': "XVEL", 'OUT_STAT': "REPLACE", 'CHK_RMAX': "-1.0", From fdbf1a909dc7dd75c4bc5677566bece65c9a6494 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Sat, 28 Aug 2021 16:34:22 -0400 Subject: [PATCH 092/154] Updated naming scheme in the Chambers run --- examples/symba_chambers_2013/init_cond.py | 4 +- .../symba_chambers_2013/pl_chambers_2013.in | 924 +++++++++--------- 2 files changed, 464 insertions(+), 464 deletions(-) diff --git a/examples/symba_chambers_2013/init_cond.py b/examples/symba_chambers_2013/init_cond.py index cf9baa290..a3225caf4 100755 --- a/examples/symba_chambers_2013/init_cond.py +++ b/examples/symba_chambers_2013/init_cond.py @@ -85,10 +85,10 @@ nameb = [] for i in idb: - nameb.append(f"BigBody{i-10:0.4g}") + nameb.append(f"BigBody{i-9:0.4g}") names = [] for i in ids: - names.append(f"SmallBody{i-10:0.4g}") + names.append(f"SmallBody{i-9:0.4g}") # Populate the simulation object with the two types of bodies diff --git a/examples/symba_chambers_2013/pl_chambers_2013.in b/examples/symba_chambers_2013/pl_chambers_2013.in index bae3d0a91..d694bd90c 100644 --- a/examples/symba_chambers_2013/pl_chambers_2013.in +++ b/examples/symba_chambers_2013/pl_chambers_2013.in @@ -11,927 +11,927 @@ Saturn 0.011285899820091272997 0.43766379465266665196 113.59526896860690215 335.6868332999574136 225.48455056285450837 0.0 0.0 0.22000000000000000111 441.93109321068034775 378.52929516502754512 5135.9113502360652523 -BigBody0 1.1053539394491336042e-05 0.0063075596499805015168 +BigBody1 1.1053539394491336042e-05 0.0074243341280248171816 2.3653347588909066005e-05 -1.3905366526104205871 0.0051551549664398807135 0.3092444066234905642 -228.58509335446049704 334.67460737226542733 216.69401173037385888 +1.6367358057845475816 0.0034166548941629258651 0.21879260968354363737 +21.041926702013121542 6.966209570135037943 353.89940691003835127 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -BigBody1 1.1053539394491336042e-05 0.0060310909831888406354 +BigBody2 1.1053539394491336042e-05 0.008701441270991232489 2.3653347588909066005e-05 -1.3295875953195663843 0.0059376373304325580013 0.37911239701313403927 -49.836771644804038317 353.35838600309818958 98.50291362894803626 +1.9182811878580832143 0.001983570125226424754 0.47699514975225187907 +244.73038369249368884 169.64703978001028872 228.74294167258540256 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -BigBody2 1.1053539394491336042e-05 0.0035241167077997471306 +BigBody3 1.1053539394491336042e-05 0.0028274735843444539963 2.3653347588909066005e-05 -0.77691115458376436287 0.0035957008056896190389 0.42835300354068150952 -347.5342864326624408 7.965633467666743961 71.65897451799423834 +0.62333229830507885794 0.005233546206515517739 0.39568260035041247225 +325.88888897134881972 153.91710344621517947 52.819812549308984728 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -BigBody3 1.1053539394491336042e-05 0.007837878259153562561 +BigBody4 1.1053539394491336042e-05 0.0014161638656182578314 2.3653347588909066005e-05 -1.7279039125829078749 0.0045575169313139419353 0.30382866814111919584 -253.64737905496954795 267.12833283229065273 189.10836150338562334 +0.31220121101046316436 0.005603861843408211238 0.092818768166148979404 +163.68602221786181872 248.54181736106085054 263.40784379446773755 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -BigBody4 1.1053539394491336042e-05 0.0026272209025122289392 +BigBody5 1.1053539394491336042e-05 0.0058031850839421550937 2.3653347588909066005e-05 -0.57918547935710384955 0.0035229707266752063877 0.19534986609695992321 -351.2858699045939943 331.00199448212464404 260.0567726858896549 +1.2793444705875420819 0.008208680503293538239 0.023138084495924027273 +209.58319396393750367 119.52910880653347192 314.50121467342484038 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -BigBody5 1.1053539394491336042e-05 0.0025768241135549523954 +BigBody6 1.1053539394491336042e-05 0.0057067919277962843923 2.3653347588909066005e-05 -0.56807522656398412586 0.009587363144368176923 0.47985543902781624404 -208.04744805740477887 152.82398397889099328 222.69294085751820944 +1.2580940624868359734 0.0065171590670703941767 0.39352865077091525592 +195.49136805916123194 57.04938439216533652 248.43605393468556031 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -BigBody6 1.1053539394491336042e-05 0.0026065591161533988347 +BigBody7 1.1053539394491336042e-05 0.008909342916648943839 2.3653347588909066005e-05 -0.5746304734856257923 0.0025001534530765868493 0.26243591511318342668 -250.28064959229163833 58.357636473165307223 223.37515017006040807 +1.9641142634796455724 0.003827092787364123807 0.11322153568015552727 +193.30489858580236273 167.70088129510983777 72.21547320900106115 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -BigBody7 1.1053539394491336042e-05 0.005273184794616913636 +BigBody8 1.1053539394491336042e-05 0.0022763633549123734702 2.3653347588909066005e-05 -1.1625029551524634908 0.009502371963720513889 0.48925430380691231624 -282.8532270407699798 11.300947267125426521 252.28305802704849725 +0.5018369790089363125 0.0042844948172547350426 0.168943107634771994 +258.4718846019206353 276.50078927222079983 175.04487030031225459 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -BigBody8 1.1053539394491336042e-05 0.0013743091219513574427 +BigBody9 1.1053539394491336042e-05 0.0068303803402822211564 2.3653347588909066005e-05 -0.30297409967357413763 0.006153085722489816216 0.24413190643541238245 -200.54313002395986132 95.676151272770198375 285.05850827347865106 +1.5057953854564698482 0.0025088080634212738332 0.38815973385703372855 +342.40213238162482412 38.531939970843424703 190.77674887921716618 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -BigBody9 1.1053539394491336042e-05 0.0014400388191713955921 +BigBody10 1.1053539394491336042e-05 0.008388115886865277387 2.3653347588909066005e-05 -0.31746457748454987025 0.0082836787198065416765 0.3458292101729332213 -109.10988633396883074 190.8784377815383948 83.709048009304211746 +1.8492068619701422794 0.007194433386484905789 0.40063701449417626899 +144.04024254110095171 333.32725808913193077 77.12020350544085545 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -BigBody10 1.1053539394491336042e-05 0.006356298033710497025 +BigBody11 1.1053539394491336042e-05 0.008617248786048845239 2.3653347588909066005e-05 -1.4012813007352717953 0.003165171108998443561 0.20197461359785090496 -246.39263065184604784 174.9762417406147108 321.5192778374650402 +1.8997204856716041199 0.008611198402818386749 0.35916982827818139112 +335.510100580524238 94.3216870275639252 312.88201783559190972 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -BigBody11 1.1053539394491336042e-05 0.0074989071844086092277 +BigBody12 1.1053539394491336042e-05 0.0035499236688427180967 2.3653347588909066005e-05 -1.6531758513732035532 0.0022871815438197298093 0.0070104389974737779667 -354.36533178823532353 311.093700682041856 310.25114822903884715 +0.7826004428686323955 0.0012885916956714516066 0.072998416848503777654 +289.698333799458851 51.867186524003187742 193.41829977210343827 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -BigBody12 1.1053539394491336042e-05 0.0024899092426714881184 +BigBody13 1.1053539394491336042e-05 0.0026082150511211890182 2.3653347588909066005e-05 -0.54891435923540754516 0.0022069297624748274687 0.27749529254220250962 -114.30900274612675105 243.56280767632020456 21.231447431177706164 +0.5749955335714322935 0.00070756832643816154876 0.49519708693510428033 +359.6794452009551719 319.60134668069326835 154.49113681541822984 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -BigBody13 1.1053539394491336042e-05 0.008449694968226453511 +BigBody14 1.1053539394491336042e-05 0.008562476338591311624 2.3653347588909066005e-05 -1.8627823133996121996 0.006977961045014737136 0.48710585020453461835 -143.59149899463938027 274.8740789951295369 245.2333786693829154 +1.8876455945933858782 0.004021006848009781899 0.087891473786938734136 +274.70971881893206046 154.36910259029556869 302.11280885249925632 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody15 1.1053539394491334998e-06 0.0017906229980958408579 +SmallBody16 1.1053539394491334998e-06 0.0017351564481596240887 1.0978911404624207108e-05 -0.85046915256070887423 0.00392301989673250924 0.2688494315152081815 -273.16219120632564454 50.115914721428694634 165.84879211345474914 +0.8241249194251554222 0.0006487878307126593129 0.37479217715625012808 +39.79358057252731129 88.04695214526078928 350.63033380622476898 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody16 1.1053539394491334998e-06 0.0017924083782442332348 +SmallBody17 1.1053539394491334998e-06 0.003438767681582787084 1.0978911404624207108e-05 -0.8513171315844434428 0.007552464623893690235 0.39603425460827951232 -81.47723026955590342 106.604362386465339796 332.7343601414484624 +1.633267214326447947 0.00023758016472743781152 0.34167698710799682127 +268.24635832820735004 169.94300166889169645 84.47584522462051382 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody17 1.1053539394491334998e-06 0.0029193442700291086804 +SmallBody18 1.1053539394491334998e-06 0.0036234919106881456764 1.0978911404624207108e-05 -1.3865633637035013059 0.0080003725369993655 0.25584505360144360608 -138.51987810492843778 326.46995736065861138 306.6642035347931028 +1.7210033032473028847 0.0047742023208973216955 0.11586561032367881374 +122.12903874666852744 83.63949330516025782 89.43732781404645493 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody18 1.1053539394491334998e-06 0.00083210543813983783056 +SmallBody19 1.1053539394491334998e-06 0.001134755447805816562 1.0978911404624207108e-05 -0.39521440725853312914 0.00857965444976194723 0.4462197941140798596 -34.92615520153869113 191.44938410333966772 76.45598120928450214 +0.5389601859717687571 0.005953573515783903633 0.38301846117291393767 +198.6812014627746521 82.06633747367067144 222.26356386390955322 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody19 1.1053539394491334998e-06 0.0014997120748366796664 +SmallBody20 1.1053539394491334998e-06 0.0031159203507303477127 1.0978911404624207108e-05 -0.7122989365867320455 0.0095012482862691580165 0.22540652816168355033 -25.333112836017342318 252.23481776709510882 62.533664756602398427 +1.4799285739937022566 0.0035619477965435409651 0.059098198702242421554 +310.44503242432062962 355.89233767122334484 296.79189250544027345 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody20 1.1053539394491334998e-06 0.0009222365084692850775 +SmallBody21 1.1053539394491334998e-06 0.0023535027362334387583 1.0978911404624207108e-05 -0.43802280136716942316 0.004781612088389226682 0.16753228279959353486 -271.35984601722304888 68.325986632106989305 352.8125464325211169 +1.1178128951556278725 0.0011223516138449806528 0.022315933398055154413 +297.56102596926723436 2.4935445365223785075 290.66289100541200696 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody21 1.1053539394491334998e-06 0.0020208271999879728366 +SmallBody22 1.1053539394491334998e-06 0.0035656742897341810272 1.0978911404624207108e-05 -0.9598062786376726496 0.003605982751920797525 0.1569186298203504859 -245.49110527946089633 57.92230959367861942 324.0334343406562425 +1.693542412178616452 0.0040932943971498294417 0.3948665983305137961 +339.093558804669442 259.81990416297884394 148.95186208865482058 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody22 1.1053539394491334998e-06 0.0039602711035984731796 +SmallBody23 1.1053539394491334998e-06 0.0022611863814377749927 1.0978911404624207108e-05 -1.8809589807400564077 0.007251369815475449017 0.38064872111638359264 -306.61046955850400764 181.36712055864495596 155.52039454636368987 +1.0739665846178696462 0.0012840171705301973125 0.19476937266504218416 +297.386703142769818 151.91509859305122632 250.19456183898023482 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody23 1.1053539394491334998e-06 0.0019682776333037484235 +SmallBody24 1.1053539394491334998e-06 0.0023953714758779178613 1.0978911404624207108e-05 -0.9348474874834820092 0.0098458579465244763784 0.18502955450711011665 -307.05002984880451322 140.36370226483856527 85.95578402340959201 +1.1376987513978915612 0.008515802940667225804 0.039736464816959027324 +130.21317576651230752 70.45013837961363379 221.87886384170494125 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody24 1.1053539394491334998e-06 0.0022414635714275113668 +SmallBody25 1.1053539394491334998e-06 0.0034659284677154082642 1.0978911404624207108e-05 -1.0645990954627644332 0.0084373716687540078335 0.4460803209227525712 -190.65913682739514456 191.5789014687326528 246.52257502088281171 +1.6461674232423710862 0.004605036788321378513 0.31874779879437620256 +148.5866490040527026 149.30091714058067964 99.46202642603512345 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody25 1.1053539394491334998e-06 0.0021578231801338408073 +SmallBody26 1.1053539394491334998e-06 0.0028314912741128235144 1.0978911404624207108e-05 -1.0248734956134282204 0.005065996629560730498 0.14626119997104242154 -240.98330390541326551 220.41241905441205517 189.21797176247514471 +1.344836957270491018 0.004004225412797391033 0.31408792179868039174 +329.42526329938533536 218.74973858770289326 31.598359508124481465 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody26 1.1053539394491334998e-06 0.0029827362662033012827 +SmallBody27 1.1053539394491334998e-06 0.0035657719433803714185 1.0978911404624207108e-05 -1.4166718440048984284 0.0025266126922014230452 0.29821242045816626076 -133.43125921208502405 189.91995919972310958 82.880462421090214775 +1.6935887934737345883 0.003625823925211191321 0.011103313823782212655 +4.3173658011361659703 265.51362444050306522 306.2440101174317988 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody27 1.1053539394491334998e-06 0.0027039346261452628856 +SmallBody28 1.1053539394491334998e-06 0.003297916350976027023 1.0978911404624207108e-05 -1.2842530183755827 0.0046897109457686584136 0.21496551660303919729 -112.39385384106159904 215.8952064205250565 354.25306544481526316 +1.5663688711768488648 0.0046622077804485666935 0.33919175649180494103 +306.97367190207165777 18.174144285673445864 354.14468289351236763 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody28 1.1053539394491334998e-06 0.003236657978466086267 +SmallBody29 1.1053539394491334998e-06 0.001696857290253097992 1.0978911404624207108e-05 -1.5372737706385561918 0.008236569108027860103 0.41764153867254960595 -38.342904015669752482 190.88468085878071179 189.19919955010038848 +0.80593446146544556186 0.0089081506786704706125 0.043157412254051730205 +277.850373401511888 123.10579243426050766 93.01488646634489044 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody29 1.1053539394491334998e-06 0.0014865754187823128504 +SmallBody30 1.1053539394491334998e-06 0.0021446696510771600803 1.0978911404624207108e-05 -0.7060595881845728172 0.0067468676596185196692 0.45043008242521387352 -236.91404942165763714 21.927133499684750007 28.172244007534004595 +1.0186261332585864192 0.0029210959858598228855 0.19801062855300394228 +6.458452465982582602 319.89801940984625617 228.20899095996719552 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody30 1.1053539394491334998e-06 0.0006483419933024542547 +SmallBody31 1.1053539394491334998e-06 0.0027547362011134702279 1.0978911404624207108e-05 -0.30793464967210609773 0.008069936872778109976 0.2724959287926068674 -358.70308062571780283 225.49128516561441415 199.72976304561231586 +1.3083815884084177839 0.0075545048562947990367 0.33085846113471090169 +294.3939768734622362 308.9097722907977186 289.8210233062081329 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody31 1.1053539394491334998e-06 0.002018210243469286887 +SmallBody32 1.1053539394491334998e-06 0.0031842594376846704832 1.0978911404624207108e-05 -0.9585633364912231613 0.009009905756055591741 0.31963549148297148994 -27.366823661514217747 315.7263950336954963 72.26266493943053604 +1.5123867103130843592 0.001686012349810540531 0.37228230250032695592 +18.8797547571544726 125.872553835984504644 208.9251761899009523 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody32 1.1053539394491334998e-06 0.00091189020915312874153 +SmallBody33 1.1053539394491334998e-06 0.002247708832979587486 1.0978911404624207108e-05 -0.43310875278133753596 0.0009226434312926524257 3.7871736713213088876e-05 -140.28680626290937994 198.6519961479969254 188.39714836428248645 +1.0675653269393858835 0.0011230027938351151619 0.35557286841218888052 +243.67111775541096108 37.96034701396045108 88.987820375667197936 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody33 1.1053539394491334998e-06 0.0014458168785057989686 +SmallBody34 1.1053539394491334998e-06 0.0013121511866584325592 1.0978911404624207108e-05 -0.68670102904317897874 0.0013277259838060907152 0.29757365508293343037 -358.03703640013964105 256.17728183625638394 172.02261627369821895 +0.6232155562257534198 0.0011780431424190363453 0.35960708946175562462 +322.02262254571718358 332.4949291895190413 152.81190365726115488 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody34 1.1053539394491334998e-06 0.0014390149238434223788 +SmallBody35 1.1053539394491334998e-06 0.0014967817348828841872 1.0978911404624207108e-05 -0.68347039220693850403 0.009030013891107387461 0.23770174057769000164 -28.788093527018038031 297.1203224520854178 347.65300912374004838 +0.71090715074467070167 0.008832462815755786831 0.10952157655510541545 +160.71141170112289842 114.18934134683311754 277.6929815128169139 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody35 1.1053539394491334998e-06 0.0012625053685361255998 +SmallBody36 1.1053539394491334998e-06 0.0030299295774483482833 1.0978911404624207108e-05 -0.5996359211425668079 0.00029626288583441075155 0.04027165425420448086 -92.97568107878895205 251.9501186448117096 217.31372830682673225 +1.4390866434706655053 0.0043491365873236367476 0.2172391413785259573 +107.424624730892062985 140.64076212096063045 65.37328530182462316 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody36 1.1053539394491334998e-06 0.0039596359940901068546 +SmallBody37 1.1053539394491334998e-06 0.0038420224219524271426 1.0978911404624207108e-05 -1.8806573309533967109 0.0099750025372931476475 0.30898084325688157659 -69.326066836276083905 193.05576292211591749 19.749320687752476289 +1.8247959267762252633 0.0069595061027765839703 0.2031458227831892116 +60.30069261316840823 186.29407945868973684 96.04805330164970201 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody37 1.1053539394491334998e-06 0.0027287215096217574358 +SmallBody38 1.1053539394491334998e-06 0.0027991657617720382088 1.0978911404624207108e-05 -1.2960257253090312624 0.00034691773709094597677 0.029246476333898208111 -131.63716530630554757 211.34034504873113747 98.226995574387899524 +1.3294837248392123996 0.0021307104738356487383 0.27150507932869094585 +286.3783517588109362 129.48053796312069608 119.90656313407949085 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody38 1.1053539394491334998e-06 0.0033772431763425540378 +SmallBody39 1.1053539394491334998e-06 0.0039543751049730075407 1.0978911404624207108e-05 -1.6040457121514952732 0.00016590685794708791919 0.38000365951495623795 -129.05280805195508265 322.10721881350264084 19.370815517117634386 +1.8781586341792051442 0.0023844012437418417825 0.27326985201083692223 +114.968426872986213993 57.98285683500146348 113.5343972847980325 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody39 1.1053539394491334998e-06 0.003896112452102458823 +SmallBody40 1.1053539394491334998e-06 0.0020036090161593164158 1.0978911404624207108e-05 -1.8504863720305302355 0.00047515625553996469277 0.45527381432526925487 -236.085725999933004 210.21818181641509682 137.83196137498174494 +0.9516283795349782526 0.0022186742704323092652 0.04628224671674396884 +32.299509227827073232 317.61854491863351768 268.59769558425449532 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody40 1.1053539394491334998e-06 0.0034576435287466804158 +SmallBody41 1.1053539394491334998e-06 0.0028799283662589175008 1.0978911404624207108e-05 -1.6422324324423847042 0.0054180737848693325334 0.3633074328433625877 -318.57279378603777786 344.63336593785294326 145.55306177607735663 +1.3678424993381399499 0.0066819507316878603426 0.07716164563597766035 +329.64464444459332526 204.92003707923961997 163.74906736662356366 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody41 1.1053539394491334998e-06 0.0027505018335353342132 +SmallBody42 1.1053539394491334998e-06 0.0037367851650158436479 1.0978911404624207108e-05 -1.3063704453539404238 0.006063652581356089241 0.26150027322263946772 -281.12447238732357846 237.65962840401968492 131.73191153344592408 +1.7748127416949179835 0.0026742823651202530903 0.35585638061056223957 +113.347581144256466246 174.66974907394964589 289.37163474014494113 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody42 1.1053539394491334998e-06 0.0018598838998215439473 +SmallBody43 1.1053539394491334998e-06 0.0022390360937310795117 1.0978911404624207108e-05 -0.88336511137442252917 0.00021332665852522470374 0.49452520848202163872 -128.64442400907418573 305.79449185728265093 272.11975853427526317 +1.0634461476331320551 0.00053313026316393122544 0.2373999411140914062 +271.30012989506457188 10.459818195289575016 58.036821152458777817 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody43 1.1053539394491334998e-06 0.0038787297493011350567 +SmallBody44 1.1053539394491334998e-06 0.0023045570046331629935 1.0978911404624207108e-05 -1.8422303334694387633 0.0017691531576543284825 0.42914608465831793893 -90.33060632601211637 298.92072716920284847 155.60340000412523409 +1.0945657711547540636 0.0011368233813004891431 0.46678482074518445888 +302.43512296271762807 34.219408880811762685 273.1731433525869761 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody44 1.1053539394491334998e-06 0.0040205050284578732577 +SmallBody45 1.1053539394491334998e-06 0.0036257009987981708087 1.0978911404624207108e-05 -1.9095675125667193051 0.0030801669204009039967 0.15953646867409598809 -209.08679797383152277 320.77246942730693036 198.45127398866443968 +1.7220525253866716398 0.005812492405147601064 0.18241253340230184632 +349.16566525366459928 66.79804880955843771 244.99022628833102999 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody45 1.1053539394491334998e-06 0.0010656801230813612627 +SmallBody46 1.1053539394491334998e-06 0.0019632679325566203126 1.0978911404624207108e-05 -0.50615236827718168566 0.0024434709549745249092 0.17777835590219637218 -184.54384211440816443 235.74454741983433337 193.59681355350048193 +0.9324680944155254725 0.005096834041688923754 0.2483520694023206854 +119.99880286178381539 9.742430947085129134 155.32437515351233515 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody46 1.1053539394491334998e-06 0.0012848279975201385693 +SmallBody47 1.1053539394491334998e-06 0.0009102148088042158425 1.0978911404624207108e-05 -0.61023821284503521056 0.003987143732529693438 0.001365418664104667279 -343.87442064134455677 332.11360135906141977 211.12253475805300695 +0.43231300944705941536 0.005648229292013018203 0.18853291667710370128 +269.6055670622664593 357.6457559917049025 334.9767947473189338 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody47 1.1053539394491334998e-06 0.001586855972994529395 +SmallBody48 1.1053539394491334998e-06 0.0012954121171608724439 1.0978911404624207108e-05 -0.7536885519864870986 0.0068545946072486622566 0.47875353005964926822 -268.6816988781197324 118.55357784026483614 28.10015400805450625 +0.6152652158886844358 0.0064177679039259761737 0.3660772735514235543 +288.48514746496266525 38.450761776372161194 55.7962725159071411 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody48 1.1053539394491334998e-06 0.0022330250179423978959 +SmallBody49 1.1053539394491334998e-06 0.0024739699402568946195 1.0978911404624207108e-05 -1.0605911443535949168 0.0022050845762832060014 0.17006705206962935417 -60.87397436452053512 63.78368846451786567 329.77954502722860752 +1.1750296521313488007 0.0065104146765382125625 0.03763006803493884611 +262.774107356739421 201.1690156846309776 105.607622741249286946 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody49 1.1053539394491334998e-06 0.0028707184422754971512 +SmallBody50 1.1053539394491334998e-06 0.0016836813798114476406 1.0978911404624207108e-05 -1.363468180314170386 0.005942764201040959607 0.37173945785205231296 -29.57191054050963075 100.41312169995346437 72.46300737457485752 +0.79967646891232724293 0.0010604079445286596853 0.36911162753965132133 +278.5022837689812718 353.07542055254396018 94.178933984937216906 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody50 1.1053539394491334998e-06 0.0013589924201308696665 +SmallBody51 1.1053539394491334998e-06 0.0017195953704312818065 1.0978911404624207108e-05 -0.6454631338445848687 0.003687156220124645535 0.47108622959286672316 -214.35473118646626745 160.7608961783459165 180.69048975870487084 +0.8167340746730060719 0.0014735397597012923811 0.106630877203119256436 +217.86989923422629545 260.11059897322320467 190.31524934619145029 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody51 1.1053539394491334998e-06 0.0011543345402911547252 +SmallBody52 1.1053539394491334998e-06 0.0008608540298652155061 1.0978911404624207108e-05 -0.5482594154643087858 0.0058273827372787257925 0.47155791843593697354 -114.383916488962867675 222.32926951962554085 161.00772323788964968 +0.4088687557551154983 0.0022200982033595763505 0.35810271184633135633 +288.9047897804766194 62.075500010596677214 18.189906361202666574 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody52 1.1053539394491334998e-06 0.003625757501063538497 +SmallBody53 1.1053539394491334998e-06 0.0019848569361943638805 1.0978911404624207108e-05 -1.7220793615402316679 0.0067582117965574381446 0.473313138490892793 -19.264507554706526093 306.34719154839370958 350.14073181346304864 +0.9427219455321182995 0.004239482820492568131 0.2260315464979905653 +350.77406185440707986 159.74287915746657518 87.84313205545750236 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody53 1.1053539394491334998e-06 0.00071857240099922700467 +SmallBody54 1.1053539394491334998e-06 0.0029664053385532961257 1.0978911404624207108e-05 -0.34129108225528154152 0.0007615613901554241444 0.06859795886339431492 -197.15917765141804807 158.25617293553941067 27.519089489610109922 +1.4089153535466614198 0.008939923531461250669 0.34471554248304558943 +182.63918552677125717 348.7500402840085485 120.74620441079039779 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody54 1.1053539394491334998e-06 0.0011716620583187394159 +SmallBody55 1.1053539394491334998e-06 0.0023637080106960954408 1.0978911404624207108e-05 -0.5564892436238774165 0.0045826378199643122424 0.24195292989213706969 -239.72284529330184455 132.21214770785758219 305.41153045395969912 +1.1226599629823756921 0.008703427486171486441 0.08785815527239088096 +338.94990604190400063 238.9132533680246695 319.78307374199994229 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody55 1.1053539394491334998e-06 0.0024615255028710602107 +SmallBody56 1.1053539394491334998e-06 0.0026328560562540776697 1.0978911404624207108e-05 -1.1691190779184184034 0.0068687080516668854585 0.10666014510077265198 -275.99872699417227295 169.73889419589309568 248.90290020737802479 +1.2504937451143398608 0.002589156467576795434 0.410462142220338444 +189.77150265342899615 122.37242655661786728 96.94997250606695616 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody56 1.1053539394491334998e-06 0.0017321756455436248891 +SmallBody57 1.1053539394491334998e-06 0.002121649634828146817 1.0978911404624207108e-05 -0.8227091659820937597 0.00843319774766918516 0.22884853768953594688 -304.30606168405762446 25.93584871510447698 4.848633998416511659 +1.0076926125051663963 0.009841532148699604771 0.48146102056592687823 +185.59042598838865956 64.35847565299175699 78.96986998774411859 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody57 1.1053539394491334998e-06 0.0023910402872564365214 +SmallBody58 1.1053539394491334998e-06 0.0018289433155997616911 1.0978911404624207108e-05 -1.1356416224989502872 0.0007665109352532950343 0.1419214571706507999 -240.43439932382597135 298.9062599161678122 58.015459116669731543 +0.8686696604219803497 0.0082175492365333217826 0.18858910014174024017 +235.11309456546851493 45.764303821886500145 40.807378448225108514 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody58 1.1053539394491334998e-06 0.0019350973663502399923 +SmallBody59 1.1053539394491334998e-06 0.0013740407773030377619 1.0978911404624207108e-05 -0.9190882832580831163 0.0064336379372377438743 0.21851798864023092017 -154.82954330295854106 356.93189278963092192 194.69117686773361697 +0.65261045831503694536 0.00886869353675501064 0.058625206665167850506 +39.187838407592039403 322.45546892152003693 253.06901117526950884 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody59 1.1053539394491334998e-06 0.0037561789778854402514 +SmallBody60 1.1053539394491334998e-06 0.0022926246503426237399 1.0978911404624207108e-05 -1.7840239713136967215 0.006148371953439728775 0.25679832782220995968 -294.159436987109018 13.667963580601236728 109.71022344892682554 +1.0888984144569340273 0.0039875571453738345787 0.020129257957628376996 +9.110799581756335641 125.83977812325261425 78.40563607259049661 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody60 1.1053539394491334998e-06 0.0013611814389692063118 +SmallBody61 1.1053539394491334998e-06 0.0025091531893443032756 1.0978911404624207108e-05 -0.64650282394035563094 0.00210355505260503969 0.05531076625953512682 -1.2066583847071798985 19.662168359747298041 42.088447685333754578 +1.191740186994086681 0.008173634999465642995 0.29869700212275529516 +278.24214351007020696 214.39280016748816138 101.53169945550675379 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody61 1.1053539394491334998e-06 0.0036842862982039128794 +SmallBody62 1.1053539394491334998e-06 0.0009897399507804386538 1.0978911404624207108e-05 -1.749878030806350182 0.0058877624633116307576 0.25927135724151134655 -106.54193156547684396 309.62159619247529463 198.30883233401769417 +0.47008404230864464513 0.0016900691601710205337 0.2923668713090333826 +222.75856139935487477 23.871242778405207474 247.11608431356100368 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody62 1.1053539394491334998e-06 0.002352457282817648111 +SmallBody63 1.1053539394491334998e-06 0.0041212944734210044516 1.0978911404624207108e-05 -1.1173163496061098154 0.008722730655786280901 0.45532722119645963055 -7.669255186594696738 328.27376432936614492 283.993162943758648 +1.9574381776570324298 0.0009901435887703768229 0.14466197394385382768 +286.3416003771931173 297.27668389783224256 139.31901126031084459 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody63 1.1053539394491334998e-06 0.0041865789707916299196 +SmallBody64 1.1053539394491334998e-06 0.0010057170108254320502 1.0978911404624207108e-05 -1.98844551488725374 0.0071526190521102421538 0.44868034424472752475 -202.41141669675778303 86.25518321577487768 248.93971582039534951 +0.47767246082629277737 0.009318667742477268132 0.44646018202156600996 +181.50231862935842742 39.941988854307389545 92.775461164340114806 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody64 1.1053539394491334998e-06 0.0038156990777683893855 +SmallBody65 1.1053539394491334998e-06 0.0012355928427943945143 1.0978911404624207108e-05 -1.8122934668812227255 0.0046607119651452099535 0.18959887351040988213 -103.753167455451190904 251.98883746225675395 79.68459651017317924 +0.58685362526834994323 0.0063944758811966167025 0.13179594249846143805 +166.27829439480856877 194.57385330167642223 248.15960802489175308 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody65 1.1053539394491334998e-06 0.0020349210108043651083 +SmallBody66 1.1053539394491334998e-06 0.0029497258104301727759 1.0978911404624207108e-05 -0.9665002345145459195 0.009888737196005765312 0.031496742813291678242 -331.12496419413429294 92.43097071039983348 51.154372128609594483 +1.4009932928096608951 0.0073617980845235523463 0.4331110895441231401 +298.98597359658293726 291.79032465955356201 134.71870506235592302 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody66 1.1053539394491334998e-06 0.0007519970150145614117 +SmallBody67 1.1053539394491334998e-06 0.0024335602953199311332 1.0978911404624207108e-05 -0.35716634085886211913 0.009812992174250710631 0.19330764764073876671 -294.8736717732407442 59.943598965498772202 37.415260394651753018 +1.1558368033176316114 0.0014674948178538295418 0.14595620981903045799 +26.906065188725545312 193.59979141105480949 342.92713693975338174 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody67 1.1053539394491334998e-06 0.0017422896962019374534 +SmallBody68 1.1053539394491334998e-06 0.0011621530047934199633 1.0978911404624207108e-05 -0.82751290641292607475 0.004483101404917193278 0.42444650766319869106 -284.08737987214851728 20.66202219747616553 244.94157667031407755 +0.5519728508924466315 0.009125710167568410955 0.38391361749146651894 +312.46372840188922737 52.13612183972309566 237.37098505324595976 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody68 1.1053539394491334998e-06 0.0009990898270396054195 +SmallBody69 1.1053539394491334998e-06 0.0013502749860594976756 1.0978911404624207108e-05 -0.47452483266325140576 0.0024462445739371319574 0.2497100598204521904 -38.56617039404348901 71.18453251440668339 355.36891313147475557 +0.64132272641372556343 0.00090827058188821087684 0.122492384756083261266 +85.557328856885106916 38.164622893518028945 6.7652899237678276734 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody69 1.1053539394491334998e-06 0.0033996536056487195092 +SmallBody70 1.1053539394491334998e-06 0.0011111205042707826829 1.0978911404624207108e-05 -1.6146897052426172348 0.0015219920533292442388 0.17922372150567844606 -12.159534634854507473 344.35229701092345067 10.8997608537475052515 +0.5277346011220065414 0.0057285060222213544934 0.3871179032550878807 +78.49694291256504641 297.43183861262565415 359.95087146468250694 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody70 1.1053539394491334998e-06 0.0018534897741513436611 +SmallBody71 1.1053539394491334998e-06 0.0012221682205234687057 1.0978911404624207108e-05 -0.88032817582412259405 0.008005928497239050978 0.32284168761100751066 -272.37506606187326952 58.34741166490307762 222.9991401165076752 +0.5804775052596473639 0.006606364723628247587 0.35126971133492751465 +266.67191037878211546 347.85365732062336974 196.00158209101920193 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody71 1.1053539394491334998e-06 0.0031561172624764302416 +SmallBody72 1.1053539394491334998e-06 0.0026308596582066154685 1.0978911404624207108e-05 -1.4990203836625171085 0.005123403698736885524 0.0565805471353558187 -222.61764027553329015 15.581020765914104231 49.313482304184191207 +1.2495455416357714729 0.002031665833294462719 0.32894383168929558492 +180.19692357114033143 187.6939538154834679 245.18398176961554213 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody72 1.1053539394491334998e-06 0.0024433392566886891639 +SmallBody73 1.1053539394491334998e-06 0.0025459751819877767305 1.0978911404624207108e-05 -1.1604813907026119146 0.007303514048424671924 0.13882682659903528011 -140.85830088218762057 70.182013379350649984 354.88230752734301632 +1.2092290547861306305 0.0062147785036781658108 0.42828731835165739783 +351.15138514894761101 140.23344369553493038 252.31698431602899291 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody73 1.1053539394491334998e-06 0.002840560638411957164 +SmallBody74 1.1053539394491334998e-06 0.0026758393184655913376 1.0978911404624207108e-05 -1.3491445164708089077 0.005720642229715540601 0.14981819009776592422 -352.3487865630142437 211.34103074075423478 192.0694520334756703 +1.2709089517916776213 0.0029285359688681514116 0.40818349943589532502 +346.8551108771299596 12.119434598934258673 249.55690237557612932 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody74 1.1053539394491334998e-06 0.0031444797715256892693 +SmallBody75 1.1053539394491334998e-06 0.0038435765356302306976 1.0978911404624207108e-05 -1.4934930744090704202 0.0031276427636128647028 0.3214666381100500514 -175.07919233828184247 35.481995834318553307 260.6360034601860889 +1.8255340641417958647 0.004337083773540291974 0.12440740004749534231 +0.21158758918201403532 315.85729824918280428 23.028332918127727424 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody75 1.1053539394491334998e-06 0.003459255021998138457 +SmallBody76 1.1053539394491334998e-06 0.001962369310037469242 1.0978911404624207108e-05 -1.6429978226453376688 0.009295252819063579489 0.49102576894325750123 -345.02654860489548128 345.52660132514841962 310.74654593341955433 +0.9320412872466534715 0.0072527006896398269614 0.33669899514991330491 +314.09559552333024612 29.746778859664111394 138.08651123959521101 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody76 1.1053539394491334998e-06 0.0022873662080603565067 +SmallBody77 1.1053539394491334998e-06 0.0034266742915467665759 1.0978911404624207108e-05 -1.0864008798243816045 0.008384640338494970396 0.27205559161590919803 -253.52651755208796658 290.75194124657178918 159.72113624314474123 +1.6275233725538036378 0.004486668873624886922 0.0018127120154187714718 +208.63800449670034709 178.44725683460612231 295.00705561696236146 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody77 1.1053539394491334998e-06 0.0012272542532064478338 +SmallBody78 1.1053539394491334998e-06 0.0035827057041377866747 1.0978911404624207108e-05 -0.5828931527244621824 0.0019247710050318911704 0.35217059511512804892 -128.04935681999808139 128.25988178793110706 38.454554612780782463 +1.7016316038120020693 0.008074545809734847562 0.2024727100717404471 +189.54840202229254942 346.288978261405191 336.5068221459076767 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody78 1.1053539394491334998e-06 0.0026543878147870777827 +SmallBody79 1.1053539394491334998e-06 0.0014758979985400451381 1.0978911404624207108e-05 -1.2607204072605178169 0.0096473280615230992685 0.42213107167069263692 -216.82569867369645067 235.68868231250542067 139.71833578625705741 +0.70098827135538399613 0.0050294491101013204942 0.37130662544207221343 +117.532332239196989576 119.15539963745180785 126.925668244431079756 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody79 1.1053539394491334998e-06 0.0009780107056720420075 +SmallBody80 1.1053539394491334998e-06 0.0015255152064378374044 1.0978911404624207108e-05 -0.46451315376419793912 0.008467739880838711167 0.09984937286937312084 -25.346273704217509248 167.68809971291636884 218.82435230989008801 +0.72455431780856671686 0.003950446349021759229 0.3068308339372661231 +36.56291538527193552 161.75570886946522364 245.93043129193375762 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody80 1.1053539394491334998e-06 0.0015585452504019390022 +SmallBody81 1.1053539394491334998e-06 0.0011590532892219572599 1.0978911404624207108e-05 -0.7402421725546883824 0.00081815707488439471263 0.027275888583668805865 -78.168111726190360855 118.103475439356216725 271.37806527923407884 +0.55050061889383805624 0.008508557323662622671 0.093253923803440552653 +124.451163796711156806 347.73017221758141204 183.74365373633969512 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody81 1.1053539394491334998e-06 0.0036228037421964175176 +SmallBody82 1.1053539394491334998e-06 0.0024439578873632304452 1.0978911404624207108e-05 -1.7206764527184079672 0.0020388197417552213556 0.2779771865718832502 -188.21340057803570289 56.037973252133966184 346.32195813540357676 +1.1607752137497215905 0.00108159632099681614 0.1793530901487539464 +85.69565254676035693 163.58450447375494718 246.78582364352257628 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody82 1.1053539394491334998e-06 0.0028566024176281324616 +SmallBody83 1.1053539394491334998e-06 0.0041849171231261979345 1.0978911404624207108e-05 -1.3567636738199855273 0.0064602626792048187254 0.49422002485399357807 -305.31013000174260696 158.96334607327713684 9.2952725232621382645 +1.987656208496568544 0.008796530612750232819 0.21319751377321760621 +282.4698261721002268 13.883490992204517767 193.43011573870168718 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody83 1.1053539394491334998e-06 0.0030364083037735251215 +SmallBody84 1.1053539394491334998e-06 0.0035583177618115590538 1.0978911404624207108e-05 -1.4421637607048936047 0.003164481042823339297 0.14375208160874736185 -280.5711764965416819 198.45145802447700589 122.38992208970854847 +1.6900483768206462365 0.0029694984676444315282 0.43619357254784330014 +199.84303896526179756 4.9382382008980618693 153.69868992069012847 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody84 1.1053539394491334998e-06 0.0018847712591592793446 +SmallBody85 1.1053539394491334998e-06 0.003650212543420925295 1.0978911404624207108e-05 -0.89518554003413797204 0.008354232084976069214 0.32514509699956206656 -72.82349432517753485 24.921837702544884507 116.15812089477469726 +1.733694458169527719 8.37953811003178139e-05 0.49730476275208318482 +76.67449702244863374 109.74398992658458951 289.31049603383297608 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody85 1.1053539394491334998e-06 0.0032273771675824087141 +SmallBody86 1.1053539394491334998e-06 0.002135981151471338737 1.0978911404624207108e-05 -1.5328657833761838436 0.0061896190689282827233 0.34623152187383665623 -352.86954858625608722 142.80960466527201902 269.9476990871480666 +1.0144994684583215072 0.004506861636329010344 0.04762916404555184169 +352.8677626105417744 154.41611377083665957 134.09312216693749065 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody86 1.1053539394491334998e-06 0.0040634164063012070394 +SmallBody87 1.1053539394491334998e-06 0.003200581292058947748 1.0978911404624207108e-05 -1.9299485772511566495 0.0031536402555862341236 0.3950675392513491313 -139.96088035745842149 181.76039716652948641 296.43536960581485573 +1.5201388913543600889 0.005572932191637661528 0.41540019173215758652 +268.21187697796170823 48.902911826943373796 262.3436588669285925 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody87 1.1053539394491334998e-06 0.0037177872852294766954 +SmallBody88 1.1053539394491334998e-06 0.0012861207686880307786 1.0978911404624207108e-05 -1.7657895633153577464 0.008302463231769427812 0.008650241018383963976 -326.76492167094011165 248.04800625477449216 143.12774627005794059 +0.6108522237232498764 0.005429823746949486059 0.4157807676443512901 +327.8425030797158115 27.98437582738972651 42.77216027009259136 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody88 1.1053539394491334998e-06 0.0029394228179550476069 +SmallBody89 1.1053539394491334998e-06 0.0011761722209149318581 1.0978911404624207108e-05 -1.3960998131165724967 0.009864572886023466672 0.16006323209123973772 -161.58563417885309832 300.60320078078825645 271.84316795198083128 +0.5586313774874398508 0.0031758045904765452166 0.101357753154031782206 +296.28816067879887441 283.822297721177506 334.6154077534155249 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody89 1.1053539394491334998e-06 0.0021301474391629660392 +SmallBody90 1.1053539394491334998e-06 0.0036412139412147807882 1.0978911404624207108e-05 -1.0117287052276131565 0.0027700618814613365247 0.06101905242943728158 -90.188877701137116105 0.14553788257543054385 151.58365796171364082 +1.729420507929511297 0.0031178033685856634469 0.2575855781953989565 +69.84018972442507334 62.167401490125023145 330.0595318836462866 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody90 1.1053539394491334998e-06 0.0030529567836454087592 +SmallBody91 1.1053539394491334998e-06 0.0030033226640541959833 1.0978911404624207108e-05 -1.4500235791411446584 0.0051415674121213740186 0.035783766155871643555 -19.607471849850583112 137.4149541556064662 295.3619168323355666 +1.426449500358662581 0.0020081709600639477062 0.22600455672962604936 +284.87116687156947137 94.95424318278870146 53.66013829009383329 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody91 1.1053539394491334998e-06 0.00064875962033329815164 +SmallBody92 1.1053539394491334998e-06 0.0011083051001590989141 1.0978911404624207108e-05 -0.30813300460633064048 0.0068435724329741955824 0.25415063445939684028 -113.703628424172109135 315.29312159144251382 30.016315228589590447 +0.5263974048771655756 0.005519262107960243649 0.4757355366967259136 +161.12521856985677005 123.28366453298917804 315.06783952424086692 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody92 1.1053539394491334998e-06 0.0031774066214905104554 +SmallBody93 1.1053539394491334998e-06 0.0012127048213767872621 1.0978911404624207108e-05 -1.5091319164298944155 0.008761774007885180307 0.3729577687009506537 -86.71738414973454212 203.68279937784481604 178.04985347510225324 +0.5759827964006745127 0.0035395840478532037375 0.2742620450020670786 +114.32380284259015468 316.44931732492420906 69.43354290911554472 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody93 1.1053539394491334998e-06 0.0013602341599096074799 +SmallBody94 1.1053539394491334998e-06 0.0019679363219885160354 1.0978911404624207108e-05 -0.64605290700088136013 0.0028866588611838571443 0.123745735802174794404 -354.80506939301045577 301.26726001571074676 20.783162938658389152 +0.93468537924219741164 0.006668566768847774412 0.120331645988828450644 +15.981416727773186892 109.48045067821274756 119.3717579036452463 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody94 1.1053539394491334998e-06 0.004066691095601753041 +SmallBody95 1.1053539394491334998e-06 0.001665356753916010893 1.0978911404624207108e-05 -1.9315039142692205232 0.0022152965415877636304 0.48054874999633290233 -133.09052109598391667 191.53766059844949154 81.83111779972121269 +0.7909730572657345249 0.0087883446026040274585 0.45799248207591430893 +293.11097031314750438 196.40564036731450415 150.97581680478862154 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody95 1.1053539394491334998e-06 0.0021660555110931399977 +SmallBody96 1.1053539394491334998e-06 0.0031494462429892897639 1.0978911404624207108e-05 -1.0287834998644624918 0.0048806432832589697127 0.40599080267573434133 -284.29323859414336084 206.50267632987038269 32.181201191434148257 +1.4958519354207724383 0.0078384276253645052135 0.23057847829940381068 +187.22691615495435258 143.57930146928600834 300.05148838927118504 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody96 1.1053539394491334998e-06 0.0012256412334758639172 +SmallBody97 1.1053539394491334998e-06 0.0037139675097976452121 1.0978911404624207108e-05 -0.58212703750937100367 0.006815394001574134712 0.07111194936362880137 -356.8708968589809274 272.2075288690623438 105.15655667544666585 +1.7639753337550669876 0.00058526678535686382787 0.31377985952056214325 +96.073907241268287294 66.097445801554471245 146.26152385491423047 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody97 1.1053539394491334998e-06 0.003625916465309114207 +SmallBody98 1.1053539394491334998e-06 0.0009376304215520192408 1.0978911404624207108e-05 -1.7221548627414147159 0.003762997164236574557 0.24815013062447038861 -147.28961407645965664 218.03440726170023822 1.8591648258108683933 +0.4453342500797059511 0.005402555175319281519 0.1563447182758816445 +150.65938548412697173 129.60102495664250455 298.9416915331759128 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody98 1.1053539394491334998e-06 0.0008081494427977152585 +SmallBody99 1.1053539394491334998e-06 0.0023466136892612675851 1.0978911404624207108e-05 -0.383836336565244296 0.0040007873825194332357 0.08120615205831077654 -124.07811978970127598 166.61704692849599496 199.01689105952982572 +1.1145408932062483842 0.0090975189299379727315 0.45482889277417670737 +89.719047762599629436 286.27451258390016164 21.998612599652954458 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody99 1.1053539394491334998e-06 0.003021340601443785476 +SmallBody100 1.1053539394491334998e-06 0.0036042149048601778175 1.0978911404624207108e-05 -1.4350072481140032643 0.004057562854776786479 0.16489395982405652408 -92.709269128307440155 214.9999281263282569 57.464246578171120916 +1.7118475519652889272 0.009055900701920591503 0.22094329683365754313 +287.5728030058700142 5.3589737449812568926 121.09435219102297765 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody100 1.1053539394491334998e-06 0.0009475797808058692764 +SmallBody101 1.1053539394491334998e-06 0.004177037313904747932 1.0978911404624207108e-05 -0.450059769154431355 0.0037395517851033176736 0.45479598440039348262 -26.317730599306557338 23.931789830584875745 143.91842879072783035 +1.9839136369569239093 0.00089942446384002174356 0.06184857477503691303 +184.64410637865165654 193.78867613591432928 247.20281327688800843 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody101 1.1053539394491334998e-06 0.0026909717843638427215 +SmallBody102 1.1053539394491334998e-06 0.0034917647268310307955 1.0978911404624207108e-05 -1.2780962243009246215 0.0035555600141111065246 0.3257354511083095927 -192.7416849222909434 164.91900290185728295 333.67905845802670228 +1.6584385386132607376 2.8075269902115839197e-05 0.04242993985314380545 +80.55152924373120982 109.48248599757039301 147.04779191594042231 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody102 1.1053539394491334998e-06 0.0041810760162440572295 +SmallBody103 1.1053539394491334998e-06 0.0018358130659390312309 1.0978911404624207108e-05 -1.9858318474119498465 0.007254756249778001459 0.41576480580086311312 -105.64094867962499791 318.98199615126588924 22.47872975241655169 +0.871932497298059328 0.003865347425684947675 0.45248086692718403334 +267.06624420510524942 272.16072602226120125 97.21049707720219146 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody103 1.1053539394491334998e-06 0.0007996094815216030466 +SmallBody104 1.1053539394491334998e-06 0.0009961246488978876669 1.0978911404624207108e-05 -0.37978022110312864568 0.0047214882095757814556 0.01341383505492060868 -103.99287880664391537 101.414451660559109314 179.41217948023177087 +0.4731165001755865407 0.00018215173839106869142 0.020988643787622551784 +351.87198325404813204 117.171842981893476576 211.50245566826470167 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody104 1.1053539394491334998e-06 0.0041316235921579503004 +SmallBody105 1.1053539394491334998e-06 0.0010521274211646043996 1.0978911404624207108e-05 -1.962344066204342985 0.001297636502650572005 0.4471175237115694867 -84.38714843221671913 15.1728657372036792594 321.65176691418702148 +0.49971541592802215526 0.0078217984607909171735 0.33700162667911554015 +298.54816397832667008 261.0376684663759761 268.33032509548360167 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody105 1.1053539394491334998e-06 0.0006468297403521850707 +SmallBody106 1.1053539394491334998e-06 0.0008060914125760300691 1.0978911404624207108e-05 -0.3072163943573689715 0.002069552547494897185 0.06067182285957134491 -14.403233133169720759 137.80158957237256345 145.80670189311638296 +0.38285886044635036862 0.008097211239727968371 0.23983964363154663957 +132.15823015688874875 249.60545854775469365 129.91248150410982021 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody106 1.1053539394491334998e-06 0.0015291286852166491375 +SmallBody107 1.1053539394491334998e-06 0.0018401646289936616459 1.0978911404624207108e-05 -0.7262705653034777775 0.0036886731925131191132 0.307053270062749184 -259.23562206716201217 48.774316930331721665 261.170258806677964 +0.8739993031792088196 0.007885116676628872029 0.37978548582970406144 +17.667600689734385355 210.61746945153194588 196.43391786767980989 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody107 1.1053539394491334998e-06 0.0023265433330934118486 +SmallBody108 1.1053539394491334998e-06 0.0018536452717464226642 1.0978911404624207108e-05 -1.1050083345270516055 0.0021619185594817648226 0.32733237728798875166 -10.142047630130853975 212.86498766789461001 117.3267626732119453 +0.8804020305149495851 0.0013794006984467266971 0.26346466351854286314 +254.9539705880254985 205.43238842788551324 122.144017495580698096 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody108 1.1053539394491334998e-06 0.0011665670476203062816 +SmallBody109 1.1053539394491334998e-06 0.0036875419284336350676 1.0978911404624207108e-05 -0.55406933198664720663 0.0049526344715693608467 0.2827810313805791953 -155.34731745098386568 309.39073596933502586 84.99503647176723575 +1.7514243155829152254 0.0013678952795426902594 0.123704372454268463066 +131.52075526346038714 118.165228300980302834 334.8452791953995984 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody109 1.1053539394491334998e-06 0.003262805107546985368 +SmallBody110 1.1053539394491334998e-06 0.002362038229611548831 1.0978911404624207108e-05 -1.54969253591465006 0.0014634230002845761195 0.34160518035174364249 -161.22273174154071285 313.478568111725167 211.56542262438233593 +1.1218668885577500749 0.00919480252541974262 0.4193036507438517857 +205.06059433110686996 349.61078704935107453 182.18047202289503161 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody110 1.1053539394491334998e-06 0.0015382966919372130521 +SmallBody111 1.1053539394491334998e-06 0.0014184120245393167206 1.0978911404624207108e-05 -0.73062497542475979273 0.0018662111938524982881 0.47978521949566910187 -42.599778446102199325 323.68686590233079414 260.06072539586818948 +0.6736848983703858096 0.0083531057511023274614 0.22806179640198764869 +247.63026686832256473 22.743578978697456705 196.99677932251091761 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody111 1.1053539394491334998e-06 0.0030189705886898708342 +SmallBody112 1.1053539394491334998e-06 0.00090218315204428206853 1.0978911404624207108e-05 -1.4338815936683029229 0.007854986736292183039 0.034614304523278571768 -220.97166421899538591 100.270100143954621785 69.89976223012565981 +0.42849831683697725548 0.0077287908582096519206 0.105149254482249487896 +253.69830147230294415 337.20903933062618307 15.887727537436497016 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody112 1.1053539394491334998e-06 0.0012520764056687804838 +SmallBody113 1.1053539394491334998e-06 0.0041671217738134337225 1.0978911404624207108e-05 -0.5946826109140541661 0.004228441446919988314 0.48169411754613156162 -211.7494079431474745 247.34135423949993537 271.44979516436404765 +1.979204180534433366 0.0023222774165393691645 0.15776441287425713167 +256.0244883237422755 186.77731837310594187 210.27075551184211122 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody113 1.1053539394491334998e-06 0.0020341208345655149776 +SmallBody114 1.1053539394491334998e-06 0.0037234180189260659195 1.0978911404624207108e-05 -0.96612018510801100923 0.0038251263510292701948 0.10211507788692092413 -94.997718911079232385 72.20047856021278676 177.12490005041385643 +1.7684639204080152552 0.0048923341387555156767 0.18584046914891033664 +313.1367182478481368 20.291058860939237718 14.830653668149720303 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody114 1.1053539394491334998e-06 0.0036771750591194379922 +SmallBody115 1.1053539394491334998e-06 0.0015485822750073396757 1.0978911404624207108e-05 -1.746500497129936269 0.0058508507173112688643 0.041718288224785682328 -343.583602423471973 2.3923430163143555305 21.049002232435121584 +0.73551018639688825473 0.004955578380412001792 0.2542579857945891364 +126.67824666224566954 180.59420107988003679 251.77903864847220916 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody115 1.1053539394491334998e-06 0.0037508323771434353573 +SmallBody116 1.1053539394491334998e-06 0.0038524635535576166553 1.0978911404624207108e-05 -1.7814845651924926528 0.0070428576311776583396 0.42896385937108449937 -225.1566819158494468 49.358015725800711948 130.80343322774197645 +1.8297550166334890509 0.004420989995721213116 0.050995343716709384818 +200.53521365396184706 174.92280986408158583 63.09881703506901829 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody116 1.1053539394491334998e-06 0.0020312318442109675703 +SmallBody117 1.1053539394491334998e-06 0.002877861961986883982 1.0978911404624207108e-05 -0.96474803855276136666 0.0010046447322486307206 0.11664706284615694587 -77.674155996469721686 249.84767415263414136 55.65928972394180363 +1.3668610459043613048 0.009617796897453803617 0.38436144468911415117 +351.45830670101508986 2.6855955544584331207 34.117423751931553966 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody117 1.1053539394491334998e-06 0.000974112043281249845 +SmallBody118 1.1053539394491334998e-06 0.0025749721082934398766 1.0978911404624207108e-05 -0.46266145628061638995 0.0063666039556358813845 0.44153244695566923328 -293.91178927167914026 5.1655049063911606666 314.89223144009667976 +1.2230013515612012664 0.0011610078708781479493 0.046776969767367171382 +40.226079876629214027 287.61432809202983663 41.326237938535143712 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody118 1.1053539394491334998e-06 0.003556444135703642334 +SmallBody119 1.1053539394491334998e-06 0.0038644464188619738641 1.0978911404624207108e-05 -1.6891584847496128319 0.00046239007278428225943 0.4111588368317175557 -274.4195616566905187 310.5383527188005246 290.2995654268337944 +1.8354463638972531303 0.0027502147876890203036 0.12079272567478699374 +13.051150165370945189 227.20520594651023316 288.29312495148258222 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody119 1.1053539394491334998e-06 0.0026110924430802409018 +SmallBody120 1.1053539394491334998e-06 0.0020103839188844267676 1.0978911404624207108e-05 -1.2401569619543475476 0.0055636321901455041555 0.124411556495122033184 -80.591271036595884425 93.531937081230040576 91.02581530568424739 +0.9548461678608475278 0.0016713812467888655971 0.28251343730774014507 +146.79316702173738918 191.18861640108599431 109.246310882898370664 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody120 1.1053539394491334998e-06 0.0022292651491043821605 +SmallBody121 1.1053539394491334998e-06 0.003383264836668941294 1.0978911404624207108e-05 -1.058805367856919144 0.008856431115937380902 0.22985551372836227069 -103.40731004504169732 278.42753807868166405 161.92298625486941432 +1.606905742632638967 0.00064548815040708972055 0.46791632868668114886 +214.0789863490610685 0.12710902515905342369 112.51561260655698504 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody121 1.1053539394491334998e-06 0.0023714005649848728144 +SmallBody122 1.1053539394491334998e-06 0.001123742298873384317 1.0978911404624207108e-05 -1.1263135964574069181 0.00017054783801896290373 0.4551410040723882222 -105.3440152261756424 219.93423944623813782 353.84921407221094114 +0.53372941240885196645 0.009977035962730642152 0.27264558842097247338 +275.22886951319594573 286.08119290465145923 109.60038722911731668 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody122 1.1053539394491334998e-06 0.0017365893716236742182 +SmallBody123 1.1053539394491334998e-06 0.0006432347002883277041 1.0978911404624207108e-05 -0.8248054966351270334 0.0055371318107404737113 0.18749094029727253474 -305.60396836315686642 61.663571188350786656 195.18191086891513919 +0.30550890446151601765 0.0016760221201281178417 0.32538537139230516715 +265.25215774313522843 148.99759002817140185 124.13413438356363372 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody123 1.1053539394491334998e-06 0.0017727724852365723844 +SmallBody124 1.1053539394491334998e-06 0.003036828770261148186 1.0978911404624207108e-05 -0.84199092427907729075 0.0043065589255132140714 0.2675084388459675333 -38.470555172757549656 257.86123937948008233 183.30306588402953594 +1.4423634642593488042 0.009141341764341484946 0.039791008756628498677 +98.63272077981082475 270.17713718140805668 202.32526550621426509 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody124 1.1053539394491334998e-06 0.00094409454073867135766 +SmallBody125 1.1053539394491334998e-06 0.00081874486454519645577 1.0978911404624207108e-05 -0.4484044295494042376 0.005010474032756404364 0.15668152843086047277 -147.71326304493319981 322.57992193070856501 156.73534881298201071 +0.3888687076250296748 0.0021584596979441726672 0.031670778401195365248 +281.66318976366977722 7.357287548155002632 355.8272360213076695 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody125 1.1053539394491334998e-06 0.0032754931475123096045 +SmallBody126 1.1053539394491334998e-06 0.0039960198542602162104 1.0978911404624207108e-05 -1.5557188109085715588 0.007473354630028248083 0.34840638866081469205 -52.632633320882533212 35.15462414717750761 124.31246142990700321 +1.8979381046051735371 0.0037559774236174238785 0.41211360621909687296 +61.813896366572002705 29.055610630471562672 38.448989476032949142 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody126 1.1053539394491334998e-06 0.0025963640847439910755 +SmallBody127 1.1053539394491334998e-06 0.0009149892206878139238 1.0978911404624207108e-05 -1.2331616232112614373 0.008238562530627425301 0.42399484169233947473 -63.706532055494825784 25.70985870870202561 86.201329802784854905 +0.43458065039266180474 0.0069716072765846496054 0.009409196509767681071 +180.68351555608862213 333.18017309121370317 83.35504912247611742 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody127 1.1053539394491334998e-06 0.0038812889913659328306 +SmallBody128 1.1053539394491334998e-06 0.0010913913911420057976 1.0978911404624207108e-05 -1.8434458637247526092 0.004680365985859572496 0.27780307484521127304 -44.297859819313217145 319.2557910969932209 56.73815808854173781 +0.51836411825584871593 0.009008475292090643502 0.42394712017791696956 +76.26327551422369311 262.55447081899131945 32.255078645407145643 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody128 1.1053539394491334998e-06 0.0028165808881701460246 +SmallBody129 1.1053539394491334998e-06 0.00087749776001502680785 1.0978911404624207108e-05 -1.3377551632186404085 0.003719109121861046384 0.3140927561272534585 -43.246668183993357104 193.2453748363514876 49.380547237145876238 +0.416773813989602393 0.0024590338429388534924 0.22562645108049261822 +15.819312377025722682 12.224459424754545722 106.02034556611799587 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody129 1.1053539394491334998e-06 0.001979252152895991799 +SmallBody130 1.1053539394491334998e-06 0.002170678072290993283 1.0978911404624207108e-05 -0.9400599137660112792 0.0030979164694139040524 0.12701535332402813516 -84.99503342739515688 226.20476970399542438 171.66651562275484366 +1.0309790182448133056 0.0073522276566752187837 0.48335397850744188375 +194.11007019457898082 86.771967888170806305 176.35435267523482139 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody130 1.1053539394491334998e-06 0.0017130867917206263939 +SmallBody131 1.1053539394491334998e-06 0.0018491827945856857923 1.0978911404624207108e-05 -0.8136427788355728996 0.0073092069346394495516 0.085814698783936105286 -212.90921320180737553 9.763998354941886504 196.01088884421542957 +0.8782825451887534829 0.0067295105164212540294 0.15715559285768937459 +212.16104068491762291 174.75466543172368006 275.40083616632017538 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody131 1.1053539394491334998e-06 0.0022358482630314104035 +SmallBody132 1.1053539394491334998e-06 0.003901379951796391995 1.0978911404624207108e-05 -1.061932064726491376 0.0019027594188349805475 0.44476175906320358777 -157.18551589009481972 298.71764639949674347 262.90690529651982388 +1.8529882085452946683 0.0010073529794058454744 0.13332637089911064665 +292.2958158179013708 1.891272359638920264 74.00674726388690772 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody132 1.1053539394491334998e-06 0.0030586636594471469293 +SmallBody133 1.1053539394491334998e-06 0.0010551691291876035957 1.0978911404624207108e-05 -1.4527341004692158055 0.0062927146114276216737 0.4423521059459766258 -302.02420770009632633 148.5803921871369937 246.85928425279297471 +0.50116009682813800197 0.0021758576105712123042 0.02202781544352166998 +46.38659554024288667 249.67397170791653593 270.3148441879617394 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody133 1.1053539394491334998e-06 0.0026878291059565319547 +SmallBody134 1.1053539394491334998e-06 0.0034801495362615294697 1.0978911404624207108e-05 -1.2766035867972855833 0.007637980856047291156 0.4059059184123336994 -161.50116546845228527 77.850685558381286455 264.8286603906785217 +1.652921821084791798 0.0059866438847831103184 0.35594716810617565983 +15.723173357075621581 264.17832635646095696 347.42854121523549793 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody134 1.1053539394491334998e-06 0.0027943947444222948776 +SmallBody135 1.1053539394491334998e-06 0.0034553539663358196749 1.0978911404624207108e-05 -1.3272176961516530813 0.004701184643604254705 0.36952456793924481904 -47.269844566301287614 4.9163514335424984836 355.22962273370120556 +1.6411449884603905858 0.0070857780187495878615 0.405548681726294602 +81.87905712873534014 111.4217703340252541 202.10718310852169566 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody135 1.1053539394491334998e-06 0.0031563510355617611948 +SmallBody136 1.1053539394491334998e-06 0.0042013244939220061563 1.0978911404624207108e-05 -1.4991314158552144775 0.00015436034423323640417 0.1917380856368509634 -172.68410025626315019 292.7689313206145698 242.35314712175855334 +1.9954490061716230187 0.009604522241949643366 0.113267377951083214604 +142.89047522640291277 48.117766373190107743 121.52571344044037005 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody136 1.1053539394491334998e-06 0.00079256183150516454785 +SmallBody137 1.1053539394491334998e-06 0.0032301774598376437692 1.0978911404624207108e-05 -0.3764328895077013737 0.005331669234970675547 0.037038119773405431268 -137.29879269110134032 276.60344003919925626 318.224575012218736 +1.534195802137120479 0.0098685149817888517115 0.27668795256550338113 +255.56918861478004601 280.21201795717837513 332.2787448725723607 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody137 1.1053539394491334998e-06 0.0024729521662073515708 +SmallBody138 1.1053539394491334998e-06 0.0023301839271203156769 1.0978911404624207108e-05 -1.1745462530940675716 0.0025436198446592396885 0.19726208266038036676 -200.11200833959856027 328.50318859698677443 25.032545226553306605 +1.1067374606022617467 0.0063011106970540901873 0.37833337715458070782 +256.42776005034045284 77.543023468318807545 154.67314936742405962 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody138 1.1053539394491334998e-06 0.003141353993759099369 +SmallBody139 1.1053539394491334998e-06 0.004052809813013481092 1.0978911404624207108e-05 -1.4920084639851722841 0.008895169829864444169 0.40742482505034210982 -125.08982552404354749 13.6810870370561410425 125.89960225777221581 +1.9249109001887259041 0.008610323109244940806 0.2392596397695851973 +74.080774563989209014 310.4431197863084435 5.2810312055210317794 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody139 1.1053539394491334998e-06 0.0024697651374539426903 +SmallBody140 1.1053539394491334998e-06 0.0022331906704604384985 1.0978911404624207108e-05 -1.1730325510775176934 0.009714048229482108096 0.4495197610396466925 -276.1486670185516914 249.96765269618634875 38.405693580368897244 +1.060669822197444434 0.0069455314949981670353 0.4114229834516269224 +23.451263907073990111 260.4688811495023515 99.454701790253693616 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody140 1.1053539394491334998e-06 0.0009277239963550222287 +SmallBody141 1.1053539394491334998e-06 0.0035456750285586234618 1.0978911404624207108e-05 -0.4406291228412222427 0.0011498177626615313941 0.24676970418810539876 -215.50167505295402748 65.33626690753465027 206.42806807478683595 +1.6840436205726201369 0.008606120814077458311 0.39137564936045776687 +41.764363225092509424 328.768245787753699 96.166117544944881956 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody141 1.1053539394491334998e-06 0.0033835772813540165789 +SmallBody142 1.1053539394491334998e-06 0.0010759666366262836943 1.0978911404624207108e-05 -1.6070541404622327164 0.004719441710564133141 0.4984568824987272717 -47.33899341199827404 82.97698800601314417 283.4966539407437267 +0.5110380211849447907 0.0063158763456751376014 0.12533644493608675496 +273.4239174531699632 126.29059059741834403 80.20595283508792761 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody142 1.1053539394491334998e-06 0.0029520691321285031499 +SmallBody143 1.1053539394491334998e-06 0.0034220908063155763612 1.0978911404624207108e-05 -1.4021062701483164581 3.6003378605201640536e-05 0.4090674261173213866 -121.20788516521034239 247.02993176949499343 145.1606631047432927 +1.6253464135822668357 0.008519275791631654091 0.40094592229643022385 +299.1683398830161309 326.78839385032341625 60.680433772656201086 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody143 1.1053539394491334998e-06 0.0021549829461906115147 +SmallBody144 1.1053539394491334998e-06 0.0032052436607735247348 1.0978911404624207108e-05 -1.0235245062631623814 0.007773773829953017217 0.17819203426573304583 -133.79316693748211264 145.67071914831808499 74.72284817886242081 +1.522353316598439088 0.0096022921894474370236 0.000101839905715050971224 +78.70797994594754243 270.7670405205773818 278.0958215146567909 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody144 1.1053539394491334998e-06 0.0026211917416770771317 +SmallBody145 1.1053539394491334998e-06 0.0013432108020539927865 1.0978911404624207108e-05 -1.2449536957884614896 0.0009156041969351491616 0.26838610331624801475 -191.78935301636164468 61.319754558406870615 198.83867506070333775 +0.6379675418823733679 0.008956863220517736687 0.36254650513481928575 +121.29025177946014935 189.64769184547239433 184.50657012398698953 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody145 1.1053539394491334998e-06 0.002779232403688257159 +SmallBody146 1.1053539394491334998e-06 0.0027578080848200011476 1.0978911404624207108e-05 -1.3200162343762673611 0.0011825034198607953326 0.3931650954771686024 -199.15447694467161455 110.263445447020046686 357.83521607737361592 +1.3098406014644528028 0.0056589502407743417015 0.08293282783205013775 +315.32825454372186869 279.82080093042981161 19.65029600018359801 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody146 1.1053539394491334998e-06 0.0007386121576737557171 +SmallBody147 1.1053539394491334998e-06 0.0023981914504280625166 1.0978911404624207108e-05 -0.35080910748707688773 0.0027024900833699395247 0.19622296338412259509 -292.6436334273752209 93.80156934406009839 28.132779645617151942 +1.1390381184050475394 0.0054921408623832372597 0.33632472865489532188 +39.60708748515543931 265.44784092754434823 323.46447648207958991 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody147 1.1053539394491334998e-06 0.00087410562446381314443 +SmallBody148 1.1053539394491334998e-06 0.0027667358427180895877 1.0978911404624207108e-05 -0.41516269503788583162 0.008753675790044105481 0.049200587066592693652 -245.22266454023861115 133.22745192774976886 358.34006313094175766 +1.3140809036955358735 0.008080088517111517696 0.33090618278665295815 +182.2317633907563561 87.796139009040985 55.611849921214940196 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody148 1.1053539394491334998e-06 0.0040583585328557611443 +SmallBody149 1.1053539394491334998e-06 0.001636891482929803791 1.0978911404624207108e-05 -1.9275463042168652361 0.008863374200234029263 0.11472348585362174278 -68.51868890765923936 343.0156047967958557 250.37058077253891497 +0.7774532739731071507 0.0061030699634475847615 0.38140665724921773982 +134.26070969249215636 309.66180555526386797 227.75826272973381492 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody149 1.1053539394491334998e-06 0.0028701976421156316045 +SmallBody150 1.1053539394491334998e-06 0.0033168831098759378657 1.0978911404624207108e-05 -1.3632208225671262891 0.00037100362980518777727 0.40857805997329038616 -138.99534285941138023 75.25892901304128202 102.39451884516589075 +1.575377268469625669 0.0059246316490175207972 0.022806742355012399326 +351.98634627032316757 21.746445058869653622 77.129697842788047524 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody150 1.1053539394491334998e-06 0.0028371368040875375277 +SmallBody151 1.1053539394491334998e-06 0.0008955120407553322315 1.0978911404624207108e-05 -1.3475183419608791624 0.00923347856029827288 0.111868912647413332184 -163.972662313269268 324.1674645569764266 326.5948943827923472 +0.42532982499330906911 0.008813648447450198736 0.3345833792526932693 +35.495600304697589422 353.72250623508887202 71.293026142875973505 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody151 1.1053539394491334998e-06 0.002298777012902104625 +SmallBody152 1.1053539394491334998e-06 0.00076337994194106294544 1.0978911404624207108e-05 -1.0918205228950430552 0.0038962200559046968225 0.07185178854072693522 -95.25129914312677215 288.83172427646081815 113.743637781598437186 +0.36257274311502485364 0.0009343333415137500871 0.39929588634292678684 +47.20717343738380123 71.761948619615196776 175.59400320868542167 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody152 1.1053539394491334998e-06 0.0026756500371529266427 +SmallBody153 1.1053539394491334998e-06 0.0015551031619249502934 1.0978911404624207108e-05 -1.2708190512834474095 0.0031796818189825425474 0.34148938686865598635 -240.33583276715017973 159.13444408059913826 16.850108154309943131 +0.73860732810492057965 0.009823625903742597143 0.20706731183664767171 +49.3357061425451775 189.53336005615224735 130.90764325570890492 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody153 1.1053539394491334998e-06 0.0030031099519741718352 +SmallBody154 1.1053539394491334998e-06 0.0039929544866864698254 1.0978911404624207108e-05 -1.4263484712405121169 0.008772238975162893054 0.2928674262574444409 -332.10498285516734995 307.4942771576799032 198.04833839322409972 +1.8964821864328371692 0.001828422477509375043 0.40484379956372262832 +174.74748700727161577 352.56235568809995584 328.87472865506998687 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 -SmallBody154 1.1053539394491334998e-06 0.0037055221237351476841 +SmallBody155 1.1053539394491334998e-06 0.0007365912012181665501 1.0978911404624207108e-05 -1.7599641374645813574 0.0075196173991873881473 0.31916489509013851178 -47.261748044667832858 81.10596844478185119 286.61303054015036196 +0.3498492398175703788 0.008020197055140211584 0.08492570488832668074 +212.11388826902651772 279.1723246694339764 250.916201365835974 0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 0.0 0.0 0.0 From eee38ad7f45b02d7188b7554f480c1045e3671f8 Mon Sep 17 00:00:00 2001 From: David Minton Date: Sat, 28 Aug 2021 17:17:09 -0400 Subject: [PATCH 093/154] Updated movie script so that it can actually process out the empty data in a reasonable amount of time --- examples/symba_mars_disk/aescattermovie.py | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/examples/symba_mars_disk/aescattermovie.py b/examples/symba_mars_disk/aescattermovie.py index eaaa4d9b4..c91296c63 100755 --- a/examples/symba_mars_disk/aescattermovie.py +++ b/examples/symba_mars_disk/aescattermovie.py @@ -20,14 +20,11 @@ class AnimatedScatter(object): def __init__(self, ds, param): frame = 0 - nframes = int(ds['time'].size / framejump) self.ds = ds - self.param = param + self.nframes = int(ds['time'].size / framejump) self.Rcb = self.ds['radius'].sel(id=0, time=0).values - self.ds['radmarker'] = self.ds['radius'].fillna(0) - np.where(self.ds['radmarker'] > ncutoff, 0, self.ds['radmarker']) - self.ds['radmarker'] = (self.ds['radmarker'] / self.Rcb) * radscale - + self.ds = ds + self.param = param self.clist = {'Initial conditions' : 'xkcd:faded blue', 'Disruption' : 'xkcd:marigold', 'Supercatastrophic' : 'xkcd:shocking pink', @@ -41,7 +38,8 @@ def __init__(self, ds, param): self.ax.set_xlim(xmin, xmax) self.ax.set_ylim(ymin, ymax) fig.add_axes(self.ax) - self.ani = animation.FuncAnimation(fig, self.update, interval=1, frames=nframes, init_func=self.setup_plot, blit=True) + self.ani = animation.FuncAnimation(fig, self.update, interval=1, frames=self.nframes, init_func=self.setup_plot, blit=True) + #self.ani.save('aescatter.mp4', fps=30, dpi=300, extra_args=['-vcodec', 'libx264']) self.ani.save('aescatter.mp4', fps=30, dpi=300, extra_args=['-vcodec', 'mpeg4']) print('Finished writing aescattter.mp4') @@ -79,10 +77,10 @@ def setup_plot(self): def data_stream(self, frame=0): while True: d = self.ds.isel(time=frame) - d = d.where(d['a'] < ncutoff, drop=True) + d = d.where(d['radius'] < self.Rcb, drop=True) + d['radmarker'] = (d['radius'] / self.Rcb) * radscale radius = d['radmarker'].values - d = d.where(d['a'] > self.Rcb, drop=True) Gmass = d['Gmass'].values a = d['a'].values / self.Rcb From 44ea179096a4f0a94cbf4d79f2ff798dbe3d7e35 Mon Sep 17 00:00:00 2001 From: David Minton Date: Sat, 28 Aug 2021 19:56:31 -0400 Subject: [PATCH 094/154] Added proper npl variable reference to animation maker. --- examples/symba_mars_disk/aescattermovie.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/symba_mars_disk/aescattermovie.py b/examples/symba_mars_disk/aescattermovie.py index c91296c63..f4da3762e 100755 --- a/examples/symba_mars_disk/aescattermovie.py +++ b/examples/symba_mars_disk/aescattermovie.py @@ -86,7 +86,7 @@ def data_stream(self, frame=0): a = d['a'].values / self.Rcb e = d['e'].values name = d['id'].values - npl = d.id.count().values + npl = d['npl'].values[0] radmarker = d['radmarker'] origin = d['origin_type'].values From 18022745c75de914a8389eb21091902a79924d4b Mon Sep 17 00:00:00 2001 From: David A Minton Date: Sun, 29 Aug 2021 10:13:43 -0400 Subject: [PATCH 095/154] Switched to gfortran, as ifort keeps segfaulting without providing traceback. Fixed up some parallelized code and started adding more metadata to the particle info type. --- Makefile.Defines | 8 +++---- examples/symba_mars_disk/testnetcdf.ipynb | 27 ++++++++++------------- src/kick/kick.f90 | 2 ++ src/modules/swiftest_classes.f90 | 19 +++++++++------- 4 files changed, 29 insertions(+), 27 deletions(-) diff --git a/Makefile.Defines b/Makefile.Defines index e764b40ee..4e3ead7c5 100644 --- a/Makefile.Defines +++ b/Makefile.Defines @@ -67,13 +67,13 @@ GWARNINGS = -Wall -Warray-bounds -Wimplicit-interface -Wextra -Warray-temporari GPRODUCTION = -O3 -ffree-line-length-none $(GPAR) #FFLAGS = $(IDEBUG) $(HEAPARR) $(SIMDVEC) $(PAR) -FFLAGS = $(IPRODUCTION) $(OPTREPORT) -FORTRAN = ifort +#FFLAGS = $(IPRODUCTION) -g -traceback $(OPTREPORT) +#FORTRAN = ifort #AR = xiar -#FORTRAN = gfortran +FORTRAN = gfortran #FFLAGS = $(GDEBUG) $(GMEM) $(GPAR) -#FFLAGS = $(GPRODUCTION) +FFLAGS = $(GPRODUCTION) AR = ar # DO NOT include in CFLAGS the "-c" option to compile object only diff --git a/examples/symba_mars_disk/testnetcdf.ipynb b/examples/symba_mars_disk/testnetcdf.ipynb index 405947b38..50ac91b3b 100644 --- a/examples/symba_mars_disk/testnetcdf.ipynb +++ b/examples/symba_mars_disk/testnetcdf.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 1, + "execution_count": 10, "metadata": {}, "outputs": [ { @@ -11,7 +11,7 @@ "'/home/daminton/git/swiftest/examples/symba_mars_disk'" ] }, - "execution_count": 1, + "execution_count": 10, "metadata": {}, "output_type": "execute_result" } @@ -26,7 +26,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 11, "metadata": {}, "outputs": [ { @@ -48,7 +48,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 12, "metadata": {}, "outputs": [ { @@ -405,28 +405,25 @@ " stroke: currentColor;\n", " fill: currentColor;\n", "}\n", - "
    <xarray.DataArray 'origin_type' (id: 1533)>\n",
    -       "array(['Initial conditions', 'Initial conditions', 'Initial conditions',\n",
    -       "       ..., 'Disruption', 'Disruption', 'Disruption'], dtype='<U18')\n",
    +       "
    <xarray.DataArray 'npl' (time: 2)>\n",
    +       "array([1500, 1518], dtype=int32)\n",
            "Coordinates:\n",
    -       "  * id       (id) int32 0 1 2 3 4 5 6 7 ... 1526 1527 1528 1529 1530 1531 1532
    " + " * time (time) float64 0.0 6e+03
    " ], "text/plain": [ - "\n", - "array(['Initial conditions', 'Initial conditions', 'Initial conditions',\n", - " ..., 'Disruption', 'Disruption', 'Disruption'], dtype='\n", + "array([1500, 1518], dtype=int32)\n", "Coordinates:\n", - " * id (id) int32 0 1 2 3 4 5 6 7 ... 1526 1527 1528 1529 1530 1531 1532" + " * time (time) float64 0.0 6e+03" ] }, - "execution_count": 3, + "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "sim.ds['origin_type']" + "sim.ds['npl']" ] }, { diff --git a/src/kick/kick.f90 b/src/kick/kick.f90 index 19d717b0d..f2c49ad06 100644 --- a/src/kick/kick.f90 +++ b/src/kick/kick.f90 @@ -98,7 +98,9 @@ module subroutine kick_getacch_int_all_pl(npl, nplpl, k_plpl, x, Gmass, radius, if (rji2 > rlim2) call kick_getacch_int_one_pl(rji2, xr, yr, zr, Gmass(i), Gmass(j), ahi(1,i), ahi(2,i), ahi(3,i), ahj(1,j), ahj(2,j), ahj(3,j)) end do !$omp end parallel do + !$omp parallel workshare acc(:,1:npl) = acc(:,1:npl) + ahi(:,1:npl) + ahj(:,1:npl) + !$omp end parallel workshare return end subroutine kick_getacch_int_all_pl diff --git a/src/modules/swiftest_classes.f90 b/src/modules/swiftest_classes.f90 index 75b792b57..ec1a3e9df 100644 --- a/src/modules/swiftest_classes.f90 +++ b/src/modules/swiftest_classes.f90 @@ -160,12 +160,17 @@ module swiftest_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 :: swiftest_particle_info - character(len=NAMELEN) :: name !! Non-unique name - character(len=NAMELEN) :: particle_type !! String containing a description of the particle type (e.g. Central Body, Massive Body, Test Particle) - character(len=NAMELEN) :: 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 + character(len=NAMELEN) :: name !! Non-unique name + character(len=NAMELEN) :: particle_type !! String containing a description of the particle type (e.g. Central Body, Massive Body, Test Particle) + character(len=NAMELEN) :: 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 + real(DP) :: discard_time !! The time of the particle's discard + character(len=NAMELEN) :: status !! Particle status description: Active, Merged, Fragmented, etc. + real(DP), dimension(NDIM) :: discard_xh !! The heliocentric distance vector at the time of the particle's discard + real(DP), dimension(NDIM) :: discard_vh !! The heliocentric velocity vector at the time of the particle's discard + integer(I4B) :: discard_body_id !! The id of the other body involved in the discard (0 if no other body involved) contains procedure :: dump => io_dump_particle_info !! Dumps contents of particle information to file procedure :: read_in => io_read_in_particle_info !! Read in a particle information object from an open file @@ -844,7 +849,6 @@ module subroutine kick_getacch_int_all_pl(npl, nplpl, k_plpl, x, Gmass, radius, end subroutine kick_getacch_int_all_pl module pure subroutine kick_getacch_int_one_pl(rji2, xr, yr, zr, Gmi, Gmj, axi, ayi, azi, axj, ayj, azj) - !$omp declare simd(kick_getacch_int_one_pl) implicit none real(DP), intent(in) :: rji2 !! Square of distance between the two bodies real(DP), intent(in) :: xr, yr, zr !! Distances between the two bodies in x, y, and z directions @@ -855,7 +859,6 @@ module pure subroutine kick_getacch_int_one_pl(rji2, xr, yr, zr, Gmi, Gmj, axi, end subroutine kick_getacch_int_one_pl module pure subroutine kick_getacch_int_one_tp(rji2, xr, yr, zr, Gmpl, ax, ay, az) - !$omp declare simd(kick_getacch_int_one_tp) implicit none real(DP), intent(in) :: rji2 !! Square of distance between the test particle and massive body real(DP), intent(in) :: xr, yr, zr !! Distances between the two bodies in x, y, and z directions From c22a1a7dd39b73f5ecfc71f4d0ee2ddbfe1175b9 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Sun, 29 Aug 2021 10:34:53 -0400 Subject: [PATCH 096/154] Temporarily enabled reading from the binary dump files even in NetCDF mode in order to be able to restart, until writing/reading NetCDF dump files is enabled. --- src/io/io.f90 | 13 +++++++++++-- src/main/swiftest_driver.f90 | 2 +- src/setup/setup.f90 | 15 +-------------- 3 files changed, 13 insertions(+), 17 deletions(-) diff --git a/src/io/io.f90 b/src/io/io.f90 index c3417f094..65a61da6a 100644 --- a/src/io/io.f90 +++ b/src/io/io.f90 @@ -154,7 +154,7 @@ module subroutine io_dump_particle_info_base(self, param, idx) integer(I4B) :: i character(STRMAX) :: errmsg - if ((param%out_type == REAL4_TYPE) .or. (param%out_type == REAL8_TYPE)) then + !if ((param%out_type == REAL4_TYPE) .or. (param%out_type == REAL8_TYPE)) then if (lfirst) then select case(param%out_stat) case('APPEND') @@ -190,7 +190,8 @@ module subroutine io_dump_particle_info_base(self, param, idx) end select close(unit = LUN, err = 667, iomsg = errmsg) - else if ((param%out_type == NETCDF_FLOAT_TYPE) .or. (param%out_type == NETCDF_DOUBLE_TYPE)) then + !else if ((param%out_type == NETCDF_FLOAT_TYPE) .or. (param%out_type == NETCDF_DOUBLE_TYPE)) then + if ((param%out_type == NETCDF_FLOAT_TYPE) .or. (param%out_type == NETCDF_DOUBLE_TYPE)) then call param%nciu%open(param) call self%write_particle_info(param%nciu) call param%nciu%close(param) @@ -1851,6 +1852,7 @@ module subroutine io_write_frame_system(self, param) end if call self%write_hdr(iu, param) else if ((param%out_type == NETCDF_FLOAT_TYPE) .or. (param%out_type == NETCDF_DOUBLE_TYPE)) then + if (lfirst) then inquire(file=param%outfile, exist=fileExists) @@ -1872,6 +1874,13 @@ module subroutine io_write_frame_system(self, param) end if end select + select type(param) + class is (symba_parameters) + param%nciu%ltrack_origin = param%lfragmentation + class default + param%nciu%ltrack_origin = .false. + end select + select case(param%out_stat) case('APPEND') call param%nciu%open(param) diff --git a/src/main/swiftest_driver.f90 b/src/main/swiftest_driver.f90 index 3b7765347..e7b327e93 100644 --- a/src/main/swiftest_driver.f90 +++ b/src/main/swiftest_driver.f90 @@ -53,7 +53,7 @@ program swiftest_driver nloops = ceiling(tstop / dt, kind=I8B) ioutput = ceiling(t0/ dt, kind=I8B) / int(istep_out, kind=I8B) ! Prevent duplicate frames from being written if this is a restarted run - if (param%lrestart) then + if ((param%lrestart) .and. ((param%out_type == REAL8_TYPE) .or. param%out_type == REAL4_TYPE)) then old_t_final = nbody_system%get_old_t_final(param) else old_t_final = t0 diff --git a/src/setup/setup.f90 b/src/setup/setup.f90 index 11bd69fd1..4477fd788 100644 --- a/src/setup/setup.f90 +++ b/src/setup/setup.f90 @@ -141,21 +141,8 @@ module subroutine setup_initialize_particle_info_system(self, param) integer(I4B) :: i associate(cb => self%cb, pl => self%pl, npl => self%pl%nbody, tp => self%tp, ntp => self%tp%nbody) - select type(param) - class is (symba_parameters) - param%nciu%ltrack_origin = param%lfragmentation - class default - param%nciu%ltrack_origin = .false. - end select - - select type(param) - class is (symba_parameters) - ltrack_origin = param%lfragmentation - class default - ltrack_origin = .false. - end select - if (ltrack_origin) then + if (param%nciu%ltrack_origin) then cb%info%origin_type = "Initial conditions" cb%info%origin_time = param%t0 cb%info%origin_xh(:) = 0.0_DP From 1ae2a6fce3c30350d8bc7439ddb29b7721b2b8a3 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Sun, 29 Aug 2021 10:52:22 -0400 Subject: [PATCH 097/154] Small changes to help track down the source of a mysterious segfault that only happens in ifort --- src/symba/symba_encounter_check.f90 | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/symba/symba_encounter_check.f90 b/src/symba/symba_encounter_check.f90 index c1b83f9dd..5aa0af850 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(lany_enc integer(I8B) :: k, nplplm integer(I4B) :: i, j, nenc real(DP) :: xr, yr, zr, vxr, vyr, vzr, rhill1, rhill2 - logical, dimension(self%nplplm) :: lencounter, loc_lvdotr + logical, dimension(:), allocatable :: lencounter, loc_lvdotr real(DP), dimension(:,:), pointer :: xh, vh real(DP), dimension(:), pointer :: rhill integer(I4B), dimension(:,:), pointer :: k_plpl @@ -28,6 +28,8 @@ module function symba_encounter_check_pl(self, system, dt, irec) result(lany_enc associate(pl => self, xh => self%xh, vh => self%vh, rhill => self%rhill, npl => self%nbody, k_plpl => self%k_plpl) nplplm = self%nplplm + allocate(lencounter(nplplm)) + allocate(loc_lvdotr(nplplm)) lencounter(:) = .false. loc_lvdotr(:) = .false. @@ -48,7 +50,9 @@ module function symba_encounter_check_pl(self, system, dt, irec) result(lany_enc end do !$omp end parallel do + !$omp parallel workshare nenc = count(lencounter(:)) + !$omp end parallel workshare lany_encounter = nenc > 0 if (lany_encounter) then associate(plplenc_list => system%plplenc_list) From 874300d647bc537073d1fd0e8124fd5dbefc60e6 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Sun, 29 Aug 2021 13:56:00 -0400 Subject: [PATCH 098/154] Changes in a number of places to improve the robustness of the code --- src/discard/discard.f90 | 7 +- src/fragmentation/fragmentation.f90 | 6 +- src/rmvs/rmvs_discard.f90 | 8 +- src/rmvs/rmvs_util.f90 | 12 ++- src/symba/symba_collision.f90 | 7 +- src/symba/symba_discard.f90 | 11 +- src/symba/symba_encounter_check.f90 | 58 +++++------ src/symba/symba_kick.f90 | 141 +++++++++++++------------- src/symba/symba_util.f90 | 6 +- src/util/util_append.f90 | 3 +- src/util/util_fill.f90 | 2 + src/util/util_get_energy_momentum.f90 | 46 +++++---- src/util/util_resize.f90 | 2 + src/util/util_sort.f90 | 18 +++- src/util/util_spill.f90 | 2 + src/whm/whm_util.f90 | 5 +- 16 files changed, 194 insertions(+), 140 deletions(-) diff --git a/src/discard/discard.f90 b/src/discard/discard.f90 index 1d9922207..cf38c2bbd 100644 --- a/src/discard/discard.f90 +++ b/src/discard/discard.f90 @@ -236,13 +236,12 @@ subroutine discard_pl_tp(tp, system, param) 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 write(idstri, *) tp%id(i) write(idstrj, *) pl%id(j) write(timestr, *) param%t - write(*, *) "Particle " // trim(adjustl(tp%info(i)%name)) // " (" // trim(adjustl(idstri)) // ")" & - // " too close to massive body " // trim(adjustl(pl%info(i)%name)) // " (" // trim(adjustl(idstrj)) & - // " at t = " // trim(adjustl(timestr)) + write(*, *) "Test particle " // trim(adjustl(tp%info(i)%name)) // " (" // trim(adjustl(idstri)) // ")" & + // " too close to massive body " // trim(adjustl(pl%info(i)%name)) // " (" // trim(adjustl(idstrj)) & + // " at t = " // trim(adjustl(timestr)) tp%ldiscard(i) = .true. exit end if diff --git a/src/fragmentation/fragmentation.f90 b/src/fragmentation/fragmentation.f90 index 43ed02599..c62d337ca 100644 --- a/src/fragmentation/fragmentation.f90 +++ b/src/fragmentation/fragmentation.f90 @@ -152,12 +152,12 @@ module subroutine fragmentation_initialize(system, param, family, x, v, L_spin, ! write(*, "(' -------------------------------------------------------------------------------------')") ! call calculate_system_energy(linclude_fragments=.true.) if (lfailure) then - ! write(*,*) "symba_frag_pos failed after: ",try," tries" + 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" + 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' )") diff --git a/src/rmvs/rmvs_discard.f90 b/src/rmvs/rmvs_discard.f90 index bcdb9f902..724c107be 100644 --- a/src/rmvs/rmvs_discard.f90 +++ b/src/rmvs/rmvs_discard.f90 @@ -16,6 +16,7 @@ module subroutine rmvs_discard_tp(self, system, param) class(swiftest_parameters), intent(inout) :: param !! Current run configuration parameters ! Internals integer(I4B) :: i + character(len=STRMAX) :: timestr, idstri, idstrj if (self%nbody == 0) return @@ -25,7 +26,12 @@ module subroutine rmvs_discard_tp(self, system, param) if ((tp%status(i) == ACTIVE) .and. (tp%lperi(i))) then if ((tp%peri(i) < pl%radius(iplperP))) then tp%status(i) = DISCARDED_PLQ - write(*, *) "Particle ",tp%id(i)," q with respect to Planet ",pl%id(iplperP)," is too small at t = ",t + write(idstri, *) tp%id(i) + write(idstrj, *) pl%id(iplperP) + write(timestr, *) t + write(*, *) "Particle " // trim(adjustl(tp%info(i)%name)) // " (" // trim(adjustl(idstri)) & + // ") q with respect to massive body " // trim(adjustl(pl%info(iplperP)%name)) // " (" // trim(adjustl(idstrj)) & + // ") is too small at t = " // trim(adjustl(timestr)) tp%ldiscard(i) = .true. tp%lmask(i) = .false. end if diff --git a/src/rmvs/rmvs_util.f90 b/src/rmvs/rmvs_util.f90 index 140c43426..3b823c190 100644 --- a/src/rmvs/rmvs_util.f90 +++ b/src/rmvs/rmvs_util.f90 @@ -189,9 +189,11 @@ module subroutine rmvs_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(self%nbody) :: ind + integer(I4B), dimension(:), allocatable :: ind integer(I4B) :: direction + if (self%nbody == 0) return + if (ascending) then direction = 1 else @@ -199,6 +201,7 @@ module subroutine rmvs_util_sort_pl(self, sortby, ascending) end if associate(pl => self, npl => self%nbody) + allocate(ind(npl)) select case(sortby) case("nenc") call util_sort(direction * pl%nenc(1:npl), ind(1:npl)) @@ -231,8 +234,10 @@ module subroutine rmvs_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(self%nbody) :: ind - integer(I4B) :: direction + integer(I4B), dimension(:), allocatable :: ind + integer(I4B) :: direction + + if (self%nbody == 0) return if (ascending) then direction = 1 @@ -241,6 +246,7 @@ module subroutine rmvs_util_sort_tp(self, sortby, ascending) end if associate(tp => self, ntp => self%nbody) + allocate(ind(ntp)) select case(sortby) case("plperP") call util_sort(direction * tp%plperP(1:ntp), ind(1:ntp)) diff --git a/src/symba/symba_collision.f90 b/src/symba/symba_collision.f90 index 7a68a56cd..df215665f 100644 --- a/src/symba/symba_collision.f90 +++ b/src/symba/symba_collision.f90 @@ -740,7 +740,7 @@ module subroutine symba_collision_encounter_extract_collisions(self, system, par 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_collision logical, dimension(:), allocatable :: lplpl_unique_parent integer(I4B), dimension(:), pointer :: plparent integer(I4B), dimension(:), allocatable :: collision_idx, unique_parent_idx @@ -749,6 +749,7 @@ module subroutine symba_collision_encounter_extract_collisions(self, system, par 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) + allocate(lplpl_collision(nplplenc)) lplpl_collision(:) = plplenc_list%status(1:nplplenc) == COLLISION if (.not.any(lplpl_collision)) return ! Collisions have been detected in this step. So we need to determine which of them are between unique bodies. @@ -1139,6 +1140,7 @@ module subroutine symba_collision_resolve_plplenc(self, system, param, t, dt, ir ! Internals real(DP) :: Eorbit_before, Eorbit_after logical :: lplpl_collision + character(len=STRMAX) :: timestr associate(plplenc_list => self, plplcollision_list => system%plplcollision_list) select type(pl => system%pl) @@ -1157,7 +1159,8 @@ module subroutine symba_collision_resolve_plplenc(self, system, param, t, dt, ir end if do - write(*, *) "Collision between massive bodies detected at time t = ", t + write(timestr,*) t + write(*, *) "Collision between massive bodies detected at time t = " // trim(adjustl(timestr)) if (param%lfragmentation) then call plplcollision_list%resolve_fragmentations(system, param) else diff --git a/src/symba/symba_discard.f90 b/src/symba/symba_discard.f90 index b1a433fca..f812dc664 100644 --- a/src/symba/symba_discard.f90 +++ b/src/symba/symba_discard.f90 @@ -36,14 +36,14 @@ subroutine symba_discard_cb_pl(pl, system, param) pl%status(i) = DISCARDED_RMAX write(idstr, *) pl%id(i) write(timestr, *) param%t - write(*, *) "Massive body " // trim(adjustl(pl%info(i)%name)) // " (" // trim(adjustl(idstr)) // ")" // " too far from the central body at t = " // trim(adjustl(timestr)) + write(*, *) trim(adjustl(pl%info(i)%name)) // " (" // trim(adjustl(idstr)) // ")" // " too far from the central body at t = " // trim(adjustl(timestr)) 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(idstr, *) pl%id(i) write(timestr, *) param%t - write(*, *) "Massive body " // trim(adjustl(pl%info(i)%name)) // " (" // trim(adjustl(idstr)) // ")" // " too close to the central body at t = " // trim(adjustl(timestr)) + write(*, *) trim(adjustl(pl%info(i)%name)) // " (" // trim(adjustl(idstr)) // ")" // " too close to the central body at t = " // trim(adjustl(timestr)) 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)) @@ -54,7 +54,7 @@ subroutine symba_discard_cb_pl(pl, system, param) pl%status(i) = DISCARDED_RMAXU write(idstr, *) pl%id(i) write(timestr, *) param%t - write(*, *) "Massive body " // trim(adjustl(pl%info(i)%name)) // " (" // trim(adjustl(idstr)) // ")" // " is unbound and too far from barycenter at t = " // trim(adjustl(timestr)) + write(*, *) trim(adjustl(pl%info(i)%name)) // " (" // trim(adjustl(idstr)) // ")" // " is unbound and too far from barycenter at t = " // trim(adjustl(timestr)) end if end if end if @@ -255,6 +255,7 @@ subroutine symba_discard_peri_pl(pl, system, param) logical, save :: lfirst = .true. logical :: lfirst_orig integer(I4B) :: i + character(len=STRMAX) :: timestr, idstr lfirst_orig = pl%lfirst @@ -271,7 +272,9 @@ subroutine symba_discard_peri_pl(pl, system, param) 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 + write(timestr, *) param%t + write(idstr, *) pl%id(i) + write(*, *) trim(adjustl(pl%info(i)%name)) // " (" // trim(adjustl(idstr)) // ") perihelion distance too small at t = " // trim(adjustl(timestr)) end if end if end if diff --git a/src/symba/symba_encounter_check.f90 b/src/symba/symba_encounter_check.f90 index 5aa0af850..78403c348 100644 --- a/src/symba/symba_encounter_check.f90 +++ b/src/symba/symba_encounter_check.f90 @@ -99,7 +99,7 @@ module function symba_encounter_check(self, system, dt, irec) result(lany_encoun integer(I4B), intent(in) :: irec !! Current recursion level logical :: lany_encounter !! Returns true if there is at least one close encounter ! Internals - integer(I4B) :: k + integer(I4B) :: i, j,k real(DP), dimension(NDIM) :: xr, vr logical :: lencounter, isplpl real(DP) :: rlim2, rji2 @@ -122,40 +122,40 @@ module function symba_encounter_check(self, system, dt, irec) result(lany_encoun allocate(lencmask(self%nenc)) 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)) + do concurrent(k = 1:self%nenc, lencmask(k)) + i = self%index1(k) + j = self%index2(k) + if (isplpl) then + xr(:) = pl%xh(:,j) - pl%xh(:,i) + vr(:) = pl%vb(:,j) - pl%vb(:,i) + 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, self%lvdotr(k)) + else + xr(:) = tp%xh(:,j) - pl%xh(:,i) + vr(:) = tp%vb(:,j) - pl%vb(:,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, self%lvdotr(k)) + end if + if (lencounter) then if (isplpl) then - 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)) + rlim2 = (pl%radius(i) + pl%radius(j))**2 else - 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)) + rlim2 = (pl%radius(i))**2 end if - if (lencounter) then + 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(i) = irec + pl%levelm(i) = MAX(irec, pl%levelm(i)) if (isplpl) then - rlim2 = (pl%radius(ind1(k)) + pl%radius(ind2(k)))**2 + pl%levelg(j) = irec + pl%levelm(j) = MAX(irec, pl%levelm(j)) else - rlim2 = (pl%radius(ind1(k)))**2 + tp%levelg(j) = irec + tp%levelm(j) = MAX(irec, tp%levelm(j)) 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(ind1(k)) = irec - pl%levelm(ind1(k)) = MAX(irec, pl%levelm(ind1(k))) - if (isplpl) then - pl%levelg(ind2(k)) = irec - pl%levelm(ind2(k)) = MAX(irec, pl%levelm(ind2(k))) - else - tp%levelg(ind2(k)) = irec - tp%levelm(ind2(k)) = MAX(irec, tp%levelm(ind2(k))) - end if - self%level(k) = irec - end if - end if - end do - end associate + self%level(k) = irec + end if + end if + end do end select end select diff --git a/src/symba/symba_kick.f90 b/src/symba/symba_kick.f90 index 9a5b11229..c80f53536 100644 --- a/src/symba/symba_kick.f90 +++ b/src/symba/symba_kick.f90 @@ -36,7 +36,7 @@ module subroutine symba_kick_getacch_pl(self, system, param, t, lbeg) ! Internals integer(I4B) :: i, j integer(I8B) :: k, nplplenc - real(DP) :: rji2, rlim2, xr, yr, zr + real(DP) :: rjj, rlim2, xr, yr, zr real(DP), dimension(NDIM,self%nbody) :: ah_enc integer(I4B), dimension(:,:), allocatable :: k_plpl_enc @@ -78,7 +78,7 @@ module subroutine symba_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 ! Internals integer(I4B) :: k - real(DP) :: rji2, fac, rlim2 + real(DP) :: rjj, fac, rlim2 real(DP), dimension(NDIM) :: dx if (self%nbody == 0) return @@ -95,8 +95,8 @@ module subroutine symba_kick_getacch_tp(self, system, param, t, lbeg) else dx(:) = tp%xh(:,j) - pl%xend(:,i) end if - rji2 = dot_product(dx(:), dx(:)) - fac = pl%Gmass(i) / (rji2 * sqrt(rji2)) + rjj = dot_product(dx(:), dx(:)) + fac = pl%Gmass(i) / (rjj * sqrt(rjj)) tp%ah(:,j) = tp%ah(:,j) + fac * dx(:) end IF end associate @@ -123,15 +123,17 @@ module subroutine symba_kick_encounter(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, ngood + integer(I4B) :: i, j, irm1, irecl, ngood + integer(I8B) :: k real(DP) :: r, rr, ri, ris, rim1, r2, ir3, fac, faci, facj real(DP), dimension(NDIM) :: dx logical :: isplpl - logical, dimension(self%nenc) :: lgoodlevel + logical, dimension(:), allocatable :: lgoodlevel integer(I4B), dimension(:), allocatable :: good_idx if (self%nenc == 0) return + select type(self) class is (symba_plplenc) isplpl = .true. @@ -142,9 +144,10 @@ module subroutine symba_kick_encounter(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, npl => pl%nbody, ntp => tp%nbody, nenc => self%nenc) + associate(npl => pl%nbody, ntp => tp%nbody, nenc => self%nenc) if (npl > 0) pl%lmask(1:npl) = pl%status(1:npl) /= INACTIVE if (ntp > 0) tp%lmask(1:ntp) = tp%status(1:ntp) /= INACTIVE + allocate(lgoodlevel(nenc)) irm1 = irec - 1 @@ -154,89 +157,89 @@ module subroutine symba_kick_encounter(self, system, dt, irec, sgn) irecl = irec end if - do i = 1, nenc + do k = 1, nenc + i = self%index1(k) + j = self%index2(k) if (isplpl) then - lgoodlevel(i) = (pl%levelg(ind1(i)) >= irm1) .and. (pl%levelg(ind2(i)) >= irm1) + lgoodlevel(k) = (pl%levelg(i) >= irm1) .and. (pl%levelg(j) >= irm1) else - lgoodlevel(i) = (pl%levelg(ind1(i)) >= irm1) .and. (tp%levelg(ind2(i)) >= irm1) + lgoodlevel(k) = (pl%levelg(i) >= irm1) .and. (tp%levelg(j) >= irm1) end if - lgoodlevel(i) = (self%status(i) == ACTIVE) .and. lgoodlevel(i) + lgoodlevel(k) = (self%status(k) == ACTIVE) .and. lgoodlevel(k) end do ngood = count(lgoodlevel(:)) - if (ngood > 0) then + if (ngood > 0_I8B) then allocate(good_idx(ngood)) good_idx(:) = pack([(i, i = 1, nenc)], lgoodlevel(:)) if (isplpl) then - do i = 1, ngood - associate(i1 => ind1(good_idx(i)), i2 => ind2(good_idx(i))) - pl%ah(:,i1) = 0.0_DP - pl%ah(:,i2) = 0.0_DP - end associate + do concurrent (k = 1:ngood) + i = self%index1(good_idx(k)) + j = self%index2(good_idx(k)) + pl%ah(:,i) = 0.0_DP + pl%ah(:,j) = 0.0_DP end do else - do i = 1, ngood - associate(i2 => ind2(good_idx(i))) - tp%ah(:,i2) = 0.0_DP - end associate + do concurrent (k = 1_I8B:ngood) + j = self%index2(good_idx(k)) + tp%ah(:,j) = 0.0_DP end do end if - do i = 1, ngood - associate(k => good_idx(i), i1 => ind1(good_idx(i)), i2 => ind2(good_idx(i))) - if (isplpl) then - ri = ((pl%rhill(i1) + pl%rhill(i2))**2) * (RHSCALE**2) * (RSHELL**(2*irecl)) - rim1 = ri * (RSHELL**2) - dx(:) = pl%xh(:,i2) - pl%xh(:,i1) - else - ri = ((pl%rhill(i1))**2) * (RHSCALE**2) * (RSHELL**(2*irecl)) - rim1 = ri * (RSHELL**2) - dx(:) = tp%xh(:,i2) - pl%xh(:,i1) - end if - r2 = dot_product(dx(:), dx(:)) - if (r2 < rim1) then - fac = 0.0_DP - lgoodlevel(k) = .false. - cycle - end if - 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%Gmass(i1) - if (isplpl) then - facj = fac * pl%Gmass(i2) - pl%ah(:, i1) = pl%ah(:, i1) + facj * dx(:) - pl%ah(:, i2) = pl%ah(:, i2) - faci * dx(:) - else - tp%ah(:, i2) = tp%ah(:, i2) - faci * dx(:) - end if - end associate + do k = 1, ngood + i = self%index1(good_idx(k)) + j = self%index2(good_idx(k)) + if (isplpl) then + ri = ((pl%rhill(i) + pl%rhill(j))**2) * (RHSCALE**2) * (RSHELL**(2*irecl)) + rim1 = ri * (RSHELL**2) + dx(:) = pl%xh(:,j) - pl%xh(:,i) + else + ri = ((pl%rhill(i))**2) * (RHSCALE**2) * (RSHELL**(2*irecl)) + rim1 = ri * (RSHELL**2) + dx(:) = tp%xh(:,j) - pl%xh(:,i) + end if + r2 = dot_product(dx(:), dx(:)) + if (r2 < rim1) then + fac = 0.0_DP + lgoodlevel(good_idx(k)) = .false. + cycle + end if + 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%Gmass(i) + if (isplpl) then + facj = fac * pl%Gmass(j) + pl%ah(:, i) = pl%ah(:, i) + facj * dx(:) + pl%ah(:, j) = pl%ah(:, j) - faci * dx(:) + else + tp%ah(:, j) = tp%ah(:, j) - faci * dx(:) + end if end do ngood = count(lgoodlevel(:)) - if (ngood == 0) return + if (ngood == 0_I8B) return good_idx(1:ngood) = pack([(i, i = 1, nenc)], lgoodlevel(:)) if (isplpl) then - do i = 1, ngood - associate(i1 => ind1(good_idx(i)), i2 => ind2(good_idx(i))) - pl%vb(:,i1) = pl%vb(:,i1) + sgn * dt * pl%ah(:,i1) - pl%vb(:,i2) = pl%vb(:,i2) + sgn * dt * pl%ah(:,i2) - pl%ah(:,i1) = 0.0_DP - pl%ah(:,i2) = 0.0_DP - end associate + do k = 1, ngood + i = self%index1(good_idx(k)) + j = self%index2(good_idx(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 do else - do i = 1, ngood - associate(i2 => ind2(good_idx(i))) - tp%vb(:,i2) = tp%vb(:,i2) + sgn * dt * tp%ah(:,i2) - tp%ah(:,i2) = 0.0_DP - end associate + do k = 1, ngood + j = self%index2(good_idx(k)) + tp%vb(:,j) = tp%vb(:,j) + sgn * dt * tp%ah(:,j) + tp%ah(:,j) = 0.0_DP end do end if end if diff --git a/src/symba/symba_util.f90 b/src/symba/symba_util.f90 index 150bf7825..91a81091a 100644 --- a/src/symba/symba_util.f90 +++ b/src/symba/symba_util.f90 @@ -646,7 +646,7 @@ module subroutine symba_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(self%nbody) :: ind + integer(I4B), dimension(:), allocatable :: ind integer(I4B) :: direction if (self%nbody == 0) return @@ -658,6 +658,7 @@ module subroutine symba_util_sort_pl(self, sortby, ascending) end if associate(pl => self, npl => self%nbody) + allocate(ind(npl)) select case(sortby) case("nplenc") call util_sort(direction * pl%nplenc(1:npl), ind(1:npl)) @@ -696,7 +697,7 @@ module subroutine symba_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(self%nbody) :: ind + integer(I4B), dimension(:), allocatable :: ind integer(I4B) :: direction if (self%nbody == 0) return @@ -708,6 +709,7 @@ module subroutine symba_util_sort_tp(self, sortby, ascending) end if associate(tp => self, ntp => self%nbody) + allocate(ind(ntp)) select case(sortby) case("nplenc") call util_sort(direction * tp%nplenc(1:ntp), ind(1:ntp)) diff --git a/src/util/util_append.f90 b/src/util/util_append.f90 index 6abbc0e9a..ecefb1572 100644 --- a/src/util/util_append.f90 +++ b/src/util/util_append.f90 @@ -258,7 +258,6 @@ module subroutine util_append_pl(self, source, lsource_mask) class(swiftest_body), intent(in) :: source !! Source object to append logical, dimension(:), intent(in) :: lsource_mask !! Logical mask indicating which elements to append to - select type(source) class is (swiftest_pl) associate(nold => self%nbody, nsrc => source%nbody) @@ -276,6 +275,8 @@ module subroutine util_append_pl(self, source, lsource_mask) call util_append(self%Q, source%Q, nold, nsrc, lsource_mask) call util_append(self%tlag, source%tlag, nold, nsrc, lsource_mask) + if (allocated(self%k_plpl)) deallocate(self%k_plpl) + call util_append_body(self, source, lsource_mask) end associate class default diff --git a/src/util/util_fill.f90 b/src/util/util_fill.f90 index 541ee40cd..26b21310e 100644 --- a/src/util/util_fill.f90 +++ b/src/util/util_fill.f90 @@ -206,6 +206,8 @@ module subroutine util_fill_pl(self, inserts, 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) + + if (allocated(keeps%k_plpl)) deallocate(keeps%k_plpl) call util_fill_body(keeps, inserts, lfill_list) class default diff --git a/src/util/util_get_energy_momentum.f90 b/src/util/util_get_energy_momentum.f90 index 4243070ac..70fbb16df 100644 --- a/src/util/util_get_energy_momentum.f90 +++ b/src/util/util_get_energy_momentum.f90 @@ -14,18 +14,19 @@ module subroutine util_get_energy_momentum_system(self, param) class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters ! Internals integer(I4B) :: i, j - integer(I8B) :: k + integer(I8B) :: k, nplpl real(DP) :: oblpot, kecb, kespincb real(DP), dimension(self%pl%nbody) :: irh, kepl, kespinpl, pecb real(DP), dimension(self%pl%nbody) :: Lplorbitx, Lplorbity, Lplorbitz real(DP), dimension(self%pl%nbody) :: Lplspinx, Lplspiny, Lplspinz - real(DP), dimension(self%pl%nplpl) :: pepl + logical, dimension(self%pl%nbody) :: lstatus real(DP), dimension(NDIM) :: Lcborbit, Lcbspin - logical, dimension(self%pl%nplpl) :: lstatpl - logical, dimension(self%pl%nbody) :: lstatus + real(DP), dimension(:), allocatable :: pepl + logical, dimension(:), allocatable :: lstatpl real(DP) :: hx, hy, hz associate(system => self, pl => self%pl, npl => self%pl%nbody, cb => self%cb) + nplpl = pl%nplpl system%Lorbit(:) = 0.0_DP system%Lspin(:) = 0.0_DP system%Ltot(:) = 0.0_DP @@ -82,24 +83,35 @@ module subroutine util_get_energy_momentum_system(self, param) end if ! Do the central body potential energy component first - associate(px => pl%xb(1,:), py => pl%xb(2,:), pz => pl%xb(3,:)) - do concurrent(i = 1:npl, lstatus(i)) - pecb(i) = -cb%Gmass * pl%mass(i) / sqrt(px(i)**2 + py(i)**2 + pz(i)**2) - end do - end associate + where(.not. lstatus(1:npl)) + pecb(1:npl) = 0.0_DP + end where + + do concurrent(i = 1:npl, lstatus(i)) + pecb(i) = -cb%Gmass * pl%mass(i) / norm2(pl%xb(:,i)) + end do ! Do the potential energy between pairs of massive bodies - associate(indi => pl%k_plpl(1, :), indj => pl%k_plpl(2, :)) - do concurrent (k = 1:pl%nplpl) - lstatpl(k) = (lstatus(indi(k)) .and. lstatus(indj(k))) - end do + allocate(lstatpl(nplpl)) + allocate(pepl(nplpl)) + do concurrent (k = 1:nplpl) + i = pl%k_plpl(1,k) + j = pl%k_plpl(2,k) + lstatpl(k) = (lstatus(i) .and. lstatus(j)) + end do - do concurrent (k = 1:pl%nplpl, lstatpl(k)) - pepl(k) = -(pl%Gmass(indi(k)) * pl%mass(indj(k))) / norm2(pl%xb(:, indi(k)) - pl%xb(:, indj(k))) - end do - end associate + where(.not.lstatpl(1:nplpl)) + pepl(1:nplpl) = 0.0_DP + end where + + do concurrent (k = 1:nplpl, lstatpl(k)) + i = pl%k_plpl(1,k) + j = pl%k_plpl(2,k) + pepl(k) = -(pl%Gmass(i) * pl%mass(j)) / norm2(pl%xb(:, i) - pl%xb(:, j)) + end do system%pe = sum(pepl(:), lstatpl(:)) + sum(pecb(1:npl), lstatus(1:npl)) + deallocate(lstatpl, pepl) system%ke_orbit = 0.5_DP * (kecb + sum(kepl(1:npl), lstatus(:))) if (param%lrotation) system%ke_spin = 0.5_DP * (kespincb + sum(kespinpl(1:npl), lstatus(:))) diff --git a/src/util/util_resize.f90 b/src/util/util_resize.f90 index ed28d1007..889703ac8 100644 --- a/src/util/util_resize.f90 +++ b/src/util/util_resize.f90 @@ -307,6 +307,8 @@ module subroutine util_resize_pl(self, nnew) call util_resize(self%Q, nnew) call util_resize(self%tlag, nnew) + if (allocated(self%k_plpl)) deallocate(self%k_plpl) + return end subroutine util_resize_pl diff --git a/src/util/util_sort.f90 b/src/util/util_sort.f90 index 9717f1e3e..b69627b0b 100644 --- a/src/util/util_sort.f90 +++ b/src/util/util_sort.f90 @@ -13,9 +13,11 @@ 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(self%nbody) :: ind + integer(I4B), dimension(:), allocatable :: ind integer(I4B) :: direction + if (self%nbody == 0) return + if (ascending) then direction = 1 else @@ -23,6 +25,7 @@ module subroutine util_sort_body(self, sortby, ascending) end if associate(body => self, n => self%nbody) + allocate(ind(n)) select case(sortby) case("id") call util_sort(direction * body%id(1:n), ind(1:n)) @@ -55,7 +58,6 @@ module subroutine util_sort_body(self, sortby, ascending) end subroutine util_sort_body - module subroutine util_sort_dp(arr) !! author: David A. Minton !! @@ -235,9 +237,11 @@ 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(self%nbody) :: ind + integer(I4B), dimension(:), allocatable :: ind integer(I4B) :: direction + if (self%nbody == 0) return + if (ascending) then direction = 1 else @@ -245,6 +249,7 @@ module subroutine util_sort_pl(self, sortby, ascending) end if associate(pl => self, npl => self%nbody) + allocate(ind(npl)) select case(sortby) case("Gmass","mass") call util_sort(direction * pl%Gmass(1:npl), ind(1:npl)) @@ -286,9 +291,11 @@ 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(self%nbody) :: ind + integer(I4B), dimension(:), allocatable :: ind integer(I4B) :: direction + if (self%nbody == 0) return + if (ascending) then direction = 1 else @@ -296,6 +303,7 @@ module subroutine util_sort_tp(self, sortby, ascending) end if associate(tp => self, ntp => self%nbody) + allocate(ind(ntp)) select case(sortby) case("peri") call util_sort(direction * tp%peri(1:ntp), ind(1:ntp)) @@ -506,6 +514,8 @@ module subroutine util_sort_rearrange_pl(self, ind) call util_sort_rearrange(pl%Q, ind, npl) call util_sort_rearrange(pl%tlag, ind, npl) + if (allocated(pl%k_plpl)) deallocate(pl%k_plpl) + call util_sort_rearrange_body(pl, ind) end associate diff --git a/src/util/util_spill.f90 b/src/util/util_spill.f90 index b4d43e019..8f9567ef9 100644 --- a/src/util/util_spill.f90 +++ b/src/util/util_spill.f90 @@ -417,6 +417,8 @@ module subroutine util_spill_pl(self, discards, lspill_list, ldestructive) call util_spill(keeps%Ip, discards%Ip, lspill_list, ldestructive) call util_spill(keeps%rot, discards%rot, lspill_list, ldestructive) + if (ldestructive .and. allocated(keeps%k_plpl)) deallocate(keeps%k_plpl) + call util_spill_body(keeps, discards, lspill_list, ldestructive) class default write(*,*) 'Error! spill method called for incompatible return type on swiftest_pl' diff --git a/src/whm/whm_util.f90 b/src/whm/whm_util.f90 index 6689e78cb..bedf359ae 100644 --- a/src/whm/whm_util.f90 +++ b/src/whm/whm_util.f90 @@ -141,9 +141,11 @@ module subroutine whm_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(self%nbody) :: ind + integer(I4B), dimension(:), allocatable :: ind integer(I4B) :: direction + if (self%nbody == 0) return + if (ascending) then direction = 1 else @@ -151,6 +153,7 @@ module subroutine whm_util_sort_pl(self, sortby, ascending) end if associate(pl => self, npl => self%nbody) + allocate(ind(npl)) select case(sortby) case("eta") call util_sort(direction * pl%eta(1:npl), ind(1:npl)) From 8f54fe3904ddfc737f66f7a40aa2c58f7bda487f Mon Sep 17 00:00:00 2001 From: David A Minton Date: Sun, 29 Aug 2021 17:41:01 -0400 Subject: [PATCH 099/154] Fixed bug in which rhill was not being set for new fragments. --- Makefile.Defines | 10 ++--- src/symba/symba_collision.f90 | 1 + src/symba/symba_util.f90 | 69 +++++++++++++++++++---------------- 3 files changed, 43 insertions(+), 37 deletions(-) diff --git a/Makefile.Defines b/Makefile.Defines index 4e3ead7c5..e48cb9d07 100644 --- a/Makefile.Defines +++ b/Makefile.Defines @@ -62,18 +62,18 @@ IPRODUCTION = -init=snan,arrays -no-wrap-margin -O3 $(STRICTREAL) $(PAR) $(SIMD #gfortran flags GDEBUG = -g -Og -fbacktrace -fbounds-check -ffree-line-length-none GPAR = -fopenmp #-ftree-parallelize-loops=4 -GMEM = -fsanitize=undefined -fsanitize=address -fsanitize=leak +GMEM = -fsanitize-address-use-after-scope -fstack-check -fsanitize=bounds-strict -fsanitize=undefined -fsanitize=signed-integer-overflow -fsanitize=object-size -fstack-protector-all GWARNINGS = -Wall -Warray-bounds -Wimplicit-interface -Wextra -Warray-temporaries GPRODUCTION = -O3 -ffree-line-length-none $(GPAR) #FFLAGS = $(IDEBUG) $(HEAPARR) $(SIMDVEC) $(PAR) -#FFLAGS = $(IPRODUCTION) -g -traceback $(OPTREPORT) -#FORTRAN = ifort +FFLAGS = $(IPRODUCTION) -g -traceback $(OPTREPORT) +FORTRAN = ifort #AR = xiar -FORTRAN = gfortran +#FORTRAN = gfortran #FFLAGS = $(GDEBUG) $(GMEM) $(GPAR) -FFLAGS = $(GPRODUCTION) +#FFLAGS = $(GPRODUCTION) -g -fcheck=all -Wall -fbacktrace AR = ar # DO NOT include in CFLAGS the "-c" option to compile object only diff --git a/src/symba/symba_collision.f90 b/src/symba/symba_collision.f90 index df215665f..56713e101 100644 --- a/src/symba/symba_collision.f90 +++ b/src/symba/symba_collision.f90 @@ -969,6 +969,7 @@ subroutine symba_collision_mergeaddsub(system, param, family, id_frag, Ip_frag, end if call plnew%set_mu(cb) + call plnew%set_rhill(cb) !Copy over or set integration parameters for new bodies plnew%lcollision(1:nfrag) = .false. plnew%ldiscard(1:nfrag) = .false. diff --git a/src/symba/symba_util.f90 b/src/symba/symba_util.f90 index 91a81091a..c804aebb7 100644 --- a/src/symba/symba_util.f90 +++ b/src/symba/symba_util.f90 @@ -409,7 +409,7 @@ module subroutine symba_util_rearray_pl(self, system, param) class(symba_parameters), intent(inout) :: param !! Current run configuration parameters ! Internals class(symba_pl), allocatable :: tmp !! The discarded body list. - integer(I4B) :: i, j, k, npl, nencmin + integer(I4B) :: i, j, k, npl, nencmin, idnew1, idnew2, idold1, idold2 logical, dimension(:), allocatable :: lmask, ldump_mask class(symba_plplenc), allocatable :: plplenc_old logical :: lencounter @@ -418,6 +418,7 @@ module subroutine symba_util_rearray_pl(self, system, param) associate(pl => self, pl_adds => system%pl_adds, nadd => system%pl_adds%nbody) npl = pl%nbody + if (npl == 0) return ! Deallocate any temporary variables if (allocated(pl%xbeg)) deallocate(pl%xbeg) if (allocated(pl%xend)) deallocate(pl%xend) @@ -429,7 +430,7 @@ module subroutine symba_util_rearray_pl(self, system, param) call pl%spill(tmp, lspill_list=lmask, ldestructive=.true.) npl = pl%nbody call tmp%setup(0,param) - deallocate(tmp) + if (allocated(tmp)) deallocate(tmp) deallocate(lmask) ! Store the original plplenc list so we don't remove any of the original encounters @@ -450,7 +451,6 @@ module subroutine symba_util_rearray_pl(self, system, param) ldump_mask(:) = .false. end if - ! Reset all of the status flags for this body where(pl%status(1:npl) /= INACTIVE) pl%status(1:npl) = ACTIVE @@ -481,16 +481,19 @@ module subroutine symba_util_rearray_pl(self, system, param) ! Reset the kinship trackers pl%kin(1:npl)%nchild = 0 pl%kin(1:npl)%parent = [(i, i=1, npl)] + do i = 1, npl + if (allocated(pl%kin(i)%child)) deallocate(pl%kin(i)%child) + end do ! Re-build the zero-level encounter list, being sure to save the original level information for all bodies allocate(levelg_orig_pl, source=pl%levelg) allocate(levelm_orig_pl, source=pl%levelm) allocate(nplenc_orig_pl, source=pl%nplenc) - allocate(ntpenc_orig_pl, source=pl%ntpenc) lencounter = pl%encounter_check(system, param%dt, 0) if (system%tp%nbody > 0) then select type(tp => system%tp) class is (symba_tp) + allocate(ntpenc_orig_pl, source=pl%ntpenc) allocate(levelg_orig_tp, source=tp%levelg) allocate(levelm_orig_tp, source=tp%levelm) allocate(nplenc_orig_tp, source=tp%nplenc) @@ -498,6 +501,7 @@ module subroutine symba_util_rearray_pl(self, system, param) call move_alloc(levelg_orig_tp, tp%levelg) call move_alloc(levelm_orig_tp, tp%levelm) call move_alloc(nplenc_orig_tp, tp%nplenc) + call move_alloc(ntpenc_orig_pl, pl%ntpenc) end select end if call move_alloc(levelg_orig_pl, pl%levelg) @@ -505,33 +509,34 @@ module subroutine symba_util_rearray_pl(self, system, param) call move_alloc(nplenc_orig_pl, pl%nplenc) ! Re-index the encounter list as the index values may have changed - associate(idnew1 => system%plplenc_list%id1, idnew2 => system%plplenc_list%id2, idold1 => plplenc_old%id1, idold2 => plplenc_old%id2) - nencmin = min(system%plplenc_list%nenc, plplenc_old%nenc) - do k = 1, nencmin - if ((idnew1(k) == idold1(k)) .and. (idnew2(k) == idold2(k))) then - ! This is an encounter we already know about, so save the old information - system%plplenc_list%lvdotr(k) = plplenc_old%lvdotr(k) - system%plplenc_list%status(k) = plplenc_old%status(k) - system%plplenc_list%x1(:,k) = plplenc_old%x1(:,k) - system%plplenc_list%x2(:,k) = plplenc_old%x2(:,k) - system%plplenc_list%v1(:,k) = plplenc_old%v1(:,k) - system%plplenc_list%v2(:,k) = plplenc_old%v2(:,k) - system%plplenc_list%t(k) = plplenc_old%t(k) - system%plplenc_list%level(k) = plplenc_old%level(k) - else if (((idnew1(k) == idold2(k)) .and. (idnew2(k) == idold1(k)))) then - ! This is an encounter we already know about, but with the order reversed, so save the old information - system%plplenc_list%lvdotr(k) = plplenc_old%lvdotr(k) - system%plplenc_list%status(k) = plplenc_old%status(k) - system%plplenc_list%x1(:,k) = plplenc_old%x2(:,k) - system%plplenc_list%x2(:,k) = plplenc_old%x1(:,k) - system%plplenc_list%v1(:,k) = plplenc_old%v2(:,k) - system%plplenc_list%v2(:,k) = plplenc_old%v1(:,k) - system%plplenc_list%t(k) = plplenc_old%t(k) - system%plplenc_list%level(k) = plplenc_old%level(k) - end if - end do - end associate - + nencmin = min(system%plplenc_list%nenc, plplenc_old%nenc) + do k = 1, nencmin + idnew1 = system%plplenc_list%id1(k) + idnew2 = system%plplenc_list%id2(k) + idold1 = plplenc_old%id1(k) + idold2 = plplenc_old%id2(k) + if ((idnew1 == idold1) .and. (idnew2 == idold2)) then + ! This is an encounter we already know about, so save the old information + system%plplenc_list%lvdotr(k) = plplenc_old%lvdotr(k) + system%plplenc_list%status(k) = plplenc_old%status(k) + system%plplenc_list%x1(:,k) = plplenc_old%x1(:,k) + system%plplenc_list%x2(:,k) = plplenc_old%x2(:,k) + system%plplenc_list%v1(:,k) = plplenc_old%v1(:,k) + system%plplenc_list%v2(:,k) = plplenc_old%v2(:,k) + system%plplenc_list%t(k) = plplenc_old%t(k) + system%plplenc_list%level(k) = plplenc_old%level(k) + else if (((idnew1 == idold2) .and. (idnew2 == idold1))) then + ! This is an encounter we already know about, but with the order reversed, so save the old information + system%plplenc_list%lvdotr(k) = plplenc_old%lvdotr(k) + system%plplenc_list%status(k) = plplenc_old%status(k) + system%plplenc_list%x1(:,k) = plplenc_old%x2(:,k) + system%plplenc_list%x2(:,k) = plplenc_old%x1(:,k) + system%plplenc_list%v1(:,k) = plplenc_old%v2(:,k) + system%plplenc_list%v2(:,k) = plplenc_old%v1(:,k) + system%plplenc_list%t(k) = plplenc_old%t(k) + system%plplenc_list%level(k) = plplenc_old%level(k) + end if + end do end associate return @@ -548,7 +553,7 @@ module subroutine symba_util_resize_arr_kin(arr, nnew) 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 + integer(I4B) :: nold !! Old size if (.not. allocated(arr) .or. nnew < 0) return From 1312cb77e35437f2068e50f7e93bd2828b787852 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Mon, 30 Aug 2021 08:59:15 -0400 Subject: [PATCH 100/154] Added coordinate conversion while generating fragment position and velocities. --- src/symba/symba_collision.f90 | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/symba/symba_collision.f90 b/src/symba/symba_collision.f90 index 56713e101..2bf7387d6 100644 --- a/src/symba/symba_collision.f90 +++ b/src/symba/symba_collision.f90 @@ -910,6 +910,8 @@ subroutine symba_collision_mergeaddsub(system, param, family, id_frag, Ip_frag, plnew%id(1:nfrag) = id_frag(1:nfrag) plnew%xb(:, 1:nfrag) = xb_frag(:, 1:nfrag) plnew%vb(:, 1:nfrag) = vb_frag(:, 1:nfrag) + call pl%vb2vh(cb) + call pl%xh2xb(cb) do i = 1, nfrag plnew%xh(:,i) = xb_frag(:, i) - cb%xb(:) plnew%vh(:,i) = vb_frag(:, i) - cb%vb(:) From a2b8b4a1cbb62f9b7fc4e3b8e97982e2a76bc704 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Mon, 30 Aug 2021 09:21:20 -0400 Subject: [PATCH 101/154] Added mass loss exception commit --- src/io/io.f90 | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/io/io.f90 b/src/io/io.f90 index 65a61da6a..a7cea0d7f 100644 --- a/src/io/io.f90 +++ b/src/io/io.f90 @@ -67,6 +67,10 @@ module subroutine io_conservation_report(self, param, lterminal) Ecoll_error = param%Ecollisions / abs(param%Eorbit_orig) Etotal_error = (Eorbit_now - param%Ecollisions - param%Eorbit_orig - param%Euntracked) / abs(param%Eorbit_orig) Merror = (GMtot_now - param%GMtot_orig) / param%GMtot_orig + if (Merror < -10 * epsilon(Merror)) then + write(*,*) 'Mass loss! Halting!' + call util_exit(FAILURE) + end if write(*, EGYTERMFMT) Lerror, Ecoll_error, Etotal_error, Merror end if end associate From 71cc5878b2793e3a6d1ede8c35848bbe226c8cee Mon Sep 17 00:00:00 2001 From: David A Minton Date: Mon, 30 Aug 2021 12:21:34 -0400 Subject: [PATCH 102/154] Added discard info and rearranged code to properly record discard information. Still hunting for mass loss bug --- python/swiftest/swiftest/io.py | 8 +- src/discard/discard.f90 | 5 + src/io/io.f90 | 56 ++++---- src/modules/swiftest_classes.f90 | 239 +++++++++++++++++-------------- src/modules/swiftest_globals.f90 | 119 ++++++++------- src/modules/symba_classes.f90 | 2 +- src/netcdf/netcdf.f90 | 82 ++++++++--- src/rmvs/rmvs_discard.f90 | 1 + src/setup/setup.f90 | 51 +++---- src/symba/symba_collision.f90 | 86 ++++++----- src/symba/symba_discard.f90 | 4 + src/symba/symba_io.f90 | 14 +- src/symba/symba_util.f90 | 1 + src/util/util_copy.f90 | 19 ++- src/util/util_set.f90 | 56 ++++++++ 15 files changed, 460 insertions(+), 283 deletions(-) diff --git a/python/swiftest/swiftest/io.py b/python/swiftest/swiftest/io.py index 0397335d6..a82c5f043 100644 --- a/python/swiftest/swiftest/io.py +++ b/python/swiftest/swiftest/io.py @@ -718,8 +718,12 @@ def clean_string_values(param, ds): ------- ds : xarray dataset with the strings cleaned up """ - ds['name'] = ds['name'].str.decode(encoding='utf-8') - ds['particle_type'] = ds['particle_type'].str.decode(encoding='utf-8') + if 'name' in ds: + ds['name'] = ds['name'].str.decode(encoding='utf-8') + if 'particle_type' in ds: + ds['particle_type'] = ds['particle_type'].str.decode(encoding='utf-8') + if 'status' in ds: + ds['status'] = ds['status'].str.decode(encoding='utf-8') if 'origin_type' in ds: ds['origin_type'] = ds['origin_type'].str.decode(encoding='utf-8') return ds diff --git a/src/discard/discard.f90 b/src/discard/discard.f90 index cf38c2bbd..e0dc8813e 100644 --- a/src/discard/discard.f90 +++ b/src/discard/discard.f90 @@ -128,6 +128,7 @@ subroutine discard_cb_tp(tp, system, param) write(*, *) "Particle " // trim(adjustl(tp%info(i)%name)) // " (" // trim(adjustl(idstr)) // ")" // " too far from the central body at t = " // trim(adjustl(timestr)) tp%ldiscard(i) = .true. tp%lmask(i) = .false. + call tp%info(i)%set_value(status="DISCARDED_RMAX", discard_time=param%t, discard_xh=tp%xh(:,i), discard_vh=tp%vh(:,i)) else if ((param%rmin >= 0.0_DP) .and. (rh2 < rmin2)) then tp%status(i) = DISCARDED_RMIN write(idstr, *) tp%id(i) @@ -135,6 +136,7 @@ subroutine discard_cb_tp(tp, system, param) write(*, *) "Particle " // trim(adjustl(tp%info(i)%name)) // " (" // trim(adjustl(idstr)) // ")" // " too close to the central body at t = " // trim(adjustl(timestr)) tp%ldiscard(i) = .true. tp%lmask(i) = .false. + call tp%info(i)%set_value(status="DISCARDED_RMIN", discard_time=param%t, discard_xh=tp%xh(:,i), discard_vh=tp%vh(:,i), discard_body_id=cb%id) 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)) @@ -146,6 +148,7 @@ subroutine discard_cb_tp(tp, system, param) write(*, *) "Particle " // trim(adjustl(tp%info(i)%name)) // " (" // trim(adjustl(idstr)) // ")" // " is unbound and too far from barycenter at t = " // trim(adjustl(timestr)) tp%ldiscard(i) = .true. tp%lmask(i) = .false. + call tp%info(i)%set_value(status="DISCARDED_RMAXU", discard_time=param%t, discard_xh=tp%xh(:,i), discard_vh=tp%vh(:,i)) end if end if end if @@ -195,6 +198,7 @@ subroutine discard_peri_tp(tp, system, param) write(timestr, *) param%t write(*, *) "Particle " // trim(adjustl(tp%info(i)%name)) // " (" // trim(adjustl(idstr)) // ")" // " perihelion distance too small at t = " // trim(adjustl(timestr)) tp%ldiscard(i) = .true. + call tp%info(i)%set_value(status="DISCARDED_PERI", discard_time=param%t, discard_xh=tp%xh(:,i), discard_vh=tp%vh(:,i), discard_body_id=pl%id(j)) end if end if end if @@ -243,6 +247,7 @@ subroutine discard_pl_tp(tp, system, param) // " too close to massive body " // trim(adjustl(pl%info(i)%name)) // " (" // trim(adjustl(idstrj)) & // " at t = " // trim(adjustl(timestr)) tp%ldiscard(i) = .true. + call tp%info(i)%set_value(status="DISCARDED_PLR", discard_time=param%t, discard_xh=tp%xh(:,i), discard_vh=tp%vh(:,i), discard_body_id=pl%id(j)) exit end if end do diff --git a/src/io/io.f90 b/src/io/io.f90 index a7cea0d7f..a7e1d5d9f 100644 --- a/src/io/io.f90 +++ b/src/io/io.f90 @@ -938,7 +938,7 @@ module subroutine io_read_in_body(self, param) ! Internals integer(I4B), parameter :: LUN = 7 !! Unit number of input file integer(I4B) :: iu = LUN - integer(I4B) :: nbody + integer(I4B) :: i, nbody logical :: is_ascii, is_pl character(len=:), allocatable :: infile real(DP) :: t @@ -974,6 +974,9 @@ module subroutine io_read_in_body(self, param) ierr = self%read_frame(iu, param) self%status(:) = ACTIVE self%lmask(:) = .true. + do i = 1, nbody + call self%info(i)%set_value(status="ACTIVE") + end do end if close(iu, err = 667, iomsg = errmsg) @@ -1547,7 +1550,7 @@ module subroutine io_write_discard(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 integer(I4B), parameter :: LUN = 40 integer(I4B) :: i @@ -1561,9 +1564,17 @@ module subroutine io_write_discard(self, param) class(swiftest_body), allocatable :: pltemp character(len=STRMAX) :: errmsg, out_stat - if (param%discard_out == "") return - associate(tp_discards => self%tp_discards, nsp => self%tp_discards%nbody, pl => self%pl, npl => self%pl%nbody) + + ! Record the discarded body metadata information to file + if ((param%out_type == NETCDF_FLOAT_TYPE) .or. (param%out_type == NETCDF_DOUBLE_TYPE)) then + call param%nciu%open(param) + call tp_discards%write_particle_info(param%nciu) + call param%nciu%close(param) + end if + + if (param%discard_out == "") return + if (nsp == 0) return if (lfirst) then out_stat = param%out_stat @@ -1589,22 +1600,22 @@ module subroutine io_write_discard(self, param) write(LUN, VECFMT, err = 667, iomsg = errmsg) 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 + 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, err = 667, iomsg = errmsg) pl%id(i), pl%Gmass(i), pl%radius(i) - write(LUN, VECFMT, err = 667, iomsg = errmsg) pl%xh(1, i), pl%xh(2, i), pl%xh(3, i) - write(LUN, VECFMT, err = 667, iomsg = errmsg) vh(1, i), vh(2, i), vh(3, i) - end do - deallocate(vh) + write(LUN, NPLFMT) npl + do i = 1, npl + write(LUN, PLNAMEFMT, err = 667, iomsg = errmsg) pl%id(i), pl%Gmass(i), pl%radius(i) + write(LUN, VECFMT, err = 667, iomsg = errmsg) pl%xh(1, i), pl%xh(2, i), pl%xh(3, i) + write(LUN, VECFMT, err = 667, iomsg = errmsg) vh(1, i), vh(2, i), vh(3, i) + end do + deallocate(vh) end if close(LUN) end associate @@ -1878,13 +1889,6 @@ module subroutine io_write_frame_system(self, param) end if end select - select type(param) - class is (symba_parameters) - param%nciu%ltrack_origin = param%lfragmentation - class default - param%nciu%ltrack_origin = .false. - end select - select case(param%out_stat) case('APPEND') call param%nciu%open(param) diff --git a/src/modules/swiftest_classes.f90 b/src/modules/swiftest_classes.f90 index ec1a3e9df..faffcfb62 100644 --- a/src/modules/swiftest_classes.f90 +++ b/src/modules/swiftest_classes.f90 @@ -9,65 +9,74 @@ module swiftest_classes type :: netcdf_parameters - integer(I4B) :: out_type !! NetCDF output type (will be assigned either NF90_DOUBLE or NF90_FLOAT, depending on the user parameter) - integer(I4B) :: ncid !! NetCDF ID for the output file - integer(I4B) :: dimids(3) !! Dimensions of the NetCDF file - integer(I4B) :: time_dimid !! NetCDF ID for the time dimension - integer(I4B) :: id_dimid !! NetCDF ID for the particle id dimension - integer(I4B) :: str_dimid !! NetCDF ID for the character string dimension - integer(I4B) :: time_varid !! NetCDF ID for the time variable - integer(I4B) :: id_varid !! NetCDF ID for the particle name variable - integer(I4B) :: name_varid !! NetCDF ID for the namevariable - integer(I4B) :: ptype_varid !! NetCDF ID for the particle type variable - integer(I4B) :: npl_varid !! NetCDF ID for the number of active massive bodies variable - integer(I4B) :: ntp_varid !! NetCDF ID for the number of active test particles variable - integer(I4B) :: a_varid !! NetCDF ID for the semimajor axis variable - integer(I4B) :: e_varid !! NetCDF ID for the eccentricity variable - integer(I4B) :: inc_varid !! NetCDF ID for the inclination variable - integer(I4B) :: capom_varid !! NetCDF ID for the long. asc. node variable - integer(I4B) :: omega_varid !! NetCDF ID for the arg. periapsis variable - integer(I4B) :: capm_varid !! NetCDF ID for the mean anomaly variable - integer(I4B) :: xhx_varid !! NetCDF ID for the heliocentric position x variable - integer(I4B) :: xhy_varid !! NetCDF ID for the heliocentric position y variable - integer(I4B) :: xhz_varid !! NetCDF ID for the heliocentric position z variable - integer(I4B) :: vhx_varid !! NetCDF ID for the heliocentric velocity x variable - integer(I4B) :: vhy_varid !! NetCDF ID for the heliocentric velocity y variable - integer(I4B) :: vhz_varid !! NetCDF ID for the heliocentric velocity z variable - integer(I4B) :: Gmass_varid !! NetCDF ID for the mass variable - integer(I4B) :: rhill_varid !! NetCDF ID for the hill radius variable - integer(I4B) :: radius_varid !! NetCDF ID for the radius variable - integer(I4B) :: Ip1_varid !! NetCDF ID for the axis 1 principal moment of inertia variable - integer(I4B) :: Ip2_varid !! NetCDF ID for the axis 2 principal moment of inertia variable - integer(I4B) :: Ip3_varid !! NetCDF ID for the axis 3 principal moment of inertia variable - integer(I4B) :: rotx_varid !! NetCDF ID for the rotation x variable - integer(I4B) :: roty_varid !! NetCDF ID for the rotation y variable - integer(I4B) :: rotz_varid !! NetCDF ID for the rotation z variable - integer(I4B) :: k2_varid !! NetCDF ID for the Love number variable - integer(I4B) :: Q_varid !! NetCDF ID for the energy dissipation variable - integer(I4B) :: KE_orb_varid !! NetCDF ID for the system orbital kinetic energy variable - integer(I4B) :: KE_spin_varid !! NetCDF ID for the system spin kinetic energy variable - integer(I4B) :: PE_varid !! NetCDF ID for the system potential energy variable - integer(I4B) :: L_orbx_varid !! NetCDF ID for the system orbital angular momentum x variable - integer(I4B) :: L_orby_varid !! NetCDF ID for the system orbital angular momentum y variable - integer(I4B) :: L_orbz_varid !! NetCDF ID for the system orbital angular momentum z variable - integer(I4B) :: L_spinx_varid !! NetCDF ID for the system spin angular momentum x variable - integer(I4B) :: L_spiny_varid !! NetCDF ID for the system spin angular momentum y variable - integer(I4B) :: L_spinz_varid !! NetCDF ID for the system spin angular momentum z variable - integer(I4B) :: L_escapex_varid !! NetCDF ID for the escaped angular momentum x variable - integer(I4B) :: L_escapey_varid !! NetCDF ID for the escaped angular momentum x variable - integer(I4B) :: L_escapez_varid !! NetCDF ID for the escaped angular momentum x variable - integer(I4B) :: Ecollisions_varid !! NetCDF ID for the energy lost in collisions variable - integer(I4B) :: Euntracked_varid !! NetCDF ID for the energy that is untracked due to loss (untracked potential energy due to mergers and body energy for escaped bodies) - integer(I4B) :: GMescape_varid !! NetCDF ID for the G*Mass of bodies that escape the system - logical :: ltrack_origin = .false. !! Indicate whether to track particle origin (SyMBA with Fragmentation) - integer(I4B) :: origin_type_varid !! NetCDF ID for the origin type - integer(I4B) :: origin_time_varid !! NetCDF ID for the origin type - integer(I4B) :: origin_xhx_varid !! NetCDF ID for the origin xh x component - integer(I4B) :: origin_xhy_varid !! NetCDF ID for the origin xh y component - integer(I4B) :: origin_xhz_varid !! NetCDF ID for the origin xh z component - integer(I4B) :: origin_vhx_varid !! NetCDF ID for the origin xh x component - integer(I4B) :: origin_vhy_varid !! NetCDF ID for the origin xh y component - integer(I4B) :: origin_vhz_varid !! NetCDF ID for the origin xh z component + integer(I4B) :: out_type !! NetCDF output type (will be assigned either NF90_DOUBLE or NF90_FLOAT, depending on the user parameter) + integer(I4B) :: ncid !! NetCDF ID for the output file + integer(I4B) :: dimids(3) !! Dimensions of the NetCDF file + integer(I4B) :: time_dimid !! NetCDF ID for the time dimension + integer(I4B) :: id_dimid !! NetCDF ID for the particle id dimension + integer(I4B) :: str_dimid !! NetCDF ID for the character string dimension + integer(I4B) :: time_varid !! NetCDF ID for the time variable + integer(I4B) :: id_varid !! NetCDF ID for the particle name variable + integer(I4B) :: name_varid !! NetCDF ID for the namevariable + integer(I4B) :: ptype_varid !! NetCDF ID for the particle type variable + integer(I4B) :: npl_varid !! NetCDF ID for the number of active massive bodies variable + integer(I4B) :: ntp_varid !! NetCDF ID for the number of active test particles variable + integer(I4B) :: a_varid !! NetCDF ID for the semimajor axis variable + integer(I4B) :: e_varid !! NetCDF ID for the eccentricity variable + integer(I4B) :: inc_varid !! NetCDF ID for the inclination variable + integer(I4B) :: capom_varid !! NetCDF ID for the long. asc. node variable + integer(I4B) :: omega_varid !! NetCDF ID for the arg. periapsis variable + integer(I4B) :: capm_varid !! NetCDF ID for the mean anomaly variable + integer(I4B) :: xhx_varid !! NetCDF ID for the heliocentric position x variable + integer(I4B) :: xhy_varid !! NetCDF ID for the heliocentric position y variable + integer(I4B) :: xhz_varid !! NetCDF ID for the heliocentric position z variable + integer(I4B) :: vhx_varid !! NetCDF ID for the heliocentric velocity x variable + integer(I4B) :: vhy_varid !! NetCDF ID for the heliocentric velocity y variable + integer(I4B) :: vhz_varid !! NetCDF ID for the heliocentric velocity z variable + integer(I4B) :: Gmass_varid !! NetCDF ID for the mass variable + integer(I4B) :: rhill_varid !! NetCDF ID for the hill radius variable + integer(I4B) :: radius_varid !! NetCDF ID for the radius variable + integer(I4B) :: Ip1_varid !! NetCDF ID for the axis 1 principal moment of inertia variable + integer(I4B) :: Ip2_varid !! NetCDF ID for the axis 2 principal moment of inertia variable + integer(I4B) :: Ip3_varid !! NetCDF ID for the axis 3 principal moment of inertia variable + integer(I4B) :: rotx_varid !! NetCDF ID for the rotation x variable + integer(I4B) :: roty_varid !! NetCDF ID for the rotation y variable + integer(I4B) :: rotz_varid !! NetCDF ID for the rotation z variable + integer(I4B) :: k2_varid !! NetCDF ID for the Love number variable + integer(I4B) :: Q_varid !! NetCDF ID for the energy dissipation variable + integer(I4B) :: KE_orb_varid !! NetCDF ID for the system orbital kinetic energy variable + integer(I4B) :: KE_spin_varid !! NetCDF ID for the system spin kinetic energy variable + integer(I4B) :: PE_varid !! NetCDF ID for the system potential energy variable + integer(I4B) :: L_orbx_varid !! NetCDF ID for the system orbital angular momentum x variable + integer(I4B) :: L_orby_varid !! NetCDF ID for the system orbital angular momentum y variable + integer(I4B) :: L_orbz_varid !! NetCDF ID for the system orbital angular momentum z variable + integer(I4B) :: L_spinx_varid !! NetCDF ID for the system spin angular momentum x variable + integer(I4B) :: L_spiny_varid !! NetCDF ID for the system spin angular momentum y variable + integer(I4B) :: L_spinz_varid !! NetCDF ID for the system spin angular momentum z variable + integer(I4B) :: L_escapex_varid !! NetCDF ID for the escaped angular momentum x variable + integer(I4B) :: L_escapey_varid !! NetCDF ID for the escaped angular momentum x variable + integer(I4B) :: L_escapez_varid !! NetCDF ID for the escaped angular momentum x variable + integer(I4B) :: Ecollisions_varid !! NetCDF ID for the energy lost in collisions variable + integer(I4B) :: Euntracked_varid !! NetCDF ID for the energy that is untracked due to loss (untracked potential energy due to mergers and body energy for escaped bodies) + integer(I4B) :: GMescape_varid !! NetCDF ID for the G*Mass of bodies that escape the system + integer(I4B) :: status_varid !! NetCDF ID for the status variable + integer(I4B) :: origin_type_varid !! NetCDF ID for the origin type + integer(I4B) :: origin_time_varid !! NetCDF ID for the origin time + integer(I4B) :: origin_xhx_varid !! NetCDF ID for the origin xh x component + integer(I4B) :: origin_xhy_varid !! NetCDF ID for the origin xh y component + integer(I4B) :: origin_xhz_varid !! NetCDF ID for the origin xh z component + integer(I4B) :: origin_vhx_varid !! NetCDF ID for the origin xh x component + integer(I4B) :: origin_vhy_varid !! NetCDF ID for the origin xh y component + integer(I4B) :: origin_vhz_varid !! NetCDF ID for the origin xh z component + integer(I4B) :: discard_time_varid !! NetCDF ID for the time of discard variable + integer(I4B) :: discard_xhx_varid !! NetCDF ID for the heliocentric position of the body at the time of discard x variable + integer(I4B) :: discard_xhy_varid !! NetCDF ID for the heliocentric position of the body at the time of discard y variable + integer(I4B) :: discard_xhz_varid !! NetCDF ID for the heliocentric position of the body at the time of discard z variable + integer(I4B) :: discard_vhx_varid !! NetCDF ID for the heliocentric velocity of the body at the time of discard x variable + integer(I4B) :: discard_vhy_varid !! NetCDF ID for the heliocentric velocity of the body at the time of discard y variable + integer(I4B) :: discard_vhz_varid !! NetCDF ID for the heliocentric velocity of the body at the time of discard z variable + integer(I4B) :: discard_body_id_varid !! NetCDF ID for the id of the other body involved in the discard + contains procedure :: close => netcdf_close !! Closes an open NetCDF file procedure :: initialize => netcdf_initialize_output !! Initialize a set of parameters used to identify a NetCDF output object @@ -172,9 +181,10 @@ module swiftest_classes real(DP), dimension(NDIM) :: discard_vh !! The heliocentric velocity vector at the time of the particle's discard integer(I4B) :: discard_body_id !! The id of the other body involved in the discard (0 if no other body involved) contains - procedure :: dump => io_dump_particle_info !! Dumps contents of particle information to file - procedure :: read_in => io_read_in_particle_info !! Read in a particle information object from an open file - procedure :: copy => util_copy_particle_info !! Copies one set of information object components into another, component-by-component + procedure :: dump => io_dump_particle_info !! Dumps contents of particle information to file + procedure :: read_in => io_read_in_particle_info !! Read in a particle information object from an open file + procedure :: copy => util_copy_particle_info !! Copies one set of information object components into another, component-by-component + procedure :: set_value => util_set_particle_info !! Sets one or more values of the particle information metadata object end type swiftest_particle_info !******************************************************************************************************************************** @@ -234,29 +244,29 @@ module swiftest_classes !> An abstract class for a generic collection of Swiftest bodies 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 - type(swiftest_particle_info), dimension(:), allocatable :: info !! Particle metadata information - 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 !! Swiftestcentric position - real(DP), dimension(:,:), allocatable :: vh !! Swiftestcentric velocity - real(DP), dimension(:,:), allocatable :: xb !! Barycentric position - 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) - real(DP), dimension(:), allocatable :: e !! Eccentricity - real(DP), dimension(:), allocatable :: inc !! Inclination - real(DP), dimension(:), allocatable :: capom !! Longitude of ascending node - real(DP), dimension(:), allocatable :: omega !! Argument of pericenter - real(DP), dimension(:), allocatable :: capm !! Mean anomaly + logical :: lfirst = .true. !! Run the current step as a first + integer(I4B) :: nbody = 0 !! Number of bodies + type(swiftest_particle_info), dimension(:), allocatable :: info !! Particle metadata information + 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 !! Swiftestcentric position + real(DP), dimension(:,:), allocatable :: vh !! Swiftestcentric velocity + real(DP), dimension(:,:), allocatable :: xb !! Barycentric position + 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) + real(DP), dimension(:), allocatable :: e !! Eccentricity + real(DP), dimension(:), allocatable :: inc !! Inclination + real(DP), dimension(:), allocatable :: capom !! Longitude of ascending node + real(DP), dimension(:), allocatable :: omega !! Argument of pericenter + real(DP), dimension(:), allocatable :: capm !! Mean anomaly !! 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 @@ -341,10 +351,10 @@ module swiftest_classes !> An abstract class for a generic collection of Swiftest test particles 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 - real(DP), dimension(:), allocatable :: atp !! Semimajor axis following perihelion passage - integer(I4B), dimension(:,:), allocatable :: k_pltp !! Index array used to convert flattened the body-body comparison upper triangular matrix + 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 + integer(I4B), dimension(:,:), allocatable :: k_pltp !! Index array used to convert flattened the body-body comparison upper triangular matrix integer(I8B) :: npltp !! Number of pl-tp 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_tp and util_spill_tp @@ -376,22 +386,22 @@ module swiftest_classes !> An abstract class for a basic Swiftest nbody system type, abstract :: 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 - class(swiftest_tp), allocatable :: tp !! Test particle data structure - class(swiftest_tp), allocatable :: tp_discards !! Discarded test particle data structure - class(swiftest_pl), allocatable :: pl_discards !! Discarded massive body particle data structure - real(DP) :: GMtot = 0.0_DP !! Total system mass - used for barycentric coordinate conversion - real(DP) :: ke_orbit = 0.0_DP !! System orbital kinetic energy - real(DP) :: ke_spin = 0.0_DP !! System spin kinetic energy - real(DP) :: pe = 0.0_DP !! System potential energy - real(DP) :: te = 0.0_DP !! System total energy - 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) :: Ltot = 0.0_DP !! System angular momentum vector - 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 + class(swiftest_cb), allocatable :: cb !! Central body data structure + class(swiftest_pl), allocatable :: pl !! Massive body data structure + class(swiftest_tp), allocatable :: tp !! Test particle data structure + class(swiftest_tp), allocatable :: tp_discards !! Discarded test particle data structure + class(swiftest_pl), allocatable :: pl_discards !! Discarded massive body particle data structure + real(DP) :: GMtot = 0.0_DP !! Total system mass - used for barycentric coordinate conversion + real(DP) :: ke_orbit = 0.0_DP !! System orbital kinetic energy + real(DP) :: ke_spin = 0.0_DP !! System spin kinetic energy + real(DP) :: pe = 0.0_DP !! System potential energy + real(DP) :: te = 0.0_DP !! System total energy + 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) :: Ltot = 0.0_DP !! System angular momentum vector + 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 contains !> Each integrator will have its own version of the step procedure(abstract_step_system), deferred :: step @@ -783,7 +793,7 @@ end subroutine io_read_particle_info_system module subroutine io_write_discard(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 io_write_discard module subroutine io_toupper(string) @@ -1122,7 +1132,6 @@ module subroutine util_append_arr_logical(arr, source, nold, nsrc, lsource_mask) integer(I4B), intent(in) :: nold, nsrc !! Extend of the old array and the source array, respectively logical, dimension(:), intent(in) :: lsource_mask !! Logical mask indicating which elements to append to end subroutine util_append_arr_logical - end interface interface @@ -1432,6 +1441,22 @@ module subroutine util_set_mu_tp(self, cb) class(swiftest_cb), intent(inout) :: cb !! Swiftest central body object end subroutine util_set_mu_tp + module subroutine util_set_particle_info(self, name, particle_type, status, origin_type, origin_time, origin_xh, origin_vh, discard_time, discard_xh, discard_vh, discard_body_id) + implicit none + class(swiftest_particle_info), intent(inout) :: self + character(len=*), intent(in), optional :: name !! Non-unique name + character(len=*), intent(in), optional :: particle_type !! String containing a description of the particle type (e.g. Central Body, Massive Body, Test Particle) + character(len=*), intent(in), optional :: status !! Particle status description: Active, Merged, Fragmented, etc. + character(len=*), intent(in), optional :: origin_type !! String containing a description of the origin of the particle (e.g. Initial Conditions, Supercatastrophic, Disruption, etc.) + real(DP), intent(in), optional :: origin_time !! The time of the particle's formation + real(DP), dimension(:), intent(in), optional :: origin_xh !! The heliocentric distance vector at the time of the particle's formation + real(DP), dimension(:), intent(in), optional :: origin_vh !! The heliocentric velocity vector at the time of the particle's formation + real(DP), intent(in), optional :: discard_time !! The time of the particle's discard + real(DP), dimension(:), intent(in), optional :: discard_xh !! The heliocentric distance vector at the time of the particle's discard + real(DP), dimension(:), intent(in), optional :: discard_vh !! The heliocentric velocity vector at the time of the particle's discard + integer(I4B), intent(in), optional :: discard_body_id !! The id of the other body involved in the discard (0 if no other body involved) + end subroutine util_set_particle_info + module subroutine util_set_rhill(self,cb) implicit none class(swiftest_pl), intent(inout) :: self !! Swiftest massive body object diff --git a/src/modules/swiftest_globals.f90 b/src/modules/swiftest_globals.f90 index a9dd2d762..72d204a49 100644 --- a/src/modules/swiftest_globals.f90 +++ b/src/modules/swiftest_globals.f90 @@ -58,6 +58,7 @@ module swiftest_globals character(*), parameter :: CB_TYPE_NAME = "Central Body" character(*), parameter :: PL_TYPE_NAME = "Massive Body" character(*), parameter :: TP_TYPE_NAME = "Test Particle" + character(*), parameter :: PL_TINY_TYPE_NAME = "Semi-Interacting Massive Body" ! OpenMP Parameters integer(I4B) :: nthreads = 1 !! Number of OpenMP threads @@ -135,60 +136,68 @@ module swiftest_globals real(DP), parameter :: einsteinC = 299792458.0_DP !! Speed of light in SI units !> NetCDF variable names and constants - character(*), parameter :: NETCDF_OUTFILE = 'bin.nc' !! Default output file name - character(*), parameter :: TIME_DIMNAME = "time" !! NetCDF name of the time dimension - character(*), parameter :: ID_DIMNAME = "id" !! NetCDF name of the particle id dimension - character(*), parameter :: STR_DIMNAME = "str" !! NetCDF name of the particle id dimension - character(*), parameter :: PTYPE_VARNAME = "particle_type" ! NetCDF name of the particle type variable - character(*), parameter :: NAME_VARNAME = "name" !! NetCDF name of the particle name variable - character(*), parameter :: NPL_VARNAME = "npl" !! NetCDF name of the number of active massive bodies variable - character(*), parameter :: NTP_VARNAME = "ntp" !! NetCDF name of the number of active test particles variable - character(*), parameter :: A_VARNAME = "a" !! NetCDF name of the semimajor axis variable - character(*), parameter :: E_VARNAME = "e" !! NetCDF name of the eccentricity variable - character(*), parameter :: INC_VARNAME = "inc" !! NetCDF name of the inclination variable - character(*), parameter :: CAPOM_VARNAME = "capom" !! NetCDF name of the long. asc. node variable - character(*), parameter :: OMEGA_VARNAME = "omega" !! NetCDF name of the arg. periapsis variable - character(*), parameter :: CAPM_VARNAME = "capm" !! NetCDF name of the mean anomaly variable - character(*), parameter :: XHX_VARNAME = "xhx" !! NetCDF name of the heliocentric position x variable - character(*), parameter :: XHY_VARNAME = "xhy" !! NetCDF name of the heliocentric position y variable - character(*), parameter :: XHZ_VARNAME = "xhz" !! NetCDF name of the heliocentric position z variable - character(*), parameter :: VHX_VARNAME = "vhx" !! NetCDF name of the heliocentric velocity x variable - character(*), parameter :: VHY_VARNAME = "vhy" !! NetCDF name of the heliocentric velocity y variable - character(*), parameter :: VHZ_VARNAME = "vhz" !! NetCDF name of the heliocentric velocity z variable - character(*), parameter :: GMASS_VARNAME = "Gmass" !! NetCDF name of the mass variable - character(*), parameter :: RHILL_VARNAME = "rhill" !! NetCDF name of the hill radius variable - character(*), parameter :: RADIUS_VARNAME = "radius" !! NetCDF name of the radius variable - character(*), parameter :: IP1_VARNAME = "Ip1" !! NetCDF name of the axis 1 principal moment of inertial variable - character(*), parameter :: IP2_VARNAME = "Ip2" !! NetCDF name of the axis 2 principal moment of inertial variable - character(*), parameter :: IP3_VARNAME = "Ip3" !! NetCDF name of the axis 3 principal moment of inertial variable - character(*), parameter :: ROTX_VARNAME = "rotx" !! NetCDF name of the rotation x variable - character(*), parameter :: ROTY_VARNAME = "roty" !! NetCDF name of the rotation y variable - character(*), parameter :: ROTZ_VARNAME = "rotz" !! NetCDF name of the rotation z variable - character(*), parameter :: K2_VARNAME = "k2" !! NetCDF name of the Love number variable - character(*), parameter :: Q_VARNAME = "Q" !! NetCDF name of the energy dissipation variable - character(*), parameter :: KE_ORB_VARNAME = "KE_orb" !! NetCDF name of the system orbital kinetic energy variable - character(*), parameter :: KE_SPIN_VARNAME = "KE_spin" !! NetCDF name of the system spin kinetic energy variable - character(*), parameter :: PE_VARNAME = "PE" !! NetCDF name of the system potential energy variable - character(*), parameter :: L_ORBX_VARNAME = "L_orbx" !! NetCDF name of the orbital angular momentum x variable - character(*), parameter :: L_ORBY_VARNAME = "L_orby" !! NetCDF name of the orbital angular momentum y variable - character(*), parameter :: L_ORBZ_VARNAME = "L_orbz" !! NetCDF name of the orbital angular momentum z variable - character(*), parameter :: L_SPINX_VARNAME = "L_spinx" !! NetCDF name of the spin angular momentum x variable - character(*), parameter :: L_SPINY_VARNAME = "L_spiny" !! NetCDF name of the spin angular momentum y variable - character(*), parameter :: L_SPINZ_VARNAME = "L_spinz" !! NetCDF name of the spin angular momentum z variable - character(*), parameter :: L_ESCAPEX_VARNAME = "L_escapex" !! NetCDF name of the escaped angular momentum x variable - character(*), parameter :: L_ESCAPEY_VARNAME = "L_escapey" !! NetCDF name of the escaped angular momentum y variable - character(*), parameter :: L_ESCAPEZ_VARNAME = "L_escapez" !! NetCDF name of the escaped angular momentum z variable - character(*), parameter :: ECOLLISIONS_VARNAME = "Ecollisions" !! NetCDF name of the escaped angular momentum y variable - character(*), parameter :: EUNTRACKED_VARNAME = "Euntracked" !! NetCDF name of the energy that is untracked due to loss (untracked potential energy due to mergers and body energy for escaped bodies) - character(*), parameter :: GMESCAPE_VARNAME = "GMescape" !! NetCDF name of the G*Mass of bodies that escape the system - character(*), parameter :: ORIGIN_TYPE_VARNAME = "origin_type" - character(*), parameter :: ORIGIN_TIME_VARNAME = "origin_time" - character(*), parameter :: ORIGIN_XHX_VARNAME = "origin_xhx" - character(*), parameter :: ORIGIN_XHY_VARNAME = "origin_xhy" - character(*), parameter :: ORIGIN_XHZ_VARNAME = "origin_xhz" - character(*), parameter :: ORIGIN_VHX_VARNAME = "origin_vhx" - character(*), parameter :: ORIGIN_VHY_VARNAME = "origin_vhy" - character(*), parameter :: ORIGIN_VHZ_VARNAME = "origin_vhz" - character(*), parameter :: PL_TINY_TYPE_NAME = "Semi-Interacting Massive Body" + character(*), parameter :: NETCDF_OUTFILE = 'bin.nc' !! Default output file name + character(*), parameter :: TIME_DIMNAME = "time" !! NetCDF name of the time dimension + character(*), parameter :: ID_DIMNAME = "id" !! NetCDF name of the particle id dimension + character(*), parameter :: STR_DIMNAME = "str" !! NetCDF name of the particle id dimension + character(*), parameter :: PTYPE_VARNAME = "particle_type" !! NetCDF name of the particle type variable + character(*), parameter :: NAME_VARNAME = "name" !! NetCDF name of the particle name variable + character(*), parameter :: NPL_VARNAME = "npl" !! NetCDF name of the number of active massive bodies variable + character(*), parameter :: NTP_VARNAME = "ntp" !! NetCDF name of the number of active test particles variable + character(*), parameter :: A_VARNAME = "a" !! NetCDF name of the semimajor axis variable + character(*), parameter :: E_VARNAME = "e" !! NetCDF name of the eccentricity variable + character(*), parameter :: INC_VARNAME = "inc" !! NetCDF name of the inclination variable + character(*), parameter :: CAPOM_VARNAME = "capom" !! NetCDF name of the long. asc. node variable + character(*), parameter :: OMEGA_VARNAME = "omega" !! NetCDF name of the arg. periapsis variable + character(*), parameter :: CAPM_VARNAME = "capm" !! NetCDF name of the mean anomaly variable + character(*), parameter :: XHX_VARNAME = "xhx" !! NetCDF name of the heliocentric position x variable + character(*), parameter :: XHY_VARNAME = "xhy" !! NetCDF name of the heliocentric position y variable + character(*), parameter :: XHZ_VARNAME = "xhz" !! NetCDF name of the heliocentric position z variable + character(*), parameter :: VHX_VARNAME = "vhx" !! NetCDF name of the heliocentric velocity x variable + character(*), parameter :: VHY_VARNAME = "vhy" !! NetCDF name of the heliocentric velocity y variable + character(*), parameter :: VHZ_VARNAME = "vhz" !! NetCDF name of the heliocentric velocity z variable + character(*), parameter :: GMASS_VARNAME = "Gmass" !! NetCDF name of the mass variable + character(*), parameter :: RHILL_VARNAME = "rhill" !! NetCDF name of the hill radius variable + character(*), parameter :: RADIUS_VARNAME = "radius" !! NetCDF name of the radius variable + character(*), parameter :: IP1_VARNAME = "Ip1" !! NetCDF name of the axis 1 principal moment of inertial variable + character(*), parameter :: IP2_VARNAME = "Ip2" !! NetCDF name of the axis 2 principal moment of inertial variable + character(*), parameter :: IP3_VARNAME = "Ip3" !! NetCDF name of the axis 3 principal moment of inertial variable + character(*), parameter :: ROTX_VARNAME = "rotx" !! NetCDF name of the rotation x variable + character(*), parameter :: ROTY_VARNAME = "roty" !! NetCDF name of the rotation y variable + character(*), parameter :: ROTZ_VARNAME = "rotz" !! NetCDF name of the rotation z variable + character(*), parameter :: K2_VARNAME = "k2" !! NetCDF name of the Love number variable + character(*), parameter :: Q_VARNAME = "Q" !! NetCDF name of the energy dissipation variable + character(*), parameter :: KE_ORB_VARNAME = "KE_orb" !! NetCDF name of the system orbital kinetic energy variable + character(*), parameter :: KE_SPIN_VARNAME = "KE_spin" !! NetCDF name of the system spin kinetic energy variable + character(*), parameter :: PE_VARNAME = "PE" !! NetCDF name of the system potential energy variable + character(*), parameter :: L_ORBX_VARNAME = "L_orbx" !! NetCDF name of the orbital angular momentum x variable + character(*), parameter :: L_ORBY_VARNAME = "L_orby" !! NetCDF name of the orbital angular momentum y variable + character(*), parameter :: L_ORBZ_VARNAME = "L_orbz" !! NetCDF name of the orbital angular momentum z variable + character(*), parameter :: L_SPINX_VARNAME = "L_spinx" !! NetCDF name of the spin angular momentum x variable + character(*), parameter :: L_SPINY_VARNAME = "L_spiny" !! NetCDF name of the spin angular momentum y variable + character(*), parameter :: L_SPINZ_VARNAME = "L_spinz" !! NetCDF name of the spin angular momentum z variable + character(*), parameter :: L_ESCAPEX_VARNAME = "L_escapex" !! NetCDF name of the escaped angular momentum x variable + character(*), parameter :: L_ESCAPEY_VARNAME = "L_escapey" !! NetCDF name of the escaped angular momentum y variable + character(*), parameter :: L_ESCAPEZ_VARNAME = "L_escapez" !! NetCDF name of the escaped angular momentum z variable + character(*), parameter :: ECOLLISIONS_VARNAME = "Ecollisions" !! NetCDF name of the escaped angular momentum y variable + character(*), parameter :: EUNTRACKED_VARNAME = "Euntracked" !! NetCDF name of the energy that is untracked due to loss (untracked potential energy due to mergers and body energy for escaped bodies) + character(*), parameter :: GMESCAPE_VARNAME = "GMescape" !! NetCDF name of the G*Mass of bodies that escape the system + character(*), parameter :: STATUS_VARNAME = "status" !! NetCDF name of the current status of the body variable (includes discard type) + character(*), parameter :: ORIGIN_TYPE_VARNAME = "origin_type" !! NetCDF name of the origin type variable (Initial Conditions, Disruption, etc.) + character(*), parameter :: ORIGIN_TIME_VARNAME = "origin_time" !! NetCDF name of the time of origin variable + character(*), parameter :: ORIGIN_XHX_VARNAME = "origin_xhx" !! NetCDF name of the heliocentric position of the body at the time of origin x variable + character(*), parameter :: ORIGIN_XHY_VARNAME = "origin_xhy" !! NetCDF name of the heliocentric position of the body at the time of origin y variable + character(*), parameter :: ORIGIN_XHZ_VARNAME = "origin_xhz" !! NetCDF name of the heliocentric position of the body at the time of origin z variable + character(*), parameter :: ORIGIN_VHX_VARNAME = "origin_vhx" !! NetCDF name of the heliocentric velocity of the body at the time of origin x variable + character(*), parameter :: ORIGIN_VHY_VARNAME = "origin_vhy" !! NetCDF name of the heliocentric velocity of the body at the time of origin y variable + character(*), parameter :: ORIGIN_VHZ_VARNAME = "origin_vhz" !! NetCDF name of the heliocentric velocity of the body at the time of origin z variable + character(*), parameter :: DISCARD_TIME_VARNAME = "discard_time" !! NetCDF name of the time of discard variable + character(*), parameter :: DISCARD_XHX_VARNAME = "discard_xhx" !! NetCDF name of the heliocentric position of the body at the time of discard x variable + character(*), parameter :: DISCARD_XHY_VARNAME = "discard_xhy" !! NetCDF name of the heliocentric position of the body at the time of discard y variable + character(*), parameter :: DISCARD_XHZ_VARNAME = "discard_xhz" !! NetCDF name of the heliocentric position of the body at the time of discard z variable + character(*), parameter :: DISCARD_VHX_VARNAME = "discard_vhx" !! NetCDF name of the heliocentric velocity of the body at the time of discard x variable + character(*), parameter :: DISCARD_VHY_VARNAME = "discard_vhy" !! NetCDF name of the heliocentric velocity of the body at the time of discard y variable + character(*), parameter :: DISCARD_VHZ_VARNAME = "discard_vhz" !! NetCDF name of the heliocentric velocity of the body at the time of discard z variable + character(*), parameter :: DISCARD_BODY_ID_VARNAME = "discard_body_id" !! NetCDF name of the id of the other body involved in the discard end module swiftest_globals diff --git a/src/modules/symba_classes.f90 b/src/modules/symba_classes.f90 index 60dbd4feb..ca51def4c 100644 --- a/src/modules/symba_classes.f90 +++ b/src/modules/symba_classes.f90 @@ -369,7 +369,7 @@ module subroutine symba_io_write_discard(self, param) use swiftest_classes, only : swiftest_parameters implicit none class(symba_nbody_system), intent(inout) :: self !! SyMBA 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_io_write_discard module subroutine symba_kick_getacch_int_pl(self) diff --git a/src/netcdf/netcdf.f90 b/src/netcdf/netcdf.f90 index e37703782..6672ee7d0 100644 --- a/src/netcdf/netcdf.f90 +++ b/src/netcdf/netcdf.f90 @@ -120,16 +120,23 @@ module subroutine netcdf_initialize_output(self, param) call check( nf90_def_var(self%ncid, GMESCAPE_VARNAME, self%out_type, self%time_dimid, self%GMescape_varid) ) end if - if (self%ltrack_origin) then - call check( nf90_def_var(self%ncid, ORIGIN_TYPE_VARNAME, NF90_CHAR, [self%str_dimid, self%id_dimid], self%origin_type_varid) ) - call check( nf90_def_var(self%ncid, ORIGIN_TIME_VARNAME, self%out_type, self%id_dimid, self%origin_time_varid) ) - call check( nf90_def_var(self%ncid, ORIGIN_XHX_VARNAME, self%out_type, self%id_dimid, self%origin_xhx_varid) ) - call check( nf90_def_var(self%ncid, ORIGIN_XHY_VARNAME, self%out_type, self%id_dimid, self%origin_xhy_varid) ) - call check( nf90_def_var(self%ncid, ORIGIN_XHZ_VARNAME, self%out_type, self%id_dimid, self%origin_xhz_varid) ) - call check( nf90_def_var(self%ncid, ORIGIN_VHX_VARNAME, self%out_type, self%id_dimid, self%origin_vhx_varid) ) - call check( nf90_def_var(self%ncid, ORIGIN_VHY_VARNAME, self%out_type, self%id_dimid, self%origin_vhy_varid) ) - call check( nf90_def_var(self%ncid, ORIGIN_VHZ_VARNAME, self%out_type, self%id_dimid, self%origin_vhz_varid) ) - end if + call check( nf90_def_var(self%ncid, STATUS_VARNAME, NF90_CHAR, [self%str_dimid, self%id_dimid], self%status_varid) ) + call check( nf90_def_var(self%ncid, ORIGIN_TYPE_VARNAME, NF90_CHAR, [self%str_dimid, self%id_dimid], self%origin_type_varid) ) + call check( nf90_def_var(self%ncid, ORIGIN_TIME_VARNAME, self%out_type, self%id_dimid, self%origin_time_varid) ) + call check( nf90_def_var(self%ncid, ORIGIN_XHX_VARNAME, self%out_type, self%id_dimid, self%origin_xhx_varid) ) + call check( nf90_def_var(self%ncid, ORIGIN_XHY_VARNAME, self%out_type, self%id_dimid, self%origin_xhy_varid) ) + call check( nf90_def_var(self%ncid, ORIGIN_XHZ_VARNAME, self%out_type, self%id_dimid, self%origin_xhz_varid) ) + call check( nf90_def_var(self%ncid, ORIGIN_VHX_VARNAME, self%out_type, self%id_dimid, self%origin_vhx_varid) ) + call check( nf90_def_var(self%ncid, ORIGIN_VHY_VARNAME, self%out_type, self%id_dimid, self%origin_vhy_varid) ) + call check( nf90_def_var(self%ncid, ORIGIN_VHZ_VARNAME, self%out_type, self%id_dimid, self%origin_vhz_varid) ) + call check( nf90_def_var(self%ncid, DISCARD_TIME_VARNAME, self%out_type, self%id_dimid, self%discard_time_varid) ) + call check( nf90_def_var(self%ncid, DISCARD_XHX_VARNAME, self%out_type, self%id_dimid, self%discard_xhx_varid) ) + call check( nf90_def_var(self%ncid, DISCARD_XHY_VARNAME, self%out_type, self%id_dimid, self%discard_xhy_varid) ) + call check( nf90_def_var(self%ncid, DISCARD_XHZ_VARNAME, self%out_type, self%id_dimid, self%discard_xhz_varid) ) + call check( nf90_def_var(self%ncid, DISCARD_VHX_VARNAME, self%out_type, self%id_dimid, self%discard_vhx_varid) ) + call check( nf90_def_var(self%ncid, DISCARD_VHY_VARNAME, self%out_type, self%id_dimid, self%discard_vhy_varid) ) + call check( nf90_def_var(self%ncid, DISCARD_VHZ_VARNAME, self%out_type, self%id_dimid, self%discard_vhz_varid) ) + call check( nf90_def_var(self%ncid, DISCARD_BODY_ID_VARNAME, NF90_INT, self%id_dimid, self%discard_body_id_varid) ) return end subroutine netcdf_initialize_output @@ -208,16 +215,24 @@ module subroutine netcdf_open(self, param) call check( nf90_inq_varid(self%ncid, GMESCAPE_VARNAME, self%GMescape_varid) ) end if - if (self%ltrack_origin) then - call check( nf90_inq_varid(self%ncid, ORIGIN_TYPE_VARNAME, self%origin_type_varid)) - call check( nf90_inq_varid(self%ncid, ORIGIN_TIME_VARNAME, self%origin_time_varid)) - call check( nf90_inq_varid(self%ncid, ORIGIN_XHX_VARNAME, self%origin_xhx_varid)) - call check( nf90_inq_varid(self%ncid, ORIGIN_XHY_VARNAME, self%origin_xhy_varid)) - call check( nf90_inq_varid(self%ncid, ORIGIN_XHZ_VARNAME, self%origin_xhz_varid)) - call check( nf90_inq_varid(self%ncid, ORIGIN_VHX_VARNAME, self%origin_vhx_varid)) - call check( nf90_inq_varid(self%ncid, ORIGIN_VHY_VARNAME, self%origin_vhy_varid)) - call check( nf90_inq_varid(self%ncid, ORIGIN_VHZ_VARNAME, self%origin_vhz_varid)) - end if + call check( nf90_inq_varid(self%ncid, STATUS_VARNAME, self%status_varid)) + call check( nf90_inq_varid(self%ncid, ORIGIN_TYPE_VARNAME, self%origin_type_varid)) + call check( nf90_inq_varid(self%ncid, ORIGIN_TIME_VARNAME, self%origin_time_varid)) + call check( nf90_inq_varid(self%ncid, ORIGIN_XHX_VARNAME, self%origin_xhx_varid)) + call check( nf90_inq_varid(self%ncid, ORIGIN_XHY_VARNAME, self%origin_xhy_varid)) + call check( nf90_inq_varid(self%ncid, ORIGIN_XHZ_VARNAME, self%origin_xhz_varid)) + call check( nf90_inq_varid(self%ncid, ORIGIN_VHX_VARNAME, self%origin_vhx_varid)) + call check( nf90_inq_varid(self%ncid, ORIGIN_VHY_VARNAME, self%origin_vhy_varid)) + call check( nf90_inq_varid(self%ncid, ORIGIN_VHZ_VARNAME, self%origin_vhz_varid)) + + call check( nf90_inq_varid(self%ncid, DISCARD_TIME_VARNAME, self%discard_time_varid)) + call check( nf90_inq_varid(self%ncid, DISCARD_XHX_VARNAME, self%discard_xhx_varid)) + call check( nf90_inq_varid(self%ncid, DISCARD_XHY_VARNAME, self%discard_xhy_varid)) + call check( nf90_inq_varid(self%ncid, DISCARD_XHZ_VARNAME, self%discard_xhz_varid)) + call check( nf90_inq_varid(self%ncid, DISCARD_VHX_VARNAME, self%discard_vhx_varid)) + call check( nf90_inq_varid(self%ncid, DISCARD_VHY_VARNAME, self%discard_vhy_varid)) + call check( nf90_inq_varid(self%ncid, DISCARD_VHZ_VARNAME, self%discard_vhz_varid)) + call check( nf90_inq_varid(self%ncid, DISCARD_BODY_ID_VARNAME, self%discard_body_id_varid)) return end subroutine netcdf_open @@ -344,7 +359,6 @@ module subroutine netcdf_write_particle_info_base(self, iu) integer(I4B), dimension(:), allocatable :: ind character(len=:), allocatable :: charstring - select type(self) class is (swiftest_body) associate(n => self%nbody) @@ -364,9 +378,14 @@ module subroutine netcdf_write_particle_info_base(self, iu) strlen = len(charstring) call check( nf90_put_var(iu%ncid, iu%ptype_varid, charstring, start=[1, idslot], count=[strlen, 1]) ) + charstring = trim(adjustl(self%info(j)%status)) + strlen = len(charstring) + call check( nf90_put_var(iu%ncid, iu%status_varid, charstring, start=[1, idslot], count=[strlen, 1]) ) + charstring = trim(adjustl(self%info(j)%origin_type)) strlen = len(charstring) call check( nf90_put_var(iu%ncid, iu%origin_type_varid, charstring, start=[1, idslot], count=[strlen, 1]) ) + call check( nf90_put_var(iu%ncid, iu%origin_time_varid, self%info(j)%origin_time, start=[idslot]) ) call check( nf90_put_var(iu%ncid, iu%origin_xhx_varid, self%info(j)%origin_xh(1), start=[idslot]) ) call check( nf90_put_var(iu%ncid, iu%origin_xhy_varid, self%info(j)%origin_xh(2), start=[idslot]) ) @@ -374,6 +393,14 @@ module subroutine netcdf_write_particle_info_base(self, iu) call check( nf90_put_var(iu%ncid, iu%origin_vhx_varid, self%info(j)%origin_vh(1), start=[idslot]) ) call check( nf90_put_var(iu%ncid, iu%origin_vhy_varid, self%info(j)%origin_vh(2), start=[idslot]) ) call check( nf90_put_var(iu%ncid, iu%origin_vhz_varid, self%info(j)%origin_vh(3), start=[idslot]) ) + + call check( nf90_put_var(iu%ncid, iu%discard_time_varid, self%info(j)%discard_time, start=[idslot]) ) + call check( nf90_put_var(iu%ncid, iu%discard_xhx_varid, self%info(j)%discard_xh(1), start=[idslot]) ) + call check( nf90_put_var(iu%ncid, iu%discard_xhy_varid, self%info(j)%discard_xh(2), start=[idslot]) ) + call check( nf90_put_var(iu%ncid, iu%discard_xhz_varid, self%info(j)%discard_xh(3), start=[idslot]) ) + call check( nf90_put_var(iu%ncid, iu%discard_vhx_varid, self%info(j)%discard_vh(1), start=[idslot]) ) + call check( nf90_put_var(iu%ncid, iu%discard_vhy_varid, self%info(j)%discard_vh(2), start=[idslot]) ) + call check( nf90_put_var(iu%ncid, iu%discard_vhz_varid, self%info(j)%discard_vh(3), start=[idslot]) ) end do end associate @@ -389,9 +416,14 @@ module subroutine netcdf_write_particle_info_base(self, iu) strlen = len(charstring) call check( nf90_put_var(iu%ncid, iu%ptype_varid, charstring, start=[1, idslot], count=[strlen, 1]) ) + charstring = trim(adjustl(self%info%status)) + strlen = len(charstring) + call check( nf90_put_var(iu%ncid, iu%status_varid, charstring, start=[1, idslot], count=[strlen, 1]) ) + charstring = trim(adjustl(self%info%origin_type)) strlen = len(charstring) call check( nf90_put_var(iu%ncid, iu%origin_type_varid, charstring, start=[1, idslot], count=[strlen, 1]) ) + call check( nf90_put_var(iu%ncid, iu%origin_time_varid, self%info%origin_time, start=[idslot]) ) call check( nf90_put_var(iu%ncid, iu%origin_xhx_varid, self%info%origin_xh(1), start=[idslot]) ) call check( nf90_put_var(iu%ncid, iu%origin_xhy_varid, self%info%origin_xh(2), start=[idslot]) ) @@ -399,6 +431,14 @@ module subroutine netcdf_write_particle_info_base(self, iu) call check( nf90_put_var(iu%ncid, iu%origin_vhx_varid, self%info%origin_vh(1), start=[idslot]) ) call check( nf90_put_var(iu%ncid, iu%origin_vhy_varid, self%info%origin_vh(2), start=[idslot]) ) call check( nf90_put_var(iu%ncid, iu%origin_vhz_varid, self%info%origin_vh(3), start=[idslot]) ) + + call check( nf90_put_var(iu%ncid, iu%discard_time_varid, self%info%discard_time, start=[idslot]) ) + call check( nf90_put_var(iu%ncid, iu%discard_xhx_varid, self%info%discard_xh(1), start=[idslot]) ) + call check( nf90_put_var(iu%ncid, iu%discard_xhy_varid, self%info%discard_xh(2), start=[idslot]) ) + call check( nf90_put_var(iu%ncid, iu%discard_xhz_varid, self%info%discard_xh(3), start=[idslot]) ) + call check( nf90_put_var(iu%ncid, iu%discard_vhx_varid, self%info%discard_vh(1), start=[idslot]) ) + call check( nf90_put_var(iu%ncid, iu%discard_vhy_varid, self%info%discard_vh(2), start=[idslot]) ) + call check( nf90_put_var(iu%ncid, iu%discard_vhz_varid, self%info%discard_vh(3), start=[idslot]) ) end select return diff --git a/src/rmvs/rmvs_discard.f90 b/src/rmvs/rmvs_discard.f90 index 724c107be..b179178dc 100644 --- a/src/rmvs/rmvs_discard.f90 +++ b/src/rmvs/rmvs_discard.f90 @@ -34,6 +34,7 @@ module subroutine rmvs_discard_tp(self, system, param) // ") is too small at t = " // trim(adjustl(timestr)) tp%ldiscard(i) = .true. tp%lmask(i) = .false. + call tp%info(i)%set_value(status="DISCARDED_PLQ", discard_time=t, discard_xh=tp%xh(:,i), discard_vh=tp%vh(:,i), discard_body_id=pl%id(iplperP)) end if end if end associate diff --git a/src/setup/setup.f90 b/src/setup/setup.f90 index 4477fd788..82e549ce5 100644 --- a/src/setup/setup.f90 +++ b/src/setup/setup.f90 @@ -137,33 +137,17 @@ module subroutine setup_initialize_particle_info_system(self, param) class(swiftest_nbody_system), intent(inout) :: self !! Swiftest nbody system object class(swiftest_parameters), intent(inout) :: param !! Current run configuration parameters ! Internals - logical :: ltrack_origin integer(I4B) :: i associate(cb => self%cb, pl => self%pl, npl => self%pl%nbody, tp => self%tp, ntp => self%tp%nbody) - if (param%nciu%ltrack_origin) then - cb%info%origin_type = "Initial conditions" - cb%info%origin_time = param%t0 - cb%info%origin_xh(:) = 0.0_DP - cb%info%origin_vh(:) = 0.0_DP - do i = 1, self%pl%nbody - pl%info(i)%origin_type = "Initial conditions" - pl%info(i)%origin_time = param%t0 - pl%info(i)%origin_xh(:) = self%pl%xh(:,i) - pl%info(i)%origin_vh(:) = self%pl%vh(:,i) - end do - do i = 1, self%tp%nbody - tp%info(i)%origin_type = "Initial conditions" - tp%info(i)%origin_time = param%t0 - tp%info(i)%origin_xh(:) = self%tp%xh(:,i) - tp%info(i)%origin_vh(:) = self%tp%vh(:,i) - end do - end if - - cb%info%particle_type = CB_TYPE_NAME - if (npl > 0) pl%info(1:npl)%particle_type = PL_TYPE_NAME - if (ntp > 0) tp%info(1:ntp)%particle_type = TP_TYPE_NAME + call cb%info%set_value(particle_type=CB_TYPE_NAME, status="ACTIVE", origin_type="Initial conditions", origin_time=param%t0, origin_xh=[0.0_DP, 0.0_DP, 0.0_DP], origin_vh=[0.0_DP, 0.0_DP, 0.0_DP]) + do i = 1, self%pl%nbody + call pl%info(i)%set_value(particle_type=PL_TYPE_NAME, status="ACTIVE", origin_type="Initial conditions", origin_time=param%t0, origin_xh=self%pl%xh(:,i), origin_vh=self%pl%vh(:,i)) + end do + do i = 1, self%tp%nbody + call tp%info(i)%set_value(particle_type=TP_TYPE_NAME, status="ACTIVE", origin_type="Initial conditions", origin_time=param%t0, origin_xh=self%tp%xh(:,i), origin_vh=self%tp%vh(:,i)) + end do end associate @@ -219,6 +203,7 @@ module subroutine setup_body(self, n, param) class(swiftest_parameters), intent(in) :: param !! Current run configuration parameter ! Internals integer(I4B) :: i + self%nbody = n if (n <= 0) return self%lfirst = .true. @@ -250,14 +235,22 @@ module subroutine setup_body(self, n, param) allocate(self%lmask(n)) self%id(:) = 0 - self%info(:)%name = "UNNAMED" - self%info(:)%particle_type = "UKNOWN" - self%info(:)%origin_type = "UNKNOWN" - self%info(:)%origin_time = -1.0_DP do i = 1, n - self%info(i)%origin_xh(:) = 0.0_DP - self%info(i)%origin_vh(:) = 0.0_DP + call self%info(i)%set_value(& + name = "UNNAMED", & + particle_type = "UNKNOWN", & + status = "INACTIVE", & + origin_type = "UNKNOWN", & + origin_time = -huge(1.0_DP), & + origin_xh = [0.0_DP, 0.0_DP, 0.0_DP], & + origin_vh = [0.0_DP, 0.0_DP, 0.0_DP], & + discard_time = -huge(1.0_DP), & + discard_xh = [0.0_DP, 0.0_DP, 0.0_DP], & + discard_vh = [0.0_DP, 0.0_DP, 0.0_DP], & + discard_body_id = -1 & + ) end do + self%status(:) = INACTIVE self%lmask(:) = .false. self%ldiscard(:) = .false. diff --git a/src/symba/symba_collision.f90 b/src/symba/symba_collision.f90 index 2bf7387d6..922cadc09 100644 --- a/src/symba/symba_collision.f90 +++ b/src/symba/symba_collision.f90 @@ -315,6 +315,7 @@ module function symba_collision_casemerge(system, param, family, x, v, mass, rad end do status = MERGED + call symba_collision_mergeaddsub(system, param, family, id_frag, Ip_frag, m_frag, rad_frag, xb_frag, vb_frag, rot_frag, status) end select @@ -875,7 +876,7 @@ subroutine symba_collision_mergeaddsub(system, param, family, id_frag, Ip_frag, real(DP), dimension(:,:), intent(in) :: xb_frag, vb_frag, rot_frag !! Fragment barycentric position, barycentric velocity, and rotation vectors integer(I4B), intent(in) :: status !! Status flag to assign to adds ! Internals - integer(I4B) :: i, ibiggest, nstart, nend, nfamily, nfrag + integer(I4B) :: i, ibiggest, ismallest, iother, nstart, nend, nfamily, nfrag logical, dimension(system%pl%nbody) :: lmask class(symba_pl), allocatable :: plnew character(*), parameter :: FRAGFMT = '("Newbody",I0.7)' @@ -885,26 +886,16 @@ subroutine symba_collision_mergeaddsub(system, param, family, id_frag, Ip_frag, class is (symba_pl) select type(pl_discards => system%pl_discards) class is (symba_merger) - associate(info => pl%info, pl_adds => system%pl_adds, cb => system%cb) + associate(info => pl%info, pl_adds => system%pl_adds, cb => system%cb, npl => pl%nbody) ! Add the family bodies to the subtraction list nfamily = size(family(:)) nfrag = size(m_frag(:)) - lmask(:) = .false. - lmask(family(:)) = .true. - pl%status(family(:)) = MERGED - nstart = pl_discards%nbody + 1 - nend = pl_discards%nbody + nfamily - call pl_discards%append(pl, lmask) - pl%ldiscard(family(:)) = .true. - pl%lcollision(family(:)) = .true. - - ! Record how many bodies were subtracted in this event - pl_discards%ncomp(nstart:nend) = nfamily - + ! Setup new bodies allocate(plnew, mold=pl) call plnew%setup(nfrag, param) - ibiggest = family(maxloc(pl%Gmass(family(:)), dim=1)) + ibiggest = family(maxloc(pl%Gmass(family(:)), dim=1)) + ismallest = family(minloc(pl%Gmass(family(:)), dim=1)) ! Copy over identification, information, and physical properties of the new bodies from the fragment list plnew%id(1:nfrag) = id_frag(1:nfrag) @@ -923,40 +914,54 @@ subroutine symba_collision_mergeaddsub(system, param, family, id_frag, Ip_frag, select case(status) case(DISRUPTION) - plnew%info(1:nfrag)%origin_type = "Disruption" plnew%status(1:nfrag) = NEW_PARTICLE - plnew%info(1:nfrag)%origin_time = param%t do i = 1, nfrag write(newname, FRAGFMT) id_frag(i) - plnew%info(i)%name = newname - plnew%info(i)%origin_xh(:) = plnew%xh(:,i) - plnew%info(i)%origin_vh(:) = plnew%vh(:,i) + call plnew%info(i)%set_value(origin_type="Disruption", origin_time=param%t, name=newname, origin_xh=plnew%xh(:,i), origin_vh=plnew%vh(:,i)) + end do + do i = 1, nfamily + if (family(i) == ibiggest) then + iother = ismallest + else + iother = ibiggest + end if + call pl%info(family(i))%set_value(status="Disruption", discard_time=param%t, discard_xh=pl%xh(:,i), discard_vh=pl%vh(:,i), discard_body_id=iother) end do case(SUPERCATASTROPHIC) - plnew%info(1:nfrag)%origin_type = "Supercatastrophic" plnew%status(1:nfrag) = NEW_PARTICLE - plnew%info(1:nfrag)%origin_time = param%t do i = 1, nfrag write(newname, FRAGFMT) id_frag(i) - plnew%info(i)%name = newname - plnew%info(i)%origin_xh(:) = plnew%xh(:,i) - plnew%info(i)%origin_vh(:) = plnew%vh(:,i) + call plnew%info(i)%set_value(origin_type="Supercatastrophic", origin_time=param%t, name=newname, origin_xh=plnew%xh(:,i), origin_vh=plnew%vh(:,i)) + end do + do i = 1, nfamily + if (family(i) == ibiggest) then + iother = ismallest + else + iother = ibiggest + end if + call pl%info(family(i))%set_value(status="Supercatastrophic", discard_time=param%t, discard_xh=pl%xh(:,i), discard_vh=pl%vh(:,i), discard_body_id=iother) end do case(HIT_AND_RUN_DISRUPT) call plnew%info(1)%copy(pl%info(ibiggest)) plnew%status(1) = OLD_PARTICLE - plnew%status(2:nfrag) = NEW_PARTICLE - plnew%info(2:nfrag)%origin_type = "Hit and run fragment" - plnew%info(2:nfrag)%origin_time = param%t do i = 2, nfrag write(newname, FRAGFMT) id_frag(i) - plnew%info(i)%name = newname - plnew%info(i)%origin_xh(:) = plnew%xh(:,i) - plnew%info(i)%origin_vh(:) = plnew%vh(:,i) + call plnew%info(i)%set_value(origin_type="Hit and run fragmention", origin_time=param%t, name=newname, origin_xh=plnew%xh(:,i), origin_vh=plnew%vh(:,i)) end do + do i = 1, nfamily + if (family(i) == ibiggest) cycle + iother = ibiggest + call pl%info(family(i))%set_value(status="Hit and run fragmention", discard_time=param%t, discard_xh=pl%xh(:,i), discard_vh=pl%vh(:,i), discard_body_id=iother) + end do case(MERGED) call plnew%info(1)%copy(pl%info(ibiggest)) plnew%status(1) = OLD_PARTICLE + do i = 1, nfamily + if (family(i) == ibiggest) cycle + + iother = ibiggest + call pl%info(family(i))%set_value(status="MERGED", discard_time=param%t, discard_xh=pl%xh(:,i), discard_vh=pl%vh(:,i), discard_body_id=iother) + end do end select if (param%lrotation) then @@ -978,13 +983,28 @@ subroutine symba_collision_mergeaddsub(system, param, family, id_frag, Ip_frag, plnew%levelg(1:nfrag) = pl%levelg(ibiggest) plnew%levelm(1:nfrag) = pl%levelm(ibiggest) - ! Append the new merged body to the list and record how many we made + ! Append the new merged body to the list nstart = pl_adds%nbody + 1 nend = pl_adds%nbody + plnew%nbody call pl_adds%append(plnew, lsource_mask=[(.true., i=1, plnew%nbody)]) + ! Record how many bodies were added in this event pl_adds%ncomp(nstart:nend) = plnew%nbody - call plnew%setup(0, param) + + ! Add the discarded bodies to the discard list + pl%status(family(:)) = MERGED + lmask(:) = .false. + lmask(family(:)) = .true. + pl%ldiscard(family(:)) = .true. + pl%lcollision(family(:)) = .true. + + nstart = pl_discards%nbody + 1 + nend = pl_discards%nbody + nfamily + call pl_discards%append(pl, lmask) + + ! Record how many bodies were subtracted in this event + pl_discards%ncomp(nstart:nend) = nfamily + deallocate(plnew) end associate end select diff --git a/src/symba/symba_discard.f90 b/src/symba/symba_discard.f90 index f812dc664..877f7cc95 100644 --- a/src/symba/symba_discard.f90 +++ b/src/symba/symba_discard.f90 @@ -37,6 +37,7 @@ subroutine symba_discard_cb_pl(pl, system, param) write(idstr, *) pl%id(i) write(timestr, *) param%t write(*, *) trim(adjustl(pl%info(i)%name)) // " (" // trim(adjustl(idstr)) // ")" // " too far from the central body at t = " // trim(adjustl(timestr)) + call pl%info(i)%set_value(status="DISCARDED_RMAX", discard_time=param%t, discard_xh=pl%xh(:,i), discard_vh=pl%vh(:,i)) else if ((param%rmin >= 0.0_DP) .and. (rh2 < rmin2)) then pl%ldiscard(i) = .true. pl%lcollision(i) = .false. @@ -44,6 +45,7 @@ subroutine symba_discard_cb_pl(pl, system, param) write(idstr, *) pl%id(i) write(timestr, *) param%t write(*, *) trim(adjustl(pl%info(i)%name)) // " (" // trim(adjustl(idstr)) // ")" // " too close to the central body at t = " // trim(adjustl(timestr)) + call pl%info(i)%set_value(status="DISCARDED_RMIN", discard_time=param%t, discard_xh=pl%xh(:,i), discard_vh=pl%vh(:,i), discard_body_id=cb%id) 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)) @@ -55,6 +57,7 @@ subroutine symba_discard_cb_pl(pl, system, param) write(idstr, *) pl%id(i) write(timestr, *) param%t write(*, *) trim(adjustl(pl%info(i)%name)) // " (" // trim(adjustl(idstr)) // ")" // " is unbound and too far from barycenter at t = " // trim(adjustl(timestr)) + call pl%info(i)%set_value(status="DISCARDED_RMAXU", discard_time=param%t, discard_xh=pl%xh(:,i), discard_vh=pl%vh(:,i)) end if end if end if @@ -275,6 +278,7 @@ subroutine symba_discard_peri_pl(pl, system, param) write(timestr, *) param%t write(idstr, *) pl%id(i) write(*, *) trim(adjustl(pl%info(i)%name)) // " (" // trim(adjustl(idstr)) // ") perihelion distance too small at t = " // trim(adjustl(timestr)) + call pl%info(i)%set_value(status="DISCARDED_PERI", discard_time=param%t, discard_xh=pl%xh(:,i), discard_vh=pl%vh(:,i), discard_body_id=system%cb%id) end if end if end if diff --git a/src/symba/symba_io.f90 b/src/symba/symba_io.f90 index 8b64950e9..71717aabe 100644 --- a/src/symba/symba_io.f90 +++ b/src/symba/symba_io.f90 @@ -182,7 +182,7 @@ end subroutine symba_io_param_writer 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 + class(swiftest_parameters), intent(inout) :: param !! Current run configuration parameters ! Internals integer(I4B), parameter :: LUN = 40 integer(I4B) :: iadd, isub, j, nsub, nadd @@ -196,13 +196,21 @@ module subroutine symba_io_write_discard(self, param) class(swiftest_body), allocatable :: pltemp character(STRMAX) :: errmsg, out_stat - if (param%discard_out == "") return - associate(pl => self%pl, npl => self%pl%nbody, pl_adds => self%pl_adds) + if (self%tp_discards%nbody > 0) call io_write_discard(self, param) select type(pl_discards => self%pl_discards) class is (symba_merger) if (pl_discards%nbody == 0) return + + ! Record the discarded body metadata information to file + if ((param%out_type == NETCDF_FLOAT_TYPE) .or. (param%out_type == NETCDF_DOUBLE_TYPE)) then + call param%nciu%open(param) + call pl_discards%write_particle_info(param%nciu) + call param%nciu%close(param) + end if + + if (param%discard_out == "") return if (lfirst) then out_stat = param%out_stat else diff --git a/src/symba/symba_util.f90 b/src/symba/symba_util.f90 index c804aebb7..ce29e22aa 100644 --- a/src/symba/symba_util.f90 +++ b/src/symba/symba_util.f90 @@ -454,6 +454,7 @@ module subroutine symba_util_rearray_pl(self, system, param) ! Reset all of the status flags for this body where(pl%status(1:npl) /= INACTIVE) pl%status(1:npl) = ACTIVE + pl%info(1:npl)%status = "ACTIVE" pl%ldiscard(1:npl) = .false. pl%lcollision(1:npl) = .false. pl%lmask(1:npl) = .true. diff --git a/src/util/util_copy.f90 b/src/util/util_copy.f90 index 0d29cc92f..60d93e45e 100644 --- a/src/util/util_copy.f90 +++ b/src/util/util_copy.f90 @@ -39,12 +39,19 @@ module subroutine util_copy_particle_info(self, source) class(swiftest_particle_info), intent(inout) :: self class(swiftest_particle_info), intent(in) :: source - self%name = source%name - self%particle_type = source%particle_type - self%origin_type = source%origin_type - self%origin_time = source%origin_time - self%origin_xh(:) = source%origin_xh(:) - self%origin_vh(:) = source%origin_vh(:) + call self%set_value(& + name = source%name, & + particle_type = source%particle_type, & + status = source%status, & + origin_type = source%origin_type, & + origin_time = source%origin_time, & + origin_xh = source%origin_xh(:), & + origin_vh = source%origin_vh(:), & + discard_time = source%discard_time, & + discard_xh = source%discard_xh(:), & + discard_vh = source%discard_vh(:), & + discard_body_id = source%discard_body_id & + ) return end subroutine util_copy_particle_info diff --git a/src/util/util_set.f90 b/src/util/util_set.f90 index 4e686eec8..48c0006c2 100644 --- a/src/util/util_set.f90 +++ b/src/util/util_set.f90 @@ -98,6 +98,62 @@ module subroutine util_set_mu_tp(self, cb) return end subroutine util_set_mu_tp + module subroutine util_set_particle_info(self, name, particle_type, status, origin_type, origin_time, origin_xh, origin_vh, discard_time, discard_xh, discard_vh, discard_body_id) + !! author: David A. Minton + !! + !! Sets one or more values of the particle information metadata object + implicit none + ! Arguments + class(swiftest_particle_info), intent(inout) :: self + character(len=*), intent(in), optional :: name !! Non-unique name + character(len=*), intent(in), optional :: particle_type !! String containing a description of the particle type (e.g. Central Body, Massive Body, Test Particle) + character(len=*), intent(in), optional :: status !! Particle status description: ACTIVE, MERGED, FRAGMENTED, etc. + character(len=*), intent(in), optional :: origin_type !! String containing a description of the origin of the particle (e.g. Initial Conditions, Supercatastrophic, Disruption, etc.) + real(DP), intent(in), optional :: origin_time !! The time of the particle's formation + real(DP), dimension(:), intent(in), optional :: origin_xh !! The heliocentric distance vector at the time of the particle's formation + real(DP), dimension(:), intent(in), optional :: origin_vh !! The heliocentric velocity vector at the time of the particle's formation + real(DP), intent(in), optional :: discard_time !! The time of the particle's discard + real(DP), dimension(:), intent(in), optional :: discard_xh !! The heliocentric distance vector at the time of the particle's discard + real(DP), dimension(:), intent(in), optional :: discard_vh !! The heliocentric velocity vector at the time of the particle's discard + integer(I4B), intent(in), optional :: discard_body_id !! The id of the other body involved in the discard (0 if no other body involved) + + if (present(name)) then + self%name = name + end if + if (present(particle_type)) then + self%particle_type = particle_type + end if + if (present(origin_type)) then + self%origin_type = origin_type + end if + if (present(origin_time)) then + self%origin_time = origin_time + end if + if (present(origin_xh)) then + self%origin_xh(:) = origin_xh(:) + end if + if (present(origin_vh)) then + self%origin_vh(:) = origin_vh(:) + end if + if (present(discard_time)) then + self%discard_time = discard_time + end if + if (present(status)) then + self%status = status + end if + if (present(discard_xh)) then + self%discard_xh(:) = discard_xh(:) + end if + if (present(discard_vh)) then + self%discard_vh(:) = discard_vh(:) + end if + if (present(discard_body_id)) then + self%discard_body_id = discard_body_id + end if + + return + end subroutine util_set_particle_info + module subroutine util_set_rhill(self,cb) !! author: David A. Minton From d4e17769bb218788853392a4050ec5e49b6225c7 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Mon, 30 Aug 2021 14:17:37 -0400 Subject: [PATCH 103/154] Convert angles to degrees before putting them into NetCDF. Also write out final state of variables on the mass loss exception. --- examples/symba_mars_disk/testnetcdf.ipynb | 6957 ++++++++++++++++----- src/io/io.f90 | 4 +- src/netcdf/netcdf.f90 | 8 +- 3 files changed, 5368 insertions(+), 1601 deletions(-) diff --git a/examples/symba_mars_disk/testnetcdf.ipynb b/examples/symba_mars_disk/testnetcdf.ipynb index 50ac91b3b..be4bf6a11 100644 --- a/examples/symba_mars_disk/testnetcdf.ipynb +++ b/examples/symba_mars_disk/testnetcdf.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 10, + "execution_count": 1, "metadata": {}, "outputs": [ { @@ -11,7 +11,7 @@ "'/home/daminton/git/swiftest/examples/symba_mars_disk'" ] }, - "execution_count": 10, + "execution_count": 1, "metadata": {}, "output_type": "execute_result" } @@ -26,7 +26,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 2, "metadata": {}, "outputs": [ { @@ -36,7 +36,7 @@ "Reading Swiftest file param.in\n", "\n", "Creating Dataset\n", - "Successfully converted 2 output frames.\n", + "Successfully converted 6 output frames.\n", "Swiftest simulation data stored as xarray DataSet .ds\n" ] } @@ -48,7 +48,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 3, "metadata": {}, "outputs": [ { @@ -405,25 +405,28 @@ " stroke: currentColor;\n", " fill: currentColor;\n", "}\n", - "
    <xarray.DataArray 'npl' (time: 2)>\n",
    -       "array([1500, 1518], dtype=int32)\n",
    +       "
    <xarray.DataArray 'status' (id: 1521)>\n",
    +       "array(['ACTIVE', 'ACTIVE', 'ACTIVE', ..., 'ACTIVE', 'ACTIVE', 'ACTIVE'],\n",
    +       "      dtype='<U17')\n",
            "Coordinates:\n",
    -       "  * time     (time) float64 0.0 6e+03
    " + " * id (id) int32 0 1 2 3 4 5 6 7 ... 1514 1515 1516 1517 1518 1519 1520
    " ], "text/plain": [ - "\n", - "array([1500, 1518], dtype=int32)\n", + "\n", + "array(['ACTIVE', 'ACTIVE', 'ACTIVE', ..., 'ACTIVE', 'ACTIVE', 'ACTIVE'],\n", + " dtype='
    <xarray.DataArray 'xhx' (time: 2)>\n",
    -       "array([      0.      , 2742814.426863])\n",
    +       "
    <xarray.DataArray 'status' ()>\n",
    +       "array('Supercatastrophic', dtype='<U17')\n",
            "Coordinates:\n",
    -       "  * time     (time) float64 0.0 6e+03\n",
    -       "    id       int32 1510
    " + " id int32 726
    " ], "text/plain": [ - "\n", - "array([ 0. , 2742814.426863])\n", + "\n", + "array('Supercatastrophic', dtype='\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
    <xarray.DataArray 'discard_time' (id: 1521)>\n",
    +       "array([ 0.000000e+000,  6.013470e-154,  6.013470e-154, ..., -1.797693e+308,\n",
    +       "       -1.797693e+308, -1.797693e+308])\n",
    +       "Coordinates:\n",
    +       "  * id       (id) int32 0 1 2 3 4 5 6 7 ... 1514 1515 1516 1517 1518 1519 1520
    " + ], + "text/plain": [ + "\n", + "array([ 0.000000e+000, 6.013470e-154, 6.013470e-154, ..., -1.797693e+308,\n", + " -1.797693e+308, -1.797693e+308])\n", + "Coordinates:\n", + " * id (id) int32 0 1 2 3 4 5 6 7 ... 1514 1515 1516 1517 1518 1519 1520" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "sim.ds['discard_time']" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "dslost = sim.ds.where(sim.ds['status'] != \"ACTIVE\", drop=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
    \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
    <xarray.DataArray 'discard_time' (id: 2)>\n",
    +       "array([2400., 2400.])\n",
    +       "Coordinates:\n",
    +       "  * id       (id) int32 230 726
    " + ], + "text/plain": [ + "\n", + "array([2400., 2400.])\n", + "Coordinates:\n", + " * id (id) int32 230 726" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "dslost['discard_time']" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "lastloss = dslost.where(dslost['discard_time'] == 98400.0, drop=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "dsactive = sim.ds.where(sim.ds['status'] == \"ACTIVE\", drop=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
    \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
    <xarray.Dataset>\n",
    +       "Dimensions:          (id: 1519, time: 6)\n",
    +       "Coordinates:\n",
    +       "  * time             (time) float64 0.0 600.0 1.2e+03 1.8e+03 2.4e+03 3e+03\n",
    +       "  * id               (id) int32 0 1 2 3 4 5 6 ... 1515 1516 1517 1518 1519 1520\n",
    +       "Data variables: (12/57)\n",
    +       "    npl              (time, id) float64 1.5e+03 1.5e+03 ... 1.518e+03 1.518e+03\n",
    +       "    ntp              (time, id) float64 0.0 0.0 0.0 0.0 0.0 ... 0.0 0.0 0.0 0.0\n",
    +       "    name             (id) object 'Mars' 'Body2' ... 'Newbody0001520'\n",
    +       "    particle_type    (id) object 'Central Body' ... 'Massive Body'\n",
    +       "    xhx              (time, id) float64 0.0 -2.358e+06 ... -3.489e+06 -3.476e+06\n",
    +       "    xhy              (time, id) float64 0.0 8.604e+06 ... -8.532e+06 -8.571e+06\n",
    +       "    ...               ...\n",
    +       "    discard_xhy      (id) float64 0.0 0.0 0.0 0.0 0.0 ... 0.0 0.0 0.0 0.0 0.0\n",
    +       "    discard_xhz      (id) float64 0.0 0.0 0.0 0.0 0.0 ... 0.0 0.0 0.0 0.0 0.0\n",
    +       "    discard_vhx      (id) float64 0.0 0.0 0.0 0.0 0.0 ... 0.0 0.0 0.0 0.0 0.0\n",
    +       "    discard_vhy      (id) float64 0.0 2.122e-314 2.122e-314 ... 0.0 0.0 0.0\n",
    +       "    discard_vhz      (id) float64 0.0 3.024e-153 3.024e-153 ... 0.0 0.0 0.0\n",
    +       "    discard_body_id  (id) float64 -2.147e+09 -2.147e+09 ... -2.147e+09
    " + ], + "text/plain": [ + "\n", + "Dimensions: (id: 1519, time: 6)\n", + "Coordinates:\n", + " * time (time) float64 0.0 600.0 1.2e+03 1.8e+03 2.4e+03 3e+03\n", + " * id (id) int32 0 1 2 3 4 5 6 ... 1515 1516 1517 1518 1519 1520\n", + "Data variables: (12/57)\n", + " npl (time, id) float64 1.5e+03 1.5e+03 ... 1.518e+03 1.518e+03\n", + " ntp (time, id) float64 0.0 0.0 0.0 0.0 0.0 ... 0.0 0.0 0.0 0.0\n", + " name (id) object 'Mars' 'Body2' ... 'Newbody0001520'\n", + " particle_type (id) object 'Central Body' ... 'Massive Body'\n", + " xhx (time, id) float64 0.0 -2.358e+06 ... -3.489e+06 -3.476e+06\n", + " xhy (time, id) float64 0.0 8.604e+06 ... -8.532e+06 -8.571e+06\n", + " ... ...\n", + " discard_xhy (id) float64 0.0 0.0 0.0 0.0 0.0 ... 0.0 0.0 0.0 0.0 0.0\n", + " discard_xhz (id) float64 0.0 0.0 0.0 0.0 0.0 ... 0.0 0.0 0.0 0.0 0.0\n", + " discard_vhx (id) float64 0.0 0.0 0.0 0.0 0.0 ... 0.0 0.0 0.0 0.0 0.0\n", + " discard_vhy (id) float64 0.0 2.122e-314 2.122e-314 ... 0.0 0.0 0.0\n", + " discard_vhz (id) float64 0.0 3.024e-153 3.024e-153 ... 0.0 0.0 0.0\n", + " discard_body_id (id) float64 -2.147e+09 -2.147e+09 ... -2.147e+09" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "dsactive" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [], + "source": [ + "lastadd = sim.ds.where(sim.ds['origin_time'] == 2400.0, drop=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
    \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
    <xarray.Dataset>\n",
    +       "Dimensions:          (id: 20, time: 6)\n",
    +       "Coordinates:\n",
    +       "  * time             (time) float64 0.0 600.0 1.2e+03 1.8e+03 2.4e+03 3e+03\n",
    +       "  * id               (id) int32 1501 1502 1503 1504 1505 ... 1517 1518 1519 1520\n",
    +       "Data variables: (12/57)\n",
    +       "    npl              (time, id) float64 1.5e+03 1.5e+03 ... 1.518e+03 1.518e+03\n",
    +       "    ntp              (time, id) float64 0.0 0.0 0.0 0.0 0.0 ... 0.0 0.0 0.0 0.0\n",
    +       "    name             (id) object 'Newbody0001501' ... 'Newbody0001520'\n",
    +       "    particle_type    (id) object 'Massive Body' ... 'Massive Body'\n",
    +       "    xhx              (time, id) float64 0.0 0.0 0.0 ... -3.489e+06 -3.476e+06\n",
    +       "    xhy              (time, id) float64 0.0 0.0 0.0 ... -8.532e+06 -8.571e+06\n",
    +       "    ...               ...\n",
    +       "    discard_xhy      (id) float64 0.0 0.0 0.0 0.0 0.0 ... 0.0 0.0 0.0 0.0 0.0\n",
    +       "    discard_xhz      (id) float64 0.0 0.0 0.0 0.0 0.0 ... 0.0 0.0 0.0 0.0 0.0\n",
    +       "    discard_vhx      (id) float64 0.0 0.0 0.0 0.0 0.0 ... 0.0 0.0 0.0 0.0 0.0\n",
    +       "    discard_vhy      (id) float64 0.0 0.0 0.0 0.0 0.0 ... 0.0 0.0 0.0 0.0 0.0\n",
    +       "    discard_vhz      (id) float64 0.0 0.0 0.0 0.0 0.0 ... 0.0 0.0 0.0 0.0 0.0\n",
    +       "    discard_body_id  (id) float64 -2.147e+09 -2.147e+09 ... -2.147e+09
    " + ], + "text/plain": [ + "\n", + "Dimensions: (id: 20, time: 6)\n", + "Coordinates:\n", + " * time (time) float64 0.0 600.0 1.2e+03 1.8e+03 2.4e+03 3e+03\n", + " * id (id) int32 1501 1502 1503 1504 1505 ... 1517 1518 1519 1520\n", + "Data variables: (12/57)\n", + " npl (time, id) float64 1.5e+03 1.5e+03 ... 1.518e+03 1.518e+03\n", + " ntp (time, id) float64 0.0 0.0 0.0 0.0 0.0 ... 0.0 0.0 0.0 0.0\n", + " name (id) object 'Newbody0001501' ... 'Newbody0001520'\n", + " particle_type (id) object 'Massive Body' ... 'Massive Body'\n", + " xhx (time, id) float64 0.0 0.0 0.0 ... -3.489e+06 -3.476e+06\n", + " xhy (time, id) float64 0.0 0.0 0.0 ... -8.532e+06 -8.571e+06\n", + " ... ...\n", + " discard_xhy (id) float64 0.0 0.0 0.0 0.0 0.0 ... 0.0 0.0 0.0 0.0 0.0\n", + " discard_xhz (id) float64 0.0 0.0 0.0 0.0 0.0 ... 0.0 0.0 0.0 0.0 0.0\n", + " discard_vhx (id) float64 0.0 0.0 0.0 0.0 0.0 ... 0.0 0.0 0.0 0.0 0.0\n", + " discard_vhy (id) float64 0.0 0.0 0.0 0.0 0.0 ... 0.0 0.0 0.0 0.0 0.0\n", + " discard_vhz (id) float64 0.0 0.0 0.0 0.0 0.0 ... 0.0 0.0 0.0 0.0 0.0\n", + " discard_body_id (id) float64 -2.147e+09 -2.147e+09 ... -2.147e+09" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "lastadd" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [], + "source": [ + "lastframe = dsactive.isel(time=-1, drop=True)\n", + "firstframe = sim.ds.isel(time=0, drop=True)\n", + "firstframe = firstframe.where(firstframe['a'] < 1e20, drop=True)\n", + "midframe = sim.ds.isel(time=-2, drop=True)\n", + "midframe = midframe.where(midframe['a'] < 1e20, drop=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
    \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
    <xarray.DataArray 'id' (id: 1519)>\n",
    +       "array([   0,    1,    2, ..., 1518, 1519, 1520], dtype=int32)\n",
    +       "Coordinates:\n",
    +       "  * id       (id) int32 0 1 2 3 4 5 6 7 ... 1514 1515 1516 1517 1518 1519 1520
    " + ], + "text/plain": [ + "\n", + "array([ 0, 1, 2, ..., 1518, 1519, 1520], dtype=int32)\n", + "Coordinates:\n", + " * id (id) int32 0 1 2 3 4 5 6 7 ... 1514 1515 1516 1517 1518 1519 1520" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "lastframe.id" + ] + }, + { + "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 'id' (id: 0)>\n",
    +       "array([], dtype=int32)\n",
    +       "Coordinates:\n",
    +       "  * id       (id) int32 
    " + ], + "text/plain": [ + "\n", + "array([], dtype=int32)\n", + "Coordinates:\n", + " * id (id) int32 " + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "lastloss.id" + ] + }, + { + "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 'Gmass' ()>\n",
    +       "array(4.28396188e+13)
    " + ], + "text/plain": [ + "\n", + "array(4.28396188e+13)" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "lastframe['Gmass'].sum()" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
    \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
    <xarray.DataArray 'Gmass' ()>\n",
    +       "array(4.28396188e+13)
    " + ], + "text/plain": [ + "\n", + "array(4.28396188e+13)" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "firstframe['Gmass'].sum()" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
    \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
    <xarray.DataArray 'Gmass' ()>\n",
    +       "array(4.28396188e+13)
    " + ], + "text/plain": [ + "\n", + "array(4.28396188e+13)" + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "midframe['Gmass'].sum()" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
    \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
    <xarray.Dataset>\n",
    +       "Dimensions:          ()\n",
    +       "Coordinates:\n",
    +       "    id               int32 2\n",
    +       "Data variables: (12/57)\n",
    +       "    npl              float64 1.518e+03\n",
    +       "    ntp              float64 0.0\n",
    +       "    name             object 'Body3'\n",
    +       "    particle_type    object 'Massive Body'\n",
    +       "    xhx              float64 -3.025e+06\n",
    +       "    xhy              float64 -1.02e+07\n",
    +       "    ...               ...\n",
    +       "    discard_xhy      float64 0.0\n",
    +       "    discard_xhz      float64 0.0\n",
    +       "    discard_vhx      float64 0.0\n",
    +       "    discard_vhy      float64 2.122e-314\n",
    +       "    discard_vhz      float64 3.024e-153\n",
    +       "    discard_body_id  float64 -2.147e+09
    " + ], + "text/plain": [ + "\n", + "Dimensions: ()\n", + "Coordinates:\n", + " id int32 2\n", + "Data variables: (12/57)\n", + " npl float64 1.518e+03\n", + " ntp float64 0.0\n", + " name object 'Body3'\n", + " particle_type object 'Massive Body'\n", + " xhx float64 -3.025e+06\n", + " xhy float64 -1.02e+07\n", + " ... ...\n", + " discard_xhy float64 0.0\n", + " discard_xhz float64 0.0\n", + " discard_vhx float64 0.0\n", + " discard_vhy float64 2.122e-314\n", + " discard_vhz float64 3.024e-153\n", + " discard_body_id float64 -2.147e+09" + ] + }, + "execution_count": 22, + "metadata": {}, + "output_type": "execute_result" } ], "source": [ - "for n in sim.ds['radius']:\n", - " print(n.values)" + "lastframe.sel(id=2)" ] }, { diff --git a/src/io/io.f90 b/src/io/io.f90 index a7e1d5d9f..637d1705f 100644 --- a/src/io/io.f90 +++ b/src/io/io.f90 @@ -69,6 +69,9 @@ module subroutine io_conservation_report(self, param, lterminal) Merror = (GMtot_now - param%GMtot_orig) / param%GMtot_orig if (Merror < -10 * epsilon(Merror)) then write(*,*) 'Mass loss! Halting!' + call param%nciu%open(param) + call pl%write_frame(param%nciu, param) + call param%nciu%close(param) call util_exit(FAILURE) end if write(*, EGYTERMFMT) Lerror, Ecoll_error, Etotal_error, Merror @@ -1919,7 +1922,6 @@ module subroutine io_write_frame_system(self, param) call cb%write_frame(iu, param) call pl%write_frame(iu, param) call tp%write_frame(iu, param) - close(iu, err = 667, iomsg = errmsg) else if ((param%out_type == NETCDF_FLOAT_TYPE) .or. (param%out_type == NETCDF_DOUBLE_TYPE)) then call cb%write_frame(param%nciu, param) diff --git a/src/netcdf/netcdf.f90 b/src/netcdf/netcdf.f90 index 6672ee7d0..64b30a44a 100644 --- a/src/netcdf/netcdf.f90 +++ b/src/netcdf/netcdf.f90 @@ -282,10 +282,10 @@ module subroutine netcdf_write_frame_base(self, iu, param) if ((param%out_form == EL) .or. (param%out_form == XVEL)) then call check( nf90_put_var(iu%ncid, iu%a_varid, self%a(j), start=[idslot, tslot]) ) call check( nf90_put_var(iu%ncid, iu%e_varid, self%e(j), start=[idslot, tslot]) ) - call check( nf90_put_var(iu%ncid, iu%inc_varid, self%inc(j), start=[idslot, tslot]) ) - call check( nf90_put_var(iu%ncid, iu%capom_varid, self%capom(j), start=[idslot, tslot]) ) - call check( nf90_put_var(iu%ncid, iu%omega_varid, self%omega(j), start=[idslot, tslot]) ) - call check( nf90_put_var(iu%ncid, iu%capm_varid, self%capm(j), start=[idslot, tslot]) ) + call check( nf90_put_var(iu%ncid, iu%inc_varid, self%inc(j) * RAD2DEG, start=[idslot, tslot]) ) + call check( nf90_put_var(iu%ncid, iu%capom_varid, self%capom(j) * RAD2DEG, start=[idslot, tslot]) ) + call check( nf90_put_var(iu%ncid, iu%omega_varid, self%omega(j) * RAD2DEG, start=[idslot, tslot]) ) + call check( nf90_put_var(iu%ncid, iu%capm_varid, self%capm(j) * RAD2DEG, start=[idslot, tslot]) ) end if select type(self) From 5e1395255ffa973e7ccfad4e8ff701240be1a5b2 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Mon, 30 Aug 2021 15:10:48 -0400 Subject: [PATCH 104/154] Changed the way discards are handeled and ensured that non-distructive spill method doesn't change the number of bodies/encounters. --- src/io/io.f90 | 7 +-- src/symba/symba_collision.f90 | 10 +++-- src/util/util_append.f90 | 85 +++++++++++++++++++---------------- src/util/util_spill.f90 | 16 +++++-- 4 files changed, 68 insertions(+), 50 deletions(-) diff --git a/src/io/io.f90 b/src/io/io.f90 index 637d1705f..e01efe4ec 100644 --- a/src/io/io.f90 +++ b/src/io/io.f90 @@ -67,14 +67,15 @@ module subroutine io_conservation_report(self, param, lterminal) Ecoll_error = param%Ecollisions / abs(param%Eorbit_orig) Etotal_error = (Eorbit_now - param%Ecollisions - param%Eorbit_orig - param%Euntracked) / abs(param%Eorbit_orig) Merror = (GMtot_now - param%GMtot_orig) / param%GMtot_orig + write(*, EGYTERMFMT) Lerror, Ecoll_error, Etotal_error, Merror if (Merror < -10 * epsilon(Merror)) then write(*,*) 'Mass loss! Halting!' + call pl%xv2el(cb) call param%nciu%open(param) call pl%write_frame(param%nciu, param) call param%nciu%close(param) call util_exit(FAILURE) end if - write(*, EGYTERMFMT) Lerror, Ecoll_error, Etotal_error, Merror end if end associate @@ -1868,7 +1869,6 @@ module subroutine io_write_frame_system(self, param) else open(unit = iu, file = param%outfile, status = 'OLD', position = 'APPEND', form = 'UNFORMATTED', err = 667, iomsg = errmsg) end if - call self%write_hdr(iu, param) else if ((param%out_type == NETCDF_FLOAT_TYPE) .or. (param%out_type == NETCDF_DOUBLE_TYPE)) then if (lfirst) then @@ -1904,7 +1904,6 @@ module subroutine io_write_frame_system(self, param) else call param%nciu%open(param) end if - call self%write_hdr(param%nciu, param) end if if (param%lgr) then @@ -1919,11 +1918,13 @@ module subroutine io_write_frame_system(self, param) ! Write out each data type frame if ((param%out_type == REAL4_TYPE) .or. (param%out_type == REAL8_TYPE)) then + call self%write_hdr(iu, param) call cb%write_frame(iu, param) call pl%write_frame(iu, param) call tp%write_frame(iu, param) close(iu, err = 667, iomsg = errmsg) else if ((param%out_type == NETCDF_FLOAT_TYPE) .or. (param%out_type == NETCDF_DOUBLE_TYPE)) then + call self%write_hdr(param%nciu, param) call cb%write_frame(param%nciu, param) call pl%write_frame(param%nciu, param) call tp%write_frame(param%nciu, param) diff --git a/src/symba/symba_collision.f90 b/src/symba/symba_collision.f90 index 922cadc09..ae63edcba 100644 --- a/src/symba/symba_collision.f90 +++ b/src/symba/symba_collision.f90 @@ -989,18 +989,20 @@ subroutine symba_collision_mergeaddsub(system, param, family, id_frag, Ip_frag, call pl_adds%append(plnew, lsource_mask=[(.true., i=1, plnew%nbody)]) ! Record how many bodies were added in this event pl_adds%ncomp(nstart:nend) = plnew%nbody - call plnew%setup(0, param) ! Add the discarded bodies to the discard list pl%status(family(:)) = MERGED - lmask(:) = .false. - lmask(family(:)) = .true. pl%ldiscard(family(:)) = .true. pl%lcollision(family(:)) = .true. + lmask(:) = .false. + lmask(family(:)) = .true. + + call plnew%setup(0, param) + call pl%spill(plnew, lmask, ldestructive=.false.) nstart = pl_discards%nbody + 1 nend = pl_discards%nbody + nfamily - call pl_discards%append(pl, lmask) + call pl_discards%append(plnew, lsource_mask=[(.true., i = 1, nfamily)]) ! Record how many bodies were subtracted in this event pl_discards%ncomp(nstart:nend) = nfamily diff --git a/src/util/util_append.f90 b/src/util/util_append.f90 index ecefb1572..ffe576c85 100644 --- a/src/util/util_append.f90 +++ b/src/util/util_append.f90 @@ -187,31 +187,36 @@ module subroutine util_append_body(self, source, lsource_mask) class(swiftest_body), intent(inout) :: self !! Swiftest body object class(swiftest_body), intent(in) :: source !! Source object to append logical, dimension(:), intent(in) :: lsource_mask !! Logical mask indicating which elements to append to + ! Internals + integer(I4B) :: nold, nsrc, nnew + + nold = self%nbody + nsrc = source%nbody + nnew = count(lsource_mask(1:nsrc)) - associate(nold => self%nbody, nsrc => source%nbody) - call util_append(self%info, source%info, nold, nsrc, lsource_mask) - call util_append(self%id, source%id, nold, nsrc, lsource_mask) - call util_append(self%status, source%status, nold, nsrc, lsource_mask) - call util_append(self%ldiscard, source%ldiscard, nold, nsrc, lsource_mask) - call util_append(self%lmask, source%lmask, nold, nsrc, lsource_mask) - call util_append(self%mu, source%mu, nold, nsrc, lsource_mask) - call util_append(self%xh, source%xh, nold, nsrc, lsource_mask) - call util_append(self%vh, source%vh, nold, nsrc, lsource_mask) - call util_append(self%xb, source%xb, nold, nsrc, lsource_mask) - call util_append(self%vb, source%vb, nold, nsrc, lsource_mask) - call util_append(self%ah, source%ah, nold, nsrc, lsource_mask) - call util_append(self%aobl, source%aobl, nold, nsrc, lsource_mask) - call util_append(self%atide, source%atide, nold, nsrc, lsource_mask) - call util_append(self%agr, source%agr, nold, nsrc, lsource_mask) - call util_append(self%ir3h, source%ir3h, nold, nsrc, lsource_mask) - call util_append(self%a, source%a, nold, nsrc, lsource_mask) - call util_append(self%e, source%e, nold, nsrc, lsource_mask) - call util_append(self%inc, source%inc, nold, nsrc, lsource_mask) - call util_append(self%capom, source%capom, nold, nsrc, lsource_mask) - call util_append(self%omega, source%omega, nold, nsrc, lsource_mask) - call util_append(self%capm, source%capm, nold, nsrc, lsource_mask) - self%nbody = nold + count(lsource_mask(:)) - end associate + call util_append(self%info, source%info, nold, nsrc, lsource_mask) + call util_append(self%id, source%id, nold, nsrc, lsource_mask) + call util_append(self%status, source%status, nold, nsrc, lsource_mask) + call util_append(self%ldiscard, source%ldiscard, nold, nsrc, lsource_mask) + call util_append(self%lmask, source%lmask, nold, nsrc, lsource_mask) + call util_append(self%mu, source%mu, nold, nsrc, lsource_mask) + call util_append(self%xh, source%xh, nold, nsrc, lsource_mask) + call util_append(self%vh, source%vh, nold, nsrc, lsource_mask) + call util_append(self%xb, source%xb, nold, nsrc, lsource_mask) + call util_append(self%vb, source%vb, nold, nsrc, lsource_mask) + call util_append(self%ah, source%ah, nold, nsrc, lsource_mask) + call util_append(self%aobl, source%aobl, nold, nsrc, lsource_mask) + call util_append(self%atide, source%atide, nold, nsrc, lsource_mask) + call util_append(self%agr, source%agr, nold, nsrc, lsource_mask) + call util_append(self%ir3h, source%ir3h, nold, nsrc, lsource_mask) + call util_append(self%a, source%a, nold, nsrc, lsource_mask) + call util_append(self%e, source%e, nold, nsrc, lsource_mask) + call util_append(self%inc, source%inc, nold, nsrc, lsource_mask) + call util_append(self%capom, source%capom, nold, nsrc, lsource_mask) + call util_append(self%omega, source%omega, nold, nsrc, lsource_mask) + call util_append(self%capm, source%capm, nold, nsrc, lsource_mask) + + self%nbody = nold + nnew return end subroutine util_append_body @@ -227,21 +232,23 @@ module subroutine util_append_encounter(self, source, lsource_mask) class(swiftest_encounter), intent(inout) :: self !! Swiftest encounter list object class(swiftest_encounter), intent(in) :: source !! Source object to append logical, dimension(:), intent(in) :: lsource_mask !! Logical mask indicating which elements to append to - - associate(nold => self%nenc, nsrc => source%nenc) - call util_append(self%lvdotr, source%lvdotr, nold, nsrc, lsource_mask) - call util_append(self%status, source%status, nold, nsrc, lsource_mask) - call util_append(self%index1, source%index1, nold, nsrc, lsource_mask) - call util_append(self%index2, source%index2, nold, nsrc, lsource_mask) - call util_append(self%id1, source%id1, nold, nsrc, lsource_mask) - call util_append(self%id2, source%id2, nold, nsrc, lsource_mask) - call util_append(self%x1, source%x1, nold, nsrc, lsource_mask) - call util_append(self%x2, source%x2, nold, nsrc, lsource_mask) - call util_append(self%v1, source%v1, nold, nsrc, lsource_mask) - call util_append(self%v2, source%v2, nold, nsrc, lsource_mask) - call util_append(self%t, source%t, nold, nsrc, lsource_mask) - self%nenc = nold + count(lsource_mask(:)) - end associate + ! Internals + integer(I4B) :: nold, nsrc + + nold = self%nenc + nsrc = source%nenc + call util_append(self%lvdotr, source%lvdotr, nold, nsrc, lsource_mask) + call util_append(self%status, source%status, nold, nsrc, lsource_mask) + call util_append(self%index1, source%index1, nold, nsrc, lsource_mask) + call util_append(self%index2, source%index2, nold, nsrc, lsource_mask) + call util_append(self%id1, source%id1, nold, nsrc, lsource_mask) + call util_append(self%id2, source%id2, nold, nsrc, lsource_mask) + call util_append(self%x1, source%x1, nold, nsrc, lsource_mask) + call util_append(self%x2, source%x2, nold, nsrc, lsource_mask) + call util_append(self%v1, source%v1, nold, nsrc, lsource_mask) + call util_append(self%v2, source%v2, nold, nsrc, lsource_mask) + call util_append(self%t, source%t, nold, nsrc, lsource_mask) + self%nenc = nold + count(lsource_mask(1:nsrc)) return end subroutine util_append_encounter diff --git a/src/util/util_spill.f90 b/src/util/util_spill.f90 index 8f9567ef9..16039c4da 100644 --- a/src/util/util_spill.f90 +++ b/src/util/util_spill.f90 @@ -318,10 +318,12 @@ module subroutine util_spill_body(self, discards, lspill_list, ldestructive) 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) :: nbody_old ! 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%info, discards%info, lspill_list, ldestructive) call util_spill(keeps%status, discards%status, lspill_list, ldestructive) @@ -343,10 +345,12 @@ module subroutine util_spill_body(self, discards, lspill_list, ldestructive) call util_spill(keeps%omega, discards%omega, lspill_list, ldestructive) call util_spill(keeps%capm, discards%capm, lspill_list, ldestructive) + nbody_old = keeps%nbody + ! 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 = keeps%nbody - discards%nbody + discards%nbody = count(lspill_list(1:nbody_old)) + if (ldestructive) keeps%nbody = nbody_old- discards%nbody end associate return @@ -363,6 +367,8 @@ module subroutine util_spill_encounter(self, discards, lspill_list, ldestructive 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) :: nenc_old associate(keeps => self) call util_spill(keeps%lvdotr, discards%lvdotr, lspill_list, ldestructive) @@ -378,10 +384,12 @@ module subroutine util_spill_encounter(self, discards, lspill_list, ldestructive call util_spill(keeps%v2, discards%v2, lspill_list, ldestructive) call util_spill(keeps%t, discards%t, lspill_list, ldestructive) + nenc_old = keeps%nenc + ! 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(:)) + discards%nenc = count(lspill_list(1:nenc_old)) + if (ldestructive) keeps%nenc = nenc_old - discards%nenc end associate return From 5ee0f72a6fe83b719a672dc6adc2493209c54c1b Mon Sep 17 00:00:00 2001 From: David A Minton Date: Mon, 30 Aug 2021 15:15:25 -0400 Subject: [PATCH 105/154] Write out a full output frame just prior to failing the run on the mass loss exception. --- src/io/io.f90 | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/io/io.f90 b/src/io/io.f90 index e01efe4ec..bbbf25cd1 100644 --- a/src/io/io.f90 +++ b/src/io/io.f90 @@ -72,6 +72,8 @@ module subroutine io_conservation_report(self, param, lterminal) write(*,*) 'Mass loss! Halting!' call pl%xv2el(cb) call param%nciu%open(param) + call self%write_hdr(param%nciu, param) + call cb%write_frame(param%nciu, param) call pl%write_frame(param%nciu, param) call param%nciu%close(param) call util_exit(FAILURE) From 2a54117198dec69dc20c7f49743146418b79f5a8 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Mon, 30 Aug 2021 15:32:47 -0400 Subject: [PATCH 106/154] Fixed what happens when you pass 0 bodies into the setup method. This now deallocates all the arrays, and therefore resets the object to be ready for the next time something needs to be added to it. --- src/rmvs/rmvs_setup.f90 | 12 +++++++++-- src/setup/setup.f90 | 42 +++++++++++++++++++++------------------ src/symba/symba_setup.f90 | 19 +++++++++++++----- src/whm/whm_setup.f90 | 4 +++- 4 files changed, 50 insertions(+), 27 deletions(-) diff --git a/src/rmvs/rmvs_setup.f90 b/src/rmvs/rmvs_setup.f90 index 92043e0fe..e59202cd9 100644 --- a/src/rmvs/rmvs_setup.f90 +++ b/src/rmvs/rmvs_setup.f90 @@ -19,7 +19,13 @@ module subroutine rmvs_setup_pl(self, n, param) !> Call allocation method for parent class associate(pl => self) call whm_setup_pl(pl, n, param) - if (n <= 0) return + if (n < 0) return + + if (allocated(pl%outer)) deallocate(pl%outer) + if (allocated(pl%inner)) deallocate(pl%inner) + if (allocated(pl%nenc)) deallocate(pl%nenc) + + if (n == 0) return allocate(pl%outer(0:NTENC)) allocate(pl%inner(0:NTPHENC)) @@ -145,12 +151,14 @@ module subroutine rmvs_setup_tp(self, n, param) !> 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 + 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) + if (n == 0) return + allocate(self%lperi(n)) allocate(self%plperP(n)) allocate(self%plencP(n)) diff --git a/src/setup/setup.f90 b/src/setup/setup.f90 index 82e549ce5..976e73956 100644 --- a/src/setup/setup.f90 +++ b/src/setup/setup.f90 @@ -82,7 +82,7 @@ module subroutine setup_encounter(self, n) integer(I4B), intent(in) :: n !! Number of encounters to allocate space for self%nenc = n - if (n == 0) return + if (n < 0) return if (allocated(self%lvdotr)) deallocate(self%lvdotr) if (allocated(self%status)) deallocate(self%status) @@ -97,6 +97,8 @@ module subroutine setup_encounter(self, n) if (allocated(self%v2)) deallocate(self%v2) if (allocated(self%t)) deallocate(self%t) + if (n == 0) return + allocate(self%lvdotr(n)) allocate(self%status(n)) allocate(self%kidx(n)) @@ -205,7 +207,8 @@ module subroutine setup_body(self, n, param) integer(I4B) :: i self%nbody = n - if (n <= 0) return + if (n < 0) return + self%lfirst = .true. if (allocated(self%id)) deallocate(self%id) @@ -220,6 +223,11 @@ module subroutine setup_body(self, n, param) if (allocated(self%ir3h)) deallocate(self%ir3h) if (allocated(self%mu)) deallocate(self%mu) if (allocated(self%lmask)) deallocate(self%lmask) + if (allocated(self%aobl)) deallocate(self%aobl) + if (allocated(self%atide)) deallocate(self%lmask) + if (allocated(self%agr)) deallocate(self%lmask) + + if (n == 0) return allocate(self%id(n)) allocate(self%info(n)) @@ -263,17 +271,14 @@ 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 @@ -296,14 +301,21 @@ module subroutine setup_pl(self, n, param) !> 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, param) - if (n <= 0) return + if (n < 0) return - if (allocated(self%info)) deallocate(self%info) if (allocated(self%mass)) deallocate(self%mass) if (allocated(self%Gmass)) deallocate(self%Gmass) if (allocated(self%rhill)) deallocate(self%rhill) + if (allocated(self%radius)) deallocate(self%radius) + if (allocated(self%density)) deallocate(self%density) + if (allocated(self%rot)) deallocate(self%rot) + if (allocated(self%Ip)) deallocate(self%Ip) + if (allocated(self%k2)) deallocate(self%k2) + if (allocated(self%Q)) deallocate(self%Q) + if (allocated(self%tlag)) deallocate(self%tlag) + + if (n == 0) return - allocate(swiftest_particle_info :: self%info(n)) allocate(self%mass(n)) allocate(self%Gmass(n)) allocate(self%rhill(n)) @@ -315,8 +327,6 @@ 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 @@ -324,8 +334,6 @@ module subroutine setup_pl(self, n, param) end if if (param%lrotation) then - if (allocated(self%rot)) deallocate(self%rot) - if (allocated(self%Ip)) deallocate(self%Ip) allocate(self%rot(NDIM, n)) allocate(self%Ip(NDIM, n)) self%rot(:,:) = 0.0_DP @@ -333,9 +341,6 @@ module subroutine setup_pl(self, n, param) end if if (param%ltides) then - if (allocated(self%k2)) deallocate(self%k2) - if (allocated(self%Q)) deallocate(self%Q) - if (allocated(self%tlag)) deallocate(self%tlag) allocate(self%k2(n)) allocate(self%Q(n)) allocate(self%tlag(n)) @@ -362,19 +367,18 @@ module subroutine setup_tp(self, n, param) !> 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, param) - if (n <= 0) return + if (n < 0) return - if (allocated(self%info)) deallocate(self%info) if (allocated(self%isperi)) deallocate(self%isperi) if (allocated(self%peri)) deallocate(self%peri) if (allocated(self%atp)) deallocate(self%atp) - allocate(swiftest_particle_info :: self%info(n)) + if (n == 0) return + allocate(self%isperi(n)) allocate(self%peri(n)) allocate(self%atp(n)) - self%info(:)%particle_type = TP_TYPE_NAME self%isperi(:) = 0 self%peri(:) = 0.0_DP self%atp(:) = 0.0_DP diff --git a/src/symba/symba_setup.f90 b/src/symba/symba_setup.f90 index 9eff6bf6c..9c1fdb343 100644 --- a/src/symba/symba_setup.f90 +++ b/src/symba/symba_setup.f90 @@ -43,9 +43,12 @@ module subroutine symba_setup_merger(self, n, param) !> 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 (n < 0) return if (allocated(self%ncomp)) deallocate(self%ncomp) + + if (n == 0) return + allocate(self%ncomp(n)) self%ncomp(:) = 0 @@ -69,8 +72,7 @@ module subroutine symba_setup_pl(self, n, param) !> 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 - + if (n < 0) return if (allocated(self%lcollision)) deallocate(self%lcollision) if (allocated(self%lencounter)) deallocate(self%lencounter) @@ -84,6 +86,8 @@ module subroutine symba_setup_pl(self, n, param) if (allocated(self%atp)) deallocate(self%atp) if (allocated(self%kin)) deallocate(self%kin) + if (n == 0) return + allocate(self%lcollision(n)) allocate(self%lencounter(n)) allocate(self%lmtiny(n)) @@ -123,9 +127,12 @@ module subroutine symba_setup_encounter(self, n) integer(I4B), intent(in) :: n !! Number of encounters to allocate space for call setup_encounter(self, n) - if (n == 0) return + if (n < 0) return if (allocated(self%level)) deallocate(self%level) + + if (n ==0) return + allocate(self%level(n)) self%level(:) = -1 @@ -148,13 +155,15 @@ module subroutine symba_setup_tp(self, n, param) !> 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 + 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) if (allocated(self%info)) deallocate(self%info) + 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 3510769a7..8dee15982 100644 --- a/src/whm/whm_setup.f90 +++ b/src/whm/whm_setup.f90 @@ -16,7 +16,7 @@ module subroutine whm_setup_pl(self, n, param) !> Call allocation method for parent class call setup_pl(self, n, param) - if (n <= 0) return + if (n < 0) return if (allocated(self%eta)) deallocate(self%eta) if (allocated(self%muj)) deallocate(self%muj) @@ -24,6 +24,8 @@ module subroutine whm_setup_pl(self, n, param) if (allocated(self%vj)) deallocate(self%vj) if (allocated(self%ir3j)) deallocate(self%ir3j) + if (n == 0) return + allocate(self%eta(n)) allocate(self%muj(n)) allocate(self%xj(NDIM, n)) From 59693470b50abf5f60e3d95574a5bd728aad9079 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Mon, 30 Aug 2021 15:45:37 -0400 Subject: [PATCH 107/154] changed number of added bodies in rearray to regular integer rather than an association. --- src/setup/setup.f90 | 25 ++++++++++++++++--------- src/symba/symba_util.f90 | 5 +++-- 2 files changed, 19 insertions(+), 11 deletions(-) diff --git a/src/setup/setup.f90 b/src/setup/setup.f90 index 976e73956..504faca35 100644 --- a/src/setup/setup.f90 +++ b/src/setup/setup.f90 @@ -211,38 +211,45 @@ module subroutine setup_body(self, n, param) self%lfirst = .true. - if (allocated(self%id)) deallocate(self%id) if (allocated(self%info)) deallocate(self%info) + if (allocated(self%id)) deallocate(self%id) if (allocated(self%status)) deallocate(self%status) if (allocated(self%ldiscard)) deallocate(self%ldiscard) + if (allocated(self%lmask)) deallocate(self%lmask) + if (allocated(self%mu)) deallocate(self%mu) 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) if (allocated(self%aobl)) deallocate(self%aobl) - if (allocated(self%atide)) deallocate(self%lmask) if (allocated(self%agr)) deallocate(self%lmask) + if (allocated(self%atide)) deallocate(self%lmask) + if (allocated(self%ir3h)) deallocate(self%ir3h) + if (allocated(self%a)) deallocate(self%a) + if (allocated(self%e)) deallocate(self%e) + if (allocated(self%e)) deallocate(self%e) + if (allocated(self%inc)) deallocate(self%inc) + if (allocated(self%capom)) deallocate(self%capom) + if (allocated(self%omega)) deallocate(self%omega) + if (allocated(self%capm)) deallocate(self%capm) if (n == 0) return - allocate(self%id(n)) allocate(self%info(n)) + allocate(self%id(n)) allocate(self%status(n)) allocate(self%ldiscard(n)) + allocate(self%lmask(n)) + allocate(self%mu(n)) allocate(self%xh(NDIM, n)) allocate(self%vh(NDIM, n)) allocate(self%xb(NDIM, n)) allocate(self%vb(NDIM, n)) allocate(self%ah(NDIM, n)) allocate(self%ir3h(n)) - allocate(self%mu(n)) - allocate(self%lmask(n)) - self%id(:) = 0 + self%id(:) = 0 do i = 1, n call self%info(i)%set_value(& name = "UNNAMED", & diff --git a/src/symba/symba_util.f90 b/src/symba/symba_util.f90 index ce29e22aa..c805734bf 100644 --- a/src/symba/symba_util.f90 +++ b/src/symba/symba_util.f90 @@ -409,15 +409,16 @@ module subroutine symba_util_rearray_pl(self, system, param) class(symba_parameters), intent(inout) :: param !! Current run configuration parameters ! Internals class(symba_pl), allocatable :: tmp !! The discarded body list. - integer(I4B) :: i, j, k, npl, nencmin, idnew1, idnew2, idold1, idold2 + integer(I4B) :: i, j, k, npl, nadd, nencmin, idnew1, idnew2, idold1, idold2 logical, dimension(:), allocatable :: lmask, ldump_mask class(symba_plplenc), allocatable :: plplenc_old logical :: lencounter integer(I4B), dimension(:), allocatable :: levelg_orig_pl, levelm_orig_pl, levelg_orig_tp, levelm_orig_tp, nplenc_orig_pl, nplenc_orig_tp, ntpenc_orig_pl - associate(pl => self, pl_adds => system%pl_adds, nadd => system%pl_adds%nbody) + associate(pl => self, pl_adds => system%pl_adds) npl = pl%nbody + nadd = pl_adds%nbody) if (npl == 0) return ! Deallocate any temporary variables if (allocated(pl%xbeg)) deallocate(pl%xbeg) From 86de607f52b9de460c1f93c70e0a61c977846d47 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Mon, 30 Aug 2021 16:07:33 -0400 Subject: [PATCH 108/154] Switched out more associates with integers for number of bodies/events in subroutines where those numbers may change. --- src/discard/discard.f90 | 5 ++++- src/symba/symba_collision.f90 | 5 +++-- src/symba/symba_discard.f90 | 3 +++ src/symba/symba_encounter_check.f90 | 20 ++++++++++---------- src/symba/symba_kick.f90 | 26 +++++++++++++------------- src/symba/symba_util.f90 | 22 ++++++++-------------- 6 files changed, 41 insertions(+), 40 deletions(-) diff --git a/src/discard/discard.f90 b/src/discard/discard.f90 index e0dc8813e..97bbfbfc4 100644 --- a/src/discard/discard.f90 +++ b/src/discard/discard.f90 @@ -73,9 +73,12 @@ module subroutine discard_tp(self, system, param) class(swiftest_parameters), intent(inout) :: param !! Current run configuration parameter ! Internals logical, dimension(:), allocatable :: ldiscard + integer(I4B) :: npl, ntp - 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) if ((ntp == 0) .or. (npl ==0)) return + ntp = tp%nbody + npl = pl%nbody 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 diff --git a/src/symba/symba_collision.f90 b/src/symba/symba_collision.f90 index ae63edcba..15a52ac48 100644 --- a/src/symba/symba_collision.f90 +++ b/src/symba/symba_collision.f90 @@ -745,11 +745,12 @@ module subroutine symba_collision_encounter_extract_collisions(self, system, par 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 + integer(I4B) :: i, index_coll, ncollisions, nunique_parent, nplplenc 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) + associate(plplenc_list => self, idx1 => self%index1, idx2 => self%index2, plparent => pl%kin%parent) + nplplenc = plplenc_list%nenc allocate(lplpl_collision(nplplenc)) lplpl_collision(:) = plplenc_list%status(1:nplplenc) == COLLISION if (.not.any(lplpl_collision)) return diff --git a/src/symba/symba_discard.f90 b/src/symba/symba_discard.f90 index 877f7cc95..97a7f84ac 100644 --- a/src/symba/symba_discard.f90 +++ b/src/symba/symba_discard.f90 @@ -322,6 +322,9 @@ module subroutine symba_discard_pl(self, system, param) call symba_discard_nonplpl_conservation(self, system, param) + ! Save the add/discard information to file + call system%write_discard(param) + call pl%rearray(system, param) if (param%lenergy) then diff --git a/src/symba/symba_encounter_check.f90 b/src/symba/symba_encounter_check.f90 index 78403c348..3f5d8d00f 100644 --- a/src/symba/symba_encounter_check.f90 +++ b/src/symba/symba_encounter_check.f90 @@ -178,7 +178,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, k,nenc + integer(I4B) :: i, j, k,nenc, plind, tpind real(DP), dimension(NDIM) :: xr, vr logical, dimension(:,:), allocatable :: lencounter, loc_lvdotr @@ -212,15 +212,15 @@ module function symba_encounter_check_tp(self, system, dt, irec) result(lany_enc class is (symba_pl) pl%lencounter(1:npl) = .false. do k = 1, nenc - associate(plind => pltpenc_list%index1(k), tpind => pltpenc_list%index2(k)) - pl%lencounter(plind) = .true. - pl%levelg(plind) = irec - pl%levelm(plind) = irec - tp%levelg(tpind) = irec - tp%levelm(tpind) = irec - pl%ntpenc(plind) = pl%ntpenc(plind) + 1 - tp%nplenc(tpind) = tp%nplenc(tpind) + 1 - end associate + plind = pltpenc_list%index1(k) + tpind = pltpenc_list%index2(k) + pl%lencounter(plind) = .true. + pl%levelg(plind) = irec + pl%levelm(plind) = irec + tp%levelg(tpind) = irec + tp%levelm(tpind) = irec + pl%ntpenc(plind) = pl%ntpenc(plind) + 1 + tp%nplenc(tpind) = tp%nplenc(tpind) + 1 end do end select end associate diff --git a/src/symba/symba_kick.f90 b/src/symba/symba_kick.f90 index c80f53536..2c074cb0d 100644 --- a/src/symba/symba_kick.f90 +++ b/src/symba/symba_kick.f90 @@ -77,7 +77,7 @@ module subroutine symba_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 - integer(I4B) :: k + integer(I4B) :: i, j, k real(DP) :: rjj, fac, rlim2 real(DP), dimension(NDIM) :: dx @@ -88,18 +88,18 @@ module subroutine symba_kick_getacch_tp(self, system, param, t, lbeg) 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)) - if (tp%lmask(j)) THEN - if (lbeg) then - dx(:) = tp%xh(:,j) - pl%xbeg(:,i) - else - dx(:) = tp%xh(:,j) - pl%xend(:,i) - end if - rjj = dot_product(dx(:), dx(:)) - fac = pl%Gmass(i) / (rjj * sqrt(rjj)) - tp%ah(:,j) = tp%ah(:,j) + fac * dx(:) - end IF - end associate + i = pltpenc_list%index1(k) + j = pltpenc_list%index2(k) + if (tp%lmask(j)) THEN + if (lbeg) then + dx(:) = tp%xh(:,j) - pl%xbeg(:,i) + else + dx(:) = tp%xh(:,j) - pl%xend(:,i) + end if + rjj = dot_product(dx(:), dx(:)) + fac = pl%Gmass(i) / (rjj * sqrt(rjj)) + tp%ah(:,j) = tp%ah(:,j) + fac * dx(:) + end IF end do end associate end select diff --git a/src/symba/symba_util.f90 b/src/symba/symba_util.f90 index c805734bf..db8ff94ab 100644 --- a/src/symba/symba_util.f90 +++ b/src/symba/symba_util.f90 @@ -285,19 +285,19 @@ module subroutine symba_util_index_eucl_plpl(self, param) class(symba_pl), intent(inout) :: self !! SyMBA massive body object class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters ! Internals - integer(I8B) :: i, j, counter, npl, nplm + integer(I8B) :: i, j, counter, npl, nplm, nplpl, nplplm - associate(pl => self, nplpl => self%nplpl, nplplm => self%nplplm) + associate(pl => self) npl = int(self%nbody, kind=I8B) call pl%sort("mass", ascending=.false.) nplm = count(.not. pl%lmtiny(1:npl)) pl%nplm = int(nplm, kind=I4B) - nplpl = (npl * (npl - 1) / 2) ! number of entries in a strict lower triangle, npl x npl, minus first column - nplplm = nplm * npl - nplm * (nplm + 1) / 2 ! number of entries in a strict lower triangle, npl x npl, minus first column including only mutually interacting bodies + pl%nplpl = (npl * (npl - 1) / 2) ! number of entries in a strict lower triangle, npl x npl, minus first column + pl%nplplm = nplm * npl - nplm * (nplm + 1) / 2 ! number of entries in a strict lower triangle, npl x npl, minus first column including only mutually interacting bodies 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)) + allocate(self%k_plpl(2, pl%nplpl)) do i = 1, npl counter = (i - 1_I8B) * npl - i * (i - 1_I8B) / 2_I8B + 1_I8B do j = i + 1_I8B, npl @@ -418,7 +418,7 @@ module subroutine symba_util_rearray_pl(self, system, param) associate(pl => self, pl_adds => system%pl_adds) npl = pl%nbody - nadd = pl_adds%nbody) + nadd = pl_adds%nbody if (npl == 0) return ! Deallocate any temporary variables if (allocated(pl%xbeg)) deallocate(pl%xbeg) @@ -431,7 +431,7 @@ module subroutine symba_util_rearray_pl(self, system, param) call pl%spill(tmp, lspill_list=lmask, ldestructive=.true.) npl = pl%nbody call tmp%setup(0,param) - if (allocated(tmp)) deallocate(tmp) + deallocate(tmp) deallocate(lmask) ! Store the original plplenc list so we don't remove any of the original encounters @@ -869,8 +869,6 @@ module subroutine symba_util_spill_pl(self, discards, lspill_list, ldestructive) 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 @@ -911,10 +909,8 @@ module subroutine symba_util_spill_encounter(self, discards, lspill_list, ldestr 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, nenc => self%nenc) + associate(keeps => self) select type(discards) class is (symba_encounter) call util_spill(keeps%level, discards%level, lspill_list, ldestructive) @@ -940,8 +936,6 @@ module subroutine symba_util_spill_tp(self, discards, lspill_list, ldestructive) 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 From 0acbf347815cfcc2e400497d6474612b9a8059cc Mon Sep 17 00:00:00 2001 From: David A Minton Date: Mon, 30 Aug 2021 16:25:06 -0400 Subject: [PATCH 109/154] Rearranged symba_encounter_check to split off the parallel loop into its own non-polymorphic subroutine to make setting the share flags easier to manage. --- src/kick/kick.f90 | 3 +- src/symba/symba_encounter_check.f90 | 71 +++++++++++++++++++---------- 2 files changed, 47 insertions(+), 27 deletions(-) diff --git a/src/kick/kick.f90 b/src/kick/kick.f90 index f2c49ad06..5c57918e2 100644 --- a/src/kick/kick.f90 +++ b/src/kick/kick.f90 @@ -98,9 +98,8 @@ module subroutine kick_getacch_int_all_pl(npl, nplpl, k_plpl, x, Gmass, radius, if (rji2 > rlim2) call kick_getacch_int_one_pl(rji2, xr, yr, zr, Gmass(i), Gmass(j), ahi(1,i), ahi(2,i), ahi(3,i), ahj(1,j), ahj(2,j), ahj(3,j)) end do !$omp end parallel do - !$omp parallel workshare + acc(:,1:npl) = acc(:,1:npl) + ahi(:,1:npl) + ahj(:,1:npl) - !$omp end parallel workshare return end subroutine kick_getacch_int_all_pl diff --git a/src/symba/symba_encounter_check.f90 b/src/symba/symba_encounter_check.f90 index 3f5d8d00f..6f6010047 100644 --- a/src/symba/symba_encounter_check.f90 +++ b/src/symba/symba_encounter_check.f90 @@ -2,6 +2,46 @@ use swiftest contains + subroutine symba_encounter_check_all(nplplm, k_plpl, x, v, rhill, dt, irec, lencounter, loc_lvdotr) + !! author: David A. Minton + !! + !! Check for encounters between massive bodies. Split off from the main subroutine for performance + implicit none + integer(I8B), intent(in) :: nplplm + integer(I4B), dimension(:,:), intent(in) :: k_plpl + real(DP), dimension(:,:), intent(in) :: x, v + real(DP), dimension(:), intent(in) :: rhill + real(DP), intent(in) :: dt + integer(I4B), intent(in) :: irec + logical, dimension(:), intent(out) :: lencounter, loc_lvdotr + ! Internals + integer(I8B) :: k + integer(I4B) :: i, j + real(DP) :: xr, yr, zr, vxr, vyr, vzr, rhill1, rhill2 + + !$omp parallel do default(private)& + !$omp shared(nplplm, k_plpl, x, v, rhill, dt, irec, lencounter, loc_lvdotr) + do k = 1_I8B, nplplm + i = k_plpl(1, k) + j = k_plpl(2, k) + xr = x(1, j) - x(1, i) + yr = x(2, j) - x(2, i) + zr = x(3, j) - x(3, i) + vxr = v(1, j) - v(1, i) + vyr = v(2, j) - v(2, i) + vzr = v(3, j) - v(3, i) + rhill1 = rhill(i) + rhill2 = rhill(j) + lencounter(k) = .false. + loc_lvdotr(k) = .false. + call symba_encounter_check_one(xr, yr, zr, vxr, vyr, vzr, rhill1, rhill2, dt, irec, lencounter(k), loc_lvdotr(k)) + end do + !$omp end parallel do + + return + end subroutine symba_encounter_check_all + + module function symba_encounter_check_pl(self, system, dt, irec) result(lany_encounter) !! author: David A. Minton !! @@ -18,47 +58,28 @@ module function symba_encounter_check_pl(self, system, dt, irec) result(lany_enc ! Internals integer(I8B) :: k, nplplm integer(I4B) :: i, j, nenc - real(DP) :: xr, yr, zr, vxr, vyr, vzr, rhill1, rhill2 - logical, dimension(:), allocatable :: lencounter, loc_lvdotr - real(DP), dimension(:,:), pointer :: xh, vh - real(DP), dimension(:), pointer :: rhill - integer(I4B), dimension(:,:), pointer :: k_plpl + logical, dimension(:), allocatable :: lencounter, loc_lvdotr if (self%nbody == 0) return - associate(pl => self, xh => self%xh, vh => self%vh, rhill => self%rhill, npl => self%nbody, k_plpl => self%k_plpl) - nplplm = self%nplplm + associate(pl => self) + nplplm = pl%nplplm allocate(lencounter(nplplm)) allocate(loc_lvdotr(nplplm)) - lencounter(:) = .false. - loc_lvdotr(:) = .false. - !$omp parallel do default(shared)& - !$omp private(k, i, j, xr, yr, zr, vxr, vyr, vzr, rhill1, rhill2) - do k = 1_I8B, nplplm - i = k_plpl(1, k) - j = k_plpl(2, k) - xr = xh(1, j) - xh(1, i) - yr = xh(2, j) - xh(2, i) - zr = xh(3, j) - xh(3, i) - vxr = vh(1, j) - vh(1, i) - vyr = vh(2, j) - vh(2, i) - vzr = vh(3, j) - vh(3, i) - rhill1 = rhill(i) - rhill2 = rhill(j) - call symba_encounter_check_one(xr, yr, zr, vxr, vyr, vzr, rhill1, rhill2, dt, irec, lencounter(k), loc_lvdotr(k)) - end do - !$omp end parallel do + call symba_encounter_check_all(nplplm, pl%k_plpl, pl%xh, pl%vh, pl%rhill, dt, irec, lencounter, loc_lvdotr) !$omp parallel workshare nenc = count(lencounter(:)) !$omp end parallel workshare + lany_encounter = nenc > 0 if (lany_encounter) then associate(plplenc_list => system%plplenc_list) call plplenc_list%resize(nenc) plplenc_list%lvdotr(1:nenc) = pack(loc_lvdotr(1:nplplm), lencounter(1:nplplm)) plplenc_list%kidx(1:nenc) = pack([(k, k = 1_I8B, nplplm)], lencounter(1:nplplm)) + deallocate(lencounter, loc_lvdotr) plplenc_list%index1(1:nenc) = pl%k_plpl(1,plplenc_list%kidx(1:nenc)) plplenc_list%index2(1:nenc) = pl%k_plpl(2,plplenc_list%kidx(1:nenc)) plplenc_list%id1(1:nenc) = pl%id(plplenc_list%index1(1:nenc)) From df8b9e20bef67f6004c43ffb5aee2a5fa5ac7897 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Mon, 30 Aug 2021 16:56:42 -0400 Subject: [PATCH 110/154] Improved collision reporting in SyMBA and switched out more in-loop associates with plain integers. --- src/symba/symba_collision.f90 | 133 +++++++++++++++++++--------------- 1 file changed, 76 insertions(+), 57 deletions(-) diff --git a/src/symba/symba_collision.f90 b/src/symba/symba_collision.f90 index 15a52ac48..99ced73c5 100644 --- a/src/symba/symba_collision.f90 +++ b/src/symba/symba_collision.f90 @@ -469,9 +469,10 @@ module function symba_collision_check_encounter(self, system, param, t, dt, irec ! Internals logical, dimension(:), allocatable :: lcollision, lmask real(DP), dimension(NDIM) :: xr, vr - integer(I4B) :: k + integer(I4B) :: i, j, k, nenc real(DP) :: rlim, Gmtot logical :: isplpl + character(len=STRMAX) :: timestr, idstri, idstrj lany_collision = .false. if (self%nenc == 0) return @@ -487,64 +488,78 @@ module function symba_collision_check_encounter(self, system, param, t, dt, irec class is (symba_pl) select type(tp => system%tp) class is (symba_tp) - 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(nenc)) - lcollision(:) = .false. + nenc = self%nenc + nenc = self%nenc + allocate(lmask(nenc)) + lmask(:) = ((self%status(1:nenc) == ACTIVE) .and. (pl%levelg(self%index1(1:nenc)) >= irec)) + if (isplpl) then + lmask(:) = lmask(:) .and. (pl%levelg(self%index2(1:nenc)) >= irec) + else + lmask(:) = lmask(:) .and. (tp%levelg(self%index2(1:nenc)) >= irec) + end if + if (.not.any(lmask(:))) return + + allocate(lcollision(nenc)) + lcollision(:) = .false. + + if (isplpl) then + do concurrent(k = 1:nenc, lmask(k)) + i = self%index1(k) + j = self%index2(k) + xr(:) = pl%xh(:, i) - pl%xh(:, j) + vr(:) = pl%vb(:, i) - pl%vb(:, j) + rlim = pl%radius(i) + pl%radius(j) + Gmtot = pl%Gmass(i) + pl%Gmass(j) + lcollision(k) = symba_collision_check_one(xr(1), xr(2), xr(3), vr(1), vr(2), vr(3), Gmtot, rlim, dt, self%lvdotr(k)) + end do + else + do concurrent(k = 1:nenc, lmask(k)) + i = self%index1(k) + j = self%index2(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, self%lvdotr(k)) + end do + end if + if (any(lcollision(1:nenc))) call pl%xh2xb(system%cb) ! Update the central body barycenteric position vector to get us out of DH and into bary + do k = 1, nenc + i = self%index1(k) + j = self%index2(k) + if (lcollision(k)) self%status(k) = COLLISION + self%t(k) = t + self%x1(:,k) = pl%xh(:,i) + system%cb%xb(:) + self%v1(:,k) = pl%vb(:,i) 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)) - Gmtot = pl%Gmass(ind1(k)) + pl%Gmass(ind2(k)) - lcollision(k) = symba_collision_check_one(xr(1), xr(2), xr(3), vr(1), vr(2), vr(3), Gmtot, rlim, dt, self%lvdotr(k)) - end do + self%x2(:,k) = pl%xh(:,j) + system%cb%xb(:) + self%v2(:,k) = pl%vb(:,j) + if (lcollision(k)) then + ! 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(i) .or. pl%lcollision(j)) call pl%make_family([i,j]) + + ! Set the collision flag for these to bodies to true in case they become involved in another collision later in the step + pl%lcollision([i, j]) = .true. + pl%ldiscard([i, j]) = .true. + pl%status([i, j]) = COLLISION + call pl%info(i)%set_value(status="COLLISION", discard_time=t, discard_xh=pl%xh(:,i), discard_vh=pl%vh(:,i)) + call pl%info(j)%set_value(status="COLLISION", discard_time=t, discard_xh=pl%xh(:,j), discard_vh=pl%vh(:,j)) + end if 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(1:nenc))) call pl%xh2xb(system%cb) ! Update the central body barycenteric position vector to get us out of DH and into bary - do k = 1, nenc - if (lcollision(k)) self%status(k) = COLLISION - self%t(k) = t - self%x1(:,k) = pl%xh(:,ind1(k)) + system%cb%xb(:) - self%v1(:,k) = pl%vb(:,ind1(k)) - if (isplpl) then - self%x2(:,k) = pl%xh(:,ind2(k)) + system%cb%xb(:) - self%v2(:,k) = pl%vb(:,ind2(k)) - if (lcollision(k)) then - ! 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 - end if - else - self%x2(:,k) = tp%xh(:,ind2(k)) + system%cb%xb(:) - self%v2(:,k) = tp%vb(:,ind2(k)) - if (lcollision(k)) then - 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 + self%x2(:,k) = tp%xh(:,j) + system%cb%xb(:) + self%v2(:,k) = tp%vb(:,j) + if (lcollision(k)) then + tp%status(j) = DISCARDED_PLR + tp%ldiscard(j) = .true. + write(idstri, *) pl%id(i) + write(idstrj, *) tp%id(j) + write(timestr, *) t + call tp%info(j)%set_value(status="DISCARDED_PLR", discard_time=t, discard_xh=tp%xh(:,j), discard_vh=tp%vh(:,j)) + write(*, *) "Particle " // trim(adjustl(tp%info(j)%name)) // " (" // trim(adjustl(idstrj)) // ")" & + // " collided with massive body " // trim(adjustl(pl%info(i)%name)) // " (" // trim(adjustl(idstri)) // ")" & + // " at t = " // trim(adjustl(timestr)) end if - end do - end associate + end if + end do end select end select @@ -1167,6 +1182,7 @@ module subroutine symba_collision_resolve_plplenc(self, system, param, t, dt, ir real(DP) :: Eorbit_before, Eorbit_after logical :: lplpl_collision character(len=STRMAX) :: timestr + class(symba_parameters), allocatable :: tmp_param associate(plplenc_list => self, plplcollision_list => system%plplcollision_list) select type(pl => system%pl) @@ -1187,6 +1203,8 @@ module subroutine symba_collision_resolve_plplenc(self, system, param, t, dt, ir do write(timestr,*) t write(*, *) "Collision between massive bodies detected at time t = " // trim(adjustl(timestr)) + allocate(tmp_param, source=param) + tmp_param%t = t if (param%lfragmentation) then call plplcollision_list%resolve_fragmentations(system, param) else @@ -1199,14 +1217,15 @@ module subroutine symba_collision_resolve_plplenc(self, system, param, t, dt, ir if ((system%pl_adds%nbody == 0) .and. (system%pl_discards%nbody == 0)) exit ! Save the add/discard information to file - call system%write_discard(param) + call system%write_discard(tmp_param) ! Rearrange the arrays: Remove discarded bodies, add any new bodies, resort, and recompute all indices and encounter lists - call pl%rearray(system, param) + call pl%rearray(system, tmp_param) ! Destroy the add/discard list so that we don't append the same body multiple times if another collision is detected call system%pl_discards%setup(0, param) call system%pl_adds%setup(0, param) + deallocate(tmp_param) ! Check whether or not any of the particles that were just added are themselves in a collision state. This will generate a new plplcollision_list lplpl_collision = plplenc_list%collision_check(system, param, t, dt, irec) From 565ed44ccb1c2139526792ac8c7229a82aa9eb81 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Mon, 30 Aug 2021 20:15:10 -0400 Subject: [PATCH 111/154] Fixed problem where the discard flag was not being reset by bodies sometimes after a collision, causing new bodies to get discarded. --- src/io/io.f90 | 2 +- src/symba/symba_util.f90 | 15 +++++---------- 2 files changed, 6 insertions(+), 11 deletions(-) diff --git a/src/io/io.f90 b/src/io/io.f90 index bbbf25cd1..c00939516 100644 --- a/src/io/io.f90 +++ b/src/io/io.f90 @@ -895,7 +895,7 @@ module subroutine io_param_writer(self, unit, iotype, v_list, iostat, iomsg) write(param_name, Afmt) "DU2M"; write(param_value, Rfmt) param%DU2M; write(unit, Afmt, err = 667, iomsg = iomsg) adjustl(param_name), adjustl(param_value) write(param_name, Afmt) "RHILL_PRESENT"; write(param_value, Lfmt) param%lrhill_present; write(unit, Afmt, err = 667, iomsg = iomsg) adjustl(param_name), adjustl(param_value) write(param_name, Afmt) "EXTRA_FORCE"; write(param_value, Lfmt) param%lextra_force; write(unit, Afmt, err = 667, iomsg = iomsg) adjustl(param_name), adjustl(param_value) - write(param_name, Afmt) "DISCARD_OUT"; write(param_value, Afmt) trim(adjustl(param%discard_out)); write(unit, Afmt, err = 667, iomsg = iomsg) adjustl(param_name), adjustl(param_value) + if (param%discard_out /= "") write(param_name, Afmt) "DISCARD_OUT"; write(param_value, Afmt) trim(adjustl(param%discard_out)); write(unit, Afmt, err = 667, iomsg = iomsg) adjustl(param_name), adjustl(param_value) if (param%discard_out /= "") write(param_name, Afmt) "BIG_DISCARD"; write(param_value, Lfmt) param%lbig_discard; write(unit, Afmt, err = 667, iomsg = iomsg) adjustl(param_name), adjustl(param_value) write(param_name, Afmt) "CHK_CLOSE"; write(param_value, Lfmt) param%lclose; write(unit, Afmt, err = 667, iomsg = iomsg) adjustl(param_name), adjustl(param_value) write(param_name, Afmt) "ENERGY"; write(param_value, Lfmt) param%lenergy; write(unit, Afmt, err = 667, iomsg = iomsg) adjustl(param_name), adjustl(param_value) diff --git a/src/symba/symba_util.f90 b/src/symba/symba_util.f90 index db8ff94ab..ccb9b37ec 100644 --- a/src/symba/symba_util.f90 +++ b/src/symba/symba_util.f90 @@ -453,16 +453,11 @@ module subroutine symba_util_rearray_pl(self, system, param) end if ! Reset all of the status flags for this body - where(pl%status(1:npl) /= INACTIVE) - pl%status(1:npl) = ACTIVE - pl%info(1:npl)%status = "ACTIVE" - pl%ldiscard(1:npl) = .false. - pl%lcollision(1:npl) = .false. - pl%lmask(1:npl) = .true. - elsewhere - pl%ldiscard(1:npl) = .true. - pl%lmask(1:npl) = .false. - end where + pl%status(1:npl) = ACTIVE + pl%info(1:npl)%status = "ACTIVE" + pl%ldiscard(1:npl) = .false. + pl%lcollision(1:npl) = .false. + pl%lmask(1:npl) = .true. select type(param) class is (symba_parameters) From f5632252daacd54c49c97930d24aa9467f41e44c Mon Sep 17 00:00:00 2001 From: David A Minton Date: Mon, 30 Aug 2021 20:38:16 -0400 Subject: [PATCH 112/154] Rearranged how the non-plpl discards work to use the same pattern as the plpl discards --- src/symba/symba_discard.f90 | 31 ++++++++++++++++++++++--------- 1 file changed, 22 insertions(+), 9 deletions(-) diff --git a/src/symba/symba_discard.f90 b/src/symba/symba_discard.f90 index 97a7f84ac..24f40b1bd 100644 --- a/src/symba/symba_discard.f90 +++ b/src/symba/symba_discard.f90 @@ -184,19 +184,32 @@ subroutine symba_discard_nonplpl(pl, system, param) class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters ! Internals logical, dimension(pl%nbody) :: ldiscard + integer(I4B) :: i, nstart, nend, nsub + class(symba_pl), allocatable :: plsub ! First check for collisions with the central body associate(npl => pl%nbody, cb => system%cb) if (npl == 0) return - ldiscard(1:npl) = pl%ldiscard(1:npl) ! Don't include any bodies that were previously flagged for discard in here - 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) - if (any(.not.ldiscard(1:npl) .and. pl%ldiscard(1:npl))) then - ldiscard(1:npl) = .not.ldiscard(1:npl) .and. pl%ldiscard(1:npl) - call system%pl_discards%append(pl, ldiscard) - end if + select type(pl_discards => system%pl_discards) + class is (symba_merger) + 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) call symba_discard_peri_pl(pl, system, param) + if (any(pl%ldiscard(1:npl))) then + ldiscard(1:npl) = pl%ldiscard(1:npl) + + allocate(plsub, mold=pl) + call pl%spill(plsub, ldiscard, ldestructive=.false.) + nsub = plsub%nbody + nstart = pl_discards%nbody + 1 + nend = pl_discards%nbody + nsub + call pl_discards%append(plsub, lsource_mask=[(.true., i = 1, nsub)]) + + ! Record how many bodies were subtracted in this event + pl_discards%ncomp(nstart:nend) = nsub + end if + end select end associate return From 0aa83aca8df7ef0682dda8551754d188f9255060 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Mon, 30 Aug 2021 23:04:42 -0400 Subject: [PATCH 113/154] Fixed issue in which pure hit and run kinship relationships were not being reset, causing bodies to later accumulate children when the hit and run had aleady been resolved. This was inadverently causing bodies to be lost when they shouldn't have been. --- src/symba/symba_collision.f90 | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/src/symba/symba_collision.f90 b/src/symba/symba_collision.f90 index 99ced73c5..7a2a38023 100644 --- a/src/symba/symba_collision.f90 +++ b/src/symba/symba_collision.f90 @@ -119,7 +119,7 @@ module function symba_collision_casehitandrun(system, param, family, x, v, mass, ! Result integer(I4B) :: status !! Status flag assigned to this outcome ! Internals - integer(I4B) :: i, nfrag, jproj, jtarg, idstart, ibiggest, nfamily + integer(I4B) :: i, j, nfrag, jproj, jtarg, idstart, ibiggest, nfamily real(DP) :: mtot, avg_dens real(DP), dimension(NDIM) :: xcom, vcom real(DP), dimension(2) :: vol @@ -201,6 +201,12 @@ module function symba_collision_casehitandrun(system, param, family, x, v, mass, pl%status(family(:)) = ACTIVE pl%ldiscard(family(:)) = .false. pl%lcollision(family(:)) = .false. + pl%kin(family(:))%parent = family(:) + pl%kin(family(:))%nchild = 0 + do j = 1, size(family(:)) + i = family(j) + if (allocated(pl%kin(i)%child)) deallocate(pl%kin(i)%child) + end do end select else status = HIT_AND_RUN_DISRUPT @@ -341,7 +347,7 @@ module function symba_collision_casesupercatastrophic(system, param, family, x, ! Result integer(I4B) :: status !! Status flag assigned to this outcome ! Internals - integer(I4B) :: i, nfrag, ibiggest, nfamily, nstart, nend + integer(I4B) :: i, j, nfrag, ibiggest, nfamily, nstart, nend real(DP) :: mtot, avg_dens, min_frag_mass real(DP), dimension(NDIM) :: xcom, vcom real(DP), dimension(2) :: vol @@ -408,6 +414,12 @@ module function symba_collision_casesupercatastrophic(system, param, family, x, pl%status(family(:)) = status pl%ldiscard(family(:)) = .false. pl%lcollision(family(:)) = .false. + pl%kin(family(:))%parent = family(:) + pl%kin(family(:))%nchild = 0 + do j = 1, size(family(:)) + i = family(j) + if (allocated(pl%kin(i)%child)) deallocate(pl%kin(i)%child) + end do end select else ! Populate the list of new bodies @@ -1066,8 +1078,7 @@ module subroutine symba_collision_resolve_fragmentations(self, system, param) idx_parent(1) = pl%kin(idx1(i))%parent idx_parent(2) = pl%kin(idx2(i))%parent lgoodcollision = symba_collision_consolidate_familes(pl, cb, 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 + if ((.not. lgoodcollision) .or. any(pl%status(idx_parent(:)) /= COLLISION)) cycle ! Convert all quantities to SI units and determine which of the pair is the projectile vs. target before sending them ! to symba_regime From bb01ff287f3bdafde017e88448c96e453a58d559 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Tue, 31 Aug 2021 08:58:25 -0400 Subject: [PATCH 114/154] Added new method fro reseting the kinship object and use it after each collision is resolved. --- src/modules/symba_classes.f90 | 9 +++++++++ src/symba/symba_collision.f90 | 29 +++++++++++------------------ src/symba/symba_setup.f90 | 3 +-- src/symba/symba_step.f90 | 6 +----- src/symba/symba_util.f90 | 28 +++++++++++++++++++++++----- 5 files changed, 45 insertions(+), 30 deletions(-) diff --git a/src/modules/symba_classes.f90 b/src/modules/symba_classes.f90 index ca51def4c..75d8e0e73 100644 --- a/src/modules/symba_classes.f90 +++ b/src/modules/symba_classes.f90 @@ -78,6 +78,7 @@ module symba_classes 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 :: reset_kinship => symba_util_reset_kinship !! Resets the kinship status of 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 @@ -573,6 +574,14 @@ module subroutine symba_util_rearray_pl(self, system, param) class(symba_nbody_system), intent(inout) :: system !! SyMBA nbody system object class(symba_parameters), intent(inout) :: param !! Current run configuration parameters with SyMBA additions end subroutine symba_util_rearray_pl + + module subroutine symba_util_reset_kinship(self, idx) + implicit none + class(symba_pl), intent(inout) :: self !! SyMBA massive body object + integer(I4B), dimension(:), intent(in) :: idx !! Index array of bodies to reset + integer(I4B) :: i, j + end subroutine symba_util_reset_kinship + end interface interface util_resize diff --git a/src/symba/symba_collision.f90 b/src/symba/symba_collision.f90 index 7a2a38023..ea93948f3 100644 --- a/src/symba/symba_collision.f90 +++ b/src/symba/symba_collision.f90 @@ -90,6 +90,7 @@ module function symba_collision_casedisruption(system, param, family, x, v, mass pl%status(family(:)) = status pl%ldiscard(family(:)) = .false. pl%lcollision(family(:)) = .false. + call pl%reset_kinship(family(:)) end select else ! Populate the list of new bodies @@ -201,12 +202,7 @@ module function symba_collision_casehitandrun(system, param, family, x, v, mass, pl%status(family(:)) = ACTIVE pl%ldiscard(family(:)) = .false. pl%lcollision(family(:)) = .false. - pl%kin(family(:))%parent = family(:) - pl%kin(family(:))%nchild = 0 - do j = 1, size(family(:)) - i = family(j) - if (allocated(pl%kin(i)%child)) deallocate(pl%kin(i)%child) - end do + call pl%reset_kinship(family(:)) end select else status = HIT_AND_RUN_DISRUPT @@ -414,12 +410,7 @@ module function symba_collision_casesupercatastrophic(system, param, family, x, pl%status(family(:)) = status pl%ldiscard(family(:)) = .false. pl%lcollision(family(:)) = .false. - pl%kin(family(:))%parent = family(:) - pl%kin(family(:))%nchild = 0 - do j = 1, size(family(:)) - i = family(j) - if (allocated(pl%kin(i)%child)) deallocate(pl%kin(i)%child) - end do + call pl%reset_kinship(family(:)) end select else ! Populate the list of new bodies @@ -874,8 +865,7 @@ module subroutine symba_collision_make_family_pl(self, idx) 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 + call pl%reset_kinship([index_child]) ! Add the new child to its parent pl%kin(index_child)%parent = index_parent temp(nchild_new) = index_child @@ -906,7 +896,7 @@ subroutine symba_collision_mergeaddsub(system, param, family, id_frag, Ip_frag, ! Internals integer(I4B) :: i, ibiggest, ismallest, iother, nstart, nend, nfamily, nfrag logical, dimension(system%pl%nbody) :: lmask - class(symba_pl), allocatable :: plnew + class(symba_pl), allocatable :: plnew, plsub character(*), parameter :: FRAGFMT = '("Newbody",I0.7)' character(len=NAMELEN) :: newname @@ -1022,15 +1012,18 @@ subroutine symba_collision_mergeaddsub(system, param, family, id_frag, Ip_frag, pl%status(family(:)) = MERGED pl%ldiscard(family(:)) = .true. pl%lcollision(family(:)) = .true. + call pl%reset_kinship(family(:)) lmask(:) = .false. lmask(family(:)) = .true. call plnew%setup(0, param) - call pl%spill(plnew, lmask, ldestructive=.false.) + + allocate(plsub, mold=pl) + call pl%spill(plsub, lmask, ldestructive=.false.) nstart = pl_discards%nbody + 1 nend = pl_discards%nbody + nfamily - call pl_discards%append(plnew, lsource_mask=[(.true., i = 1, nfamily)]) + call pl_discards%append(plsub, lsource_mask=[(.true., i = 1, nfamily)]) ! Record how many bodies were subtracted in this event pl_discards%ncomp(nstart:nend) = nfamily @@ -1042,7 +1035,7 @@ subroutine symba_collision_mergeaddsub(system, param, family, id_frag, Ip_frag, return end subroutine symba_collision_mergeaddsub - + module subroutine symba_collision_resolve_fragmentations(self, system, param) !! author: David A. Minton diff --git a/src/symba/symba_setup.f90 b/src/symba/symba_setup.f90 index 9c1fdb343..3a0543ee1 100644 --- a/src/symba/symba_setup.f90 +++ b/src/symba/symba_setup.f90 @@ -110,8 +110,7 @@ module subroutine symba_setup_pl(self, n, param) self%isperi(:) = 0 self%peri(:) = 0.0_DP self%atp(:) = 0.0_DP - self%kin(:)%nchild = 0 - self%kin(:)%parent = [(i, i=1, n)] + call self%reset_kinship([(i, i=1, n)]) return end subroutine symba_setup_pl diff --git a/src/symba/symba_step.f90 b/src/symba/symba_step.f90 index fe2d74b1a..7ab8113c0 100644 --- a/src/symba/symba_step.f90 +++ b/src/symba/symba_step.f90 @@ -236,11 +236,7 @@ module subroutine symba_step_reset_system(self, param) associate(npl => pl%nbody, ntp => tp%nbody) if (npl > 0) then pl%lcollision(1:npl) = .false. - pl%kin(1:npl)%parent = [(i, i=1, npl)] - pl%kin(1:npl)%nchild = 0 - do i = 1, npl - if (allocated(pl%kin(i)%child)) deallocate(pl%kin(i)%child) - end do + call pl%reset_kinship([(i, i=1, npl)]) pl%nplenc(1:npl) = 0 pl%ntpenc(1:npl) = 0 pl%levelg(1:npl) = -1 diff --git a/src/symba/symba_util.f90 b/src/symba/symba_util.f90 index ccb9b37ec..2ff7dbf18 100644 --- a/src/symba/symba_util.f90 +++ b/src/symba/symba_util.f90 @@ -476,11 +476,7 @@ module subroutine symba_util_rearray_pl(self, system, param) call pl%index(param) ! Reset the kinship trackers - pl%kin(1:npl)%nchild = 0 - pl%kin(1:npl)%parent = [(i, i=1, npl)] - do i = 1, npl - if (allocated(pl%kin(i)%child)) deallocate(pl%kin(i)%child) - end do + call pl%reset_kinship([(i, i=1, npl)]) ! Re-build the zero-level encounter list, being sure to save the original level information for all bodies allocate(levelg_orig_pl, source=pl%levelg) @@ -540,6 +536,28 @@ module subroutine symba_util_rearray_pl(self, system, param) end subroutine symba_util_rearray_pl + module subroutine symba_util_reset_kinship(self, idx) + !! author: David A. Minton + !! + !! Resets the kinship status of bodies. + !! + implicit none + class(symba_pl), intent(inout) :: self !! SyMBA massive body object + integer(I4B), dimension(:), intent(in) :: idx !! Index array of bodies to reset + ! Internals + integer(I4B) :: i, j + + self%kin(idx(:))%parent = idx(:) + self%kin(idx(:))%nchild = 0 + do j = 1, size(idx(:)) + i = idx(j) + if (allocated(self%kin(i)%child)) deallocate(self%kin(i)%child) + end do + + return + end subroutine symba_util_reset_kinship + + module subroutine symba_util_resize_arr_kin(arr, nnew) !! author: David A. Minton !! From cfcbef1c76fcf61d15e3a41309e8077f33bfdf4b Mon Sep 17 00:00:00 2001 From: David A Minton Date: Tue, 31 Aug 2021 09:07:19 -0400 Subject: [PATCH 115/154] Updated symba_mars_disk example input files and added bell cluster run script. --- examples/symba_mars_disk/param.in | 16 +++++------- examples/symba_mars_disk/runswiftest.sh | 33 +++++++++++++++++++++++++ 2 files changed, 39 insertions(+), 10 deletions(-) create mode 100644 examples/symba_mars_disk/runswiftest.sh diff --git a/examples/symba_mars_disk/param.in b/examples/symba_mars_disk/param.in index ae89cd6d4..78c087566 100644 --- a/examples/symba_mars_disk/param.in +++ b/examples/symba_mars_disk/param.in @@ -1,18 +1,16 @@ !Parameter file for the SyMBA-RINGMOONS test T0 0.0 -TSTOP 100000.0 +TSTOP 1.0e12 DT 600.0 CB_IN cb.in PL_IN mars.in TP_IN tp.in IN_TYPE ASCII -ISTEP_OUT 10 -ISTEP_DUMP 10 -!BIN_OUT bin.dat -!OUT_TYPE REAL8 -BIN_OUT bin.nc -OUT_TYPE NETCDF_DOUBLE +ISTEP_OUT 1 +ISTEP_DUMP 1 +BIN_OUT bin.nc PARTICLE_OUT particle.dat +OUT_TYPE NETCDF_DOUBLE OUT_FORM XVEL OUT_STAT REPLACE CHK_CLOSE yes @@ -23,9 +21,9 @@ CHK_QMIN 3389500.0 CHK_QMIN_COORD HELIO CHK_QMIN_RANGE 3389500.0 338950000000.0 EXTRA_FORCE no -BIG_DISCARD no RHILL_PRESENT yes GMTINY 1000.0 +MIN_GMFRAG 10.0 ENERGY yes FRAGMENTATION yes ROTATION yes @@ -33,5 +31,3 @@ MU2KG 1.0 DU2M 1.0 TU2S 1.0 SEED 2 3080983 2220830 -DISCARD_OUT discard.out -ENERGY_OUT energy.out diff --git a/examples/symba_mars_disk/runswiftest.sh b/examples/symba_mars_disk/runswiftest.sh new file mode 100644 index 000000000..96dd99928 --- /dev/null +++ b/examples/symba_mars_disk/runswiftest.sh @@ -0,0 +1,33 @@ +#!/bin/zsh -l +#SBATCH -A daminton +#SBATCH --nodes=1 +#SBATCH --ntasks=1 +#SBATCH --time=14-00:00:00 +#SBATCH --ntasks-per-node=1 +#SBATCH --cpus-per-task=12 +#SBATCH --job-name=high_high +#SBATCH --no-requeue +#SBATCH -o %x.out +#SBATCH -e %x.err +cd $SLURM_SUBMIT_DIR + +module load utilities monitor +#module load gcc/10.2.0 +#netcdf-fortran/4.5.3 + +# track per-code CPU load +monitor cpu percent --all-cores >cpu-percent.log & +CPU_PID=$! + +# track memory usage +monitor cpu memory >cpu-memory.log & +MEM_PID=$! + + +export OMP_NUM_THREADS=12 +export KMP_STACKSIZE=2G +./swiftest_driver symba param.in + +# shut down the resource monitors +kill -s INT $CPU_PID $MEM_PID + From 9196c53e45dddeacda93a8d100ddeac178745ffe Mon Sep 17 00:00:00 2001 From: David A Minton Date: Tue, 31 Aug 2021 14:07:07 -0400 Subject: [PATCH 116/154] added more explicit setup/destruct calls for encounter lists and moved the kinship reset higher up in the order of operations, as part of the family consolidation step. --- src/orbel/orbel.f90 | 6 +++--- src/symba/symba_collision.f90 | 25 ++++++++++++++++--------- src/symba/symba_step.f90 | 12 +++++++++--- 3 files changed, 28 insertions(+), 15 deletions(-) diff --git a/src/orbel/orbel.f90 b/src/orbel/orbel.f90 index f01c97529..620e0f839 100644 --- a/src/orbel/orbel.f90 +++ b/src/orbel/orbel.f90 @@ -931,12 +931,12 @@ module pure subroutine orbel_xv2el(mu, x, v, a, e, inc, capom, omega, capm) capom = 0.0_DP omega = 0.0_DP capm = 0.0_DP - r = sqrt(dot_product(x(:), x(:))) + r = .mag. x(:) v2 = dot_product(v(:), v(:)) hvec = x(:) .cross. v(:) h2 = dot_product(hvec(:), hvec(:)) - h = sqrt(h2) - if (h2 == 0.0_DP) return + h = .mag. hvec(:) + if (h2 <= 10 * tiny(0.0_DP)) return rdotv = dot_product(x(:), v(:)) energy = 0.5_DP * v2 - mu / r fac = hvec(3) / h diff --git a/src/symba/symba_collision.f90 b/src/symba/symba_collision.f90 index ea93948f3..39d09970a 100644 --- a/src/symba/symba_collision.f90 +++ b/src/symba/symba_collision.f90 @@ -90,7 +90,6 @@ module function symba_collision_casedisruption(system, param, family, x, v, mass pl%status(family(:)) = status pl%ldiscard(family(:)) = .false. pl%lcollision(family(:)) = .false. - call pl%reset_kinship(family(:)) end select else ! Populate the list of new bodies @@ -202,7 +201,6 @@ module function symba_collision_casehitandrun(system, param, family, x, v, mass, pl%status(family(:)) = ACTIVE pl%ldiscard(family(:)) = .false. pl%lcollision(family(:)) = .false. - call pl%reset_kinship(family(:)) end select else status = HIT_AND_RUN_DISRUPT @@ -410,7 +408,6 @@ module function symba_collision_casesupercatastrophic(system, param, family, x, pl%status(family(:)) = status pl%ldiscard(family(:)) = .false. pl%lcollision(family(:)) = .false. - call pl%reset_kinship(family(:)) end select else ! Populate the list of new bodies @@ -657,6 +654,7 @@ function symba_collision_consolidate_familes(pl, cb, param, idx_parent, family, 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. + call pl%reset_kinship([idx_parent(1)]) return end if idx_parent(2) = pl%kin(idx_parent(1))%child(nchild(1)) @@ -744,6 +742,9 @@ function symba_collision_consolidate_familes(pl, cb, param, idx_parent, family, end do lflag = .true. + ! Destroy the kinship relationships for all members of this family + call pl%reset_kinship(family(:)) + return end function symba_collision_consolidate_familes @@ -921,14 +922,21 @@ subroutine symba_collision_mergeaddsub(system, param, family, id_frag, Ip_frag, plnew%vb(:, 1:nfrag) = vb_frag(:, 1:nfrag) call pl%vb2vh(cb) call pl%xh2xb(cb) + ! write(54,*) "Fragment properties" + ! write(54,*) "xbcb : ", cb%xb(:) + ! write(54,*) "vbcb : ", cb%vb(:) do i = 1, nfrag plnew%xh(:,i) = xb_frag(:, i) - cb%xb(:) plnew%vh(:,i) = vb_frag(:, i) - cb%vb(:) + ! write(54,*) "index, id: ", i, plnew%id(i) + ! write(54,*) "xb : ", xb_frag(:,i) + ! write(54,*) "vb : ", vb_frag(:,i) end do plnew%mass(1:nfrag) = m_frag(1:nfrag) plnew%Gmass(1:nfrag) = param%GU * m_frag(1:nfrag) plnew%radius(1:nfrag) = rad_frag(1:nfrag) plnew%density(1:nfrag) = m_frag(1:nfrag) / rad_frag(1:nfrag) + call plnew%set_rhill(cb) select case(status) case(DISRUPTION) @@ -993,8 +1001,6 @@ subroutine symba_collision_mergeaddsub(system, param, family, id_frag, Ip_frag, plnew%tlag = pl%tlag(ibiggest) end if - call plnew%set_mu(cb) - call plnew%set_rhill(cb) !Copy over or set integration parameters for new bodies plnew%lcollision(1:nfrag) = .false. plnew%ldiscard(1:nfrag) = .false. @@ -1003,8 +1009,8 @@ subroutine symba_collision_mergeaddsub(system, param, family, id_frag, Ip_frag, ! Append the new merged body to the list nstart = pl_adds%nbody + 1 - nend = pl_adds%nbody + plnew%nbody - call pl_adds%append(plnew, lsource_mask=[(.true., i=1, plnew%nbody)]) + nend = pl_adds%nbody + nfrag + call pl_adds%append(plnew, lsource_mask=[(.true., i=1, nfrag)]) ! Record how many bodies were added in this event pl_adds%ncomp(nstart:nend) = plnew%nbody @@ -1012,11 +1018,11 @@ subroutine symba_collision_mergeaddsub(system, param, family, id_frag, Ip_frag, pl%status(family(:)) = MERGED pl%ldiscard(family(:)) = .true. pl%lcollision(family(:)) = .true. - call pl%reset_kinship(family(:)) lmask(:) = .false. lmask(family(:)) = .true. call plnew%setup(0, param) + deallocate(plnew) allocate(plsub, mold=pl) call pl%spill(plsub, lmask, ldestructive=.false.) @@ -1028,7 +1034,8 @@ subroutine symba_collision_mergeaddsub(system, param, family, id_frag, Ip_frag, ! Record how many bodies were subtracted in this event pl_discards%ncomp(nstart:nend) = nfamily - deallocate(plnew) + call plsub%setup(0, param) + deallocate(plsub) end associate end select end select diff --git a/src/symba/symba_step.f90 b/src/symba/symba_step.f90 index 7ab8113c0..9f4508550 100644 --- a/src/symba/symba_step.f90 +++ b/src/symba/symba_step.f90 @@ -226,7 +226,7 @@ module subroutine symba_step_reset_system(self, param) class(symba_nbody_system), intent(inout) :: self !! SyMBA nbody system object class(symba_parameters), intent(in) :: param !! Current run configuration parameters with SyMBA additions ! Internals - integer(I4B) :: i + integer(I4B) :: i, nenc_old associate(system => self) select type(pl => system%pl) @@ -245,8 +245,11 @@ module subroutine symba_step_reset_system(self, param) pl%lcollision(1:npl) = .false. pl%ldiscard(1:npl) = .false. pl%lmask(1:npl) = .true. + nenc_old = system%plplenc_list%nenc + call system%plplenc_list%setup(0) + call system%plplenc_list%setup(nenc_old) system%plplenc_list%nenc = 0 - system%plplcollision_list%nenc = 0 + call system%plplcollision_list%setup(0) end if if (ntp > 0) then @@ -254,7 +257,10 @@ module subroutine symba_step_reset_system(self, param) tp%levelg(1:ntp) = -1 tp%levelm(1:ntp) = -1 tp%lmask(1:ntp) = .true. - pl%ldiscard(1:npl) = .false. + tp%ldiscard(1:npl) = .false. + nenc_old = system%pltpenc_list%nenc + call system%pltpenc_list%setup(0) + call system%pltpenc_list%setup(nenc_old) system%pltpenc_list%nenc = 0 end if From 3f292fa387ec77081d8dda8348358b78fa50806f Mon Sep 17 00:00:00 2001 From: David A Minton Date: Tue, 31 Aug 2021 16:22:29 -0400 Subject: [PATCH 117/154] Restructured util_resize subroutines for the various data types. Now it can handle resizing of not-previously allocated arrays --- src/symba/symba_collision.f90 | 12 +-- src/symba/symba_util.f90 | 15 +-- src/util/util_resize.f90 | 177 +++++++++++++++++++++++----------- 3 files changed, 136 insertions(+), 68 deletions(-) diff --git a/src/symba/symba_collision.f90 b/src/symba/symba_collision.f90 index 39d09970a..e1bbe02da 100644 --- a/src/symba/symba_collision.f90 +++ b/src/symba/symba_collision.f90 @@ -922,15 +922,15 @@ subroutine symba_collision_mergeaddsub(system, param, family, id_frag, Ip_frag, plnew%vb(:, 1:nfrag) = vb_frag(:, 1:nfrag) call pl%vb2vh(cb) call pl%xh2xb(cb) - ! write(54,*) "Fragment properties" - ! write(54,*) "xbcb : ", cb%xb(:) - ! write(54,*) "vbcb : ", cb%vb(:) + write(54,*) "Fragment properties" + write(54,*) "xbcb : ", cb%xb(:) + write(54,*) "vbcb : ", cb%vb(:) do i = 1, nfrag plnew%xh(:,i) = xb_frag(:, i) - cb%xb(:) plnew%vh(:,i) = vb_frag(:, i) - cb%vb(:) - ! write(54,*) "index, id: ", i, plnew%id(i) - ! write(54,*) "xb : ", xb_frag(:,i) - ! write(54,*) "vb : ", vb_frag(:,i) + write(54,*) "index, id: ", i, plnew%id(i) + write(54,*) "xb : ", xb_frag(:,i) + write(54,*) "vb : ", vb_frag(:,i) end do plnew%mass(1:nfrag) = m_frag(1:nfrag) plnew%Gmass(1:nfrag) = param%GU * m_frag(1:nfrag) diff --git a/src/symba/symba_util.f90 b/src/symba/symba_util.f90 index 2ff7dbf18..91f9549ab 100644 --- a/src/symba/symba_util.f90 +++ b/src/symba/symba_util.f90 @@ -568,18 +568,21 @@ module subroutine symba_util_resize_arr_kin(arr, nnew) 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 + integer(I4B) :: nold !! Old size - if (.not. allocated(arr) .or. nnew < 0) return - - nold = size(arr) - if (nnew == nold) return + if (nnew < 0) return if (nnew == 0) then - deallocate(arr) + if (allocated(arr)) deallocate(arr) return end if + if (allocated(arr)) then + nold = size(arr) + else + nold = 0 + end if + allocate(tmp(nnew)) if (nnew > nold) then tmp(1:nold) = arr(1:nold) diff --git a/src/util/util_resize.f90 b/src/util/util_resize.f90 index 889703ac8..dfef8771b 100644 --- a/src/util/util_resize.f90 +++ b/src/util/util_resize.f90 @@ -5,7 +5,7 @@ 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. + !! Resizes an array component of type character string. nnew = 0 will deallocate. implicit none ! Arguments character(len=STRMAX), dimension(:), allocatable, intent(inout) :: arr !! Array to resize @@ -14,21 +14,31 @@ module subroutine util_resize_arr_char_string(arr, nnew) 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) return if (nnew == 0) then - deallocate(arr) + if (allocated(arr)) deallocate(arr) return end if + if (allocated(arr)) then + nold = size(arr) + else + nold = 0 + end if + + if (nnew == nold) return + allocate(tmp(nnew)) - if (nnew > nold) then - tmp(1:nold) = arr(1:nold) + if (nold > 0) then + if (nnew > nold) then + tmp(1:nold) = arr(1:nold) + tmp(nold+1:nnew) = "" + else + tmp(1:nnew) = arr(1:nnew) + end if else - tmp(1:nnew) = arr(1:nnew) + tmp(1:nnew) = "" end if call move_alloc(tmp, arr) @@ -39,7 +49,7 @@ end subroutine util_resize_arr_char_string module subroutine util_resize_arr_DP(arr, nnew) !! author: David A. Minton !! - !! Resizes an array component of double precision type. Array will only be resized if has previously been allocated. Passing nnew = 0 will deallocate. + !! Resizes an array component of double precision type. Passing nnew = 0 will deallocate. implicit none ! Arguments real(DP), dimension(:), allocatable, intent(inout) :: arr !! Array to resize @@ -47,22 +57,33 @@ module subroutine util_resize_arr_DP(arr, nnew) ! Internals real(DP), dimension(:), allocatable :: tmp !! Temporary storage array in case the input array is already allocated integer(I4B) :: nold !! Old size + real(DP), parameter :: init_val = 0.0_DP - if (.not. allocated(arr) .or. nnew < 0) return - - nold = size(arr) - if (nnew == nold) return + if (nnew < 0) return if (nnew == 0) then - deallocate(arr) + if (allocated(arr)) deallocate(arr) return end if + if (allocated(arr)) then + nold = size(arr) + else + nold = 0 + end if + + if (nnew == nold) return + allocate(tmp(nnew)) - if (nnew > nold) then - tmp(1:nold) = arr(1:nold) + if (nold > 0) then + if (nnew > nold) then + tmp(1:nold) = arr(1:nold) + tmp(nold+1:nnew) = init_val + else + tmp(1:nnew) = arr(1:nnew) + end if else - tmp(1:nnew) = arr(1:nnew) + tmp(1:nnew) = init_val end if call move_alloc(tmp, arr) @@ -73,7 +94,7 @@ 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. + !! Resizes an array component of double precision vectors of size (NDIM, n). Passing nnew = 0 will deallocate. implicit none ! Arguments real(DP), dimension(:,:), allocatable, intent(inout) :: arr !! Array to resize @@ -81,33 +102,51 @@ module subroutine util_resize_arr_DPvec(arr, nnew) ! Internals real(DP), dimension(:,:), allocatable :: tmp !! Temporary storage array in case the input array is already allocated integer(I4B) :: nold !! Old size + real(DP), dimension(NDIM), parameter :: init_val = 0.0_DP + integer(I4B) :: i - if (.not. allocated(arr) .or. nnew < 0) return - - nold = size(arr, dim=2) - if (nnew == nold) return + if (nnew < 0) return if (nnew == 0) then - deallocate(arr) + if (allocated(arr)) deallocate(arr) return end if + if (allocated(arr)) then + nold = size(arr, dim=2) + else + nold = 0 + end if + + if (nnew == nold) return + allocate(tmp(NDIM, nnew)) - if (nnew > nold) then - tmp(:, 1:nold) = arr(:, 1:nold) + if (nold > 0) then + if (nnew > nold) then + tmp(:,1:nold) = arr(:,1:nold) + do i = nold+1, nnew + tmp(:,i) = init_val(:) + end do + else + tmp(:,1:nnew) = arr(:,1:nnew) + end if else - tmp(:, 1:nnew) = arr(:, 1:nnew) + do i = 1, nnew + tmp(:, i) = init_val(:) + end do end if call move_alloc(tmp, arr) return + + 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. + !! Resizes an array component of integer type. Passing nnew = 0 will deallocate. implicit none ! Arguments integer(I4B), dimension(:), allocatable, intent(inout) :: arr !! Array to resize @@ -115,22 +154,33 @@ module subroutine util_resize_arr_I4B(arr, nnew) ! Internals integer(I4B), dimension(:), allocatable :: tmp !! Temporary storage array in case the input array is already allocated integer(I4B) :: nold !! Old size + integer(I4B), parameter :: init_val = -1 - if (.not. allocated(arr) .or. nnew < 0) return - - nold = size(arr) - if (nnew == nold) return + if (nnew < 0) return if (nnew == 0) then - deallocate(arr) + if (allocated(arr)) deallocate(arr) return end if + if (allocated(arr)) then + nold = size(arr) + else + nold = 0 + end if + + if (nnew == nold) return + allocate(tmp(nnew)) - if (nnew > nold) then - tmp(1:nold) = arr(1:nold) + if (nold > 0) then + if (nnew > nold) then + tmp(1:nold) = arr(1:nold) + tmp(nold+1:nnew) = init_val + else + tmp(1:nnew) = arr(1:nnew) + end if else - tmp(1:nnew) = arr(1:nnew) + tmp(1:nnew) = init_val end if call move_alloc(tmp, arr) @@ -149,18 +199,22 @@ module subroutine util_resize_arr_info(arr, nnew) ! Internals type(swiftest_particle_info), dimension(:), allocatable :: tmp !! Temporary storage array in case the input array is already allocated integer(I4B) :: nold !! Old size - logical :: is_symba - - if (.not. allocated(arr) .or. nnew < 0) return - nold = size(arr) - if (nnew == nold) return + if (nnew < 0) return if (nnew == 0) then - deallocate(arr) + if (allocated(arr)) deallocate(arr) return end if + if (allocated(arr)) then + nold = size(arr) + else + nold = 0 + end if + + if (nnew == nold) return + allocate(tmp(nnew)) if (nnew > nold) then call util_copy_particle_info_arr(arr(1:nold), tmp(1:nold)) @@ -177,7 +231,7 @@ end subroutine util_resize_arr_info 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. + !! Resizes an array component of logical type. Passing nnew = 0 will deallocate. implicit none ! Arguments logical, dimension(:), allocatable, intent(inout) :: arr !! Array to resize @@ -185,22 +239,33 @@ module subroutine util_resize_arr_logical(arr, nnew) ! Internals logical, dimension(:), allocatable :: tmp !! Temporary storage array in case the input array is already allocated integer(I4B) :: nold !! Old size + logical, parameter :: init_val = .false. - if (.not. allocated(arr) .or. nnew < 0) return - - nold = size(arr) - if (nnew == nold) return + if (nnew < 0) return if (nnew == 0) then - deallocate(arr) + if (allocated(arr)) deallocate(arr) return end if + if (allocated(arr)) then + nold = size(arr) + else + nold = 0 + end if + + if (nnew == nold) return + allocate(tmp(nnew)) - if (nnew > nold) then - tmp(1:nold) = arr(1:nold) + if (nold > 0) then + if (nnew > nold) then + tmp(1:nold) = arr(1:nold) + tmp(nold+1:nnew) = init_val + else + tmp(1:nnew) = arr(1:nnew) + end if else - tmp(1:nnew) = arr(1:nnew) + tmp(1:nnew) = init_val end if call move_alloc(tmp, arr) @@ -214,8 +279,8 @@ module subroutine util_resize_body(self, nnew) !! 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 + class(swiftest_body), intent(inout) :: self !! Swiftest body object + integer(I4B), intent(in) :: nnew !! New size neded call util_resize(self%info, nnew) call util_resize(self%id, nnew) @@ -285,7 +350,7 @@ end subroutine util_resize_encounter 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. + !! Checks the current size of a Swiftest massive 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 @@ -316,10 +381,10 @@ 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. + !! Checks the current size of a Swiftest test particle 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 + class(swiftest_tp), intent(inout) :: self !! Swiftest test particle object integer(I4B), intent(in) :: nnew !! New size neded call util_resize_body(self, nnew) From 9b5b3c3c77f0994720b7fc7489fc92381e555a6d Mon Sep 17 00:00:00 2001 From: David A Minton Date: Tue, 31 Aug 2021 20:15:40 -0400 Subject: [PATCH 118/154] Fixed issues involving discard flags and bookkeeping of discards/adds --- src/modules/swiftest_classes.f90 | 2 +- src/symba/symba_collision.f90 | 7 ---- src/symba/symba_util.f90 | 69 +++++++++++++++++--------------- 3 files changed, 38 insertions(+), 40 deletions(-) diff --git a/src/modules/swiftest_classes.f90 b/src/modules/swiftest_classes.f90 index faffcfb62..746781117 100644 --- a/src/modules/swiftest_classes.f90 +++ b/src/modules/swiftest_classes.f90 @@ -355,7 +355,7 @@ module swiftest_classes real(DP), dimension(:), allocatable :: peri !! Perihelion distance real(DP), dimension(:), allocatable :: atp !! Semimajor axis following perihelion passage integer(I4B), dimension(:,:), allocatable :: k_pltp !! Index array used to convert flattened the body-body comparison upper triangular matrix - integer(I8B) :: npltp !! Number of pl-tp comparisons in the flattened upper triangular matrix + integer(I8B) :: npltp !! Number of pl-tp 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_tp and util_spill_tp contains diff --git a/src/symba/symba_collision.f90 b/src/symba/symba_collision.f90 index e1bbe02da..384102ffc 100644 --- a/src/symba/symba_collision.f90 +++ b/src/symba/symba_collision.f90 @@ -539,7 +539,6 @@ module function symba_collision_check_encounter(self, system, param, t, dt, irec ! Set the collision flag for these to bodies to true in case they become involved in another collision later in the step pl%lcollision([i, j]) = .true. - pl%ldiscard([i, j]) = .true. pl%status([i, j]) = COLLISION call pl%info(i)%set_value(status="COLLISION", discard_time=t, discard_xh=pl%xh(:,i), discard_vh=pl%vh(:,i)) call pl%info(j)%set_value(status="COLLISION", discard_time=t, discard_xh=pl%xh(:,j), discard_vh=pl%vh(:,j)) @@ -922,15 +921,9 @@ subroutine symba_collision_mergeaddsub(system, param, family, id_frag, Ip_frag, plnew%vb(:, 1:nfrag) = vb_frag(:, 1:nfrag) call pl%vb2vh(cb) call pl%xh2xb(cb) - write(54,*) "Fragment properties" - write(54,*) "xbcb : ", cb%xb(:) - write(54,*) "vbcb : ", cb%vb(:) do i = 1, nfrag plnew%xh(:,i) = xb_frag(:, i) - cb%xb(:) plnew%vh(:,i) = vb_frag(:, i) - cb%vb(:) - write(54,*) "index, id: ", i, plnew%id(i) - write(54,*) "xb : ", xb_frag(:,i) - write(54,*) "vb : ", vb_frag(:,i) end do plnew%mass(1:nfrag) = m_frag(1:nfrag) plnew%Gmass(1:nfrag) = param%GU * m_frag(1:nfrag) diff --git a/src/symba/symba_util.f90 b/src/symba/symba_util.f90 index 91f9549ab..4a40100c0 100644 --- a/src/symba/symba_util.f90 +++ b/src/symba/symba_util.f90 @@ -409,7 +409,7 @@ module subroutine symba_util_rearray_pl(self, system, param) class(symba_parameters), intent(inout) :: param !! Current run configuration parameters ! Internals class(symba_pl), allocatable :: tmp !! The discarded body list. - integer(I4B) :: i, j, k, npl, nadd, nencmin, idnew1, idnew2, idold1, idold2 + integer(I4B) :: i, j, k, npl, nadd, nencmin, nenc_old, idnew1, idnew2, idold1, idold2 logical, dimension(:), allocatable :: lmask, ldump_mask class(symba_plplenc), allocatable :: plplenc_old logical :: lencounter @@ -426,7 +426,7 @@ module subroutine symba_util_rearray_pl(self, system, param) ! Remove the discards and destroy the list, as the system already tracks pl_discards elsewhere allocate(lmask(npl)) - lmask(1:npl) = pl%ldiscard(1:npl) .or. pl%status(1:npl) == INACTIVE + lmask(1:npl) = pl%ldiscard(1:npl) allocate(tmp, mold=self) call pl%spill(tmp, lspill_list=lmask, ldestructive=.true.) npl = pl%nbody @@ -435,8 +435,11 @@ module subroutine symba_util_rearray_pl(self, system, param) deallocate(lmask) ! Store the original plplenc list so we don't remove any of the original encounters - allocate(plplenc_old, source=system%plplenc_list) - call plplenc_old%copy(system%plplenc_list) + nenc_old = system%plplenc_list%nenc + if (nenc_old > 0) then + allocate(plplenc_old, source=system%plplenc_list) + call plplenc_old%copy(system%plplenc_list) + end if ! Add in any new bodies if (nadd > 0) then @@ -502,34 +505,36 @@ module subroutine symba_util_rearray_pl(self, system, param) call move_alloc(nplenc_orig_pl, pl%nplenc) ! Re-index the encounter list as the index values may have changed - nencmin = min(system%plplenc_list%nenc, plplenc_old%nenc) - do k = 1, nencmin - idnew1 = system%plplenc_list%id1(k) - idnew2 = system%plplenc_list%id2(k) - idold1 = plplenc_old%id1(k) - idold2 = plplenc_old%id2(k) - if ((idnew1 == idold1) .and. (idnew2 == idold2)) then - ! This is an encounter we already know about, so save the old information - system%plplenc_list%lvdotr(k) = plplenc_old%lvdotr(k) - system%plplenc_list%status(k) = plplenc_old%status(k) - system%plplenc_list%x1(:,k) = plplenc_old%x1(:,k) - system%plplenc_list%x2(:,k) = plplenc_old%x2(:,k) - system%plplenc_list%v1(:,k) = plplenc_old%v1(:,k) - system%plplenc_list%v2(:,k) = plplenc_old%v2(:,k) - system%plplenc_list%t(k) = plplenc_old%t(k) - system%plplenc_list%level(k) = plplenc_old%level(k) - else if (((idnew1 == idold2) .and. (idnew2 == idold1))) then - ! This is an encounter we already know about, but with the order reversed, so save the old information - system%plplenc_list%lvdotr(k) = plplenc_old%lvdotr(k) - system%plplenc_list%status(k) = plplenc_old%status(k) - system%plplenc_list%x1(:,k) = plplenc_old%x2(:,k) - system%plplenc_list%x2(:,k) = plplenc_old%x1(:,k) - system%plplenc_list%v1(:,k) = plplenc_old%v2(:,k) - system%plplenc_list%v2(:,k) = plplenc_old%v1(:,k) - system%plplenc_list%t(k) = plplenc_old%t(k) - system%plplenc_list%level(k) = plplenc_old%level(k) - end if - end do + if (nenc_old > 0) then + nencmin = min(system%plplenc_list%nenc, plplenc_old%nenc) + do k = 1, nencmin + idnew1 = system%plplenc_list%id1(k) + idnew2 = system%plplenc_list%id2(k) + idold1 = plplenc_old%id1(k) + idold2 = plplenc_old%id2(k) + if ((idnew1 == idold1) .and. (idnew2 == idold2)) then + ! This is an encounter we already know about, so save the old information + system%plplenc_list%lvdotr(k) = plplenc_old%lvdotr(k) + system%plplenc_list%status(k) = plplenc_old%status(k) + system%plplenc_list%x1(:,k) = plplenc_old%x1(:,k) + system%plplenc_list%x2(:,k) = plplenc_old%x2(:,k) + system%plplenc_list%v1(:,k) = plplenc_old%v1(:,k) + system%plplenc_list%v2(:,k) = plplenc_old%v2(:,k) + system%plplenc_list%t(k) = plplenc_old%t(k) + system%plplenc_list%level(k) = plplenc_old%level(k) + else if (((idnew1 == idold2) .and. (idnew2 == idold1))) then + ! This is an encounter we already know about, but with the order reversed, so save the old information + system%plplenc_list%lvdotr(k) = plplenc_old%lvdotr(k) + system%plplenc_list%status(k) = plplenc_old%status(k) + system%plplenc_list%x1(:,k) = plplenc_old%x2(:,k) + system%plplenc_list%x2(:,k) = plplenc_old%x1(:,k) + system%plplenc_list%v1(:,k) = plplenc_old%v2(:,k) + system%plplenc_list%v2(:,k) = plplenc_old%v1(:,k) + system%plplenc_list%t(k) = plplenc_old%t(k) + system%plplenc_list%level(k) = plplenc_old%level(k) + end if + end do + end if end associate return From 0a30daf509a52014e2aa4d341b33cf0b17d70f83 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Thu, 2 Sep 2021 17:34:03 -0400 Subject: [PATCH 119/154] Major restructuring of the fragmentation model. I know call it Fraggle and it is fully object oriented. --- Makefile | 7 +- Makefile.Defines | 4 +- src/fraggle/fraggle_generate.f90 | 525 +++++++++++ src/fraggle/fraggle_placeholder.f90 | 44 + src/fraggle/fraggle_regime.f90 | 356 ++++++++ src/fraggle/fraggle_set.f90 | 295 +++++++ src/fraggle/fraggle_setup.f90 | 78 ++ src/fraggle/fraggle_util.f90 | 316 +++++++ src/fragmentation/fragmentation.f90 | 1266 --------------------------- src/helio/helio_setup.f90 | 2 + src/helio/helio_util.f90 | 21 - src/modules/fraggle_classes.f90 | 250 ++++++ src/modules/helio_classes.f90 | 9 +- src/modules/swiftest.f90 | 1 + src/modules/swiftest_classes.f90 | 29 +- src/modules/symba_classes.f90 | 75 +- src/modules/whm_classes.f90 | 1 - src/setup/setup.f90 | 4 +- src/symba/symba_collision.f90 | 598 +++++-------- src/symba/symba_util.f90 | 3 +- src/whm/whm_setup.f90 | 2 + src/whm/whm_util.f90 | 16 - 22 files changed, 2124 insertions(+), 1778 deletions(-) create mode 100644 src/fraggle/fraggle_generate.f90 create mode 100644 src/fraggle/fraggle_placeholder.f90 create mode 100644 src/fraggle/fraggle_regime.f90 create mode 100644 src/fraggle/fraggle_set.f90 create mode 100644 src/fraggle/fraggle_setup.f90 create mode 100644 src/fraggle/fraggle_util.f90 delete mode 100644 src/fragmentation/fragmentation.f90 delete mode 100644 src/helio/helio_util.f90 create mode 100644 src/modules/fraggle_classes.f90 diff --git a/Makefile b/Makefile index 8d8955eb4..fb555345f 100644 --- a/Makefile +++ b/Makefile @@ -45,9 +45,10 @@ #****************************************************************************** SWIFTEST_MODULES = swiftest_globals.f90 \ + swiftest_operators.f90 \ lambda_function.f90\ swiftest_classes.f90 \ - swiftest_operators.f90 \ + fraggle_classes.f90 \ whm_classes.f90 \ rmvs_classes.f90 \ helio_classes.f90 \ @@ -91,7 +92,7 @@ lib: ln -s $(SWIFTEST_HOME)/Makefile.Defines .; \ ln -s $(SWIFTEST_HOME)/Makefile .; \ make libdir - cd $(SWIFTEST_HOME)/src/fragmentation; \ + cd $(SWIFTEST_HOME)/src/fraggle; \ rm -f Makefile.Defines Makefile; \ ln -s $(SWIFTEST_HOME)/Makefile.Defines .; \ ln -s $(SWIFTEST_HOME)/Makefile .; \ @@ -193,7 +194,7 @@ clean: cd $(SWIFTEST_HOME)/src/modules; rm -f Makefile.Defines Makefile *.gc* 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/fragmentation; rm -f Makefile.Defines Makefile *.gc* + cd $(SWIFTEST_HOME)/src/fraggle; 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/Makefile.Defines b/Makefile.Defines index e48cb9d07..36de2cdb7 100644 --- a/Makefile.Defines +++ b/Makefile.Defines @@ -67,13 +67,13 @@ GWARNINGS = -Wall -Warray-bounds -Wimplicit-interface -Wextra -Warray-temporari GPRODUCTION = -O3 -ffree-line-length-none $(GPAR) #FFLAGS = $(IDEBUG) $(HEAPARR) $(SIMDVEC) $(PAR) -FFLAGS = $(IPRODUCTION) -g -traceback $(OPTREPORT) +FFLAGS = $(IPRODUCTION) $(OPTREPORT) FORTRAN = ifort #AR = xiar #FORTRAN = gfortran #FFLAGS = $(GDEBUG) $(GMEM) $(GPAR) -#FFLAGS = $(GPRODUCTION) -g -fcheck=all -Wall -fbacktrace +#FFLAGS = $(GPRODUCTION) -g -fbacktrace #-fcheck=all #-Wall AR = ar # DO NOT include in CFLAGS the "-c" option to compile object only diff --git a/src/fraggle/fraggle_generate.f90 b/src/fraggle/fraggle_generate.f90 new file mode 100644 index 000000000..01fc3cf18 --- /dev/null +++ b/src/fraggle/fraggle_generate.f90 @@ -0,0 +1,525 @@ +submodule(fraggle_classes) s_fraggle_generate + use swiftest + + 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), parameter :: F_SPIN_FIRST = 0.05_DP !! The initial try value of the fraction of energy or momenum in spin (whichever has the lowest kinetic energy) + real(DP), parameter :: FRAGGLE_LTOL = 10 * epsilon(1.0_DP) + real(DP), parameter :: FRAGGLE_ETOL = 1e-8_DP + +contains + + module subroutine fraggle_generate_fragments(self, colliders, system, param, lfailure) + !! Author: Jennifer L.L. Pouplin, Carlisle A. Wishard, and David A. Minton + !! + !! Generates a system of fragments in barycentric coordinates that conserves energy and momentum. + use, intrinsic :: ieee_exceptions + implicit none + ! Arguments + class(fraggle_fragments), intent(inout) :: self !! Fraggle system object the outputs will be the fragmentation + class(fraggle_colliders), intent(inout) :: colliders !! Fraggle colliders object containing the two-body equivalent values of the colliding bodies + class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + logical, intent(out) :: lfailure !! Answers the question: Should this have been a merger instead? + ! Internals + integer(I4B) :: i + integer(I4B) :: try + real(DP) :: r_max_start, f_spin, dEtot, dLmag + integer(I4B), parameter :: MAXTRY = 3000 + character(len=*), parameter :: fmtlabel = "(A14,10(ES11.4,1X,:))" + logical, dimension(size(IEEE_ALL)) :: fpe_halting_modes, fpe_quiet_modes + logical :: lk_plpl + + 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) + + associate(frag => self, nfrag => self%nbody, pl => system%pl) + + if (nfrag < NFRAG_MIN) then + write(*,*) "Fraggle needs at least ",NFRAG_MIN," fragments, but only ",nfrag," were given." + lfailure = .true. + return + end if + f_spin = F_SPIN_FIRST + + lk_plpl = allocated(pl%k_plpl) + if (lk_plpl) deallocate(pl%k_plpl) + + call frag%set_natural_scale(colliders) + + call frag%reset() + + ! Calculate the initial energy of the system without the collisional family + call frag%get_energy_and_momentum(colliders, system, param, lbefore=.true.) + + ! Start out the fragments close to the initial separation distance. This will be increased if there is any overlap or we fail to find a solution + r_max_start = 1 * norm2(colliders%xb(:,2) - colliders%xb(:,1)) + try = 1 + lfailure = .false. + do while (try < MAXTRY) + lfailure = .false. + + call fraggle_generate_pos_vec(frag, colliders, r_max_start) + call frag%set_coordinate_system(colliders) + + ! Initial velocity guess will be the barycentric velocity of the colliding system. + ! This ensures that our budgets are based on the residual velocities needed in the + ! collisional frame + do concurrent (i = 1:nfrag) + frag%vb(:, i) = frag%vbcom(:) + end do + + call frag%get_energy_and_momentum(colliders, system, param, lbefore=.false.) + call frag%set_budgets(colliders) + + call fraggle_generate_spins(frag, colliders, f_spin, lfailure) + if (.not.lfailure) then + call fraggle_generate_tan_vel(frag, colliders, lfailure) + if (.not. lfailure) then + call fraggle_generate_rad_vel(frag, colliders, lfailure) + ! if (lfailure) write(*,*) 'Failed to find radial velocities' + if (.not.lfailure) then + call frag%get_energy_and_momentum(colliders, system, param, lbefore=.false.) + dEtot = frag%Etot_after - frag%Etot_before + dLmag = .mag. (frag%Ltot_after(:) - frag%Ltot_before(:)) + + if ((abs(dEtot + frag%Qloss) > FRAGGLE_ETOL) .or. (dEtot > 0.0_DP)) then + ! write(*,*) 'Failed due to high energy error: ',dEtot, abs(dEtot + frag%Qloss) / FRAGGLE_ETOL + lfailure = .true. + else if ((abs(dLmag) / (.mag.frag%Ltot_before)) > FRAGGLE_LTOL) then + ! write(*,*) 'Failed due to high angular momentum error: ', dLmag / (.mag.frag%Ltot_before(:)) + lfailure = .true. + end if + end if + end if + end if + + if (.not.lfailure) exit + call frag%restructure(colliders, try, f_spin, r_max_start) + call frag%reset() + try = try + 1 + end do + + ! write(*, "(' -------------------------------------------------------------------------------------')") + ! write(*, "(' Final diagnostic')") + ! write(*, "(' -------------------------------------------------------------------------------------')") + if (lfailure) then + write(*,*) "Fraggle fragment generation failed after: ",try," tries" + else + write(*,*) "Fraggle fragment generation succeeded after: ",try," tries" + ! write(*, "(' dL_tot should be very small' )") + ! write(*,fmtlabel) ' dL_tot |', (.mag.(frag%Ltot_after(:) - frag%Ltot_before(:))) / (.mag.frag%Ltot_before(:)) + ! write(*, "(' dE_tot should be negative and equal to Qloss' )") + ! write(*,fmtlabel) ' dE_tot |', (frag%Etot_after - frag%Etot_before) / abs(frag%Etot_before) + ! write(*,fmtlabel) ' Qloss |', -frag%Qloss / abs(frag%Etot_before) + ! write(*,fmtlabel) ' dE - Qloss |', (frag%Etot_after - frag%Etot_before + frag%Qloss) / abs(frag%Etot_before) + end if + ! write(*, "(' -------------------------------------------------------------------------------------')") + call frag%set_original_scale(colliders) + + ! Restore the big array + if (lk_plpl) call pl%index(param) + end associate + + call ieee_set_halting_mode(IEEE_ALL,fpe_halting_modes) ! Save the current halting modes so we can turn them off temporarily + + return + end subroutine fraggle_generate_fragments + + + subroutine fraggle_generate_pos_vec(frag, colliders, r_max_start) + !! 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 + ! Arguments + class(fraggle_fragments), intent(inout) :: frag !! Fraggle fragment system object + class(fraggle_colliders), intent(inout) :: colliders !! Fraggle collider system object + real(DP), intent(in) :: r_max_start !! Initial guess for the starting maximum radial distance of fragments + ! Internals + real(DP) :: dis, rad, r_max + logical, dimension(:), allocatable :: loverlap + integer(I4B) :: i, j + + associate(nfrag => frag%nbody) + 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(colliders%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(frag%x_coll(:,3:nfrag)) + loverlap(:) = .true. + do while (any(loverlap(3:nfrag))) + frag%x_coll(:, 1) = colliders%xb(:, 1) - frag%xbcom(:) + frag%x_coll(:, 2) = colliders%xb(:, 2) - frag%xbcom(:) + r_max = r_max + 0.1_DP * rad + do i = 3, nfrag + if (loverlap(i)) then + call random_number(frag%x_coll(:,i)) + frag%x_coll(:, i) = 2 * (frag%x_coll(:, i) - 0.5_DP) * r_max + end if + end do + loverlap(:) = .false. + do j = 1, nfrag + do i = j + 1, nfrag + dis = norm2(frag%x_coll(:,j) - frag%x_coll(:,i)) + loverlap(i) = loverlap(i) .or. (dis <= (frag%radius(i) + frag%radius(j))) + end do + end do + end do + call fraggle_util_shift_vector_to_origin(frag%mass, frag%x_coll) + call frag%set_coordinate_system(colliders) + + do i = 1, nfrag + frag%xb(:,i) = frag%x_coll(:,i) + frag%xbcom(:) + end do + + frag%xbcom(:) = 0.0_DP + do i = 1, nfrag + frag%xbcom(:) = frag%xbcom(:) + frag%mass(i) * frag%xb(:,i) + end do + frag%xbcom(:) = frag%xbcom(:) / frag%mtot + end associate + + return + end subroutine fraggle_generate_pos_vec + + + subroutine fraggle_generate_spins(frag, colliders, f_spin, lfailure) + !! Author: Jennifer L.L. Pouplin, Carlisle A. Wishard, and David A. Minton + !! + !! Calculates the spins of a collection of fragments such that they conserve angular momentum without blowing the fragment kinetic energy budget. + !! + !! A failure will trigger a restructuring of the fragments so we will try new values of the radial position distribution. + implicit none + ! Arguments + class(fraggle_fragments), intent(inout) :: frag !! Fraggle fragment system object + class(fraggle_colliders), intent(in) :: colliders !! Fraggle collider system object + real(DP), intent(in) :: f_spin !! Fraction of energy or momentum that goes into spin (whichever gives the lowest kinetic energy) + logical, intent(out) :: lfailure !! Logical flag indicating whether this step fails or succeeds! + ! Internals + real(DP), dimension(NDIM) :: L_remainder, rot_L, rot_ke + integer(I4B) :: i + + associate(nfrag => frag%nbody) + lfailure = .false. + + ! Start the first two bodies with the same rotation as the original two impactors, then distribute the remaining angular momentum among the rest + frag%rot(:,1:2) = colliders%rot(:, :) + frag%rot(:,3:nfrag) = 0.0_DP + call frag%get_ang_mtm() + L_remainder(:) = frag%L_budget(:) - frag%L_spin(:) + + frag%ke_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 * frag%ke_budget / (nfrag * frag%mass(i) * frag%radius(i)**2 * frag%Ip(3, i))) * L_remainder(:) / norm2(L_remainder(:)) + rot_L(:) = f_spin * L_remainder(:) / (nfrag * frag%mass(i) * frag%radius(i)**2 * frag%Ip(3, i)) + if (norm2(rot_ke) < norm2(rot_L)) then + frag%rot(:,i) = frag%rot(:, i) + rot_ke(:) + else + frag%rot(:, i) = frag%rot(:, i) + rot_L(:) + end if + frag%ke_spin = frag%ke_spin + frag%mass(i) * frag%Ip(3, i) * frag%radius(i)**2 * dot_product(frag%rot(:, i), frag%rot(:, i)) + end do + frag%ke_spin = 0.5_DP * frag%ke_spin + + lfailure = ((frag%ke_budget - frag%ke_spin - frag%ke_orbit) < 0.0_DP) + end associate + + return + end subroutine fraggle_generate_spins + + + subroutine fraggle_generate_tan_vel(frag, colliders, lfailure) + !! 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 (frag%ke_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 + class(fraggle_fragments), intent(inout) :: frag !! Fraggle fragment system object + class(fraggle_colliders), intent(in) :: colliders !! Fraggle collider system object + logical, intent(out) :: lfailure !! Logical flag indicating whether this step fails or succeeds + ! Internals + integer(I4B) :: i + real(DP), parameter :: TOL_MIN = 1e-1_DP ! This doesn't have to be very accurate, as we really just want a tangential velocity distribution with less kinetic energy than our initial guess. + real(DP), parameter :: TOL_INIT = 1e-14_DP + integer(I4B), parameter :: MAXLOOP = 10 + real(DP) :: tol + real(DP), dimension(:), allocatable :: v_t_initial + real(DP), dimension(frag%nbody) :: kefrag + type(lambda_obj) :: spinfunc + type(lambda_obj_err) :: objective_function + real(DP), dimension(NDIM) :: Li, L_remainder + + associate(nfrag => frag%nbody) + lfailure = .false. + + ! 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(*,*) 'frag%ke_budget : ',frag%ke_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(*,*) '***************************************************' + + allocate(v_t_initial, mold=frag%v_t_mag) + v_t_initial(:) = 0.0_DP + frag%v_coll(:,:) = 0.0_DP + + ! 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. + call frag%get_ang_mtm() + L_remainder(:) = frag%L_budget(:) - frag%L_spin(:) + do i = 1, nfrag + v_t_initial(i) = norm2(L_remainder(:)) / ((nfrag - i + 1) * frag%mass(i) * norm2(frag%x_coll(:,i))) + Li(:) = frag%mass(i) * (frag%x_coll(:,i) .cross. (v_t_initial(i) * frag%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, lfailure) + + tol = TOL_INIT + do while(tol < TOL_MIN) + frag%v_t_mag(7:nfrag) = util_minimize_bfgs(objective_function, nfrag-6, v_t_initial(7:nfrag), tol, MAXLOOP, lfailure) + ! 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) = frag%v_t_mag(7:nfrag) + if (.not.lfailure) exit + tol = tol * 2_DP ! Keep increasing the tolerance until we converge on a solution + end do + frag%v_t_mag(1:nfrag) = solve_fragment_tan_vel(v_t_mag_input=v_t_initial(7:nfrag), lfailure=lfailure) + + ! Perform one final shift of the radial velocity vectors to align with the center of mass of the collisional system (the origin) + frag%vb(:,1:nfrag) = fraggle_util_vmag_to_vb(frag%v_r_mag(1:nfrag), frag%v_r_unit(:,1:nfrag), frag%v_t_mag(1:nfrag), frag%v_t_unit(:,1:nfrag), frag%mass(1:nfrag), frag%vbcom(:)) + do concurrent (i = 1:nfrag) + frag%v_coll(:,i) = frag%vb(:,i) - frag%vbcom(:) + end do + + ! Now do a kinetic energy budget check to make sure we are still within the budget. + kefrag = 0.0_DP + do concurrent(i = 1:nfrag) + kefrag(i) = frag%mass(i) * dot_product(frag%vb(:, i), frag%vb(:, i)) + end do + frag%ke_orbit = 0.5_DP * sum(kefrag(:)) + + ! If we are over the energy budget, flag this as a failure so we can try again + lfailure = ((frag%ke_budget - frag%ke_spin - frag%ke_orbit) < 0.0_DP) + ! write(*,*) 'Tangential' + ! write(*,*) 'Failure? ',lfailure + ! call calculate_fragment_ang_mtm() + ! write(*,*) '|L_remainder| : ',.mag.(frag%L_budget(:) - L_frag_tot(:)) / Lmag_before + ! write(*,*) 'frag%ke_budget: ',frag%ke_budget + ! write(*,*) 'frag%ke_spin : ',frag%ke_spin + ! write(*,*) 'ke_tangential : ',frag%ke_orbit + ! write(*,*) 'ke_radial : ',frag%ke_budget - frag%ke_spin - frag%ke_orbit + end associate + + return + + contains + function solve_fragment_tan_vel(lfailure, 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) :: lfailure !! 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 + + associate(nfrag => frag%nbody) + lfailure = .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) = frag%mass(i) * frag%v_t_unit(:, i) + A(4:6, i) = frag%mass(i) * frag%rmag(i) * (frag%v_r_unit(:, i) .cross. frag%v_t_unit(:, i)) + else if (present(v_t_mag_input)) then + vtmp(:) = v_t_mag_input(i - 6) * frag%v_t_unit(:, i) + L_lin_others(:) = L_lin_others(:) + frag%mass(i) * vtmp(:) + L(:) = frag%mass(i) * (frag%x_coll(:, i) .cross. vtmp(:)) + L_orb_others(:) = L_orb_others(:) + L(:) + end if + end do + b(1:3) = -L_lin_others(:) + b(4:6) = frag%L_budget(:) - frag%L_spin(:) - L_orb_others(:) + allocate(v_t_mag_output(nfrag)) + v_t_mag_output(1:6) = util_solve_linear_system(A, b, 6, lfailure) + if (present(v_t_mag_input)) v_t_mag_output(7:nfrag) = v_t_mag_input(:) + end associate + return + end function solve_fragment_tan_vel + + + function tangential_objective_function(v_t_mag_input, lfailure) 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) :: lfailure !! Error flag + ! Result + real(DP) :: fval + ! Internals + integer(I4B) :: i + real(DP), dimension(NDIM,frag%nbody) :: v_shift + real(DP), dimension(frag%nbody) :: v_t_new, kearr + real(DP) :: keo + + associate(nfrag => frag%nbody) + lfailure = .false. + + v_t_new(:) = solve_fragment_tan_vel(v_t_mag_input=v_t_mag_input(:), lfailure=lfailure) + v_shift(:,:) = fraggle_util_vmag_to_vb(frag%v_r_mag, frag%v_r_unit, v_t_new, frag%v_t_unit, frag%mass, frag%vbcom) + + kearr = 0.0_DP + do concurrent(i = 1:nfrag) + kearr(i) = frag%mass(i) * dot_product(v_shift(:, i), v_shift(:, i)) + end do + keo = 0.5_DP * sum(kearr(:)) + fval = keo + lfailure = .false. + end associate + + return + end function tangential_objective_function + + end subroutine fraggle_generate_tan_vel + + + subroutine fraggle_generate_rad_vel(frag, colliders, lfailure) + !! 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 + class(fraggle_fragments), intent(inout) :: frag !! Fraggle fragment system object + class(fraggle_colliders), intent(in) :: colliders !! Fraggle collider system object + logical, intent(out) :: lfailure !! Logical flag indicating whether this step fails or succeeds! + ! Internals + real(DP), parameter :: TOL_MIN = FRAGGLE_ETOL ! This needs to be more accurate than the tangential step, as we are trying to minimize the total residual energy + real(DP), parameter :: TOL_INIT = 1e-14_DP + integer(I4B), parameter :: MAXLOOP = 100 + real(DP) :: ke_radial, tol + 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 + + associate(nfrag => frag%nbody) + ! Set the "target" ke for the radial component + ke_radial = frag%ke_budget - frag%ke_spin - frag%ke_orbit + + allocate(v_r_initial, source=frag%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=frag%v_r_mag) + call random_number(v_r_sigma(1:nfrag)) + v_r_sigma(1:nfrag) = sqrt(1.0_DP + 2 * (v_r_sigma(1:nfrag) - 0.5_DP) * 1e-4_DP) + v_r_initial(1:nfrag) = v_r_sigma(1:nfrag) * sqrt(abs(2 * ke_radial) / (frag%mass(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) + tol = TOL_INIT + do while(tol < TOL_MIN) + frag%v_r_mag = util_minimize_bfgs(objective_function, nfrag, v_r_initial, tol, MAXLOOP, lfailure) + if (.not.lfailure) exit + tol = tol * 2 ! Keep increasing the tolerance until we converge on a solution + v_r_initial(:) = frag%v_r_mag(:) + end do + + ! Shift the radial velocity vectors to align with the center of mass of the collisional system (the origin) + frag%ke_orbit = 0.0_DP + frag%vb(:,1:nfrag) = fraggle_util_vmag_to_vb(frag%v_r_mag(1:nfrag), frag%v_r_unit(:,1:nfrag), frag%v_t_mag(1:nfrag), frag%v_t_unit(:,1:nfrag), frag%mass(1:nfrag), frag%vbcom(:)) + do i = 1, nfrag + frag%v_coll(:, i) = frag%vb(:, i) - frag%vbcom(:) + frag%ke_orbit = frag%ke_orbit + frag%mass(i) * dot_product(frag%vb(:, i), frag%vb(:, i)) + end do + frag%ke_orbit = 0.5_DP * frag%ke_orbit + + ! write(*,*) 'Radial' + ! write(*,*) 'Failure? ',lfailure + ! write(*,*) 'frag%ke_budget: ',frag%ke_budget + ! write(*,*) 'frag%ke_spin : ',frag%ke_spin + ! write(*,*) 'frag%ke_orbit : ',frag%ke_orbit + ! write(*,*) 'ke_remainder : ',frag%ke_budget - (frag%ke_orbit + frag%ke_spin) + lfailure = .false. + + end associate + return + + contains + function radial_objective_function(v_r_mag_input) result(fval) + !! Author: David A. Minton + !! + !! Objective function for evaluating how close our fragment velocities get to minimizing KE error from our required value + implicit none + ! Arguments + real(DP), dimension(:), intent(in) :: v_r_mag_input !! Unknown radial component of fragment velocity vector + ! Result + real(DP) :: fval !! The objective function result, which is the square of the difference between the calculated fragment kinetic energy and our target + !! Minimizing this brings us closer to our objective + ! Internals + integer(I4B) :: i + real(DP), dimension(:,:), allocatable :: v_shift + real(DP), dimension(frag%nbody) :: kearr + real(DP) :: keo, ke_radial + + associate(nfrag => frag%nbody) + allocate(v_shift, mold=frag%vb) + v_shift(:,:) = fraggle_util_vmag_to_vb(v_r_mag_input, frag%v_r_unit, frag%v_t_mag, frag%v_t_unit, frag%mass, frag%vbcom) + do concurrent(i = 1:nfrag) + kearr(i) = frag%mass(i) * (frag%Ip(3, i) * frag%radius(i)**2 * dot_product(frag%rot(:, i), frag%rot(:, i)) + dot_product(v_shift(:, i), v_shift(:, i))) + end do + keo = 2 * frag%ke_budget - sum(kearr(:)) + ke_radial = frag%ke_budget - frag%ke_orbit - frag%ke_spin + ! The following ensures that fval = 0 is a local minimum, which is what the BFGS method is searching for + fval = (keo / (2 * ke_radial))**2 + end associate + + return + end function radial_objective_function + + end subroutine fraggle_generate_rad_vel + +end submodule s_fraggle_generate \ No newline at end of file diff --git a/src/fraggle/fraggle_placeholder.f90 b/src/fraggle/fraggle_placeholder.f90 new file mode 100644 index 000000000..bbf08bb04 --- /dev/null +++ b/src/fraggle/fraggle_placeholder.f90 @@ -0,0 +1,44 @@ +submodule(fraggle_classes) s_fraggle_placeholder + use swiftest + +contains + + !> The following interfaces are placeholders intended to satisfy the required abstract methods given by the parent class + module subroutine fraggle_placeholder_accel(self, system, param, t, lbeg) + implicit none + class(fraggle_fragments), intent(inout) :: self !! Fraggle fragment 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, intent(in) :: lbeg !! Optional argument that determines whether or not this is the beginning or end of the step + write(*,*) "The type-bound procedure 'accel' is not defined for type fraggle_fragments" + return + end subroutine fraggle_placeholder_accel + + module subroutine fraggle_placeholder_kick(self, system, param, t, dt, lbeg) + implicit none + class(fraggle_fragments), intent(inout) :: self !! Fraggle fragment system 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, intent(in) :: lbeg !! Logical flag indicating whether this is the beginning of the half step or not. + + write(*,*) "The type-bound procedure 'kick' is not defined for type fraggle_fragments" + return + end subroutine fraggle_placeholder_kick + + module subroutine fraggle_placeholder_step(self, system, param, t, dt) + implicit none + class(fraggle_fragments), intent(inout) :: self !! Swiftest body object + class(swiftest_nbody_system), intent(inout) :: system !! Swiftest 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 + + write(*,*) "The type-bound procedure 'step' is not defined for type fraggle_fragments" + return + end subroutine fraggle_placeholder_step + + +end submodule s_fraggle_placeholder \ No newline at end of file diff --git a/src/fraggle/fraggle_regime.f90 b/src/fraggle/fraggle_regime.f90 new file mode 100644 index 000000000..ab786917e --- /dev/null +++ b/src/fraggle/fraggle_regime.f90 @@ -0,0 +1,356 @@ +submodule(fraggle_classes) s_fraggle_regime + use swiftest + +contains + + module subroutine fraggle_regime_colliders(self, frag, system, param) + !! Author: Jennifer L.L. Pouplin, Carlisle A. Wishard, and David A. Minton + !! + !! Determine which fragmentation regime the set of colliders will be. This subroutine is a wrapper for the non-polymorphic raggle_regime_collresolve subroutine. + !! It converts to SI units prior to calling + implicit none + ! Arguments + class(fraggle_colliders), intent(inout) :: self !! Fraggle colliders object + class(fraggle_fragments), intent(inout) :: frag !! Fraggle fragment system object + class(swiftest_nbody_system), intent(in) :: system !! Swiftest nbody system object + class(swiftest_parameters), intent(in) :: param !! Current Swiftest run configuration parameters + ! Internals + integer(I4B) :: jtarg, jproj, regime + real(DP), dimension(2) :: radius_si, mass_si, density_si + real(DP) :: min_mfrag_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 + + associate(colliders => self) + ! Convert all quantities to SI units and determine which of the pair is the projectile vs. target before sending them to the regime determination subroutine + if (colliders%mass(1) > colliders%mass(2)) then + jtarg = 1 + jproj = 2 + else + jtarg = 2 + jproj = 1 + end if + mass_si(:) = colliders%mass([jtarg, jproj]) * param%MU2KG !! The two-body equivalent masses of the collider system + radius_si(:) = colliders%radius([jtarg, jproj]) * param%DU2M !! The two-body equivalent radii of the collider system + density_si(:) = mass_si(:) / (4.0_DP / 3._DP * PI * radius_si(:)**3) !! The two-body equivalent density of the collider system + x1_si(:) = colliders%xb(:,jtarg) * param%DU2M !! The first body of the two-body equivalent position vector the collider system + v1_si(:) = colliders%vb(:,jtarg) * param%DU2M / param%TU2S !! The first body of the two-body equivalent velocity vector the collider system + x2_si(:) = colliders%xb(:,jproj) * param%DU2M !! The second body of the two-body equivalent position vector the collider system + v2_si(:) = colliders%vb(:,jproj) * param%DU2M / param%TU2S !! The second body of the two-body equivalent velocity vector the collider system + Mcb_si = system%cb%mass * param%MU2KG !! The central body mass of the system + select type(param) + class is (symba_parameters) + min_mfrag_si = (param%min_GMfrag / param%GU) * param%MU2KG !! The minimum fragment mass to generate. Collider systems that would otherwise generate less massive fragments than this value will be forced to merge instead + class default + min_mfrag_si = 0.0_DP + end select + + 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 fraggle_regime_collresolve(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), min_mfrag_si, frag%regime, mlr, mslr, frag%Qloss) + + frag%mass_dist(1) = min(max(mlr, 0.0_DP), mtot) + frag%mass_dist(2) = min(max(mslr, 0.0_DP), mtot) + frag%mass_dist(3) = min(max(mtot - mlr - mslr, 0.0_DP), mtot) + + ! Convert quantities back to the system units and save them into the fragment system + frag%mass_dist(:) = (frag%mass_dist(:) / param%MU2KG) + frag%Qloss = frag%Qloss * (param%TU2S / param%DU2M)**2 / param%MU2KG + frag%mtot = sum(colliders%mass(:)) + frag%xbcom(:) = (colliders%mass(1) * colliders%xb(:,1) + colliders%mass(2) * colliders%xb(:,2)) / frag%mtot + frag%vbcom(:) = (colliders%mass(1) * colliders%vb(:,1) + colliders%mass(2) * colliders%vb(:,2)) / frag%mtot + end associate + + return + end subroutine fraggle_regime_colliders + + + subroutine fraggle_regime_collresolve(Mcb, m1, m2, rad1, rad2, xh1, xh2, vb1, vb2, den1, den2, min_mfrag, regime, Mlr, Mslr, 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 + real(DP), intent(in) :: Mcb, m1, m2, rad1, rad2, den1, den2, min_mfrag + real(DP), dimension(:), intent(in) :: xh1, xh2, vb1, vb2 + integer(I4B), intent(out) :: regime + real(DP), intent(out) :: Mlr, Mslr + 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 < min_mfrag).or.(m2 < min_mfrag)) 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 + + end subroutine fraggle_regime_collresolve + +end submodule s_fraggle_regime \ No newline at end of file diff --git a/src/fraggle/fraggle_set.f90 b/src/fraggle/fraggle_set.f90 new file mode 100644 index 000000000..b0b2a69be --- /dev/null +++ b/src/fraggle/fraggle_set.f90 @@ -0,0 +1,295 @@ +submodule(fraggle_classes) s_fraggle_set + use swiftest +contains + + module subroutine fraggle_set_budgets_fragments(self, colliders) + !! author: David A. Minton + !! + !! Sets the energy and momentum budgets of the fragments based on the collider values and the before/after values of energy and momentum + implicit none + ! Arguments + class(fraggle_fragments), intent(inout) :: self !! Fraggle fragment system object + class(fraggle_colliders), intent(inout) :: colliders !! Fraggle collider system object + ! Internals + real(DP) :: dEtot + real(DP), dimension(NDIM) :: dL + + associate(frag => self) + + dEtot = frag%Etot_after - frag%Etot_before + dL(:) = frag%Ltot_after(:) - frag%Ltot_before(:) + + frag%L_budget(:) = -dL(:) + frag%ke_budget = -(dEtot - 0.5_DP * frag%mtot * dot_product(frag%vbcom(:), frag%vbcom(:))) - frag%Qloss + + end associate + return + end subroutine fraggle_set_budgets_fragments + + + module subroutine fraggle_set_mass_dist_fragments(self, colliders) + !! author: David A. Minton + !! + !! Sets the mass of fragments based on the mass distribution returned by the regime calculation. + !! This subroutine must be run after the the setup rourtine has been run on the fragments + implicit none + ! Arguments + class(fraggle_fragments), intent(inout) :: self !! Fraggle fragment system object + class(fraggle_colliders), intent(inout) :: colliders !! Fraggle collider system object + ! Internals + integer(I4B) :: i, istart, jproj, jtarg + real(DP), dimension(2) :: vol + real(DP) :: min_frag_mass + real(DP), dimension(NDIM) :: Ip_avg + + associate(frag => self, nfrag => self%nbody) + ! Get mass weighted mean of Ip and density + vol(1:2) = 4._DP / 3._DP * PI * colliders%radius(1:2)**3 + frag%density(1:nfrag) = frag%mtot / sum(vol(:)) + Ip_avg(:) = (colliders%mass(1) * colliders%Ip(:,1) + colliders%mass(2) * colliders%Ip(:,2)) / frag%mtot + do i = 1, nfrag + frag%Ip(:, i) = Ip_avg(:) + end do + + select case(frag%regime) + case(COLLRESOLVE_REGIME_DISRUPTION) + ! Distribute the mass among fragments, with a branch to check for the size of the second largest fragment + frag%mass(1) = frag%mass_dist(1) + if (frag%mass_dist(2) > frag%mass_dist(1) / 3._DP) then + frag%mass(2) = frag%mass_dist(2) + istart = 3 + else + istart = 2 + end if + ! Distribute remaining mass among the remaining bodies + do i = istart, nfrag + frag%mass(i) = (frag%mtot - sum(frag%mass(1:istart - 1))) / (nfrag - istart + 1) + end do + frag%radius(1:nfrag) = (3 * frag%mass(1:nfrag) / (4 * PI * frag%density(1:nfrag)))**(1.0_DP / 3.0_DP) + case(COLLRESOLVE_REGIME_SUPERCATASTROPHIC) + ! 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 = frag%mtot / nfrag + if (frag%mass_dist(1) < min_frag_mass) then + frag%mass(:) = min_frag_mass + else + frag%mass(1) = frag%mass_dist(1) + frag%mass(2:nfrag) = (frag%mtot - frag%mass_dist(1)) / (nfrag - 1) + end if + ! Distribute any residual mass if there is any and set the radius + frag%mass(nfrag) = frag%mass(nfrag) + (frag%mtot - sum(frag%mass(:))) + frag%radius(1:nfrag) = (3 * frag%mass(1:nfrag) / (4 * PI * frag%density(1:nfrag)))**(1.0_DP / 3.0_DP) + case(COLLRESOLVE_REGIME_HIT_AND_RUN) + if (colliders%mass(1) > colliders%mass(2)) then + jtarg = 1 + jproj = 2 + else + jtarg = 2 + jproj = 1 + end if + frag%mass(1) = frag%mass_dist(1) + frag%radius(1) = colliders%radius(jtarg) + frag%density(1) = frag%mass_dist(1) / vol(jtarg) + + frag%mass(2:nfrag) = (frag%mtot - frag%mass(1)) / (nfrag - 1) + frag%mass(nfrag) = frag%mass(nfrag) + (frag%mtot - sum(frag%mass(:))) + frag%radius(2:nfrag) = (3 * frag%mass(2:nfrag) / (4 * PI * frag%density(2:nfrag)))**(1.0_DP / 3.0_DP) + case (COLLRESOLVE_REGIME_MERGE, COLLRESOLVE_REGIME_GRAZE_AND_MERGE) + frag%mass(1) = frag%mtot + frag%radius(1) = (3 * sum(vol(:)) / (4 * PI))**(1._DP / 3._DP) + case default + write(*,*) "fraggle_set_mass_dist_fragments error: Unrecognized regime code",frag%regime + end select + + end associate + + return + end subroutine fraggle_set_mass_dist_fragments + + + module subroutine fraggle_set_coordinate_system(self, colliders) + !! author: David A. Minton + !! + !! Defines the collisional coordinate system, including the unit vectors of both the system and individual fragments. + implicit none + ! Arguments + class(fraggle_fragments), intent(inout) :: self !! Fraggle fragment system object + class(fraggle_colliders), intent(inout) :: colliders !! Fraggle collider system object + ! Internals + integer(I4B) :: i + real(DP), dimension(NDIM) :: x_cross_v, delta_r, delta_v, Ltot + real(DP) :: r_col_norm, v_col_norm + real(DP), dimension(NDIM, self%nbody) :: L_sigma + + associate(frag => self, nfrag => self%nbody) + delta_v(:) = colliders%vb(:, 2) - colliders%vb(:, 1) + v_col_norm = .mag. delta_v(:) + delta_r(:) = colliders%xb(:, 2) - colliders%xb(:, 1) + r_col_norm = .mag. 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. + Ltot = colliders%L_orbit(:,1) + colliders%L_orbit(:,2) + colliders%L_spin(:,1) + colliders%L_spin(:,2) + frag%y_coll_unit(:) = delta_r(:) / r_col_norm + frag%z_coll_unit(:) = Ltot(:) / (.mag. Ltot(:)) + ! The cross product of the y- by z-axis will give us the x-axis + frag%x_coll_unit(:) = frag%y_coll_unit(:) .cross. frag%z_coll_unit(:) + + if (.not.any(frag%x_coll(:,:) > 0.0_DP)) return + frag%rmag(:) = .mag. frag%x_coll(:,:) + + 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 + do concurrent(i = 1:nfrag, frag%rmag(i) > 0.0_DP) + frag%v_r_unit(:, i) = frag%x_coll(:, i) / frag%rmag(i) + frag%v_n_unit(:, i) = frag%z_coll_unit(:) + 2e-1_DP * (L_sigma(:,i) - 0.5_DP) + frag%v_n_unit(:, i) = frag%v_n_unit(:, i) / (.mag. frag%v_n_unit(:, i)) + frag%v_t_unit(:, i) = frag%v_n_unit(:, i) .cross. frag%v_r_unit(:, i) + frag%v_t_unit(:, i) = frag%v_t_unit(:, i) / (.mag. frag%v_t_unit(:, i)) + end do + end associate + + return + end subroutine fraggle_set_coordinate_system + + + ! module subroutine symba_set_collresolve_colliders(self, cb, pl, idx) + ! !! author: David A. Minton + ! !! + ! !! Calculate the two-body equivalent values given a set of input collider indices + ! use swiftest_classes, only : swiftest_nbody_system + ! implicit none + ! ! Arguments + ! class(fraggle_colliders), intent(inout) :: self !! Fraggle collider object + ! class(symba_cb), intent(in) :: cb !! Swiftest central body object system object + ! class(symba_pl), intent(in) :: pl !! Swiftest central body object system object + ! integer(I4B), dimension(:), intent(in) :: idx !! Index array of bodies from the pl object to use to calculate a "two-body equivalent" collisional pair + ! ! Internals + ! real(DP), dimension(NDIM, 2) :: mxc, vc + ! real(DP), dimension(NDIM) :: vcom, xcom + + ! associate(colliders => self) + + ! ! Compute orbital angular momentum of pre-impact system + ! xcom(:) = (colliders%mass(1) * colliders%xb(:, 1) + colliders%mass(2) * colliders%xb(:, 2)) / sum(colliders%mass(:)) + ! vcom(:) = (colliders%mass(1) * colliders%vb(:, 1) + colliders%mass(2) * colliders%vb(:, 2)) / sum(colliders%mass(:)) + ! mxc(:, 1) = colliders%mass(1) * (colliders%xb(:, 1) - xcom(:)) + ! mxc(:, 2) = colliders%mass(2) * (colliders%xb(:, 2) - xcom(:)) + ! vc(:, 1) = colliders%vb(:, 1) - vcom(:) + ! vc(:, 2) = colliders%vb(:, 2) - vcom(:) + + ! colliders%L_orbit(:,:) = mxc(:,:) .cross. vc(:,:) + + ! end associate + + ! return + ! end subroutine symbe_set_collresolve_colliders + + + module subroutine fraggle_set_natural_scale_factors(self, colliders) + !! 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 + ! Arguments + class(fraggle_fragments), intent(inout) :: self !! Fraggle fragment system object + class(fraggle_colliders), intent(inout) :: colliders !! Fraggle collider system object + ! Internals + integer(I4B) :: i + + associate(frag => self) + ! Find the center of mass of the collisional system + frag%mtot = sum(colliders%mass(:)) + frag%xbcom(:) = (colliders%mass(1) * colliders%xb(:,1) + colliders%mass(2) * colliders%xb(:,2)) / frag%mtot + frag%vbcom(:) = (colliders%mass(1) * colliders%vb(:,1) + colliders%mass(2) * colliders%vb(:,2)) / frag%mtot + + ! Set scale factors + frag%Escale = 0.5_DP * (colliders%mass(1) * dot_product(colliders%vb(:,1), colliders%vb(:,1)) + colliders%mass(2) * dot_product(colliders%vb(:,2), colliders%vb(:,2))) + frag%dscale = sum(colliders%radius(:)) + frag%mscale = frag%mtot + frag%vscale = sqrt(frag%Escale / frag%mscale) + frag%tscale = frag%dscale / frag%vscale + frag%Lscale = frag%mscale * frag%dscale * frag%vscale + + ! Scale all dimensioned quantities of colliders and fragments + frag%xbcom(:) = frag%xbcom(:) / frag%dscale + frag%vbcom(:) = frag%vbcom(:) / frag%vscale + colliders%xb(:,:) = colliders%xb(:,:) / frag%dscale + colliders%vb(:,:) = colliders%vb(:,:) / frag%vscale + colliders%mass(:) = colliders%mass(:) / frag%mscale + colliders%radius(:) = colliders%radius(:) / frag%dscale + colliders%L_spin(:,:) = colliders%L_spin(:,:) / frag%Lscale + + do i = 1, 2 + colliders%rot(:,i) = colliders%L_spin(:,i) / (colliders%mass(i) * colliders%radius(i)**2 * colliders%Ip(3, i)) + end do + + frag%mtot = frag%mtot / frag%mscale + frag%mass = frag%mass / frag%mscale + frag%radius = frag%radius / frag%dscale + frag%Qloss = frag%Qloss / frag%Escale + end associate + + return + end subroutine fraggle_set_natural_scale_factors + + + module subroutine fraggle_set_original_scale_factors(self, colliders) + !! author: David A. Minton + !! + !! Restores dimenional quantities back to the system units + use, intrinsic :: ieee_exceptions + implicit none + ! Arguments + class(fraggle_fragments), intent(inout) :: self !! Fraggle fragment system object + class(fraggle_colliders), intent(inout) :: colliders !! Fraggle collider system object + ! Internals + integer(I4B) :: i + logical, dimension(size(IEEE_ALL)) :: fpe_halting_modes + + call ieee_get_halting_mode(IEEE_ALL,fpe_halting_modes) ! Save the current halting modes so we can turn them off temporarily + call ieee_set_halting_mode(IEEE_ALL,.false.) + + associate(frag => self) + + ! Restore scale factors + frag%xbcom(:) = frag%xbcom(:) * frag%dscale + frag%vbcom(:) = frag%vbcom(:) * frag%vscale + + colliders%mass = colliders%mass * frag%mscale + colliders%radius = colliders%radius * frag%dscale + colliders%xb = colliders%xb * frag%dscale + colliders%vb = colliders%vb * frag%vscale + colliders%L_spin = colliders%L_spin * frag%Lscale + do i = 1, 2 + colliders%rot(:,i) = colliders%L_spin(:,i) * (colliders%mass(i) * colliders%radius(i)**2 * colliders%Ip(3, i)) + end do + frag%Qloss = frag%Qloss * frag%Escale + + frag%mtot = frag%mtot * frag%mscale + frag%mass = frag%mass * frag%mscale + frag%radius = frag%radius * frag%dscale + frag%rot = frag%rot / frag%tscale + frag%x_coll = frag%x_coll * frag%dscale + frag%v_coll = frag%v_coll * frag%vscale + + do i = 1, frag%nbody + frag%xb(:, i) = frag%x_coll(:, i) + frag%xbcom(:) + frag%vb(:, i) = frag%v_coll(:, i) + frag%vbcom(:) + end do + + frag%mscale = 1.0_DP + frag%dscale = 1.0_DP + frag%vscale = 1.0_DP + frag%tscale = 1.0_DP + frag%Lscale = 1.0_DP + frag%Escale = 1.0_DP + end associate + call ieee_set_halting_mode(IEEE_ALL,fpe_halting_modes) + + return + end subroutine fraggle_set_original_scale_factors + + +end submodule s_fraggle_set \ No newline at end of file diff --git a/src/fraggle/fraggle_setup.f90 b/src/fraggle/fraggle_setup.f90 new file mode 100644 index 000000000..65e107b03 --- /dev/null +++ b/src/fraggle/fraggle_setup.f90 @@ -0,0 +1,78 @@ +submodule (fraggle_classes) s_fraggle_setup + use swiftest +contains + + module subroutine fraggle_setup_reset_fragments(self) + !! author: David A. Minton + !! + !! Resets all position and velocity-dependent fragment quantities in order to do a fresh calculation (does not reset mass, radius, or other values that get set prior to the call to fraggle_generate) + implicit none + ! Arguments + class(fraggle_fragments), intent(inout) :: self + + self%xb(:,:) = 0.0_DP + self%vb(:,:) = 0.0_DP + self%rot(:,:) = 0.0_DP + self%x_coll(:,:) = 0.0_DP + self%v_coll(:,:) = 0.0_DP + self%v_r_unit(:,:) = 0.0_DP + self%v_t_unit(:,:) = 0.0_DP + self%v_n_unit(:,:) = 0.0_DP + + self%rmag(:) = 0.0_DP + self%rotmag(:) = 0.0_DP + self%v_r_mag(:) = 0.0_DP + self%v_t_mag(:) = 0.0_DP + + self%ke_orbit = 0.0_DP + self%ke_spin = 0.0_DP + self%L_orbit(:) = 0.0_DP + self%L_spin(:) = 0.0_DP + + return + end subroutine fraggle_setup_reset_fragments + + + module subroutine fraggle_setup_fragments(self, n, param) + !! author: David A. Minton + !! + !! Allocates arrays for n fragments in a Fraggle system. Passing n = 0 deallocates all arrays. + implicit none + ! Arguments + class(fraggle_fragments), intent(inout) :: self + integer(I4B), intent(in) :: n + class(swiftest_parameters), intent(in) :: param + + call setup_pl(self, n, param) + if (n < 0) return + + if (allocated(self%x_coll)) deallocate(self%x_coll) + if (allocated(self%v_coll)) deallocate(self%v_coll) + if (allocated(self%v_r_unit)) deallocate(self%v_r_unit) + if (allocated(self%v_t_unit)) deallocate(self%v_t_unit) + if (allocated(self%v_n_unit)) deallocate(self%v_n_unit) + if (allocated(self%rmag)) deallocate(self%rmag) + if (allocated(self%rotmag)) deallocate(self%rotmag) + if (allocated(self%v_r_mag)) deallocate(self%v_r_mag) + if (allocated(self%v_t_mag)) deallocate(self%v_t_mag) + + if (n == 0) return + + allocate(self%x_coll(NDIM,n)) + allocate(self%v_coll(NDIM,n)) + allocate(self%v_r_unit(NDIM,n)) + allocate(self%v_t_unit(NDIM,n)) + allocate(self%v_n_unit(NDIM,n)) + allocate(self%rmag(n)) + allocate(self%rotmag(n)) + allocate(self%v_r_mag(n)) + allocate(self%v_t_mag(n)) + + call self%reset() + + return + end subroutine fraggle_setup_fragments + + + +end submodule s_fraggle_setup \ No newline at end of file diff --git a/src/fraggle/fraggle_util.f90 b/src/fraggle/fraggle_util.f90 new file mode 100644 index 000000000..df8b89c41 --- /dev/null +++ b/src/fraggle/fraggle_util.f90 @@ -0,0 +1,316 @@ +submodule(fraggle_classes) s_fraggle_util + use swiftest +contains + + module subroutine fraggle_util_add_fragments_to_system(frag, colliders, system, param) + !! Author: David A. Minton + !! + !! Adds fragments to the temporary system pl object + implicit none + ! Arguments + class(fraggle_fragments), intent(in) :: frag !! Fraggle fragment system object + class(fraggle_colliders), intent(in) :: colliders !! Fraggle collider system object + class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object + class(swiftest_parameters), intent(in) :: param !! Current swiftest run configuration parameters + ! Internals + integer(I4B) :: i, npl_before, npl_after + logical, dimension(:), allocatable :: lexclude + + associate(nfrag => frag%nbody, pl => system%pl, cb => system%cb) + npl_after = pl%nbody + npl_before = npl_after - nfrag + allocate(lexclude(npl_after)) + + pl%status(npl_before+1:npl_after) = ACTIVE + pl%mass(npl_before+1:npl_after) = frag%mass(1:nfrag) + pl%Gmass(npl_before+1:npl_after) = frag%mass(1:nfrag) * param%GU + pl%radius(npl_before+1:npl_after) = frag%radius(1:nfrag) + do concurrent (i = 1:nfrag) + pl%xb(:,npl_before+i) = frag%xb(:,i) + pl%vb(:,npl_before+i) = frag%vb(:,i) + pl%xh(:,npl_before+i) = frag%xb(:,i) - cb%xb(:) + pl%vh(:,npl_before+i) = frag%vb(:,i) - cb%vb(:) + end do + if (param%lrotation) then + pl%Ip(:,npl_before+1:npl_after) = frag%Ip(:,1:nfrag) + pl%rot(:,npl_before+1:npl_after) = frag%rot(:,1:nfrag) + end if + ! This will remove the colliders from the system since we've replaced them with fragments + lexclude(1:npl_after) = .false. + lexclude(colliders%idx(1:colliders%ncoll)) = .true. + where(lexclude(1:npl_after)) + pl%status(1:npl_after) = INACTIVE + elsewhere + pl%status(1:npl_after) = ACTIVE + endwhere + + end associate + + return + end subroutine fraggle_util_add_fragments_to_system + + + module subroutine fraggle_util_ang_mtm(self) + !! Author: David A. Minton + !! + !! Calcualtes the current angular momentum of the fragments + implicit none + ! Arguments + class(fraggle_fragments), intent(inout) :: self !! Fraggle fragment system object + ! Internals + integer(I4B) :: i + + associate(frag => self, nfrag => self%nbody) + frag%L_orbit(:) = 0.0_DP + frag%L_spin(:) = 0.0_DP + + do i = 1, nfrag + frag%L_orbit(:) = frag%L_orbit(:) + frag%mass(i) * (frag%x_coll(:, i) .cross. frag%v_coll(:, i)) + frag%L_spin(:) = frag%L_spin(:) + frag%mass(i) * frag%radius(i)**2 * frag%Ip(:, i) * frag%rot(:, i) + end do + end associate + + return + end subroutine fraggle_util_ang_mtm + + + module subroutine fraggle_util_construct_temporary_system(frag, system, param, tmpsys, tmpparam) + !! Author: David A. Minton + !! + !! Constructs a temporary internal system consisting of active bodies and additional fragments. This internal temporary system is used to calculate system energy with and without fragments + !! and optionally including fragments. + implicit none + ! Arguments + class(fraggle_fragments), intent(in) :: frag !! Fraggle fragment system object + class(swiftest_nbody_system), intent(in) :: system !! Original swiftest nbody system object + class(swiftest_parameters), intent(in) :: param !! Current swiftest run configuration parameters + class(swiftest_nbody_system), allocatable, intent(out) :: tmpsys !! Output temporary swiftest nbody system object + class(swiftest_parameters), allocatable, intent(out) :: tmpparam !! Output temporary configuration run parameters + ! Internals + logical, dimension(:), allocatable :: linclude + integer(I4B) :: npl_tot + + associate(nfrag => frag%nbody, pl => system%pl, npl => system%pl%nbody, cb => system%cb) + ! Set up a new system based on the original + if (allocated(tmpparam)) deallocate(tmpparam) + if (allocated(tmpsys)) deallocate(tmpsys) + allocate(tmpparam, source=param) + call setup_construct_system(tmpsys, tmpparam) + + ! No test particles necessary for energy/momentum calcs + call tmpsys%tp%setup(0, param) + + ! Replace the empty central body object with a copy of the original + deallocate(tmpsys%cb) + allocate(tmpsys%cb, source=cb) + + ! Make space for the fragments + npl_tot = npl + nfrag + call tmpsys%pl%setup(npl_tot, tmpparam) + allocate(linclude(npl_tot)) + + ! Fill up the temporary system with all of the original bodies, leaving the spaces for fragments empty until we add them in later + linclude(1:npl) = .true. + linclude(npl+1:npl_tot) = .false. + call tmpsys%pl%fill(pl, linclude) + + ! Scale the temporary system to the natural units of the current Fraggle calculation + call tmpsys%rescale(tmpparam, frag%mscale, frag%dscale, frag%tscale) + + end associate + + return + end subroutine fraggle_util_construct_temporary_system + + + module subroutine fraggle_util_get_energy_momentum(self, colliders, system, param, lbefore) + !! Author: David A. Minton + !! + !! Calculates total system energy in either the pre-collision outcome state (lbefore = .true.) or the post-collision outcome state (lbefore = .false.) + !! This subrourtine works by building a temporary internal massive body object out of the non-excluded bodies and optionally with fragments appended. + !! This will get passed to the energy calculation subroutine so that energy is computed exactly the same way is it is in the main program. + !! This will temporarily expand the massive body object in a temporary system object called tmpsys to feed it into symba_energy + implicit none + ! Arguments + class(fraggle_fragments), intent(inout) :: self !! Fraggle fragment system object + class(fraggle_colliders), intent(inout) :: colliders !! Fraggle collider system object + class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object + class(swiftest_parameters), intent(in) :: param !! Current swiftest run configuration parameters + logical, intent(in) :: lbefore !! Flag indicating that this the "before" state of the system, with colliders included and fragments excluded or vice versa + ! Internals + integer(I4B) :: i, nplm + logical, dimension(:), allocatable :: lexclude + logical :: lk_plpl + logical, save :: ladd_frags + class(swiftest_nbody_system), allocatable, save :: tmpsys + class(swiftest_parameters), allocatable, save :: tmpparam + integer(I4B) :: npl_before, npl_after + + associate(frag => self, nfrag => self%nbody, pl => system%pl, cb => system%cb) + + ! Because we're making a copy of the massive body object 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. + + npl_before = pl%nbody + npl_after = npl_before + nfrag + + ! Build the exluded body logical mask + allocate(lexclude(npl_after)) + if (lbefore) then + lexclude(1:npl_before) = .false. + lexclude(npl_before+1:npl_after) = .true. + call fraggle_util_construct_temporary_system(frag, system, param, tmpsys, tmpparam) + else + lexclude(1:npl_after) = .false. + lexclude(colliders%idx(1:colliders%ncoll)) = .true. + if (.not.allocated(tmpsys)) then + write(*,*) "Error in fraggle_util_get_energy_momentum. This must be called with lbefore=.true. at least once before calling it with lbefore=.false." + call util_exit(FAILURE) + end if + call fraggle_util_add_fragments_to_system(frag, colliders, tmpsys, tmpparam) + end if + + call tmpsys%pl%index(param) + + call tmpsys%get_energy_and_momentum(param) + + + ! Calculate the current fragment energy and momentum balances + if (lbefore) then + frag%Lorbit_before(:) = tmpsys%Lorbit(:) + frag%Lspin_before(:) = tmpsys%Lspin(:) + frag%Ltot_before(:) = tmpsys%Ltot(:) + frag%ke_orbit_before = tmpsys%ke_orbit + frag%ke_spin_before = tmpsys%ke_spin + frag%pe_before = tmpsys%pe + frag%Etot_before = tmpsys%te + else + frag%Lorbit_after(:) = tmpsys%Lorbit(:) + frag%Lspin_after(:) = tmpsys%Lspin(:) + frag%Ltot_after(:) = tmpsys%Ltot(:) + frag%ke_orbit_after = tmpsys%ke_orbit + frag%ke_spin_after = tmpsys%ke_spin + frag%pe_after = tmpsys%pe + frag%Etot_after = tmpsys%te + end if + end associate + + return + end subroutine fraggle_util_get_energy_momentum + + + module subroutine fraggle_util_restructure(self, colliders, try, f_spin, r_max_start) + !! Author: David A. Minton + !! + !! Restructure the inputs after a failed attempt failed to find a set of positions and velocities that satisfy the energy and momentum constraints + implicit none + ! Arguments + class(fraggle_fragments), intent(inout) :: self !! Fraggle fragment system object + class(fraggle_colliders), intent(in) :: colliders !! Fraggle collider system object + integer(I4B), intent(in) :: try !! The current number of times Fraggle has tried to find a solution + real(DP), intent(inout) :: f_spin !! Fraction of energy/momentum that goes into spin. This decreases ater a failed attempt + real(DP), intent(inout) :: r_max_start !! The maximum radial distance that the position calculation starts with. This increases after a failed attempt + ! Internals + integer(I4B) :: i + real(DP), save :: ke_tot_deficit, r_max_start_old, ke_avg_deficit_old + 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, ke_avg_deficit + 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 + associate(frag => self) + call random_number(delta_r_max) + delta_r_max = sum(colliders%radius(:)) * (1.0_DP + 2e-1_DP * (delta_r_max - 0.5_DP)) + if (try == 1) then + ke_tot_deficit = - (frag%ke_budget - frag%ke_orbit - frag%ke_spin) + ke_avg_deficit = ke_tot_deficit + delta_r = delta_r_max + else + ! Linearly interpolate the last two failed solution ke deficits to find a new distance value to try + ke_tot_deficit = ke_tot_deficit - (frag%ke_budget - frag%ke_orbit - frag%ke_spin) + ke_avg_deficit = ke_tot_deficit / 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) + 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 + ke_avg_deficit_old = ke_avg_deficit + + if (f_spin > epsilon(1.0_DP)) then ! Try reducing the fraction in spin + f_spin = f_spin / 2 + else + f_spin = 0.0_DP + end if + end associate + + return + end subroutine fraggle_util_restructure + + + module subroutine fraggle_util_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, nfrag + real(DP) :: mtot + + mvec_frag(:) = 0.0_DP + mtot = sum(m_frag) + nfrag = size(m_frag) + + 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 fraggle_util_shift_vector_to_origin + + + module function fraggle_util_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, nfrag + + allocate(vb, mold=v_r_unit) + ! Make sure the velocity magnitude stays positive + nfrag = size(m_frag) + 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 fraggle_util_shift_vector_to_origin(m_frag, vb) + + do i = 1, nfrag + vb(:, i) = vb(:, i) + v_t_mag(i) * v_t_unit(:, i) + vcom(:) + end do + + return + end function fraggle_util_vmag_to_vb + + +end submodule s_fraggle_util diff --git a/src/fragmentation/fragmentation.f90 b/src/fragmentation/fragmentation.f90 deleted file mode 100644 index c62d337ca..000000000 --- a/src/fragmentation/fragmentation.f90 +++ /dev/null @@ -1,1266 +0,0 @@ -submodule(swiftest_classes) s_fragmentation - use swiftest -contains - - 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 - !! - !! 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 !! Swiftest nbody system object - class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters - integer(I4B), dimension(:), intent(in) :: family !! Index of bodies involved in the collision - real(DP), dimension(:,:), intent(inout) :: x, v, L_spin, Ip !! Two-body equivalent position, vector, spin momentum, and rotational inertia values for the collision - real(DP), dimension(:), intent(inout) :: mass, radius !! Two-body equivalent mass and radii for the bodies in the collision - integer(I4B), intent(inout) :: nfrag !! Number of fragments to generate - real(DP), dimension(:), allocatable, intent(inout) :: m_frag, rad_frag !! Distribution of fragment mass and radii - real(DP), dimension(:,:), allocatable, intent(inout) :: Ip_frag !! Fragment rotational inertia vectors - real(DP), dimension(:,:), allocatable, intent(inout) :: xb_frag, vb_frag, rot_frag !! Fragment barycentric position, barycentric velocity, and rotation vectors - real(DP), intent(inout) :: Qloss !! Energy lost during the collision - logical, intent(out) :: lfailure !! Answers the question: Should this have been a merger instead? - ! Internals - real(DP) :: mscale, dscale, vscale, tscale, Lscale, Escale ! Scale factors that reduce quantities to O(~1) in the collisional system - real(DP) :: mtot - real(DP), dimension(NDIM) :: xcom, vcom - integer(I4B) :: ii, npl_new - logical, dimension(:), allocatable :: lexclude - real(DP), dimension(NDIM, 2) :: rot, L_orb, mxc, vc - 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, L_frag_spin, L_frag_budget, Lorbit_before, Lorbit_after, Lspin_before, Lspin_after, dL - real(DP) :: ke_frag_budget, ke_frag_orbit, ke_frag_spin, ke_tot_deficit, 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 - 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-8_DP - integer(I4B), parameter :: MAXTRY = 3000 - 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) - - allocate(x_frag, source=xb_frag) - allocate(v_frag, source=vb_frag) - 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 - - associate(pl => system%pl, npl => system%pl%nbody) - npl_new = npl + nfrag - allocate(lexclude(npl_new)) - lexclude(1:npl) = pl%status(1:npl) == INACTIVE - lexclude(npl+1:npl_new) = .true. - end associate - - call set_scale_factors() - - ! Compute orbital angular momentum of pre-impact system - mxc(:, 1) = mass(1) * (x(:, 1) - xcom(:)) - mxc(:, 2) = mass(2) * (x(:, 2) - xcom(:)) - vc(:, 1) = v(:, 1) - vcom(:) - vc(:, 2) = v(:, 2) - vcom(:) - L_orb(:,:) = mxc(:,:) .cross. vc(:,:) - - ! Compute orbital angular momentum of pre-impact system. We'll use this to start the coordinate system, but it will get updated as we divide up the angular momentum - L_frag_orb(:) = L_orb(:, 1) + L_orb(:, 2) - L_frag_spin(:) = L_spin(:, 1) + L_spin(:, 2) - L_frag_budget(:) = L_frag_orb(:) + L_frag_spin(:) - f_spin = 0.05_DP - - call reset_fragments() - call define_coordinate_system() - - ! Calculate the initial energy of the system without the collisional family - call calculate_system_energy(linclude_fragments=.false.) - - r_max_start = 1 * norm2(x(:,2) - x(:,1)) - try = 1 - lfailure = .false. - ke_tot_deficit = 0.0_DP - do while (try < MAXTRY) - lfailure = .false. - - call set_fragment_position_vectors() - - do concurrent (ii = 1:nfrag) - vb_frag(:, ii) = vcom(:) - end do - - call calculate_system_energy(linclude_fragments=.true.) - L_frag_budget(:) = -dL(:) - ! The ke constraints are calcualted in the collision frame, so undo the barycentric velocity component - ke_frag_budget = -(dEtot - 0.5_DP * mtot * dot_product(vcom(:), vcom(:))) - Qloss - - call set_fragment_spin(lfailure) - if (.not.lfailure) call set_fragment_tan_vel(lfailure) - - if (lfailure) then - ! write(*,*) 'Failed to find tangential velocities' - else - 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.) - 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() - call reset_fragments() - try = try + 1 - end do - call restore_scale_factors() - - ! write(*, "(' -------------------------------------------------------------------------------------')") - ! write(*, "(' Final diagnostic')") - ! write(*, "(' -------------------------------------------------------------------------------------')") - ! call calculate_system_energy(linclude_fragments=.true.) - if (lfailure) then - write(*,*) "symba_frag_pos failed after: ",try," tries" - do ii = 1, nfrag - vb_frag(:, ii) = vcom(:) - end do - else - write(*,*) "symba_frag_pos succeeded after: ",try," tries" - ! write(*, "(' dL_tot should be very small' )") - ! write(*,fmtlabel) ' dL_tot |', dLmag / Lmag_before - ! write(*, "(' dE_tot should be negative and equal to Qloss' )") - ! write(*,fmtlabel) ' dE_tot |', dEtot / abs(Etot_before) - ! write(*,fmtlabel) ' Qloss |', -Qloss / abs(Etot_before) - ! write(*,fmtlabel) ' dE - Qloss |', (Etot_after - Etot_before + Qloss) / abs(Etot_before) - end if - ! write(*, "(' -------------------------------------------------------------------------------------')") - - call ieee_set_halting_mode(IEEE_ALL,fpe_halting_modes) ! Save the current halting modes so we can turn them off temporarily - - 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 - Escale = 0.5_DP * (mass(1) * dot_product(v(:,1), v(:,1)) + mass(2) * dot_product(v(:,2), v(:,2))) - dscale = sum(radius(:)) - mscale = mtot - vscale = sqrt(Escale / mscale) - tscale = dscale / vscale - Lscale = mscale * dscale * vscale - - xcom(:) = xcom(:) / dscale - vcom(:) = vcom(:) / vscale - - mtot = mtot / mscale - mass = mass / mscale - radius = radius / dscale - x = x / dscale - v = v / vscale - L_spin = L_spin / Lscale - do i = 1, 2 - rot(:,i) = L_spin(:,i) / (mass(i) * radius(i)**2 * Ip(3, i)) - end do - - m_frag = m_frag / mscale - rad_frag = rad_frag / dscale - Qloss = Qloss / Escale - - return - end subroutine set_scale_factors - - - subroutine restore_scale_factors() - !! author: David A. Minton - !! - !! Restores dimenional quantities back to the system units - implicit none - integer(I4B) :: i - - call ieee_set_halting_mode(IEEE_ALL,.false.) - ! Restore scale factors - xcom(:) = xcom(:) * dscale - vcom(:) = vcom(:) * vscale - - mtot = mtot * mscale - mass = mass * mscale - radius = radius * dscale - x = x * dscale - v = v * vscale - L_spin = L_spin * Lscale - do i = 1, 2 - rot(:,i) = L_spin(:,i) * (mass(i) * radius(i)**2 * Ip(3, i)) - end do - - m_frag = m_frag * mscale - rad_frag = rad_frag * dscale - rot_frag = rot_frag / tscale - x_frag = x_frag * dscale - v_frag = v_frag * vscale - Qloss = Qloss * Escale - - do i = 1, nfrag - xb_frag(:, i) = x_frag(:, i) + xcom(:) - vb_frag(:, i) = v_frag(:, i) + vcom(:) - end do - - 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 - - dL(:) = Ltot_after(:) - Ltot_before(:) - dLmag = .mag.dL(:) - dEtot = Etot_after - Etot_before - - mscale = 1.0_DP - dscale = 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 reset_fragments() - !! author: David A. Minton - !! - !! Resets all tracked fragment quantities in order to do a fresh calculation - !! 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 - implicit none - - xb_frag(:,:) = 0.0_DP - vb_frag(:,:) = 0.0_DP - x_frag(:,:) = 0.0_DP - v_frag(:,:) = 0.0_DP - rot_frag(:,:) = 0.0_DP - v_t_mag(:) = 0.0_DP - v_r_mag(:) = 0.0_DP - ke_frag_orbit = 0.0_DP - ke_frag_spin = 0.0_DP - L_frag_orb(:) = 0.0_DP - L_frag_spin(:) = 0.0_DP - - return - end subroutine reset_fragments - - - 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, delta_r, delta_v - real(DP) :: r_col_norm, v_col_norm - real(DP), dimension(NDIM, nfrag) :: L_sigma - - delta_v(:) = v(:, 2) - v(:, 1) - v_col_norm = .mag. delta_v(:) - delta_r(:) = x(:, 2) - x(:, 1) - r_col_norm = .mag. 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_budget(:) - L_frag_spin(:)) / (.mag. (L_frag_budget(:) - L_frag_spin(:))) - ! 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(:) - - if (.not.any(x_frag(:,:) > 0.0_DP)) return - rmag(:) = .mag. x_frag(:,:) - - 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 - do concurrent(i = 1:nfrag, rmag(i) > 0.0_DP) - v_r_unit(:, i) = x_frag(:, i) / rmag(i) - v_h_unit(:, i) = z_col_unit(:) + 2e-1_DP * (L_sigma(:,i) - 0.5_DP) - v_h_unit(:, i) = v_h_unit(:, i) / (.mag. v_h_unit(:, i)) - v_t_unit(:, i) = v_h_unit(:, i) .cross. v_r_unit(:, i) - v_t_unit(:, i) = v_t_unit(:, i) / (.mag. v_t_unit(:, i)) - end do - - return - end subroutine define_coordinate_system - - - subroutine construct_temporary_system(tmpsys, tmpparam) - !! Author: David A. Minton - !! - !! Constructs a temporary internal system consisting of active bodies and additional fragments. This internal temporary system is used to calculate system energy with and without fragments - !! and optionally including fragments. - implicit none - ! Arguments - class(swiftest_nbody_system), allocatable, intent(inout) :: tmpsys - class(swiftest_parameters), allocatable, intent(inout) :: tmpparam - ! Internals - logical, dimension(:), allocatable :: lexclude_tmp - - associate(pl => system%pl, npl => system%pl%nbody, cb => system%cb) - if (size(lexclude) /= npl + nfrag) then - allocate(lexclude_tmp(npl + nfrag)) - lexclude_tmp(1:npl) = lexclude(1:npl) - call move_alloc(lexclude_tmp, lexclude) - end if - where (pl%status(1:npl) == INACTIVE) ! Safety check in case one of the included bodies has been previously deactivated - lexclude(1:npl) = .true. - elsewhere - lexclude(1:npl) = .false. - end where - lexclude(npl+1:(npl + nfrag)) = .true. - allocate(tmpparam, source=param) - call setup_construct_system(tmpsys, tmpparam) - call tmpsys%tp%setup(0, param) - deallocate(tmpsys%cb) - allocate(tmpsys%cb, source=cb) - call tmpsys%pl%setup(npl + nfrag, tmpparam) - call tmpsys%pl%fill(pl, .not.lexclude) - call tmpsys%rescale(tmpparam, mscale, dscale, tscale) - - end associate - - return - end subroutine construct_temporary_system - - - subroutine add_fragments_to_tmpsys(tmpsys, tmpparam) - !! Author: David A. Minton - !! - !! Adds fragments to the temporary system pl object - implicit none - ! Arguments - class(swiftest_nbody_system), intent(inout) :: tmpsys - class(swiftest_parameters), intent(inout) :: tmpparam - ! Internals - integer(I4B) :: i - class(swiftest_pl), allocatable :: pl_discards - logical, dimension(:), allocatable :: lexclude_tmp - - associate(pl => system%pl, npl => system%pl%nbody) - npl_new = npl + nfrag - - tmpsys%pl%mass(npl+1:npl_new) = m_frag(1:nfrag) - tmpsys%pl%Gmass(npl+1:npl_new) = m_frag(1:nfrag) * tmpparam%GU - tmpsys%pl%radius(npl+1:npl_new) = rad_frag(1:nfrag) - do concurrent (i = 1:nfrag) - tmpsys%pl%xb(:,npl+i) = xb_frag(:,i) - tmpsys%pl%vb(:,npl+i) = vb_frag(:,i) - tmpsys%pl%xh(:,npl+i) = xb_frag(:,i) - tmpsys%cb%xb(:) - tmpsys%pl%vh(:,npl+i) = vb_frag(:,i) - tmpsys%cb%vb(:) - end do - if (tmpparam%lrotation) then - tmpsys%pl%Ip(:,npl+1:npl_new) = Ip_frag(:,1:nfrag) - tmpsys%pl%rot(:,npl+1:npl_new) = rot_frag(:,1:nfrag) - end if - ! Disable the collisional family for subsequent energy calculations and coordinate shifts - lexclude(family(:)) = .true. - lexclude(npl+1:npl_new) = .false. - where(lexclude(1:npl_new)) - tmpsys%pl%status(1:npl_new) = INACTIVE - elsewhere - tmpsys%pl%status(1:npl_new) = ACTIVE - end where - allocate(pl_discards, mold=tmpsys%pl) - call tmpsys%pl%spill(pl_discards, lspill_list=lexclude(1:npl_new), ldestructive=.true.) - npl_new = count(.not.lexclude(:)) - - if (size(lexclude) /= npl_new) then - allocate(lexclude_tmp(npl_new)) - call move_alloc(lexclude_tmp, lexclude) - end if - lexclude(1:npl_new) = .false. - - end associate - - return - end subroutine add_fragments_to_tmpsys - - - subroutine calculate_system_energy(linclude_fragments) - !! Author: David A. Minton - !! - !! Calculates total system energy, including all bodies in the pl list that do not have a corresponding value of the lexclude array that is true - !! and optionally including fragments. - implicit none - ! Arguments - logical, intent(in) :: linclude_fragments - ! Internals - integer(I4B) :: i, nplm - logical, dimension(:), allocatable :: lexclude_tmp - logical :: lk_plpl - class(swiftest_nbody_system), allocatable :: tmpsys - class(swiftest_parameters), allocatable :: tmpparam - - ! Build the internal planet list out of the non-excluded bodies and optionally with fragments appended. This - ! will get passed to the energy calculation subroutine so that energy is computed exactly the same way is it - ! is in the main program. This will temporarily expand the planet list in a temporary system object called tmpsys to feed it into symba_energy - associate(pl => system%pl, npl => system%pl%nbody, cb => system%cb) - - ! 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. - lk_plpl = allocated(pl%k_plpl) - if (lk_plpl) deallocate(pl%k_plpl) - - call construct_temporary_system(tmpsys, tmpparam) - if (linclude_fragments) call add_fragments_to_tmpsys(tmpsys, tmpparam) - - call tmpsys%pl%index(param) - - call tmpsys%get_energy_and_momentum(param) - - ! Restore the big array - deallocate(tmpsys%pl%k_plpl) - - if (lk_plpl) call pl%index(param) - - ! Calculate the current fragment energy and momentum balances - if (linclude_fragments) then - Lorbit_after(:) = tmpsys%Lorbit - Lspin_after(:) = tmpsys%Lspin - 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 = tmpsys%te - dEtot = Etot_after - Etot_before - dL(:) = Ltot_after(:) - Ltot_before(:) - dLmag = .mag.dL(:) - else - Lorbit_before(:) = tmpsys%Lorbit - Lspin_before(:) = tmpsys%Lspin - 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 = tmpsys%te - end if - end associate - - return - end subroutine calculate_system_energy - - - subroutine calculate_fragment_ang_mtm() - !! Author: David A. Minton - !! - !! Calcualtes the current angular momentum of the fragments - implicit none - integer(I4B) :: i - - L_frag_orb(:) = 0.0_DP - L_frag_spin(:) = 0.0_DP - - do i = 1, nfrag - L_frag_orb(:) = L_frag_orb(:) + m_frag(i) * (x_frag(:, i) .cross. v_frag(:, i)) - L_frag_spin(:) = L_frag_spin(:) + m_frag(i) * rad_frag(i)**2 * Ip_frag(:, i) * rot_frag(:, i) - end do - - L_frag_tot(:) = L_frag_orb(:) + L_frag_spin(:) - - return - end subroutine calculate_fragment_ang_mtm - - - 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 - 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) - call define_coordinate_system() - - do i = 1, nfrag - xb_frag(:,i) = x_frag(:,i) + xcom(:) - end do - - xcom(:) = 0.0_DP - do i = 1, nfrag - xcom(:) = xcom(:) + m_frag(i) * xb_frag(:,i) - end do - xcom(:) = xcom(:) / mtot - - return - end subroutine set_fragment_position_vectors - - - subroutine set_fragment_spin(lerr) - !! Author: Jennifer L.L. Pouplin, Carlisle A. Wishard, and David A. Minton - !! - !! Sets the spins of a collection of fragments such that they conserve angular momentum without blowing the fragment kinetic energy budget. - !! - !! 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 - real(DP), dimension(NDIM) :: L_remainder, rot_L, rot_ke - integer(I4B) :: i - - lerr = .false. - - ! Start the first two bodies with the same rotation as the original two impactors, then distribute the remaining angular momentum among the rest - rot_frag(:,1:2) = rot(:, :) - rot_frag(:,3:nfrag) = 0.0_DP - call calculate_fragment_ang_mtm() - L_remainder(:) = L_frag_budget(:) - L_frag_spin(:) - - ke_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_remainder(:) / norm2(L_remainder(:)) - rot_L(:) = f_spin * L_remainder(:) / (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 - 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 - - lerr = ((ke_frag_budget - ke_frag_spin - ke_frag_orbit) < 0.0_DP) - - return - end subroutine set_fragment_spin - - - 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_MIN = 1e-1_DP ! This doesn't have to be very accurate, as we really just want a tangential velocity distribution with less kinetic energy than our initial guess. - real(DP), parameter :: TOL_INIT = 1e-14_DP - integer(I4B), parameter :: MAXLOOP = 10 - real(DP) :: tol - real(DP), dimension(:), allocatable :: v_t_initial - real(DP), dimension(nfrag) :: kefrag - type(lambda_obj) :: spinfunc - type(lambda_obj_err) :: objective_function - real(DP), dimension(NDIM) :: Li, L_remainder - - lerr = .false. - - ! 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(*,*) '***************************************************' - - allocate(v_t_initial, mold=v_t_mag) - v_t_initial(:) = 0.0_DP - v_frag(:,:) = 0.0_DP - - ! 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. - call calculate_fragment_ang_mtm() - call define_coordinate_system() ! Make sure that the tangential velocity components are defined properly - L_remainder(:) = L_frag_budget(:) - L_frag_spin(:) - 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) - - tol = TOL_INIT - do while(tol < TOL_MIN) - v_t_mag(7:nfrag) = util_minimize_bfgs(objective_function, nfrag-6, v_t_initial(7:nfrag), tol, MAXLOOP, 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) - if (.not.lerr) exit - tol = tol * 2_DP ! Keep increasing the tolerance until we converge on a solution - end do - 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(:)) - do concurrent (i = 1:nfrag) - v_frag(:,i) = vb_frag(:,i) - vcom(:) - end do - - ! Now do a kinetic energy budget check to make sure we are still within the budget. - kefrag = 0.0_DP - do concurrent(i = 1:nfrag) - kefrag(i) = m_frag(i) * dot_product(vb_frag(:, i), vb_frag(:, i)) - end do - ke_frag_orbit = 0.5_DP * sum(kefrag(:)) - - ! If we are over the energy budget, flag this as a failure so we can try again - lerr = ((ke_frag_budget - ke_frag_spin - ke_frag_orbit) < 0.0_DP) - ! write(*,*) 'Tangential' - ! write(*,*) 'Failure? ',lerr - ! call calculate_fragment_ang_mtm() - ! write(*,*) '|L_remainder| : ',.mag.(L_frag_budget(:) - L_frag_tot(:)) / Lmag_before - ! write(*,*) 'ke_frag_budget: ',ke_frag_budget - ! write(*,*) 'ke_frag_spin : ',ke_frag_spin - ! write(*,*) 'ke_tangential : ',ke_frag_orbit - ! write(*,*) 'ke_radial : ',ke_frag_budget - ke_frag_spin - ke_frag_orbit - - 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(NDIM,nfrag) :: v_shift - real(DP), dimension(nfrag) :: v_t_new, kearr - real(DP) :: keo - - lerr = .false. - - v_t_new(:) = solve_fragment_tan_vel(v_t_mag_input=v_t_mag_input(:), lerr=lerr) - v_shift(:,:) = vmag_to_vb(v_r_mag, v_r_unit, v_t_new, v_t_unit, m_frag, vcom) - - kearr = 0.0_DP - do concurrent(i = 1:nfrag) - kearr(i) = m_frag(i) * dot_product(v_shift(:, i), v_shift(:, i)) - end do - keo = 0.5_DP * sum(kearr(:)) - fval = keo - lerr = .false. - - return - end function tangential_objective_function - - - function solve_fragment_tan_vel(lerr, v_t_mag_input) result(v_t_mag_output) - !! Author: Jennifer L.L. Pouplin, Carlisle A. Wishard, and David A. Minton - !! - !! Adjusts the positions, velocities, and spins of a collection of fragments such that they conserve angular momentum - implicit none - ! Arguments - logical, intent(out) :: lerr !! Error flag - real(DP), dimension(:), optional, intent(in) :: v_t_mag_input !! Unknown tangential velocities for fragments 7:nfrag - ! Internals - integer(I4B) :: i - ! Result - real(DP), dimension(:), allocatable :: v_t_mag_output - - real(DP), dimension(2 * NDIM, 2 * NDIM) :: A ! LHS of linear equation used to solve for momentum constraint in Gauss elimination code - real(DP), dimension(2 * NDIM) :: b ! RHS of linear equation used to solve for momentum constraint in Gauss elimination code - real(DP), dimension(NDIM) :: L_lin_others, L_orb_others, L, vtmp - - 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) - A(4:6, i) = m_frag(i) * rmag(i) * (v_r_unit(:, i) .cross. v_t_unit(:, i)) - 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(:) = m_frag(i) * (x_frag(:, i) .cross. vtmp(:)) - L_orb_others(:) = L_orb_others(:) + L(:) - end if - end do - b(1:3) = -L_lin_others(:) - b(4:6) = L_frag_budget(:) - L_frag_spin(:) - 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_MIN = Etol ! This needs to be more accurate than the tangential step, as we are trying to minimize the total residual energy - real(DP), parameter :: TOL_INIT = 1e-14_DP - integer(I4B), parameter :: MAXLOOP = 100 - real(DP) :: ke_radial, tol - 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 for the radial component - ke_radial = ke_frag_budget - ke_frag_spin - ke_frag_orbit - - allocate(v_r_initial, source=v_r_mag) - ! Initialize radial velocity magnitudes with a random value that is approximately 10% of that found by distributing the kinetic energy equally - allocate(v_r_sigma, source=v_r_mag) - call random_number(v_r_sigma(1:nfrag)) - v_r_sigma(1:nfrag) = sqrt(1.0_DP + 2 * (v_r_sigma(1:nfrag) - 0.5_DP) * 1e-4_DP) - v_r_initial(1:nfrag) = v_r_sigma(1:nfrag) * sqrt(abs(2 * ke_radial) / (m_frag(1:nfrag) * nfrag)) - - ! Initialize the lambda function using a structure constructor that calls the init method - ! Minimize the ke objective function using the BFGS optimizer - objective_function = lambda_obj(radial_objective_function) - tol = TOL_INIT - do while(tol < TOL_MIN) - v_r_mag = util_minimize_bfgs(objective_function, nfrag, v_r_initial, tol, MAXLOOP, lerr) - if (.not.lerr) exit - tol = tol * 2 ! Keep increasing the tolerance until we converge on a solution - v_r_initial(:) = v_r_mag(:) - end do - - ! Shift the radial velocity vectors to align with the center of mass of the collisional system (the origin) - ke_frag_orbit = 0.0_DP - 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(:) - 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_spin : ',ke_frag_spin - ! write(*,*) 'ke_frag_orbit : ',ke_frag_orbit - ! write(*,*) 'ke_remainder : ',ke_frag_budget - (ke_frag_orbit + ke_frag_spin) - lerr = .false. - - return - end subroutine set_fragment_radial_velocities - - - function radial_objective_function(v_r_mag_input) result(fval) - !! Author: David A. Minton - !! - !! Objective function for evaluating how close our fragment velocities get to minimizing KE error from our required value - implicit none - ! Arguments - real(DP), dimension(:), intent(in) :: v_r_mag_input !! Unknown radial component of fragment velocity vector - ! Result - real(DP) :: fval !! The objective function result, which is the square of the difference between the calculated fragment kinetic energy and our target - !! Minimizing this brings us closer to our objective - ! Internals - integer(I4B) :: i - real(DP), dimension(:,:), allocatable :: v_shift - real(DP), dimension(nfrag) :: kearr - real(DP) :: keo, ke_radial - - allocate(v_shift, mold=vb_frag) - v_shift(:,:) = vmag_to_vb(v_r_mag_input, v_r_unit, v_t_mag, v_t_unit, m_frag, vcom) - do concurrent(i = 1:nfrag) - kearr(i) = m_frag(i) * (Ip_frag(3, i) * rad_frag(i)**2 * dot_product(rot_frag(:, i), rot_frag(:, i)) + dot_product(v_shift(:, i), v_shift(:, i))) - end do - keo = 2 * ke_frag_budget - sum(kearr(:)) - ke_radial = ke_frag_budget - ke_frag_orbit - ke_frag_spin - ! The following ensures that fval = 0 is a local minimum, which is what the BFGS method is searching for - fval = (keo / (2 * ke_radial))**2 - - return - end function radial_objective_function - - - function vmag_to_vb(v_r_mag, v_r_unit, v_t_mag, v_t_unit, m_frag, vcom) result(vb) - !! Author: David A. Minton - !! - !! Converts radial and tangential velocity magnitudes into barycentric velocity - implicit none - ! Arguments - real(DP), dimension(:), intent(in) :: v_r_mag !! Unknown radial component of fragment velocity vector - real(DP), dimension(:), intent(in) :: v_t_mag !! Tangential component of velocity vector set previously by angular momentum constraint - real(DP), dimension(:,:), intent(in) :: v_r_unit, v_t_unit !! Radial and tangential unit vectors for each fragment - real(DP), dimension(:), intent(in) :: m_frag !! Fragment masses - real(DP), dimension(:), intent(in) :: vcom !! Barycentric velocity of collisional system center of mass - ! Result - real(DP), dimension(:,:), allocatable :: vb - ! Internals - integer(I4B) :: i - - allocate(vb, mold=v_r_unit) - ! Make sure the velocity magnitude stays positive - do i = 1, nfrag - vb(:,i) = abs(v_r_mag(i)) * v_r_unit(:, i) - end do - ! In order to keep satisfying the kinetic energy constraint, we must shift the origin of the radial component of the velocities to the center of mass - call shift_vector_to_origin(m_frag, vb) - - do i = 1, nfrag - vb(:, i) = vb(:, i) + v_t_mag(i) * v_t_unit(:, i) + vcom(:) - end do - - return - end function vmag_to_vb - - - subroutine restructure_failed_fragments() - !! Author: David A. Minton - !! - !! We failed to find a set of positions and velocities that satisfy all the constraints, and so we will alter the fragments and try again. - implicit none - integer(I4B) :: i - real(DP), dimension(:), allocatable :: m_frag_new, rad_frag_new - real(DP), dimension(:,:), allocatable :: xb_frag_new, vb_frag_new, Ip_frag_new, rot_frag_new - real(DP) :: delta_r, delta_r_max - real(DP), parameter :: ke_avg_deficit_target = 0.0_DP - - ke_tot_deficit = ke_tot_deficit - (ke_frag_budget - ke_frag_orbit - ke_frag_spin) - ke_avg_deficit = ke_tot_deficit / try - ! 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 > 1) 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 - ke_avg_deficit_old = ke_avg_deficit - - if (f_spin > epsilon(1.0_DP)) then ! Try reducing the fraction in spin - f_spin = f_spin / 2 - else - f_spin = 0.0_DP - end if - - return - 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, min_mfrag, 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, min_mfrag - 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 < min_mfrag).or.(m2 < min_mfrag)) 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 - - end subroutine fragmentation_regime - -end submodule s_fragmentation \ No newline at end of file diff --git a/src/helio/helio_setup.f90 b/src/helio/helio_setup.f90 index 2a8c24019..cf5f57d8a 100644 --- a/src/helio/helio_setup.f90 +++ b/src/helio/helio_setup.f90 @@ -15,6 +15,8 @@ module subroutine helio_setup_initialize_system(self, param) call whm_setup_initialize_system(self, param) call self%pl%h2b(self%cb) call self%tp%h2b(self%cb) + call self%pl%sort("mass", ascending=.false.) + call self%pl%index(param) return end subroutine helio_setup_initialize_system diff --git a/src/helio/helio_util.f90 b/src/helio/helio_util.f90 deleted file mode 100644 index 3b5ee6116..000000000 --- a/src/helio/helio_util.f90 +++ /dev/null @@ -1,21 +0,0 @@ -submodule(helio_classes) s_helio_eucl - use swiftest -contains - - module subroutine helio_util_index_eucl_plpl(self, param) - !! author: David A. Minton - !! - !! Wrapper for the indexing method for WHM massive bodies. Sorts the massive bodies by heliocentric distance and then flattens the pl-pl upper triangular matrix - implicit none - ! Arguments - class(helio_pl), intent(inout) :: self !! Helio massive body object - class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters - - call self%sort("mass", ascending=.false.) - call util_index_eucl_plpl(self, param) - - return - end subroutine helio_util_index_eucl_plpl - -end submodule s_helio_eucl - diff --git a/src/modules/fraggle_classes.f90 b/src/modules/fraggle_classes.f90 new file mode 100644 index 000000000..d6ea0ac32 --- /dev/null +++ b/src/modules/fraggle_classes.f90 @@ -0,0 +1,250 @@ +module fraggle_classes + !! 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 Fraggel: The Fragment Generation Model + use swiftest_globals + use swiftest_classes, only : swiftest_parameters, swiftest_nbody_system, swiftest_cb, swiftest_pl + implicit none + public + + integer(I4B), parameter :: FRAGGLE_NMASS_DIST = 3 !! Number of mass bins returned by the regime calculation (largest fragment, second largest, and remainder) + !******************************************************************************************************************************** + ! fraggle_colliders class definitions and method interfaces + !******************************************************************************************************************************* + !> Class definition for the variables that describe the bodies involved in the collision + type :: fraggle_colliders + integer(I4B) :: ncoll !! Number of bodies involved in the collision + integer(I4B), dimension(:), allocatable :: idx !! Index of bodies involved in the collision + real(DP), dimension(NDIM,2) :: xb !! Two-body equivalent position vectors of the collider bodies prior to collision + real(DP), dimension(NDIM,2) :: vb !! Two-body equivalent velocity vectors of the collider bodies prior to collision + real(DP), dimension(NDIM,2) :: rot !! Two-body equivalent principal axes moments of inertia the collider bodies prior to collision + real(DP), dimension(NDIM,2) :: L_spin !! Two-body equivalent spin angular momentum vectors of the collider bodies prior to collision + real(DP), dimension(NDIM,2) :: L_orbit !! Two-body equivalent orbital angular momentum vectors of the collider bodies prior to collision + real(DP), dimension(NDIM,2) :: Ip !! Two-body equivalent principal axes moments of inertia the collider bodies prior to collision + real(DP), dimension(2) :: mass !! Two-body equivalent mass of the collider bodies prior to the collision + real(DP), dimension(2) :: radius !! Two-body equivalent radii of the collider bodies prior to the collision + contains + procedure :: regime => fraggle_regime_colliders !! Determine which fragmentation regime the set of colliders will be + end type fraggle_colliders + + !******************************************************************************************************************************** + ! fraggle_fragments class definitions and method interfaces + !******************************************************************************************************************************* + !> Class definition for the variables that describe a collection of fragments by Fraggle barycentric coordinates + type, extends(swiftest_pl) :: fraggle_fragments + real(DP) :: mtot !! Total mass of fragments + real(DP) :: Qloss !! Energy lost during the collision + real(DP), dimension(FRAGGLE_NMASS_DIST) :: mass_dist !! Distribution of fragment mass determined by the regime calculation (largest fragment, second largest, and remainder) + integer(I4B) :: regime !! Collresolve regime code for this collision + + ! Values in a coordinate frame centered on the collider barycenter and collisional system unit vectors (these are used internally by the fragment generation subroutine) + real(DP), dimension(NDIM) :: xbcom !! Center of mass position vector of the collider system in system barycentric coordinates + real(DP), dimension(NDIM) :: vbcom !! Velocity vector of the center of mass of the collider system in system barycentric coordinates + real(DP), dimension(NDIM) :: x_coll_unit !! x-direction unit vector of collisional system + real(DP), dimension(NDIM) :: y_coll_unit !! y-direction unit vector of collisional system + real(DP), dimension(NDIM) :: z_coll_unit !! z-direction unit vector of collisional system + real(DP), dimension(:,:), allocatable :: x_coll !! Array of fragment position vectors in the collisional coordinate frame + real(DP), dimension(:,:), allocatable :: v_coll !! Array of fragment velocity vectors in the collisional coordinate frame + real(DP), dimension(:,:), allocatable :: v_r_unit !! Array of radial direction unit vectors of individual fragments in the collisional coordinate frame + real(DP), dimension(:,:), allocatable :: v_t_unit !! Array of tangential direction unit vectors of individual fragments in the collisional coordinate frame + real(DP), dimension(:,:), allocatable :: v_n_unit !! Array of normal direction unit vectors of individual fragments in the collisional coordinate frame + real(DP), dimension(:), allocatable :: rmag !! Array of radial distance magnitudes of individual fragments in the collisional coordinate frame + real(DP), dimension(:), allocatable :: rotmag !! Array of rotation magnitudes of individual fragments + real(DP), dimension(:), allocatable :: v_r_mag !! Array of radial direction velocity magnitudes of individual fragments + real(DP), dimension(:), allocatable :: v_t_mag !! Array of tangential direction velocity magnitudes of individual fragments + + ! Energy and momentum book-keeping variables that characterize the whole system of fragments + real(DP) :: ke_orbit !! Current orbital kinetic energy of the system of fragments in the collisional frame + real(DP) :: ke_spin !! Current spin kinetic energy of the system of fragments in the collisional frame + real(DP), dimension(NDIM) :: L_orbit !! Current orbital angular momentum of the system of fragments in the collisional frame + real(DP), dimension(NDIM) :: L_spin !! Current spin angular momentum of the system of fragments in the collisional frame + real(DP) :: ke_budget !! Total kinetic energy budget for the system of fragmens in the collisional frame + real(DP), dimension(NDIM) :: L_budget !! Total angular momentum budget for the system of fragmens in the collisional frame + + ! For the following variables, "before" refers to the *entire* n-body system in its pre-collisional state and "after" refers to the system in its post-collisional state + real(DP), dimension(NDIM) :: Lorbit_before, Lorbit_after !! Before/after orbital angular momentum + real(DP), dimension(NDIM) :: Lspin_before, Lspin_after !! Before/after spin angular momentum + real(DP), dimension(NDIM) :: Ltot_before, Ltot_after !! Before/after total system angular momentum + real(DP) :: ke_orbit_before, ke_orbit_after !! Before/after orbital kinetic energy + real(DP) :: ke_spin_before, ke_spin_after !! Before/after spin kinetic energy + real(DP) :: pe_before, pe_after !! Before/after potential energy + real(DP) :: Etot_before, Etot_after !! Before/after total system energy + + ! Scale factors used to scale dimensioned quantities to a more "natural" system where important quantities (like kinetic energy, momentum) are of order ~1 + real(DP) :: dscale !! Distance dimension scale factor + real(DP) :: mscale !! Mass scale factor + real(DP) :: tscale !! Time scale factor + real(DP) :: vscale !! Velocity scale factor (a convenience unit that is derived from dscale and tscale) + real(DP) :: Escale !! Energy scale factor (a convenience unit that is derived from dscale, tscale, and mscale) + real(DP) :: Lscale !! Angular momentum scale factor (a convenience unit that is derived from dscale, tscale, and mscale) + contains + procedure :: generate_fragments => fraggle_generate_fragments !! Generates a system of fragments in barycentric coordinates that conserves energy and momentum. + procedure :: accel => fraggle_placeholder_accel !! Placeholder subroutine to fulfill requirement for an accel method + procedure :: kick => fraggle_placeholder_kick !! Placeholder subroutine to fulfill requirement for a kick method + procedure :: step => fraggle_placeholder_step !! Placeholder subroutine to fulfill requirement for a step method + procedure :: set_budgets => fraggle_set_budgets_fragments !! Sets the energy and momentum budgets of the fragments based on the collider value + procedure :: set_coordinate_system => fraggle_set_coordinate_system !! Defines the collisional coordinate system, including the unit vectors of both the system and individual fragments. + procedure :: set_mass_dist => fraggle_set_mass_dist_fragments !! Sets the distribution of mass among the fragments depending on the regime type + procedure :: set_natural_scale => fraggle_set_natural_scale_factors !! Scales dimenional quantities to ~O(1) with respect to the collisional system. + procedure :: set_original_scale => fraggle_set_original_scale_factors !! Restores dimenional quantities back to the original system units + procedure :: setup => fraggle_setup_fragments !! Allocates arrays for n fragments in a Fraggle system. Passing n = 0 deallocates all arrays. + procedure :: reset => fraggle_setup_reset_fragments !! Resets all position and velocity-dependent fragment quantities in order to do a fresh calculation (does not reset mass, radius, or other values that get set prior to the call to fraggle_generate) + procedure :: get_ang_mtm => fraggle_util_ang_mtm !! Calcualtes the current angular momentum of the fragments + procedure :: get_energy_and_momentum => fraggle_util_get_energy_momentum !! Calculates total system energy in either the pre-collision outcome state (lbefore = .true.) or the post-collision outcome state (lbefore = .false.) + procedure :: restructure => fraggle_util_restructure !! Restructure the inputs after a failed attempt failed to find a set of positions and velocities that satisfy the energy and momentum constraints + end type fraggle_fragments + + interface + module subroutine fraggle_generate_fragments(self, colliders, system, param, lfailure) + use swiftest_classes, only : swiftest_nbody_system, swiftest_parameters + implicit none + class(fraggle_fragments), intent(inout) :: self !! Fraggle fragment system object + class(fraggle_colliders), intent(inout) :: colliders !! Fraggle colliders object containing the two-body equivalent values of the colliding bodies + class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + logical, intent(out) :: lfailure !! Answers the question: Should this have been a merger instead? + end subroutine fraggle_generate_fragments + + !> The following interfaces are placeholders intended to satisfy the required abstract methods given by the parent class + module subroutine fraggle_placeholder_accel(self, system, param, t, lbeg) + use swiftest_classes, only : swiftest_nbody_system, swiftest_parameters + implicit none + class(fraggle_fragments), intent(inout) :: self !! Fraggle fragment 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, intent(in) :: lbeg !! Optional argument that determines whether or not this is the beginning or end of the step + end subroutine fraggle_placeholder_accel + + module subroutine fraggle_placeholder_kick(self, system, param, t, dt, lbeg) + use swiftest_classes, only : swiftest_nbody_system, swiftest_parameters + implicit none + class(fraggle_fragments), intent(inout) :: self !! Fraggle fragment system 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, intent(in) :: lbeg !! Logical flag indicating whether this is the beginning of the half step or not. + end subroutine fraggle_placeholder_kick + + module subroutine fraggle_placeholder_step(self, system, param, t, dt) + use swiftest_classes, only : swiftest_nbody_system, swiftest_parameters + implicit none + class(fraggle_fragments), intent(inout) :: self !! Helio massive body particle object + 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 + end subroutine fraggle_placeholder_step + + module subroutine fraggle_regime_colliders(self, frag, system, param) + implicit none + class(fraggle_colliders), intent(inout) :: self !! Fraggle colliders object + class(fraggle_fragments), intent(inout) :: frag !! Fraggle fragment system object + class(swiftest_nbody_system), intent(in) :: system !! Swiftest nbody system object + class(swiftest_parameters), intent(in) :: param !! Current Swiftest run configuration parameter + end subroutine fraggle_regime_colliders + + module subroutine fraggle_set_budgets_fragments(self, colliders) + implicit none + class(fraggle_fragments), intent(inout) :: self !! Fraggle fragment system object + class(fraggle_colliders), intent(inout) :: colliders !! Fraggle collider system object + end subroutine fraggle_set_budgets_fragments + + module subroutine fraggle_set_coordinate_system(self, colliders) + implicit none + class(fraggle_fragments), intent(inout) :: self !! Fraggle fragment system object + class(fraggle_colliders), intent(inout) :: colliders !! Fraggle collider system object + end subroutine fraggle_set_coordinate_system + + module subroutine fraggle_set_mass_dist_fragments(self, colliders) + implicit none + class(fraggle_fragments), intent(inout) :: self !! Fraggle fragment system object + class(fraggle_colliders), intent(inout) :: colliders !! Fraggle collider system object + end subroutine fraggle_set_mass_dist_fragments + + module subroutine fraggle_set_natural_scale_factors(self, colliders) + implicit none + class(fraggle_fragments), intent(inout) :: self !! Fraggle fragment system object + class(fraggle_colliders), intent(inout) :: colliders !! Fraggle collider system object + end subroutine fraggle_set_natural_scale_factors + + module subroutine fraggle_set_original_scale_factors(self, colliders) + implicit none + class(fraggle_fragments), intent(inout) :: self !! Fraggle fragment system object + class(fraggle_colliders), intent(inout) :: colliders !! Fraggle collider system object + end subroutine fraggle_set_original_scale_factors + + module subroutine fraggle_setup_fragments(self, n, param) + implicit none + class(fraggle_fragments), intent(inout) :: self !! Fraggle fragment system object + integer(I4B), intent(in) :: n !! Number of fragments + class(swiftest_parameters), intent(in) :: param !! Current swiftest run configuration parameters + end subroutine fraggle_setup_fragments + + module subroutine fraggle_setup_reset_fragments(self) + implicit none + class(fraggle_fragments), intent(inout) :: self + end subroutine fraggle_setup_reset_fragments + + module subroutine fraggle_util_add_fragments_to_system(frag, colliders, system, param) + use swiftest_classes, only : swiftest_nbody_system, swiftest_parameters + implicit none + class(fraggle_fragments), intent(in) :: frag !! Fraggle fragment system object + class(fraggle_colliders), intent(in) :: colliders !! Fraggle collider system object + class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object + class(swiftest_parameters), intent(in) :: param !! Current swiftest run configuration parameters + end subroutine fraggle_util_add_fragments_to_system + + module subroutine fraggle_util_ang_mtm(self) + implicit none + class(fraggle_fragments), intent(inout) :: self !! Fraggle fragment system object + end subroutine fraggle_util_ang_mtm + + module subroutine fraggle_util_construct_temporary_system(frag, system, param, tmpsys, tmpparam) + use swiftest_classes, only : swiftest_nbody_system, swiftest_parameters + implicit none + class(fraggle_fragments), intent(in) :: frag !! Fraggle fragment system object + class(swiftest_nbody_system), intent(in) :: system !! Original swiftest nbody system object + class(swiftest_parameters), intent(in) :: param !! Current swiftest run configuration parameters + class(swiftest_nbody_system), allocatable, intent(out) :: tmpsys !! Output temporary swiftest nbody system object + class(swiftest_parameters), allocatable, intent(out) :: tmpparam !! Output temporary configuration run parameters + end subroutine fraggle_util_construct_temporary_system + + module subroutine fraggle_util_get_energy_momentum(self, colliders, system, param, lbefore) + use swiftest_classes, only : swiftest_nbody_system, swiftest_parameters + implicit none + class(fraggle_fragments), intent(inout) :: self !! Fraggle fragment system object + class(fraggle_colliders), intent(inout) :: colliders !! Fraggle collider system object + class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object + class(swiftest_parameters), intent(in) :: param !! Current swiftest run configuration parameters + logical, intent(in) :: lbefore !! Flag indicating that this the "before" state of the system, with colliders included and fragments excluded or vice versa + end subroutine fraggle_util_get_energy_momentum + + module subroutine fraggle_util_restructure(self, colliders, try, f_spin, r_max_start) + implicit none + class(fraggle_fragments), intent(inout) :: self !! Fraggle fragment system object + class(fraggle_colliders), intent(in) :: colliders !! Fraggle collider system object + integer(I4B), intent(in) :: try !! The current number of times Fraggle has tried to find a solution + real(DP), intent(inout) :: f_spin !! Fraction of energy/momentum that goes into spin. This decreases ater a failed attempt + real(DP), intent(inout) :: r_max_start !! The maximum radial distance that the position calculation starts with. This increases after a failed attempt + end subroutine fraggle_util_restructure + + module subroutine fraggle_util_shift_vector_to_origin(m_frag, vec_frag) + implicit none + 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 + end subroutine + + module function fraggle_util_vmag_to_vb(v_r_mag, v_r_unit, v_t_mag, v_t_unit, m_frag, vcom) result(vb) + implicit none + 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 + real(DP), dimension(:,:), allocatable :: vb + end function fraggle_util_vmag_to_vb + end interface + +end module fraggle_classes \ No newline at end of file diff --git a/src/modules/helio_classes.f90 b/src/modules/helio_classes.f90 index dcfcdde2e..1c93bdf6b 100644 --- a/src/modules/helio_classes.f90 +++ b/src/modules/helio_classes.f90 @@ -2,7 +2,7 @@ module helio_classes !! 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 Democratic Heliocentric Method - !! Adapted from David E. Kaufmann's Swifter routine: helio.f90 + !! Adapted from David E. Kaufmann's Swifter routine: module_helio.f90 use swiftest_globals use swiftest_classes, only : swiftest_cb, swiftest_pl, swiftest_tp, swiftest_nbody_system use whm_classes, only : whm_nbody_system @@ -38,7 +38,6 @@ module helio_classes contains 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 :: index => helio_util_index_eucl_plpl !! Sets up the (i, j) -> k indexing used for the single-loop blocking Euclidean distance matrix 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 @@ -214,12 +213,6 @@ module subroutine helio_step_tp(self, system, param, t, dt) real(DP), intent(in) :: dt !! Stepsizee end subroutine helio_step_tp - module subroutine helio_util_index_eucl_plpl(self, param) - use swiftest_classes, only : swiftest_parameters - implicit none - class(helio_pl), intent(inout) :: self !! Helio massive body object - class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters - end subroutine helio_util_index_eucl_plpl end interface end module helio_classes diff --git a/src/modules/swiftest.f90 b/src/modules/swiftest.f90 index 61d45163c..a6daff9a7 100644 --- a/src/modules/swiftest.f90 +++ b/src/modules/swiftest.f90 @@ -10,6 +10,7 @@ module swiftest use rmvs_classes use helio_classes use symba_classes + use fraggle_classes use lambda_function !use advisor_annotate !$ use omp_lib diff --git a/src/modules/swiftest_classes.f90 b/src/modules/swiftest_classes.f90 index 746781117..2694fcc25 100644 --- a/src/modules/swiftest_classes.f90 +++ b/src/modules/swiftest_classes.f90 @@ -573,31 +573,6 @@ module subroutine util_index_eucl_pltp(self, pl, param) class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters 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 !! Swiftest nbody system object - class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters - integer(I4B), dimension(:), intent(in) :: family !! Index of bodies involved in the collision - real(DP), dimension(:,:), intent(inout) :: x, v, L_spin, Ip !! Two-body equivalent position, vector, spin momentum, and rotational inertia values for the collision - real(DP), dimension(:), intent(inout) :: mass, radius !! Two-body equivalent mass and radii for the bodies in the collision - integer(I4B), intent(inout) :: nfrag !! Number of fragments to generate - real(DP), dimension(:), allocatable, intent(inout) :: m_frag, rad_frag !! Distribution of fragment mass and radii - real(DP), dimension(:,:), allocatable, intent(inout) :: Ip_frag !! Fragment rotational inertia vectors - real(DP), dimension(:,:), allocatable, intent(inout) :: xb_frag, vb_frag, rot_frag !! Fragment barycentric position, barycentric velocity, and rotation vectors - real(DP), intent(inout) :: Qloss !! Energy lost during the collision - logical, intent(out) :: lfailure !! Answers the question: Should this have been a merger instead? - end subroutine fragmentation_initialize - - module subroutine fragmentation_regime(Mcb, m1, m2, rad1, rad2, xh1, xh2, vb1, vb2, den1, den2, regime, Mlr, Mslr, min_mfrag, 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, min_mfrag - real(DP), dimension(:), intent(in) :: xh1, xh2, vb1, vb2 - real(DP), intent(out) :: Qloss !! Energy lost during the collision - end subroutine fragmentation_regime - module pure subroutine gr_kick_getaccb_ns_body(self, system, param) implicit none class(swiftest_body), intent(inout) :: self !! Swiftest generic body object @@ -1048,8 +1023,8 @@ end subroutine setup_initialize_system module subroutine setup_pl(self, n, param) implicit none - class(swiftest_pl), intent(inout) :: self !! Swiftest massive body object - integer(I4B), intent(in) :: n !! Number of particles 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 diff --git a/src/modules/symba_classes.f90 b/src/modules/symba_classes.f90 index 75d8e0e73..b929b5040 100644 --- a/src/modules/symba_classes.f90 +++ b/src/modules/symba_classes.f90 @@ -1,12 +1,13 @@ module symba_classes !! 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 Democratic SyMBAcentric Method - !! Adapted from David E. Kaufmann's Swifter routine: helio.f90 + !! Definition of classes and methods specific to the SyMBA integrator + !! Adapted from David E. Kaufmann's Swifter routine: module_symba.f90 use swiftest_globals use swiftest_classes, only : swiftest_parameters, swiftest_base, swiftest_encounter, swiftest_particle_info, netcdf_parameters use helio_classes, only : helio_cb, helio_pl, helio_tp, helio_nbody_system use rmvs_classes, only : rmvs_chk_ind + use fraggle_classes, only : fraggle_colliders, fraggle_fragments implicit none public @@ -66,7 +67,7 @@ module symba_classes 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 contains - 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 :: make_colliders => symba_collision_make_colliders_pl !! When a single body is involved in more than one collision in a single step, it becomes part of a family procedure :: index => symba_util_index_eucl_plpl !! Sets up the (i, j) -> k indexing used for the single-loop blocking Euclidean distance matrix 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 @@ -190,11 +191,11 @@ module subroutine symba_collision_encounter_extract_collisions(self, system, par class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters end subroutine - module subroutine symba_collision_make_family_pl(self,idx) + module subroutine symba_collision_make_colliders_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 + end subroutine symba_collision_make_colliders_pl module subroutine symba_collision_resolve_fragmentations(self, system, param) implicit none @@ -291,50 +292,44 @@ 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_collision_casedisruption(system, param, family, x, v, mass, radius, L_spin, Ip, mass_res, Qloss) result(status) + module function symba_collision_casedisruption(system, param, colliders, frag) result(status) + use fraggle_classes, only : fraggle_colliders, fraggle_fragments implicit none - class(symba_nbody_system), intent(inout) :: system !! SyMBA nbody system object - class(symba_parameters), intent(inout) :: param !! Current run configuration parameters with SyMBA 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 + class(symba_nbody_system), intent(inout) :: system !! SyMBA nbody system object + class(symba_parameters), intent(inout) :: param !! Current run configuration parameters with SyMBA additions + class(fraggle_colliders), intent(inout) :: colliders !! Fraggle colliders object + class(fraggle_fragments), intent(inout) :: frag !! Fraggle fragmentation system object + integer(I4B) :: status !! Status flag assigned to this outcome end function symba_collision_casedisruption - module function symba_collision_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(inout) :: 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 + module function symba_collision_casehitandrun(system, param, colliders, frag) result(status) + use fraggle_classes, only : fraggle_colliders, fraggle_fragments + implicit none + class(symba_nbody_system), intent(inout) :: system !! SyMBA nbody system object + class(symba_parameters), intent(inout) :: param !! Current run configuration parameters with SyMBA additions + class(fraggle_colliders), intent(inout) :: colliders !! Fraggle colliders object + class(fraggle_fragments), intent(inout) :: frag !! Fraggle fragmentation system object + integer(I4B) :: status !! Status flag assigned to this outcome end function symba_collision_casehitandrun - module function symba_collision_casemerge(system, param, family, x, v, mass, radius, L_spin, Ip) result(status) + module function symba_collision_casemerge(system, param, colliders, frag) result(status) + use fraggle_classes, only : fraggle_colliders, fraggle_fragments implicit none - class(symba_nbody_system), intent(inout) :: system !! SyMBA nbody system object - class(symba_parameters), intent(inout) :: param !! Current run configuration parameters with SyMBA 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 + class(symba_nbody_system), intent(inout) :: system !! SyMBA nbody system object + class(symba_parameters), intent(inout) :: param !! Current run configuration parameters with SyMBA additions + class(fraggle_colliders), intent(inout) :: colliders !! Fraggle colliders object + class(fraggle_fragments), intent(inout) :: frag !! Fraggle fragmentation system object + integer(I4B) :: status !! Status flag assigned to this outcome end function symba_collision_casemerge - module function symba_collision_casesupercatastrophic(system, param, family, x, v, mass, radius, L_spin, Ip, mass_res, Qloss) result(status) + module function symba_collision_casesupercatastrophic(system, param, colliders, frag) result(status) + use fraggle_classes, only : fraggle_colliders, fraggle_fragments implicit none - class(symba_nbody_system), intent(inout) :: system !! SyMBA nbody system object - class(symba_parameters), intent(inout) :: param !! Current run configuration parameters with SyMBA 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 + class(symba_nbody_system), intent(inout) :: system !! SyMBA nbody system object + class(symba_parameters), intent(inout) :: param !! Current run configuration parameters with SyMBA additions + class(fraggle_colliders), intent(inout) :: colliders !! Fraggle colliders object + class(fraggle_fragments), intent(inout) :: frag !! Fraggle fragmentation system object + integer(I4B) :: status !! Status flag assigned to this outcome end function symba_collision_casesupercatastrophic module subroutine symba_util_index_eucl_plpl(self, param) diff --git a/src/modules/whm_classes.f90 b/src/modules/whm_classes.f90 index 1b8d13b45..9675f289d 100644 --- a/src/modules/whm_classes.f90 +++ b/src/modules/whm_classes.f90 @@ -34,7 +34,6 @@ 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 :: index => whm_util_index_eucl_plpl !! Sets up the (i, j) -> k indexing used for the single-loop blocking Euclidean distance matrix 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 :: accel => whm_kick_getacch_pl !! Compute heliocentric accelerations of massive bodies diff --git a/src/setup/setup.f90 b/src/setup/setup.f90 index 504faca35..41c0d9fba 100644 --- a/src/setup/setup.f90 +++ b/src/setup/setup.f90 @@ -81,7 +81,6 @@ module subroutine setup_encounter(self, n) 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) @@ -97,6 +96,7 @@ module subroutine setup_encounter(self, n) if (allocated(self%v2)) deallocate(self%v2) if (allocated(self%t)) deallocate(self%t) + self%nenc = n if (n == 0) return allocate(self%lvdotr(n)) @@ -206,7 +206,6 @@ module subroutine setup_body(self, n, param) ! Internals integer(I4B) :: i - self%nbody = n if (n < 0) return self%lfirst = .true. @@ -234,6 +233,7 @@ module subroutine setup_body(self, n, param) if (allocated(self%omega)) deallocate(self%omega) if (allocated(self%capm)) deallocate(self%capm) + self%nbody = n if (n == 0) return allocate(self%info(n)) diff --git a/src/symba/symba_collision.f90 b/src/symba/symba_collision.f90 index 384102ffc..a3bf27e99 100644 --- a/src/symba/symba_collision.f90 +++ b/src/symba/symba_collision.f90 @@ -5,81 +5,37 @@ integer(I4B), parameter :: NFRAG_SUPERCAT = 20 contains - module function symba_collision_casedisruption(system, param, family, x, v, mass, radius, L_spin, Ip, mass_res, Qloss) result(status) + module function symba_collision_casedisruption(system, param, colliders, frag) 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(inout) :: 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 + class(symba_nbody_system), intent(inout) :: system !! SyMBA nbody system object + class(symba_parameters), intent(inout) :: param !! Current run configuration parameters with SyMBA additions + class(fraggle_colliders), intent(inout) :: colliders !! Fraggle colliders object + class(fraggle_fragments), intent(inout) :: frag !! Fraggle fragmentation system object ! Result - integer(I4B) :: status !! Status flag assigned to this outcome + integer(I4B) :: status !! Status flag assigned to this outcome ! Internals - integer(I4B) :: i, istart, nfrag, 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 - integer(I4B), dimension(:), allocatable :: id_frag - logical :: lfailure + integer(I4B) :: i, nfrag + logical :: lfailure character(len=STRMAX) :: collider_message collider_message = "Disruption between" - call symba_collision_collider_message(system%pl, family, collider_message) + call symba_collision_collider_message(system%pl, colliders%idx, collider_message) write(*,*) trim(adjustl(collider_message)) ! Collisional fragments will be uniformly distributed around the pre-impact barycenter nfrag = NFRAG_DISRUPT - allocate(m_frag(nfrag)) - allocate(rad_frag(nfrag)) - allocate(xb_frag(NDIM, nfrag)) - allocate(vb_frag(NDIM, nfrag)) - allocate(rot_frag(NDIM, nfrag)) - allocate(Ip_frag(NDIM, nfrag)) - allocate(id_frag(nfrag)) - - mtot = sum(mass(:)) - xcom(:) = (mass(1) * x(:,1) + mass(2) * x(:,2)) / mtot - vcom(:) = (mass(1) * v(:,1) + mass(2) * v(:,2)) / mtot - - ! Get mass weighted mean of Ip and average density - Ip_new(:) = (mass(1) * Ip(:,1) + mass(2) * Ip(:,2)) / mtot - vol(:) = 4._DP / 3._DP * PI * radius(:)**3 - avg_dens = mtot / sum(vol(:)) - - ! Distribute the mass among fragments, with a branch to check for the size of the second largest fragment - m_frag(1) = mass_res(1) - if (mass_res(2) > mass_res(1) / 3._DP) then - m_frag(2) = mass_res(2) - istart = 3 - else - istart = 2 - end if - ! Distribute remaining mass among the remaining bodies - do i = istart, nfrag - m_frag(i) = (mtot - sum(m_frag(1:istart - 1))) / (nfrag - istart + 1) - end do + call frag%setup(nfrag, param) + call frag%set_mass_dist(colliders) + frag%id(1:nfrag) = [(i, i = param%maxid + 1, param%maxid + nfrag)] + param%maxid = frag%id(nfrag) - ! Distribute any residual mass if there is any and set the radius - m_frag(nfrag) = m_frag(nfrag) + (mtot - sum(m_frag(:))) - rad_frag(1:nfrag) = (3 * m_frag(:) / (4 * PI * avg_dens))**(1.0_DP / 3.0_DP) - id_frag(1:nfrag) = [(i, i = param%maxid + 1, param%maxid + nfrag)] - param%maxid = id_frag(nfrag) - - do i = 1, nfrag - Ip_frag(:, i) = Ip_new(:) - end do - - call fragmentation_initialize(system, param, family, x, v, L_spin, Ip, mass, radius, & - nfrag, Ip_frag, m_frag, rad_frag, xb_frag, vb_frag, rot_frag, Qloss, lfailure) + ! Generate the position and velocity distributions of the fragments + call frag%generate_fragments(colliders, system, param, lfailure) if (lfailure) then write(*,*) 'No fragment solution found, so treat as a pure hit-and-run' @@ -87,61 +43,45 @@ module function symba_collision_casedisruption(system, param, family, x, v, mass nfrag = 0 select type(pl => system%pl) class is (symba_pl) - pl%status(family(:)) = status - pl%ldiscard(family(:)) = .false. - pl%lcollision(family(:)) = .false. + pl%status(colliders%idx(:)) = status + pl%ldiscard(colliders%idx(:)) = .false. + pl%lcollision(colliders%idx(:)) = .false. end select else ! Populate the list of new bodies write(*,'("Generating ",I2.0," fragments")') nfrag status = DISRUPTION - call symba_collision_mergeaddsub(system, param, family, id_frag, Ip_frag, m_frag, rad_frag, xb_frag, vb_frag, rot_frag, status) + call symba_collision_mergeaddsub(system, param, colliders, frag, status) end if return end function symba_collision_casedisruption - module function symba_collision_casehitandrun(system, param, family, x, v, mass, radius, L_spin, Ip, mass_res, Qloss) result(status) + module function symba_collision_casehitandrun(system, param, colliders, frag) 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(inout) :: 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 + class(symba_nbody_system), intent(inout) :: system !! SyMBA nbody system object + class(symba_parameters), intent(inout) :: param !! Current run configuration parameters with SyMBA additions + class(fraggle_colliders), intent(inout) :: colliders !! Fraggle colliders object + class(fraggle_fragments), intent(inout) :: frag !! Fraggle fragmentation system object ! Result - integer(I4B) :: status !! Status flag assigned to this outcome + integer(I4B) :: status !! Status flag assigned to this outcom ! Internals - integer(I4B) :: i, j, nfrag, jproj, jtarg, idstart, ibiggest, nfamily - 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 + integer(I4B) :: i, ibiggest, nfrag, jtarg, jproj + logical :: lpure character(len=STRMAX) :: collider_message character(len=NAMELEN) :: idstr collider_message = "Hit and run between" - call symba_collision_collider_message(system%pl, family, collider_message) + call symba_collision_collider_message(system%pl, colliders%idx, collider_message) write(*,*) trim(adjustl(collider_message)) - 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 + if (colliders%mass(1) > colliders%mass(2)) then jtarg = 1 jproj = 2 else @@ -149,44 +89,23 @@ module function symba_collision_casehitandrun(system, param, family, x, v, mass, 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 + if (frag%mass_dist(2) > 0.9_DP * colliders%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 = family(maxloc(system%pl%Gmass(family(:)), dim=1)) - id_frag(1) = system%pl%id(ibiggest) - rad_frag(1) = radius(jtarg) - xb_frag(:, 1) = x(:, jtarg) - vb_frag(:, 1) = v(:, jtarg) - Ip_frag(:,1) = Ip(:, jtarg) - - ! Get mass weighted mean of Ip and average density - vol(:) = 4._DP / 3._DP * pi * radius(:)**3 - avg_dens = mass(jproj) / vol(jproj) - m_frag(2:nfrag) = (mtot - m_frag(1)) / (nfrag - 1) - rad_frag(2:nfrag) = (3 * m_frag(2:nfrag) / (4 * PI * avg_dens))**(1.0_DP / 3.0_DP) - m_frag(nfrag) = m_frag(nfrag) + (mtot - sum(m_frag(:))) - id_frag(2:nfrag) = [(i, i = param%maxid + 1, param%maxid + nfrag - 1)] - param%maxid = id_frag(nfrag) - - do i = 1, nfrag - Ip_frag(:, i) = Ip(:, jproj) - end do + call frag%setup(nfrag, param) + call frag%set_mass_dist(colliders) + ibiggest = colliders%idx(maxloc(system%pl%Gmass(colliders%idx(:)), dim=1)) + frag%id(1) = system%pl%id(ibiggest) + frag%id(2:nfrag) = [(i, i = param%maxid + 1, param%maxid + nfrag - 1)] + param%maxid = frag%id(nfrag) + + ! Generate the position and velocity distributions of the fragments + call frag%generate_fragments(colliders, system, param, lpure) - ! 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 @@ -198,20 +117,20 @@ module function symba_collision_casehitandrun(system, param, family, x, v, mass, status = HIT_AND_RUN_PURE select type(pl => system%pl) class is (symba_pl) - pl%status(family(:)) = ACTIVE - pl%ldiscard(family(:)) = .false. - pl%lcollision(family(:)) = .false. + pl%status(colliders%idx(:)) = ACTIVE + pl%ldiscard(colliders%idx(:)) = .false. + pl%lcollision(colliders%idx(:)) = .false. end select else status = HIT_AND_RUN_DISRUPT - call symba_collision_mergeaddsub(system, param, family, id_frag, Ip_frag, m_frag, rad_frag, xb_frag, vb_frag, rot_frag, status) + call symba_collision_mergeaddsub(system, param, colliders, frag, status) end if return end function symba_collision_casehitandrun - module function symba_collision_casemerge(system, param, family, x, v, mass, radius, L_spin, Ip) result(status) + module function symba_collision_casemerge(system, param, colliders, frag) result(status) !! author: Jennifer L.L. Pouplin, Carlisle A. Wishard, and David A. Minton !! !! Merge planets. @@ -221,76 +140,48 @@ module function symba_collision_casemerge(system, param, family, x, v, mass, rad !! 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(inout) :: 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 + class(symba_nbody_system), intent(inout) :: system !! SyMBA nbody system object + class(symba_parameters), intent(inout) :: param !! Current run configuration parameters with SyMBA additions + class(fraggle_colliders), intent(inout) :: colliders !! Fraggle colliders object + class(fraggle_fragments), intent(inout) :: frag !! Fraggle fragmentation system object ! Result - integer(I4B) :: status !! Status flag assigned to this outcome + integer(I4B) :: status !! Status flag assigned to this outcome ! Internals - integer(I4B) :: i, j, k, ibiggest, nfamily - real(DP) :: volume_new, pe - real(DP), dimension(NDIM) :: xc, vc, xcrossv - real(DP), dimension(2) :: vol - real(DP), dimension(NDIM) :: L_orb_old, L_spin_old + integer(I4B) :: i, j, k, ibiggest + real(DP), dimension(2) :: volume, density + real(DP) :: pe real(DP), dimension(NDIM) :: L_spin_new - logical, dimension(system%pl%nbody) :: lmask - real(DP), dimension(NDIM, 1) :: vb_frag, xb_frag, rot_frag, Ip_frag - real(DP), dimension(1) :: m_frag, rad_frag - integer(I4B), dimension(1) :: id_frag character(len=STRMAX) :: collider_message character(len=NAMELEN) :: idstr collider_message = "Merging" - call symba_collision_collider_message(system%pl, family, collider_message) + call symba_collision_collider_message(system%pl, colliders%idx, collider_message) write(*,*) trim(adjustl(collider_message)) select type(pl => system%pl) class is (symba_pl) - ibiggest = family(maxloc(pl%Gmass(family(:)), dim=1)) - id_frag(1) = pl%id(ibiggest) - - m_frag(1) = sum(mass(:)) - - ! Merged body is created at the barycenter of the original bodies - xb_frag(:,1) = (mass(1) * x(:,1) + mass(2) * x(:,2)) / m_frag(1) - vb_frag(:,1) = (mass(1) * v(:,1) + mass(2) * v(:,2)) / m_frag(1) + call frag%setup(1, param) + call frag%set_mass_dist(colliders) + ibiggest = colliders%idx(maxloc(pl%Gmass(colliders%idx(:)), dim=1)) + frag%id(1) = pl%id(ibiggest) + frag%xb(:,1) = frag%xbcom(:) + frag%vb(:,1) = frag%vbcom(:) - ! Get mass weighted mean of Ip and - vol(:) = 4._DP / 3._DP * PI * radius(:)**3 - volume_new = sum(vol(:)) - rad_frag(1) = (3 * volume_new / (4 * PI))**(1._DP / 3._DP) - - L_orb_old(:) = 0.0_DP - - ! Compute orbital angular momentum of pre-impact system - do i = 1, 2 - xc(:) = x(:, i) - xb_frag(:,1) - vc(:) = v(:, i) - vb_frag(:,1) - xcrossv(:) = xc(:) .cross. vc(:) - L_orb_old(:) = L_orb_old(:) + mass(i) * xcrossv(:) - end do - if (param%lrotation) then - Ip_frag(:,1) = (mass(1) * Ip(:,1) + mass(2) * Ip(:,2)) / m_frag(1) - L_spin_old(:) = L_spin(:,1) + L_spin(:,2) - ! Conserve angular momentum by putting pre-impact orbital momentum into spin of the new body - L_spin_new(:) = L_orb_old(:) + L_spin_old(:) + L_spin_new(:) = colliders%L_orbit(:,1) + colliders%L_orbit(:,2) + colliders%L_spin(:,1) + colliders%L_spin(:,2) ! Assume prinicpal axis rotation on 3rd Ip axis - rot_frag(:,1) = L_spin_new(:) / (Ip_frag(3,1) * m_frag(1) * rad_frag(1)**2) + frag%rot(:,1) = L_spin_new(:) / (frag%Ip(3,1) * frag%mass(1) * frag%radius(1)**2) else ! If spin is not enabled, we will consider the lost pre-collision angular momentum as "escaped" and add it to our bookkeeping variable - param%Lescape(:) = param%Lescape(:) + L_orb_old(:) + param%Lescape(:) = param%Lescape(:) + colliders%L_orbit(:,1) + colliders%L_orbit(:,2) end if - ! Keep track of the component of potential energy due to the pre-impact family for book-keeping - nfamily = size(family(:)) + ! Keep track of the component of potential energy due to the pre-impact colliders%idx for book-keeping pe = 0.0_DP - do j = 1, nfamily - do i = j + 1, nfamily + do j = 1, colliders%ncoll + do i = j + 1, colliders%ncoll pe = pe - pl%Gmass(i) * pl%mass(j) / norm2(pl%xb(:, i) - pl%xb(:, j)) end do end do @@ -299,8 +190,8 @@ module function symba_collision_casemerge(system, param, family, x, v, mass, rad ! Update any encounter lists that have the removed bodies in them so that they instead point to the new do k = 1, system%plplenc_list%nenc - do j = 1, nfamily - i = family(j) + do j = 1, colliders%ncoll + i = colliders%idx(j) if (i == ibiggest) cycle if (system%plplenc_list%id1(k) == pl%id(i)) then system%plplenc_list%id1(k) = pl%id(ibiggest) @@ -316,7 +207,7 @@ module function symba_collision_casemerge(system, param, family, x, v, mass, rad status = MERGED - call symba_collision_mergeaddsub(system, param, family, id_frag, Ip_frag, m_frag, rad_frag, xb_frag, vb_frag, rot_frag, status) + call symba_collision_mergeaddsub(system, param, colliders, frag, status) end select @@ -324,80 +215,37 @@ module function symba_collision_casemerge(system, param, family, x, v, mass, rad end function symba_collision_casemerge - module function symba_collision_casesupercatastrophic(system, param, family, x, v, mass, radius, L_spin, Ip, mass_res, Qloss) result(status) + module function symba_collision_casesupercatastrophic(system, param, colliders, frag) 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(inout) :: 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 + class(symba_nbody_system), intent(inout) :: system !! SyMBA nbody system object + class(symba_parameters), intent(inout) :: param !! Current run configuration parameters with SyMBA additions + class(fraggle_colliders), intent(inout) :: colliders !! Fraggle colliders object + class(fraggle_fragments), intent(inout) :: frag !! Fraggle fragmentation system object ! Result - integer(I4B) :: status !! Status flag assigned to this outcome + integer(I4B) :: status !! Status flag assigned to this outcom ! Internals - integer(I4B) :: i, j, nfrag, ibiggest, nfamily, 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 - integer(I4B), dimension(:), allocatable :: id_frag + integer(I4B) :: i, j, nfrag logical :: lfailure - logical, dimension(system%pl%nbody) :: lmask character(len=STRMAX) :: collider_message character(len=NAMELEN) :: idstr collider_message = "Supercatastrophic disruption between" - call symba_collision_collider_message(system%pl, family, collider_message) + call symba_collision_collider_message(system%pl, colliders%idx, collider_message) write(*,*) trim(adjustl(collider_message)) - ! Collisional fragments will be uniformly distributed around the pre-impact barycenter nfrag = NFRAG_SUPERCAT - allocate(m_frag(nfrag)) - allocate(rad_frag(nfrag)) - allocate(id_frag(nfrag)) - allocate(xb_frag(NDIM, nfrag)) - allocate(vb_frag(NDIM, nfrag)) - allocate(rot_frag(NDIM, nfrag)) - allocate(Ip_frag(NDIM, nfrag)) - - mtot = sum(mass(:)) - xcom(:) = (mass(1) * x(:,1) + mass(2) * x(:,2)) / mtot - vcom(:) = (mass(1) * v(:,1) + mass(2) * v(:,2)) / mtot - - ! Get mass weighted mean of Ip and average density - Ip_new(:) = (mass(1) * Ip(:,1) + mass(2) * Ip(:,2)) / mtot - vol(:) = 4._DP / 3._DP * pi * radius(:)**3 - avg_dens = mtot / sum(vol(:)) - - ! If we are adding the first and largest fragment (lr), check to see if its mass is SMALLER than an equal distribution of - ! mass between all fragments. If so, we will just distribute the mass equally between the fragments - min_frag_mass = mtot / nfrag - if (mass_res(1) < min_frag_mass) then - m_frag(:) = min_frag_mass - else - m_frag(1) = mass_res(1) - m_frag(2:nfrag) = (mtot - mass_res(1)) / (nfrag - 1) - end if - ! Distribute any residual mass if there is any and set the radius - m_frag(nfrag) = m_frag(nfrag) + (mtot - sum(m_frag(:))) - rad_frag(1:nfrag) = (3 * m_frag(:) / (4 * PI * avg_dens))**(1.0_DP / 3.0_DP) - id_frag(1:nfrag) = [(i, i = param%maxid + 1, param%maxid + nfrag)] - param%maxid = id_frag(nfrag) - - do i = 1, nfrag - Ip_frag(:, i) = Ip_new(:) - end do + call frag%setup(nfrag, param) + call frag%set_mass_dist(colliders) + frag%id(1:nfrag) = [(i, i = param%maxid + 1, param%maxid + nfrag)] + param%maxid = frag%id(nfrag) - 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) + ! Generate the position and velocity distributions of the fragments + call frag%generate_fragments(colliders, system, param, lfailure) if (lfailure) then write(*,*) 'No fragment solution found, so treat as a pure hit-and-run' @@ -405,22 +253,22 @@ module function symba_collision_casesupercatastrophic(system, param, family, x, nfrag = 0 select type(pl => system%pl) class is (symba_pl) - pl%status(family(:)) = status - pl%ldiscard(family(:)) = .false. - pl%lcollision(family(:)) = .false. + pl%status(colliders%idx(:)) = status + pl%ldiscard(colliders%idx(:)) = .false. + pl%lcollision(colliders%idx(:)) = .false. end select else ! Populate the list of new bodies write(*,'("Generating ",I2.0," fragments")') nfrag status = SUPERCATASTROPHIC - call symba_collision_mergeaddsub(system, param, family, id_frag, Ip_frag, m_frag, rad_frag, xb_frag, vb_frag, rot_frag, status) + call symba_collision_mergeaddsub(system, param, colliders, frag, status) end if return end function symba_collision_casesupercatastrophic - subroutine symba_collision_collider_message(pl, family, collider_message) + subroutine symba_collision_collider_message(pl, collidx, collider_message) !! author: David A. Minton !! !! Prints a nicely formatted message about which bodies collided, including their names and ids. @@ -428,19 +276,19 @@ subroutine symba_collision_collider_message(pl, family, collider_message) implicit none ! Arguments class(swiftest_pl), intent(in) :: pl !! Swiftest massive body object - integer(I4B), dimension(:), intent(in) :: family !! Index of collisional family members + integer(I4B), dimension(:), intent(in) :: collidx !! Index of collisional colliders%idx members character(*), intent(inout) :: collider_message !! The message to print to the screen. ! Internals integer(I4B) :: i, n character(len=STRMAX) :: idstr - n = size(family) + n = size(collidx) if (n == 0) return do i = 1, n if (i > 1) collider_message = trim(adjustl(collider_message)) // " and " - collider_message = " " // trim(adjustl(collider_message)) // " " // trim(adjustl(pl%info(family(i))%name)) - write(idstr, '(I10)') pl%id(family(i)) + collider_message = " " // trim(adjustl(collider_message)) // " " // trim(adjustl(pl%info(collidx(i))%name)) + write(idstr, '(I10)') pl%id(collidx(i)) collider_message = trim(adjustl(collider_message)) // " (" // trim(adjustl(idstr)) // ") " end do @@ -534,8 +382,8 @@ module function symba_collision_check_encounter(self, system, param, t, dt, irec self%x2(:,k) = pl%xh(:,j) + system%cb%xb(:) self%v2(:,k) = pl%vb(:,j) if (lcollision(k)) then - ! 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(i) .or. pl%lcollision(j)) call pl%make_family([i,j]) + ! Check to see if either of these bodies has been involved with a collision before, and if so, make this a collisional colliders%idx + if (pl%lcollision(i) .or. pl%lcollision(j)) call pl%make_colliders([i,j]) ! Set the collision flag for these to bodies to true in case they become involved in another collision later in the step pl%lcollision([i, j]) = .true. @@ -619,10 +467,10 @@ 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, cb, param, idx_parent, family, x, v, mass, radius, L_spin, Ip) result(lflag) + function symba_collision_consolidate_colliders(pl, cb, param, idx_parent, colliders) 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, + !! Loops through the pl-pl collision list and groups families together by index. Outputs the indices of all colliders%idx 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 @@ -630,22 +478,21 @@ function symba_collision_consolidate_familes(pl, cb, param, idx_parent, family, class(symba_cb), intent(inout) :: cb !! SyMBA central 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 - real(DP), dimension(2), intent(out) :: mass, radius !! Output values that represent a 2-body equivalent of a possibly 2+ body collision + class(fraggle_colliders), intent(out) :: colliders ! Result - logical :: lflag !! Logical flag indicating whether a family was successfully created or not + logical :: lflag !! Logical flag indicating whether a colliders%idx was successfully created or not ! Internals - type family_array + type collidx_array integer(I4B), dimension(:), allocatable :: id integer(I4B), dimension(:), allocatable :: idx - end type family_array - type(family_array), dimension(2) :: parent_child_index_array + end type collidx_array + type(collidx_array), dimension(2) :: parent_child_index_array integer(I4B), dimension(2) :: nchild - integer(I4B) :: i, j, fam_size, idx_child + integer(I4B) :: i, j, ncolliders, idx_child real(DP), dimension(2) :: volume, density real(DP) :: mchild, mtot, volchild real(DP), dimension(NDIM) :: xc, vc, xcom, vcom, xchild, vchild, xcrossv + real(DP), dimension(NDIM,2) :: mxc, vcc 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 @@ -663,9 +510,9 @@ function symba_collision_consolidate_familes(pl, cb, param, idx_parent, family, 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 + colliders%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 + colliders%radius(:) = pl%radius(idx_parent(:)) + volume(:) = (4.0_DP / 3.0_DP) * PI * colliders%radius(:)**3 ! Group together the ids and indexes of each collisional parent and its children do j = 1, 2 @@ -682,23 +529,24 @@ function symba_collision_consolidate_familes(pl, cb, param, idx_parent, family, 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%lcollision(family(:))) - family = pack(family(:), pl%lcollision(family(:))) - L_spin(:,:) = 0.0_DP - Ip(:,:) = 0.0_DP + ! Consolidate the groups of collsional parents with any children they may have into a single "colliders%idx" index array + ncolliders = 2 + sum(nchild(:)) + allocate(colliders%idx(ncolliders)) + colliders%idx = [parent_child_index_array(1)%idx(:),parent_child_index_array(2)%idx(:)] + + colliders%ncoll = count(pl%lcollision(colliders%idx(:))) + colliders%idx = pack(colliders%idx(:), pl%lcollision(colliders%idx(:))) + colliders%L_spin(:,:) = 0.0_DP + colliders%Ip(:,:) = 0.0_DP ! Find the barycenter of each body along with its children, if it has any do j = 1, 2 - x(:, j) = pl%xh(:, idx_parent(j)) + cb%xb(:) - v(:, j) = pl%vb(:, idx_parent(j)) + colliders%xb(:, j) = pl%xh(:, idx_parent(j)) + cb%xb(:) + colliders%vb(:, j) = pl%vb(:, idx_parent(j)) ! Assume principal axis rotation about axis corresponding to highest moment of inertia (3rd Ip) 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)) + colliders%Ip(:, j) = colliders%mass(j) * pl%Ip(:, idx_parent(j)) + colliders%L_spin(:, j) = colliders%Ip(3, j) * colliders%radius(j)**2 * pl%rot(:, idx_parent(j)) end if if (nchild(j) > 0) then @@ -713,39 +561,47 @@ function symba_collision_consolidate_familes(pl, cb, param, idx_parent, family, ! Get angular momentum of the child-parent pair and add that to the spin ! Add the child's spin 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(:) + xcom(:) = (colliders%mass(j) * colliders%xb(:,j) + mchild * xchild(:)) / (colliders%mass(j) + mchild) + vcom(:) = (colliders%mass(j) * colliders%vb(:,j) + mchild * vchild(:)) / (colliders%mass(j) + mchild) + xc(:) = colliders%xb(:, j) - xcom(:) + vc(:) = colliders%vb(:, j) - vcom(:) xcrossv(:) = xc(:) .cross. vc(:) - L_spin(:, j) = L_spin(:, j) + mass(j) * xcrossv(:) + colliders%L_spin(:, j) = colliders%L_spin(:, j) + colliders%mass(j) * xcrossv(:) xc(:) = xchild(:) - xcom(:) vc(:) = vchild(:) - vcom(:) xcrossv(:) = xc(:) .cross. vc(:) - L_spin(:, j) = L_spin(:, j) + mchild * xcrossv(:) + colliders%L_spin(:, j) = colliders%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) + colliders%L_spin(:, j) = colliders%L_spin(:, j) + mchild * pl%Ip(3, idx_child) * pl%radius(idx_child)**2 * pl%rot(:, idx_child) + colliders%Ip(:, j) = colliders%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(:) + colliders%mass(j) = colliders%mass(j) + mchild + colliders%xb(:, j) = xcom(:) + colliders%vb(:, j) = vcom(:) 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) - if (param%lrotation) Ip(:, j) = Ip(:, j) / mass(j) + density(j) = colliders%mass(j) / volume(j) + colliders%radius(j) = (3 * volume(j) / (4 * PI))**(1.0_DP / 3.0_DP) + if (param%lrotation) colliders%Ip(:, j) = colliders%Ip(:, j) / colliders%mass(j) + + xcom(:) = (colliders%mass(1) * colliders%xb(:, 1) + colliders%mass(2) * colliders%xb(:, 2)) / sum(colliders%mass(:)) + vcom(:) = (colliders%mass(1) * colliders%vb(:, 1) + colliders%mass(2) * colliders%vb(:, 2)) / sum(colliders%mass(:)) + mxc(:, 1) = colliders%mass(1) * (colliders%xb(:, 1) - xcom(:)) + mxc(:, 2) = colliders%mass(2) * (colliders%xb(:, 2) - xcom(:)) + vcc(:, 1) = colliders%vb(:, 1) - vcom(:) + vcc(:, 2) = colliders%vb(:, 2) - vcom(:) + colliders%L_orbit(:,:) = mxc(:,:) .cross. vcc(:,:) end do lflag = .true. - ! Destroy the kinship relationships for all members of this family - call pl%reset_kinship(family(:)) + ! Destroy the kinship relationships for all members of this colliders%idx + call pl%reset_kinship(colliders%idx(:)) return - end function symba_collision_consolidate_familes + end function symba_collision_consolidate_colliders module subroutine symba_collision_encounter_extract_collisions(self, system, param) @@ -817,10 +673,10 @@ module subroutine symba_collision_encounter_extract_collisions(self, system, par end subroutine symba_collision_encounter_extract_collisions - module subroutine symba_collision_make_family_pl(self, idx) + module subroutine symba_collision_make_colliders_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. + !! When a single body is involved in more than one collision in a single step, it becomes part of a colliders%idx. !! 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. !! @@ -875,26 +731,23 @@ module subroutine symba_collision_make_family_pl(self, idx) end associate return - end subroutine symba_collision_make_family_pl + end subroutine symba_collision_make_colliders_pl - subroutine symba_collision_mergeaddsub(system, param, family, id_frag, Ip_frag, m_frag, rad_frag, xb_frag, vb_frag, rot_frag, status) + subroutine symba_collision_mergeaddsub(system, param, colliders, frag, status) !! author: David A. Minton !! !! Fills the pl_discards and pl_adds with removed and added bodies !! implicit none ! Arguments - class(symba_nbody_system), intent(inout) :: system !! SyMBA nbody system object - class(symba_parameters), intent(inout) :: param !! Current run configuration parameters with SyMBA additions - integer(I4B), dimension(:), intent(in) :: family !! List of indices of all bodies inovlved in the collision - integer(I4B), dimension(:), intent(in) :: id_frag !! List of fragment ids - real(DP), dimension(:), intent(in) :: m_frag, rad_frag !! Distribution of fragment mass and radii - real(DP), dimension(:,:), intent(in) :: Ip_frag !! Fragment rotational inertia vectors - real(DP), dimension(:,:), intent(in) :: xb_frag, vb_frag, rot_frag !! Fragment barycentric position, barycentric velocity, and rotation vectors - integer(I4B), intent(in) :: status !! Status flag to assign to adds + class(symba_nbody_system), intent(inout) :: system !! SyMBA nbody system object + class(symba_parameters), intent(inout) :: param !! Current run configuration parameters with SyMBA additions + class(fraggle_colliders), intent(inout) :: colliders !! Fraggle colliders object + class(fraggle_fragments), intent(inout) :: frag !! Fraggle fragmentation system object + integer(I4B), intent(in) :: status !! Status flag to assign to adds ! Internals - integer(I4B) :: i, ibiggest, ismallest, iother, nstart, nend, nfamily, nfrag + integer(I4B) :: i, ibiggest, ismallest, iother, nstart, nend, ncolliders, nfrag logical, dimension(system%pl%nbody) :: lmask class(symba_pl), allocatable :: plnew, plsub character(*), parameter :: FRAGFMT = '("Newbody",I0.7)' @@ -905,87 +758,87 @@ subroutine symba_collision_mergeaddsub(system, param, family, id_frag, Ip_frag, select type(pl_discards => system%pl_discards) class is (symba_merger) associate(info => pl%info, pl_adds => system%pl_adds, cb => system%cb, npl => pl%nbody) - ! Add the family bodies to the subtraction list - nfamily = size(family(:)) - nfrag = size(m_frag(:)) + ! Add the colliders%idx bodies to the subtraction list + ncolliders = colliders%ncoll + nfrag = size(frag%mass(:)) ! Setup new bodies allocate(plnew, mold=pl) call plnew%setup(nfrag, param) - ibiggest = family(maxloc(pl%Gmass(family(:)), dim=1)) - ismallest = family(minloc(pl%Gmass(family(:)), dim=1)) + ibiggest = colliders%idx(maxloc(pl%Gmass(colliders%idx(:)), dim=1)) + ismallest = colliders%idx(minloc(pl%Gmass(colliders%idx(:)), dim=1)) ! Copy over identification, information, and physical properties of the new bodies from the fragment list - plnew%id(1:nfrag) = id_frag(1:nfrag) - plnew%xb(:, 1:nfrag) = xb_frag(:, 1:nfrag) - plnew%vb(:, 1:nfrag) = vb_frag(:, 1:nfrag) + plnew%id(1:nfrag) = frag%id(1:nfrag) + plnew%xb(:, 1:nfrag) = frag%xb(:, 1:nfrag) + plnew%vb(:, 1:nfrag) = frag%vb(:, 1:nfrag) call pl%vb2vh(cb) call pl%xh2xb(cb) do i = 1, nfrag - plnew%xh(:,i) = xb_frag(:, i) - cb%xb(:) - plnew%vh(:,i) = vb_frag(:, i) - cb%vb(:) + plnew%xh(:,i) = frag%xb(:, i) - cb%xb(:) + plnew%vh(:,i) = frag%vb(:, i) - cb%vb(:) end do - plnew%mass(1:nfrag) = m_frag(1:nfrag) - plnew%Gmass(1:nfrag) = param%GU * m_frag(1:nfrag) - plnew%radius(1:nfrag) = rad_frag(1:nfrag) - plnew%density(1:nfrag) = m_frag(1:nfrag) / rad_frag(1:nfrag) + plnew%mass(1:nfrag) = frag%mass(1:nfrag) + plnew%Gmass(1:nfrag) = param%GU * frag%mass(1:nfrag) + plnew%radius(1:nfrag) = frag%radius(1:nfrag) + plnew%density(1:nfrag) = frag%mass(1:nfrag) / frag%radius(1:nfrag) call plnew%set_rhill(cb) select case(status) case(DISRUPTION) plnew%status(1:nfrag) = NEW_PARTICLE do i = 1, nfrag - write(newname, FRAGFMT) id_frag(i) + write(newname, FRAGFMT) frag%id(i) call plnew%info(i)%set_value(origin_type="Disruption", origin_time=param%t, name=newname, origin_xh=plnew%xh(:,i), origin_vh=plnew%vh(:,i)) end do - do i = 1, nfamily - if (family(i) == ibiggest) then + do i = 1, ncolliders + if (colliders%idx(i) == ibiggest) then iother = ismallest else iother = ibiggest end if - call pl%info(family(i))%set_value(status="Disruption", discard_time=param%t, discard_xh=pl%xh(:,i), discard_vh=pl%vh(:,i), discard_body_id=iother) + call pl%info(colliders%idx(i))%set_value(status="Disruption", discard_time=param%t, discard_xh=pl%xh(:,i), discard_vh=pl%vh(:,i), discard_body_id=iother) end do case(SUPERCATASTROPHIC) plnew%status(1:nfrag) = NEW_PARTICLE do i = 1, nfrag - write(newname, FRAGFMT) id_frag(i) + write(newname, FRAGFMT) frag%id(i) call plnew%info(i)%set_value(origin_type="Supercatastrophic", origin_time=param%t, name=newname, origin_xh=plnew%xh(:,i), origin_vh=plnew%vh(:,i)) end do - do i = 1, nfamily - if (family(i) == ibiggest) then + do i = 1, ncolliders + if (colliders%idx(i) == ibiggest) then iother = ismallest else iother = ibiggest end if - call pl%info(family(i))%set_value(status="Supercatastrophic", discard_time=param%t, discard_xh=pl%xh(:,i), discard_vh=pl%vh(:,i), discard_body_id=iother) + call pl%info(colliders%idx(i))%set_value(status="Supercatastrophic", discard_time=param%t, discard_xh=pl%xh(:,i), discard_vh=pl%vh(:,i), discard_body_id=iother) end do case(HIT_AND_RUN_DISRUPT) call plnew%info(1)%copy(pl%info(ibiggest)) plnew%status(1) = OLD_PARTICLE do i = 2, nfrag - write(newname, FRAGFMT) id_frag(i) + write(newname, FRAGFMT) frag%id(i) call plnew%info(i)%set_value(origin_type="Hit and run fragmention", origin_time=param%t, name=newname, origin_xh=plnew%xh(:,i), origin_vh=plnew%vh(:,i)) end do - do i = 1, nfamily - if (family(i) == ibiggest) cycle + do i = 1, ncolliders + if (colliders%idx(i) == ibiggest) cycle iother = ibiggest - call pl%info(family(i))%set_value(status="Hit and run fragmention", discard_time=param%t, discard_xh=pl%xh(:,i), discard_vh=pl%vh(:,i), discard_body_id=iother) + call pl%info(colliders%idx(i))%set_value(status="Hit and run fragmention", discard_time=param%t, discard_xh=pl%xh(:,i), discard_vh=pl%vh(:,i), discard_body_id=iother) end do case(MERGED) call plnew%info(1)%copy(pl%info(ibiggest)) plnew%status(1) = OLD_PARTICLE - do i = 1, nfamily - if (family(i) == ibiggest) cycle + do i = 1, ncolliders + if (colliders%idx(i) == ibiggest) cycle iother = ibiggest - call pl%info(family(i))%set_value(status="MERGED", discard_time=param%t, discard_xh=pl%xh(:,i), discard_vh=pl%vh(:,i), discard_body_id=iother) + call pl%info(colliders%idx(i))%set_value(status="MERGED", discard_time=param%t, discard_xh=pl%xh(:,i), discard_vh=pl%vh(:,i), discard_body_id=iother) end do end select if (param%lrotation) then - plnew%Ip(:, 1:nfrag) = Ip_frag(:, 1:nfrag) - plnew%rot(:, 1:nfrag) = rot_frag(:, 1:nfrag) + plnew%Ip(:, 1:nfrag) = frag%Ip(:, 1:nfrag) + plnew%rot(:, 1:nfrag) = frag%rot(:, 1:nfrag) end if if (param%ltides) then @@ -1008,11 +861,11 @@ subroutine symba_collision_mergeaddsub(system, param, family, id_frag, Ip_frag, pl_adds%ncomp(nstart:nend) = plnew%nbody ! Add the discarded bodies to the discard list - pl%status(family(:)) = MERGED - pl%ldiscard(family(:)) = .true. - pl%lcollision(family(:)) = .true. + pl%status(colliders%idx(:)) = MERGED + pl%ldiscard(colliders%idx(:)) = .true. + pl%lcollision(colliders%idx(:)) = .true. lmask(:) = .false. - lmask(family(:)) = .true. + lmask(colliders%idx(:)) = .true. call plnew%setup(0, param) deallocate(plnew) @@ -1021,11 +874,11 @@ subroutine symba_collision_mergeaddsub(system, param, family, id_frag, Ip_frag, call pl%spill(plsub, lmask, ldestructive=.false.) nstart = pl_discards%nbody + 1 - nend = pl_discards%nbody + nfamily - call pl_discards%append(plsub, lsource_mask=[(.true., i = 1, nfamily)]) + nend = pl_discards%nbody + ncolliders + call pl_discards%append(plsub, lsource_mask=[(.true., i = 1, ncolliders)]) ! Record how many bodies were subtracted in this event - pl_discards%ncomp(nstart:nend) = nfamily + pl_discards%ncomp(nstart:nend) = ncolliders call plsub%setup(0, param) deallocate(plsub) @@ -1049,18 +902,13 @@ module subroutine symba_collision_resolve_fragmentations(self, system, param) class(symba_parameters), intent(inout) :: 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, jtarg, jproj, regime - real(DP), dimension(2) :: radius_si, mass_si, density_si - real(DP) :: min_mfrag_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 + integer(I4B) :: i + type(fraggle_colliders) :: colliders !! Fraggle colliders object + type(fraggle_fragments) :: frag !! Fraggle fragmentation system object associate(plplcollision_list => self, ncollisions => self%nenc, idx1 => self%index1, idx2 => self%index2) select type(pl => system%pl) @@ -1070,52 +918,20 @@ module subroutine symba_collision_resolve_fragmentations(self, system, param) 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, cb, param, idx_parent, family, x, v, mass, radius, L_spin, Ip) + lgoodcollision = symba_collision_consolidate_colliders(pl, cb, param, idx_parent, colliders) if ((.not. lgoodcollision) .or. any(pl%status(idx_parent(:)) /= COLLISION)) cycle + + call colliders%regime(frag, system, param) - ! 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(:) = plplcollision_list%x1(:,i) * param%DU2M !! The position of the parent from inside the step (at collision) - v1_si(:) = plplcollision_list%v1(:,i) * param%DU2M / param%TU2S !! The velocity of the parent from inside the step (at collision) - x2_si(:) = plplcollision_list%x2(:,i) * param%DU2M !! The position of the parent from inside the step (at collision) - v2_si(:) = plplcollision_list%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 - min_mfrag_si = (param%min_GMfrag / 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, min_mfrag_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) - Qloss = Qloss * (param%TU2S / param%DU2M)**2 / param%MU2KG - - select case (regime) + select case (frag%regime) case (COLLRESOLVE_REGIME_DISRUPTION) - plplcollision_list%status(i) = symba_collision_casedisruption(system, param, family, x, v, mass, radius, L_spin, Ip, mass_res, Qloss) + plplcollision_list%status(i) = symba_collision_casedisruption(system, param, colliders, frag) case (COLLRESOLVE_REGIME_SUPERCATASTROPHIC) - plplcollision_list%status(i) = symba_collision_casesupercatastrophic(system, param, family, x, v, mass, radius, L_spin, Ip, mass_res, Qloss) + plplcollision_list%status(i) = symba_collision_casesupercatastrophic(system, param, colliders, frag) case (COLLRESOLVE_REGIME_HIT_AND_RUN) - plplcollision_list%status(i) = symba_collision_casehitandrun(system, param, family, x, v, mass, radius, L_spin, Ip, mass_res, Qloss) + plplcollision_list%status(i) = symba_collision_casehitandrun(system, param, colliders, frag) case (COLLRESOLVE_REGIME_MERGE, COLLRESOLVE_REGIME_GRAZE_AND_MERGE) - plplcollision_list%status(i) = symba_collision_casemerge(system, param, family, x, v, mass, radius, L_spin, Ip) + plplcollision_list%status(i) = symba_collision_casemerge(system, param, colliders, frag) case default write(*,*) "Error in symba_collision, unrecognized collision regime" call util_exit(FAILURE) @@ -1140,12 +956,13 @@ module subroutine symba_collision_resolve_mergers(self, system, param) class(symba_nbody_system), intent(inout) :: system !! SyMBA nbody system object class(symba_parameters), intent(inout) :: param !! Current run configuration parameters with SyMBA additions ! 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 + type(fraggle_colliders) :: colliders !! Fraggle colliders object + type(fraggle_fragments) :: frag !! Fraggle fragmentation system object associate(plplcollision_list => self, ncollisions => self%nenc, idx1 => self%index1, idx2 => self%index2) select type(pl => system%pl) @@ -1155,11 +972,12 @@ module subroutine symba_collision_resolve_mergers(self, system, param) 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, cb, param, idx_parent, family, x, v, mass, radius, L_spin, Ip) + lgoodcollision = symba_collision_consolidate_colliders(pl, cb, param, idx_parent, colliders) if (.not. lgoodcollision) cycle if (any(pl%status(idx_parent(:)) /= COLLISION)) cycle ! One of these two bodies has already been resolved - - plplcollision_list%status(i) = symba_collision_casemerge(system, param, family, x, v, mass, radius, L_spin, Ip) + + frag%regime = COLLRESOLVE_REGIME_MERGE + plplcollision_list%status(i) = symba_collision_casemerge(system, param, colliders, frag) end do end select end select diff --git a/src/symba/symba_util.f90 b/src/symba/symba_util.f90 index 4a40100c0..b68635b0e 100644 --- a/src/symba/symba_util.f90 +++ b/src/symba/symba_util.f90 @@ -289,8 +289,6 @@ module subroutine symba_util_index_eucl_plpl(self, param) associate(pl => self) npl = int(self%nbody, kind=I8B) - call pl%sort("mass", ascending=.false.) - nplm = count(.not. pl%lmtiny(1:npl)) pl%nplm = int(nplm, kind=I4B) @@ -476,6 +474,7 @@ module subroutine symba_util_rearray_pl(self, system, param) deallocate(ldump_mask) ! Reindex the new list of bodies + call pl%sort("mass", ascending=.false.) call pl%index(param) ! Reset the kinship trackers diff --git a/src/whm/whm_setup.f90 b/src/whm/whm_setup.f90 index 8dee15982..3c5cdeec3 100644 --- a/src/whm/whm_setup.f90 +++ b/src/whm/whm_setup.f90 @@ -81,6 +81,8 @@ module subroutine whm_setup_initialize_system(self, param) 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.) + call self%pl%index(param) ! Make sure that the discard list gets allocated initially call self%tp_discards%setup(0, param) diff --git a/src/whm/whm_util.f90 b/src/whm/whm_util.f90 index bedf359ae..e8ed91854 100644 --- a/src/whm/whm_util.f90 +++ b/src/whm/whm_util.f90 @@ -67,22 +67,6 @@ module subroutine whm_util_fill_pl(self, inserts, lfill_list) end subroutine whm_util_fill_pl - module subroutine whm_util_index_eucl_plpl(self, param) - !! author: David A. Minton - !! - !! Wrapper for the indexing method for WHM massive bodies. Sorts the massive bodies by heliocentric distance and then flattens the pl-pl upper triangular matrix - implicit none - ! Arguments - class(whm_pl), intent(inout) :: self !! WHM massive body object - class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters - - call self%sort("ir3h", ascending=.false.) - call util_index_eucl_plpl(self, param) - - return - end subroutine whm_util_index_eucl_plpl - - module subroutine whm_util_resize_pl(self, nnew) !! author: David A. Minton !! From c3d099338b38160e467e3ff53da68228b20c84f8 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Fri, 3 Sep 2021 10:37:35 -0400 Subject: [PATCH 120/154] Rearranged the Fraggle generation code a bit, improved the stability of the obl_pot call and made it a method, and added a logfile to Fraggle results. --- src/fraggle/fraggle_generate.f90 | 112 +++++++++++++++----------- src/fraggle/fraggle_io.f90 | 96 ++++++++++++++++++++++ src/fraggle/fraggle_regime.f90 | 3 + src/main/swiftest_driver.f90 | 1 - src/modules/fraggle_classes.f90 | 16 +++- src/modules/swiftest_classes.f90 | 14 ++-- src/obl/obl.f90 | 71 +++++++++++----- src/symba/symba_io.f90 | 9 ++- src/util/util_get_energy_momentum.f90 | 40 +++++---- 9 files changed, 257 insertions(+), 105 deletions(-) create mode 100644 src/fraggle/fraggle_io.f90 diff --git a/src/fraggle/fraggle_generate.f90 b/src/fraggle/fraggle_generate.f90 index 01fc3cf18..ad6ef5c87 100644 --- a/src/fraggle/fraggle_generate.f90 +++ b/src/fraggle/fraggle_generate.f90 @@ -21,14 +21,17 @@ module subroutine fraggle_generate_fragments(self, colliders, system, param, lfa class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters logical, intent(out) :: lfailure !! Answers the question: Should this have been a merger instead? ! Internals - integer(I4B) :: i - integer(I4B) :: try - real(DP) :: r_max_start, f_spin, dEtot, dLmag - integer(I4B), parameter :: MAXTRY = 3000 - character(len=*), parameter :: fmtlabel = "(A14,10(ES11.4,1X,:))" - logical, dimension(size(IEEE_ALL)) :: fpe_halting_modes, fpe_quiet_modes - logical :: lk_plpl - + integer(I4B) :: i + integer(I4B) :: try + real(DP) :: r_max_start, f_spin, dEtot, dLmag + integer(I4B), parameter :: MAXTRY = 3000 + character(len=*), parameter :: fmtlabel = "(A14,10(ES11.4,1X,:))" + logical :: lk_plpl + logical, dimension(size(IEEE_ALL)) :: fpe_halting_modes, fpe_quiet_modes + logical, dimension(size(IEEE_USUAL)) :: fpe_flag + + ! The minimization and linear solvers can sometimes lead to floating point exceptions. Rather than halting the code entirely if this occurs, we + ! can simply fail the attempt and try again. So we need to turn off any floating point exception halting modes temporarily 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) @@ -54,17 +57,22 @@ module subroutine fraggle_generate_fragments(self, colliders, system, param, lfa ! Start out the fragments close to the initial separation distance. This will be increased if there is any overlap or we fail to find a solution r_max_start = 1 * norm2(colliders%xb(:,2) - colliders%xb(:,1)) - try = 1 lfailure = .false. + try = 1 do while (try < MAXTRY) + if (lfailure) then + call frag%restructure(colliders, try, f_spin, r_max_start) + call frag%reset() + try = try + 1 + end if + lfailure = .false. + call ieee_set_flag(ieee_all, .false.) ! Set all fpe flags to quiet call fraggle_generate_pos_vec(frag, colliders, r_max_start) call frag%set_coordinate_system(colliders) - ! Initial velocity guess will be the barycentric velocity of the colliding system. - ! This ensures that our budgets are based on the residual velocities needed in the - ! collisional frame + ! Initial velocity guess will be the barycentric velocity of the colliding system so that the budgets are based on the much smaller collisional-frame velocities do concurrent (i = 1:nfrag) frag%vb(:, i) = frag%vbcom(:) end do @@ -73,54 +81,66 @@ module subroutine fraggle_generate_fragments(self, colliders, system, param, lfa call frag%set_budgets(colliders) call fraggle_generate_spins(frag, colliders, f_spin, lfailure) - if (.not.lfailure) then - call fraggle_generate_tan_vel(frag, colliders, lfailure) - if (.not. lfailure) then - call fraggle_generate_rad_vel(frag, colliders, lfailure) - ! if (lfailure) write(*,*) 'Failed to find radial velocities' - if (.not.lfailure) then - call frag%get_energy_and_momentum(colliders, system, param, lbefore=.false.) - dEtot = frag%Etot_after - frag%Etot_before - dLmag = .mag. (frag%Ltot_after(:) - frag%Ltot_before(:)) - - if ((abs(dEtot + frag%Qloss) > FRAGGLE_ETOL) .or. (dEtot > 0.0_DP)) then - ! write(*,*) 'Failed due to high energy error: ',dEtot, abs(dEtot + frag%Qloss) / FRAGGLE_ETOL - lfailure = .true. - else if ((abs(dLmag) / (.mag.frag%Ltot_before)) > FRAGGLE_LTOL) then - ! write(*,*) 'Failed due to high angular momentum error: ', dLmag / (.mag.frag%Ltot_before(:)) - lfailure = .true. - end if - end if - end if + if (lfailure) then + write(*,*) "Fraggle failed to find spins" + cycle end if - + + call fraggle_generate_tan_vel(frag, colliders, lfailure) + if (lfailure) then + write(*,*) "Fraggle failed to find tangential velocities" + cycle + end if + + call fraggle_generate_rad_vel(frag, colliders, lfailure) + if (lfailure) then + write(*,*) "Fraggle failed to find radial velocities" + cycle + end if + + call frag%get_energy_and_momentum(colliders, system, param, lbefore=.false.) + dEtot = frag%Etot_after - frag%Etot_before + dLmag = .mag. (frag%Ltot_after(:) - frag%Ltot_before(:)) + + lfailure = ((abs(dEtot + frag%Qloss) > FRAGGLE_ETOL) .or. (dEtot > 0.0_DP)) + if (lfailure) then + write(*,*) "Fraggle failed due to high energy error: ",dEtot, abs(dEtot + frag%Qloss) / FRAGGLE_ETOL + cycle + end if + + lfailure = ((abs(dLmag) / (.mag.frag%Ltot_before)) > FRAGGLE_LTOL) + if (lfailure) then + write(*,*) "Fraggle failed due to high angular momentum error: ", dLmag / (.mag.frag%Ltot_before(:)) + cycle + end if + + ! Check if any of the usual floating point exceptions happened, and fail the try if so + call ieee_get_flag(ieee_usual, fpe_flag) + lfailure = any(fpe_flag) if (.not.lfailure) exit - call frag%restructure(colliders, try, f_spin, r_max_start) - call frag%reset() - try = try + 1 + write(*,*) "Fraggle failed due to a floating point exception: ", fpe_flag end do - ! write(*, "(' -------------------------------------------------------------------------------------')") - ! write(*, "(' Final diagnostic')") - ! write(*, "(' -------------------------------------------------------------------------------------')") + write(*, "(' -------------------------------------------------------------------------------------')") + write(*, "(' Fraggle final diagnostic')") + write(*, "(' -------------------------------------------------------------------------------------')") if (lfailure) then write(*,*) "Fraggle fragment generation failed after: ",try," tries" else write(*,*) "Fraggle fragment generation succeeded after: ",try," tries" - ! write(*, "(' dL_tot should be very small' )") - ! write(*,fmtlabel) ' dL_tot |', (.mag.(frag%Ltot_after(:) - frag%Ltot_before(:))) / (.mag.frag%Ltot_before(:)) - ! write(*, "(' dE_tot should be negative and equal to Qloss' )") - ! write(*,fmtlabel) ' dE_tot |', (frag%Etot_after - frag%Etot_before) / abs(frag%Etot_before) - ! write(*,fmtlabel) ' Qloss |', -frag%Qloss / abs(frag%Etot_before) - ! write(*,fmtlabel) ' dE - Qloss |', (frag%Etot_after - frag%Etot_before + frag%Qloss) / abs(frag%Etot_before) + write(*, "(' dL_tot should be very small' )") + write(*,fmtlabel) ' dL_tot |', (.mag.(frag%Ltot_after(:) - frag%Ltot_before(:))) / (.mag.frag%Ltot_before(:)) + write(*, "(' dE_tot should be negative and equal to Qloss' )") + write(*,fmtlabel) ' dE_tot |', (frag%Etot_after - frag%Etot_before) / abs(frag%Etot_before) + write(*,fmtlabel) ' Qloss |', -frag%Qloss / abs(frag%Etot_before) + write(*,fmtlabel) ' dE - Qloss |', (frag%Etot_after - frag%Etot_before + frag%Qloss) / abs(frag%Etot_before) end if - ! write(*, "(' -------------------------------------------------------------------------------------')") + write(*, "(' -------------------------------------------------------------------------------------')") call frag%set_original_scale(colliders) ! Restore the big array if (lk_plpl) call pl%index(param) end associate - call ieee_set_halting_mode(IEEE_ALL,fpe_halting_modes) ! Save the current halting modes so we can turn them off temporarily return diff --git a/src/fraggle/fraggle_io.f90 b/src/fraggle/fraggle_io.f90 new file mode 100644 index 000000000..dbe412167 --- /dev/null +++ b/src/fraggle/fraggle_io.f90 @@ -0,0 +1,96 @@ +submodule(fraggle_classes) s_fraggle_io + use swiftest + +contains + + module subroutine fraggle_io_log_regime(param, colliders, frag) + !! author: David A. Minton + !! + !! Writes a log of the results of the collisional regime determination + implicit none + ! Arguments + class(swiftest_parameters), intent(in) :: param + class(fraggle_colliders), intent(in) :: colliders + class(fraggle_fragments), intent(in) :: frag + ! Internals + character(STRMAX) :: errmsg + + open(unit=FRAGGLE_LOG_UNIT, file=FRAGGLE_LOG_OUT, status = 'OLD', position = 'APPEND', form = 'FORMATTED', err = 667, iomsg = errmsg) + write(FRAGGLE_LOG_UNIT, *) + write(FRAGGLE_LOG_UNIT, *) "--------------------------------------------------------------------" + write(FRAGGLE_LOG_UNIT, *) " Fraggle collisional regime determination results" + write(FRAGGLE_LOG_UNIT, *) "--------------------------------------------------------------------" + write(FRAGGLE_LOG_UNIT, *) "----------------------- Collider information -----------------------" + write(FRAGGLE_LOG_UNIT, *) "True number of colliders : ",colliders%ncoll + write(FRAGGLE_LOG_UNIT, *) "Index list of true colliders : ",colliders%idx(1:colliders%ncoll) + write(FRAGGLE_LOG_UNIT, *) "-------------------- Two-body equialent values ---------------------" + write(FRAGGLE_LOG_UNIT, *) "mass1 : ",colliders%mass(1) + write(FRAGGLE_LOG_UNIT, *) "radius1 : ",colliders%radius(1) + write(FRAGGLE_LOG_UNIT, *) "xb1 : ",colliders%xb(:,1) + write(FRAGGLE_LOG_UNIT, *) "vb1 : ",colliders%vb(:,1) + write(FRAGGLE_LOG_UNIT, *) "rot1 : ",colliders%rot(:,1) + write(FRAGGLE_LOG_UNIT, *) "Ip1 : ",colliders%Ip(:,1) + write(FRAGGLE_LOG_UNIT, *) "L_spin1 : ",colliders%L_spin(:,1) + write(FRAGGLE_LOG_UNIT, *) "L_orbit1 : ",colliders%L_orbit(:,1) + write(FRAGGLE_LOG_UNIT, *) "mass2 : ",colliders%mass(2) + write(FRAGGLE_LOG_UNIT, *) "radius2 : ",colliders%radius(2) + write(FRAGGLE_LOG_UNIT, *) "xb2 : ",colliders%xb(:,2) + write(FRAGGLE_LOG_UNIT, *) "vb2 : ",colliders%vb(:,2) + write(FRAGGLE_LOG_UNIT, *) "rot2 : ",colliders%rot(:,2) + write(FRAGGLE_LOG_UNIT, *) "Ip2 : ",colliders%Ip(:,2) + write(FRAGGLE_LOG_UNIT, *) "L_spin2 : ",colliders%L_spin(:,2) + write(FRAGGLE_LOG_UNIT, *) "L_orbit2 : ",colliders%L_orbit(:,2) + write(FRAGGLE_LOG_UNIT, *) "------------------------------ Regime -----------------------------" + select case(frag%regime) + case(COLLRESOLVE_REGIME_MERGE) + write(FRAGGLE_LOG_UNIT, *) "Merge" + case(COLLRESOLVE_REGIME_DISRUPTION) + write(FRAGGLE_LOG_UNIT, *) "Disruption" + case(COLLRESOLVE_REGIME_SUPERCATASTROPHIC) + write(FRAGGLE_LOG_UNIT, *) "Supercatastrophic disruption" + case(COLLRESOLVE_REGIME_GRAZE_AND_MERGE) + write(FRAGGLE_LOG_UNIT, *) "Graze and merge" + case(COLLRESOLVE_REGIME_HIT_AND_RUN) + write(FRAGGLE_LOG_UNIT, *) "Hit and run" + end select + write(FRAGGLE_LOG_UNIT, *) "----------------------- Fragment information ----------------------" + write(FRAGGLE_LOG_UNIT, *) "Total mass of fragments : ", frag%mtot + write(FRAGGLE_LOG_UNIT, *) "Largest fragment mass : ", frag%mass_dist(1) + write(FRAGGLE_LOG_UNIT, *) "Second-largest fragment mass : ", frag%mass_dist(2) + write(FRAGGLE_LOG_UNIT, *) "Remaining fragment mass : ", frag%mass_dist(3) + write(FRAGGLE_LOG_UNIT, *) "Remaining fragment mass : ", frag%mass_dist(3) + write(FRAGGLE_LOG_UNIT, *) "Center of mass position : ", frag%xbcom(:) + write(FRAGGLE_LOG_UNIT, *) "Center of mass velocity : ", frag%vbcom(:) + write(FRAGGLE_LOG_UNIT, *) "Energy loss : ",frag%Qloss + write(FRAGGLE_LOG_UNIT, *) "--------------------------------------------------------------------" + + return + 667 continue + write(*,*) "Error writing Fraggle regime information to log file: " // trim(adjustl(errmsg)) + end subroutine fraggle_io_log_regime + + + module subroutine fraggle_io_log_start(param) + !! author: David A. Minton + !! + !! Checks to see if the Fraggle log file needs to be replaced if this is a new run, or appended if this is a restarted run + implicit none + ! Arguments + class(swiftest_parameters), intent(in) :: param + ! Internals + character(STRMAX) :: errmsg + logical :: fileExists + + inquire(file=FRAGGLE_LOG_OUT, exist=fileExists) + if (.not.param%lrestart .or. .not.fileExists) then + open(unit=FRAGGLE_LOG_UNIT, file=FRAGGLE_LOG_OUT, status="REPLACE", err = 667, iomsg = errmsg) + write(FRAGGLE_LOG_UNIT, *, err = 667, iomsg = errmsg) "Fraggle logfile" + end if + + return + + 667 continue + write(*,*) "Error writing Fraggle log file: " // trim(adjustl(errmsg)) + end subroutine fraggle_io_log_start + +end submodule s_fraggle_io \ No newline at end of file diff --git a/src/fraggle/fraggle_regime.f90 b/src/fraggle/fraggle_regime.f90 index ab786917e..bdc11f7ef 100644 --- a/src/fraggle/fraggle_regime.f90 +++ b/src/fraggle/fraggle_regime.f90 @@ -20,6 +20,7 @@ module subroutine fraggle_regime_colliders(self, frag, system, param) real(DP) :: min_mfrag_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 + logical :: fileExists associate(colliders => self) ! Convert all quantities to SI units and determine which of the pair is the projectile vs. target before sending them to the regime determination subroutine @@ -62,6 +63,8 @@ module subroutine fraggle_regime_colliders(self, frag, system, param) frag%mtot = sum(colliders%mass(:)) frag%xbcom(:) = (colliders%mass(1) * colliders%xb(:,1) + colliders%mass(2) * colliders%xb(:,2)) / frag%mtot frag%vbcom(:) = (colliders%mass(1) * colliders%vb(:,1) + colliders%mass(2) * colliders%vb(:,2)) / frag%mtot + + call fraggle_io_log_regime(param, colliders, frag) end associate return diff --git a/src/main/swiftest_driver.f90 b/src/main/swiftest_driver.f90 index e7b327e93..7f35cb0d2 100644 --- a/src/main/swiftest_driver.f90 +++ b/src/main/swiftest_driver.f90 @@ -61,7 +61,6 @@ program swiftest_driver call nbody_system%dump(param) end if - !> Define the maximum number of threads nthreads = 1 ! In the *serial* case !$ nthreads = omp_get_max_threads() ! In the *parallel* case diff --git a/src/modules/fraggle_classes.f90 b/src/modules/fraggle_classes.f90 index d6ea0ac32..669d2a91c 100644 --- a/src/modules/fraggle_classes.f90 +++ b/src/modules/fraggle_classes.f90 @@ -7,7 +7,9 @@ module fraggle_classes implicit none public - integer(I4B), parameter :: FRAGGLE_NMASS_DIST = 3 !! Number of mass bins returned by the regime calculation (largest fragment, second largest, and remainder) + integer(I4B), parameter :: FRAGGLE_NMASS_DIST = 3 !! Number of mass bins returned by the regime calculation (largest fragment, second largest, and remainder) + character(len=*), parameter :: FRAGGLE_LOG_OUT = "fraggle.log" !! Name of log file for Fraggle diagnostic information + integer(I4B), parameter :: FRAGGLE_LOG_UNIT = 88 !! Unit number for Fraggle log file !******************************************************************************************************************************** ! fraggle_colliders class definitions and method interfaces !******************************************************************************************************************************* @@ -105,6 +107,18 @@ module subroutine fraggle_generate_fragments(self, colliders, system, param, lfa logical, intent(out) :: lfailure !! Answers the question: Should this have been a merger instead? end subroutine fraggle_generate_fragments + module subroutine fraggle_io_log_regime(param, colliders, frag) + implicit none + class(swiftest_parameters), intent(in) :: param + class(fraggle_colliders), intent(in) :: colliders + class(fraggle_fragments), intent(in) :: frag + end subroutine fraggle_io_log_regime + + module subroutine fraggle_io_log_start(param) + implicit none + class(swiftest_parameters), intent(in) :: param + end subroutine fraggle_io_log_start + !> The following interfaces are placeholders intended to satisfy the required abstract methods given by the parent class module subroutine fraggle_placeholder_accel(self, system, param, t, lbeg) use swiftest_classes, only : swiftest_nbody_system, swiftest_parameters diff --git a/src/modules/swiftest_classes.f90 b/src/modules/swiftest_classes.f90 index 2694fcc25..363ed6f66 100644 --- a/src/modules/swiftest_classes.f90 +++ b/src/modules/swiftest_classes.f90 @@ -396,6 +396,7 @@ module swiftest_classes 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) :: oblpot = 0.0_DP !! System potential energy due to oblateness of the central body 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) :: Ltot = 0.0_DP !! System angular momentum vector @@ -417,6 +418,7 @@ module swiftest_classes procedure :: write_frame => io_write_frame_system !! Append a frame of output data to file procedure :: write_hdr_bin => io_write_hdr_system !! Write a header for an output frame in Fortran binary format procedure :: write_hdr_netcdf => netcdf_write_hdr_system !! Write a header for an output frame in NetCDF format + procedure :: obl_pot => obl_pot_system !! Compute the contribution to the total gravitational potential due solely to the oblateness of the central body procedure :: initialize => setup_initialize_system !! Initialize the system from input files procedure :: init_particle_info => setup_initialize_particle_info_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. @@ -927,16 +929,10 @@ 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) + module subroutine obl_pot_system(self) 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 + class(swiftest_nbody_system), intent(inout) :: self !! Swiftest nbody system object + end subroutine obl_pot_system module subroutine orbel_el2xv_vec(self, cb) implicit none diff --git a/src/obl/obl.f90 b/src/obl/obl.f90 index 035a54b18..977fc620c 100644 --- a/src/obl/obl.f90 +++ b/src/obl/obl.f90 @@ -106,7 +106,8 @@ module subroutine obl_acc_tp(self, system) end subroutine obl_acc_tp - module subroutine obl_pot(npl, Mcb, Mpl, j2rp2, j4rp4, xh, irh, oblpot) + + module subroutine obl_pot_system(self) !! author: David A. Minton !! !! Compute the contribution to the total gravitational potential due solely to the oblateness of the central body @@ -118,33 +119,59 @@ module subroutine obl_pot(npl, Mcb, Mpl, j2rp2, j4rp4, xh, irh, oblpot) !! 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 + class(swiftest_nbody_system), intent(inout) :: self !! Swiftest nbody system object + ! Internals + integer(I4B) :: i + real(DP), dimension(self%pl%nbody) :: oblpot_arr + + associate(system => self, pl => self%pl, npl => self%pl%nbody, cb => self%cb) + if (.not. any(pl%lmask(1:npl))) return + do concurrent (i = 1:npl, pl%lmask(i)) + oblpot_arr(i) = obl_pot_one(npl, cb%Gmass, pl%Gmass(i), cb%j2rp2, cb%j4rp4, pl%xh(3,i), 1.0_DP / norm2(pl%xh(:,i))) + end do + system%oblpot = sum(oblpot_arr, pl%lmask(1:npl)) + end associate + + return + end subroutine obl_pot_system + + + elemental function obl_pot_one(npl, GMcb, GMpl, j2rp2, j4rp4, zh, irh) result(oblpot) + !! author: David A. Minton + !! + !! Compute the contribution to the total gravitational potential due solely to the oblateness of the central body from a single massive 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 !! Number of massive bodies + real(DP), intent(in) :: GMcb !! G*mass of the central body + real(DP), intent(in) :: GMpl !! G*mass of the massive body + real(DP), intent(in) :: j2rp2 !! J_2 / R**2 of the central body + real(DP), intent(in) :: j4rp4 !! J_2 / R**4 of the central body + real(DP), intent(in) :: zh !! z-component of the heliocentric distance vector of the massive body + real(DP), intent(in) :: irh !! Inverse of the heliocentric distance magnitude of the massive body + ! Result + real(DP) :: oblpot !! Gravitational potential ! 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 + rinv2 = irh**2 + t0 = GMcb * GMpl * rinv2 * irh + t1 = j2rp2 + t2 = zh**2 * 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 = t0 * (t1 * p2 + t3 * p4) return - end subroutine obl_pot - + end function obl_pot_one end submodule s_obl diff --git a/src/symba/symba_io.f90 b/src/symba/symba_io.f90 index 71717aabe..d7741e38f 100644 --- a/src/symba/symba_io.f90 +++ b/src/symba/symba_io.f90 @@ -22,9 +22,9 @@ module subroutine symba_io_param_reader(self, unit, iotype, v_list, iostat, ioms integer(I4B) :: ilength, ifirst, ilast !! 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 - integer(I4B) :: nseeds, nseeds_from_file, i - logical :: seed_set = .false. !! Is the random seed set in the input file? - character(len=*),parameter :: linefmt = '(A)' + integer(I4B) :: nseeds, nseeds_from_file, i + logical :: seed_set = .false. !! Is the random seed set in the input file? + character(len=*),parameter :: linefmt = '(A)' associate(param => self) call io_param_reader(param, unit, iotype, v_list, iostat, iomsg) @@ -81,7 +81,6 @@ module subroutine symba_io_param_reader(self, unit, iotype, v_list, iostat, ioms end do 1 continue - if (self%GMTINY < 0.0_DP) then write(iomsg,*) "GMTINY invalid or not set: ", self%GMTINY iostat = -1 @@ -100,6 +99,8 @@ module subroutine symba_io_param_reader(self, unit, iotype, v_list, iostat, ioms write(*,*) "SEED: N,VAL = ",size(param%seed), param%seed(:) if (param%min_GMfrag < 0.0_DP) param%min_GMfrag = param%GMTINY write(*,*) "MIN_GMFRAG = ", self%min_GMfrag + ! For the Fraggle log file, delete it if this is a new run and the file exists + call fraggle_io_log_start(param) end if if (.not.self%lclose) then diff --git a/src/util/util_get_energy_momentum.f90 b/src/util/util_get_energy_momentum.f90 index 70fbb16df..803b7bac1 100644 --- a/src/util/util_get_energy_momentum.f90 +++ b/src/util/util_get_energy_momentum.f90 @@ -19,7 +19,6 @@ module subroutine util_get_energy_momentum_system(self, param) 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 - logical, dimension(self%pl%nbody) :: lstatus real(DP), dimension(NDIM) :: Lcborbit, Lcbspin real(DP), dimension(:), allocatable :: pepl logical, dimension(:), allocatable :: lstatpl @@ -41,13 +40,13 @@ module subroutine util_get_energy_momentum_system(self, param) Lplspiny(:) = 0.0_DP Lplspinz(:) = 0.0_DP - lstatus(1:npl) = pl%status(1:npl) /= INACTIVE + pl%lmask(1:npl) = pl%status(1:npl) /= INACTIVE - system%GMtot = cb%Gmass + sum(pl%Gmass(1:npl), lstatus(1:npl)) + system%GMtot = cb%Gmass + sum(pl%Gmass(1:npl), pl%lmask(1:npl)) kecb = cb%mass * dot_product(cb%vb(:), cb%vb(:)) Lcborbit(:) = cb%mass * (cb%xb(:) .cross. cb%vb(:)) - do concurrent (i = 1:npl, lstatus(i)) + do concurrent (i = 1:npl, pl%lmask(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) @@ -67,7 +66,7 @@ module subroutine util_get_energy_momentum_system(self, param) ! For simplicity, we always assume that the rotation pole is the 3rd principal axis Lcbspin(:) = cb%Ip(3) * cb%mass * cb%radius**2 * cb%rot(:) - do concurrent (i = 1:npl, lstatus(i)) + do concurrent (i = 1:npl, pl%lmask(i)) ! Currently we assume that the rotation pole is the 3rd principal axis ! Angular momentum from spin Lplspinx(i) = pl%mass(i) * pl%Ip(3,i) * pl%radius(i)**2 * pl%rot(1,i) @@ -83,11 +82,11 @@ module subroutine util_get_energy_momentum_system(self, param) end if ! Do the central body potential energy component first - where(.not. lstatus(1:npl)) + where(.not. pl%lmask(1:npl)) pecb(1:npl) = 0.0_DP end where - do concurrent(i = 1:npl, lstatus(i)) + do concurrent(i = 1:npl, pl%lmask(i)) pecb(i) = -cb%Gmass * pl%mass(i) / norm2(pl%xb(:,i)) end do @@ -97,7 +96,7 @@ module subroutine util_get_energy_momentum_system(self, param) do concurrent (k = 1:nplpl) i = pl%k_plpl(1,k) j = pl%k_plpl(2,k) - lstatpl(k) = (lstatus(i) .and. lstatus(j)) + lstatpl(k) = (pl%lmask(i) .and. pl%lmask(j)) end do where(.not.lstatpl(1:nplpl)) @@ -110,29 +109,26 @@ module subroutine util_get_energy_momentum_system(self, param) pepl(k) = -(pl%Gmass(i) * pl%mass(j)) / norm2(pl%xb(:, i) - pl%xb(:, j)) end do - system%pe = sum(pepl(:), lstatpl(:)) + sum(pecb(1:npl), lstatus(1:npl)) + system%pe = sum(pepl(:), lstatpl(:)) + sum(pecb(1:npl), pl%lmask(1:npl)) deallocate(lstatpl, pepl) - system%ke_orbit = 0.5_DP * (kecb + sum(kepl(1:npl), lstatus(:))) - if (param%lrotation) system%ke_spin = 0.5_DP * (kespincb + sum(kespinpl(1:npl), lstatus(:))) + system%ke_orbit = 0.5_DP * (kecb + sum(kepl(1:npl), pl%lmask(1:npl))) + if (param%lrotation) system%ke_spin = 0.5_DP * (kespincb + sum(kespinpl(1:npl), pl%lmask(1:npl))) ! Potential energy from the oblateness term if (param%loblatecb) then - do concurrent(i = 1:npl, lstatus(i)) - irh(i) = 1.0_DP / norm2(pl%xh(:,i)) - end do - call obl_pot(npl, cb%Gmass, pl%mass, cb%j2rp2, cb%j4rp4, pl%xh, irh, oblpot) - system%pe = system%pe + oblpot + call system%obl_pot() + system%pe = system%pe + system%oblpot end if - system%Lorbit(1) = Lcborbit(1) + sum(Lplorbitx(1:npl), lstatus(1:npl)) - system%Lorbit(2) = Lcborbit(2) + sum(Lplorbity(1:npl), lstatus(1:npl)) - system%Lorbit(3) = Lcborbit(3) + sum(Lplorbitz(1:npl), lstatus(1:npl)) + system%Lorbit(1) = Lcborbit(1) + sum(Lplorbitx(1:npl), pl%lmask(1:npl)) + system%Lorbit(2) = Lcborbit(2) + sum(Lplorbity(1:npl), pl%lmask(1:npl)) + system%Lorbit(3) = Lcborbit(3) + sum(Lplorbitz(1:npl), pl%lmask(1:npl)) if (param%lrotation) then - system%Lspin(1) = Lcbspin(1) + sum(Lplspinx(1:npl), lstatus(1:npl)) - system%Lspin(2) = Lcbspin(2) + sum(Lplspiny(1:npl), lstatus(1:npl)) - system%Lspin(3) = Lcbspin(3) + sum(Lplspinz(1:npl), lstatus(1:npl)) + system%Lspin(1) = Lcbspin(1) + sum(Lplspinx(1:npl), pl%lmask(1:npl)) + system%Lspin(2) = Lcbspin(2) + sum(Lplspiny(1:npl), pl%lmask(1:npl)) + system%Lspin(3) = Lcbspin(3) + sum(Lplspinz(1:npl), pl%lmask(1:npl)) end if system%te = system%ke_orbit + system%ke_spin + system%pe From d9c89b348f17af5787e11c6bb55f30bef1683f7f Mon Sep 17 00:00:00 2001 From: David A Minton Date: Fri, 3 Sep 2021 12:40:34 -0400 Subject: [PATCH 121/154] Finished adding diagnostic information to Fraggle logfile. The Fraggle logfile now contains all information about collisions in SyMBA (fragmentation, merger, and others). --- src/fraggle/fraggle_generate.f90 | 120 +++++++++++---------- src/fraggle/fraggle_io.f90 | 172 +++++++++++++++++++++++++++++-- src/fraggle/fraggle_regime.f90 | 2 +- src/modules/fraggle_classes.f90 | 23 ++++- src/modules/swiftest_globals.f90 | 7 +- src/modules/symba_classes.f90 | 10 -- src/symba/symba_collision.f90 | 127 +++++++++-------------- src/symba/symba_discard.f90 | 23 ++++- src/symba/symba_io.f90 | 4 +- 9 files changed, 324 insertions(+), 164 deletions(-) diff --git a/src/fraggle/fraggle_generate.f90 b/src/fraggle/fraggle_generate.f90 index ad6ef5c87..f66904599 100644 --- a/src/fraggle/fraggle_generate.f90 +++ b/src/fraggle/fraggle_generate.f90 @@ -25,10 +25,10 @@ module subroutine fraggle_generate_fragments(self, colliders, system, param, lfa integer(I4B) :: try real(DP) :: r_max_start, f_spin, dEtot, dLmag integer(I4B), parameter :: MAXTRY = 3000 - character(len=*), parameter :: fmtlabel = "(A14,10(ES11.4,1X,:))" logical :: lk_plpl logical, dimension(size(IEEE_ALL)) :: fpe_halting_modes, fpe_quiet_modes logical, dimension(size(IEEE_USUAL)) :: fpe_flag + character(len=STRMAX) :: message ! The minimization and linear solvers can sometimes lead to floating point exceptions. Rather than halting the code entirely if this occurs, we ! can simply fail the attempt and try again. So we need to turn off any floating point exception halting modes temporarily @@ -39,7 +39,8 @@ module subroutine fraggle_generate_fragments(self, colliders, system, param, lfa associate(frag => self, nfrag => self%nbody, pl => system%pl) if (nfrag < NFRAG_MIN) then - write(*,*) "Fraggle needs at least ",NFRAG_MIN," fragments, but only ",nfrag," were given." + write(message,*) "Fraggle needs at least ",NFRAG_MIN," fragments, but only ",nfrag," were given." + call fraggle_io_log_one_message(message) lfailure = .true. return end if @@ -60,6 +61,8 @@ module subroutine fraggle_generate_fragments(self, colliders, system, param, lfa lfailure = .false. try = 1 do while (try < MAXTRY) + write(message,*) try + call fraggle_io_log_one_message("Fraggle try " // trim(adjustl(message))) if (lfailure) then call frag%restructure(colliders, try, f_spin, r_max_start) call frag%reset() @@ -82,19 +85,19 @@ module subroutine fraggle_generate_fragments(self, colliders, system, param, lfa call fraggle_generate_spins(frag, colliders, f_spin, lfailure) if (lfailure) then - write(*,*) "Fraggle failed to find spins" + call fraggle_io_log_one_message("Fraggle failed to find spins") cycle end if call fraggle_generate_tan_vel(frag, colliders, lfailure) if (lfailure) then - write(*,*) "Fraggle failed to find tangential velocities" + call fraggle_io_log_one_message("Fraggle failed to find tangential velocities") cycle end if call fraggle_generate_rad_vel(frag, colliders, lfailure) if (lfailure) then - write(*,*) "Fraggle failed to find radial velocities" + call fraggle_io_log_one_message("Fraggle failed to find radial velocities") cycle end if @@ -104,13 +107,15 @@ module subroutine fraggle_generate_fragments(self, colliders, system, param, lfa lfailure = ((abs(dEtot + frag%Qloss) > FRAGGLE_ETOL) .or. (dEtot > 0.0_DP)) if (lfailure) then - write(*,*) "Fraggle failed due to high energy error: ",dEtot, abs(dEtot + frag%Qloss) / FRAGGLE_ETOL + write(message, *) dEtot, abs(dEtot + frag%Qloss) / FRAGGLE_ETOL + call fraggle_io_log_one_message("Fraggle failed due to high energy error: " // trim(adjustl(message))) cycle end if lfailure = ((abs(dLmag) / (.mag.frag%Ltot_before)) > FRAGGLE_LTOL) if (lfailure) then - write(*,*) "Fraggle failed due to high angular momentum error: ", dLmag / (.mag.frag%Ltot_before(:)) + write(message,*) dLmag / (.mag.frag%Ltot_before(:)) + call fraggle_io_log_one_message("Fraggle failed due to high angular momentum error: " // trim(adjustl(message))) cycle end if @@ -118,24 +123,18 @@ module subroutine fraggle_generate_fragments(self, colliders, system, param, lfa call ieee_get_flag(ieee_usual, fpe_flag) lfailure = any(fpe_flag) if (.not.lfailure) exit - write(*,*) "Fraggle failed due to a floating point exception: ", fpe_flag + write(message,*) "Fraggle failed due to a floating point exception: ", fpe_flag + call fraggle_io_log_one_message(message) end do - write(*, "(' -------------------------------------------------------------------------------------')") - write(*, "(' Fraggle final diagnostic')") - write(*, "(' -------------------------------------------------------------------------------------')") + write(message,*) try if (lfailure) then - write(*,*) "Fraggle fragment generation failed after: ",try," tries" + call fraggle_io_log_one_message("Fraggle fragment generation failed after " // trim(adjustl(message)) // " tries") else - write(*,*) "Fraggle fragment generation succeeded after: ",try," tries" - write(*, "(' dL_tot should be very small' )") - write(*,fmtlabel) ' dL_tot |', (.mag.(frag%Ltot_after(:) - frag%Ltot_before(:))) / (.mag.frag%Ltot_before(:)) - write(*, "(' dE_tot should be negative and equal to Qloss' )") - write(*,fmtlabel) ' dE_tot |', (frag%Etot_after - frag%Etot_before) / abs(frag%Etot_before) - write(*,fmtlabel) ' Qloss |', -frag%Qloss / abs(frag%Etot_before) - write(*,fmtlabel) ' dE - Qloss |', (frag%Etot_after - frag%Etot_before + frag%Qloss) / abs(frag%Etot_before) + call fraggle_io_log_one_message("Fraggle fragment generation succeeded after " // trim(adjustl(message)) // " tries") + call fraggle_io_log_generate(frag) end if - write(*, "(' -------------------------------------------------------------------------------------')") + call frag%set_original_scale(colliders) ! Restore the big array @@ -226,7 +225,8 @@ subroutine fraggle_generate_spins(frag, colliders, f_spin, lfailure) logical, intent(out) :: lfailure !! Logical flag indicating whether this step fails or succeeds! ! Internals real(DP), dimension(NDIM) :: L_remainder, rot_L, rot_ke - integer(I4B) :: i + integer(I4B) :: i + character(len=STRMAX) :: message associate(nfrag => frag%nbody) lfailure = .false. @@ -252,6 +252,20 @@ subroutine fraggle_generate_spins(frag, colliders, f_spin, lfailure) frag%ke_spin = 0.5_DP * frag%ke_spin lfailure = ((frag%ke_budget - frag%ke_spin - frag%ke_orbit) < 0.0_DP) + + if (lfailure) then + call fraggle_io_log_one_message(" ") + call fraggle_io_log_one_message("Spin failure diagnostics") + write(message, *) frag%ke_budget + call fraggle_io_log_one_message("ke_budget : " // trim(adjustl(message))) + write(message, *) frag%ke_spin + call fraggle_io_log_one_message("ke_spin : " // trim(adjustl(message))) + write(message, *) frag%ke_orbit + call fraggle_io_log_one_message("ke_orbit : " // trim(adjustl(message))) + write(message, *) frag%ke_budget - frag%ke_spin - frag%ke_orbit + call fraggle_io_log_one_message("ke_remainder : " // trim(adjustl(message))) + end if + end associate return @@ -286,27 +300,12 @@ subroutine fraggle_generate_tan_vel(frag, colliders, lfailure) real(DP), dimension(frag%nbody) :: kefrag type(lambda_obj) :: spinfunc type(lambda_obj_err) :: objective_function - real(DP), dimension(NDIM) :: Li, L_remainder + real(DP), dimension(NDIM) :: Li, L_remainder, L_frag_tot + character(len=STRMAX) :: message associate(nfrag => frag%nbody) lfailure = .false. - ! 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(*,*) 'frag%ke_budget : ',frag%ke_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(*,*) '***************************************************' - allocate(v_t_initial, mold=frag%v_t_mag) v_t_initial(:) = 0.0_DP frag%v_coll(:,:) = 0.0_DP @@ -351,14 +350,22 @@ subroutine fraggle_generate_tan_vel(frag, colliders, lfailure) ! If we are over the energy budget, flag this as a failure so we can try again lfailure = ((frag%ke_budget - frag%ke_spin - frag%ke_orbit) < 0.0_DP) - ! write(*,*) 'Tangential' - ! write(*,*) 'Failure? ',lfailure - ! call calculate_fragment_ang_mtm() - ! write(*,*) '|L_remainder| : ',.mag.(frag%L_budget(:) - L_frag_tot(:)) / Lmag_before - ! write(*,*) 'frag%ke_budget: ',frag%ke_budget - ! write(*,*) 'frag%ke_spin : ',frag%ke_spin - ! write(*,*) 'ke_tangential : ',frag%ke_orbit - ! write(*,*) 'ke_radial : ',frag%ke_budget - frag%ke_spin - frag%ke_orbit + if (lfailure) then + call fraggle_io_log_one_message(" ") + call fraggle_io_log_one_message("Tangential velocity failure diagnostics") + call frag%get_ang_mtm() + L_frag_tot = frag%L_spin(:) + frag%L_orbit(:) + write(message, *) .mag.(frag%L_budget(:) - L_frag_tot(:)) / (.mag.frag%Ltot_before(:)) + call fraggle_io_log_one_message("|L_remainder| : " // trim(adjustl(message))) + write(message, *) frag%ke_budget + call fraggle_io_log_one_message("ke_budget : " // trim(adjustl(message))) + write(message, *) frag%ke_spin + call fraggle_io_log_one_message("ke_spin : " // trim(adjustl(message))) + write(message, *) frag%ke_orbit + call fraggle_io_log_one_message("ke_tangential : " // trim(adjustl(message))) + write(message, *) frag%ke_budget - frag%ke_spin - frag%ke_orbit + call fraggle_io_log_one_message("ke_radial : " // trim(adjustl(message))) + end if end associate return @@ -465,6 +472,7 @@ subroutine fraggle_generate_rad_vel(frag, colliders, lfailure) real(DP), dimension(:), allocatable :: v_r_initial, v_r_sigma real(DP), dimension(:,:), allocatable :: v_r type(lambda_obj) :: objective_function + character(len=STRMAX) :: message associate(nfrag => frag%nbody) ! Set the "target" ke for the radial component @@ -497,13 +505,19 @@ subroutine fraggle_generate_rad_vel(frag, colliders, lfailure) end do frag%ke_orbit = 0.5_DP * frag%ke_orbit - ! write(*,*) 'Radial' - ! write(*,*) 'Failure? ',lfailure - ! write(*,*) 'frag%ke_budget: ',frag%ke_budget - ! write(*,*) 'frag%ke_spin : ',frag%ke_spin - ! write(*,*) 'frag%ke_orbit : ',frag%ke_orbit - ! write(*,*) 'ke_remainder : ',frag%ke_budget - (frag%ke_orbit + frag%ke_spin) - lfailure = .false. + lfailure = abs((frag%ke_budget - (frag%ke_orbit + frag%ke_spin)) / frag%ke_budget) > FRAGGLE_ETOL + if (lfailure) then + call fraggle_io_log_one_message(" ") + call fraggle_io_log_one_message("Radial velocity failure diagnostics") + write(message, *) frag%ke_budget + call fraggle_io_log_one_message("ke_budget : " // trim(adjustl(message))) + write(message, *) frag%ke_spin + call fraggle_io_log_one_message("ke_spin : " // trim(adjustl(message))) + write(message, *) frag%ke_orbit + call fraggle_io_log_one_message("ke_orbit : " // trim(adjustl(message))) + write(message, *) frag%ke_budget - (frag%ke_orbit + frag%ke_spin) + call fraggle_io_log_one_message("ke_remainder : " // trim(adjustl(message))) + end if end associate return diff --git a/src/fraggle/fraggle_io.f90 b/src/fraggle/fraggle_io.f90 index dbe412167..72d4adfa1 100644 --- a/src/fraggle/fraggle_io.f90 +++ b/src/fraggle/fraggle_io.f90 @@ -3,20 +3,178 @@ contains - module subroutine fraggle_io_log_regime(param, colliders, frag) + module subroutine fraggle_io_log_generate(frag) !! author: David A. Minton !! - !! Writes a log of the results of the collisional regime determination + !! Writes a log of the results of the fragment generation implicit none ! Arguments - class(swiftest_parameters), intent(in) :: param - class(fraggle_colliders), intent(in) :: colliders class(fraggle_fragments), intent(in) :: frag ! Internals + integer(I4B) :: i + character(STRMAX) :: errmsg + character(len=*), parameter :: fmtlabel = "(A14,10(ES11.4,1X,:))" + + open(unit=FRAGGLE_LOG_UNIT, file=FRAGGLE_LOG_OUT, status = 'OLD', position = 'APPEND', form = 'FORMATTED', err = 667, iomsg = errmsg) + write(FRAGGLE_LOG_UNIT, *, err = 667, iomsg = errmsg) + write(FRAGGLE_LOG_UNIT, *) "--------------------------------------------------------------------" + write(FRAGGLE_LOG_UNIT, *) " Fraggle fragment generation results" + write(FRAGGLE_LOG_UNIT, *) "--------------------------------------------------------------------" + write(FRAGGLE_LOG_UNIT, "(' dL_tot should be very small' )") + write(FRAGGLE_LOG_UNIT,fmtlabel) ' dL_tot |', (.mag.(frag%Ltot_after(:) - frag%Ltot_before(:))) / (.mag.frag%Ltot_before(:)) + write(FRAGGLE_LOG_UNIT, "(' dE_tot should be negative and equal to Qloss' )") + write(FRAGGLE_LOG_UNIT,fmtlabel) ' dE_tot |', (frag%Etot_after - frag%Etot_before) / abs(frag%Etot_before) + write(FRAGGLE_LOG_UNIT,fmtlabel) ' Qloss |', -frag%Qloss / abs(frag%Etot_before) + write(FRAGGLE_LOG_UNIT,fmtlabel) ' dE - Qloss |', (frag%Etot_after - frag%Etot_before + frag%Qloss) / abs(frag%Etot_before) + write(FRAGGLE_LOG_UNIT, "(' -------------------------------------------------------------------------------------')") + write(FRAGGLE_LOG_UNIT, *) "Individual fragment values (collisional system natural units)" + write(FRAGGLE_LOG_UNIT, *) "mass" + do i = 1, frag%nbody + write(FRAGGLE_LOG_UNIT, *) i, frag%mass(i) + end do + write(FRAGGLE_LOG_UNIT, *) "x_coll" + do i = 1, frag%nbody + write(FRAGGLE_LOG_UNIT, *) i, frag%x_coll(:,i) + end do + write(FRAGGLE_LOG_UNIT, *) "v_coll" + do i = 1, frag%nbody + write(FRAGGLE_LOG_UNIT, *) i, frag%v_coll(:,i) + end do + write(FRAGGLE_LOG_UNIT, *) "xb" + do i = 1, frag%nbody + write(FRAGGLE_LOG_UNIT, *) i, frag%xb(:,i) + end do + write(FRAGGLE_LOG_UNIT, *) "vb" + do i = 1, frag%nbody + write(FRAGGLE_LOG_UNIT, *) i, frag%vb(:,i) + end do + write(FRAGGLE_LOG_UNIT, *) "rot" + do i = 1, frag%nbody + write(FRAGGLE_LOG_UNIT, *) i, frag%rot(:,i) + end do + + close(FRAGGLE_LOG_UNIT) + + return + 667 continue + write(*,*) "Error writing Fraggle message to log file: " // trim(adjustl(errmsg)) + end subroutine fraggle_io_log_generate + + + module subroutine fraggle_io_log_one_message(message) + !! author: David A. Minton + !! + !! Writes a single message to the fraggle log file + implicit none + ! Arguments + character(len=*), intent(in) :: message + ! Internals + character(STRMAX) :: errmsg + + open(unit=FRAGGLE_LOG_UNIT, file=FRAGGLE_LOG_OUT, status = 'OLD', position = 'APPEND', form = 'FORMATTED', err = 667, iomsg = errmsg) + write(FRAGGLE_LOG_UNIT, *) trim(adjustl(message)) + close(FRAGGLE_LOG_UNIT) + + return + 667 continue + write(*,*) "Error writing Fraggle message to log file: " // trim(adjustl(errmsg)) + end subroutine fraggle_io_log_one_message + + + module subroutine fraggle_io_log_pl(pl, param) + !! author: David A. Minton + !! + !! Writes a single message to the fraggle log file + implicit none + ! Arguments + class(swiftest_pl), intent(in) :: pl !! Swiftest massive body object (only the new bodies generated in a collision) + class(swiftest_parameters), intent(in) :: param !! Current swiftest run configuration parameters + ! Internals + integer(I4B) :: i + character(STRMAX) :: errmsg + + open(unit=FRAGGLE_LOG_UNIT, file=FRAGGLE_LOG_OUT, status = 'OLD', position = 'APPEND', form = 'FORMATTED', err = 667, iomsg = errmsg) + write(FRAGGLE_LOG_UNIT, *, err = 667, iomsg = errmsg) + + write(FRAGGLE_LOG_UNIT, *) "--------------------------------------------------------------------" + write(FRAGGLE_LOG_UNIT, *) " Fraggle fragment final body properties" + write(FRAGGLE_LOG_UNIT, *) "--------------------------------------------------------------------" + write(FRAGGLE_LOG_UNIT, *) "id, name" + do i = 1, pl%nbody + write(FRAGGLE_LOG_UNIT, *) i, pl%id(i), pl%info(i)%name + end do + write(FRAGGLE_LOG_UNIT, *) "mass, Gmass" + do i = 1, pl%nbody + write(FRAGGLE_LOG_UNIT, *) i, pl%mass(i), pl%Gmass(i) + end do + write(FRAGGLE_LOG_UNIT, *) "radius" + do i = 1, pl%nbody + write(FRAGGLE_LOG_UNIT, *) i, pl%radius(i) + end do + write(FRAGGLE_LOG_UNIT, *) "xb" + do i = 1, pl%nbody + write(FRAGGLE_LOG_UNIT, *) i, pl%xb(:,i) + end do + write(FRAGGLE_LOG_UNIT, *) "vb" + do i = 1, pl%nbody + write(FRAGGLE_LOG_UNIT, *) i, pl%vb(:,i) + end do + write(FRAGGLE_LOG_UNIT, *) "xh" + do i = 1, pl%nbody + write(FRAGGLE_LOG_UNIT, *) i, pl%xh(:,i) + end do + write(FRAGGLE_LOG_UNIT, *) "vh" + do i = 1, pl%nbody + write(FRAGGLE_LOG_UNIT, *) i, pl%vh(:,i) + end do + + if (param%lrotation) then + write(FRAGGLE_LOG_UNIT, *) "rot" + do i = 1, pl%nbody + write(FRAGGLE_LOG_UNIT, *) i, pl%rot(:,i) + end do + write(FRAGGLE_LOG_UNIT, *) "Ip" + do i = 1, pl%nbody + write(FRAGGLE_LOG_UNIT, *) i, pl%Ip(:,i) + end do + end if + + if (param%ltides) then + write(FRAGGLE_LOG_UNIT, *) "Q" + do i = 1, pl%nbody + write(FRAGGLE_LOG_UNIT, *) i, pl%Q(i) + end do + write(FRAGGLE_LOG_UNIT, *) "k2" + do i = 1, pl%nbody + write(FRAGGLE_LOG_UNIT, *) i, pl%k2(i) + end do + write(FRAGGLE_LOG_UNIT, *) "tlag" + do i = 1, pl%nbody + write(FRAGGLE_LOG_UNIT, *) i, pl%tlag(i) + end do + end if + + close(FRAGGLE_LOG_UNIT) + + return + 667 continue + write(*,*) "Error writing Fraggle message to log file: " // trim(adjustl(errmsg)) + end subroutine fraggle_io_log_pl + + + module subroutine fraggle_io_log_regime(colliders, frag) + !! author: David A. Minton + !! + !! Writes a log of the results of the collisional regime determination + implicit none + ! Arguments + class(fraggle_colliders), intent(in) :: colliders !! Fraggle collider system object + class(fraggle_fragments), intent(in) :: frag !! Fraggle fragment object + ! Internals character(STRMAX) :: errmsg open(unit=FRAGGLE_LOG_UNIT, file=FRAGGLE_LOG_OUT, status = 'OLD', position = 'APPEND', form = 'FORMATTED', err = 667, iomsg = errmsg) - write(FRAGGLE_LOG_UNIT, *) + write(FRAGGLE_LOG_UNIT, *, err = 667, iomsg = errmsg) write(FRAGGLE_LOG_UNIT, *) "--------------------------------------------------------------------" write(FRAGGLE_LOG_UNIT, *) " Fraggle collisional regime determination results" write(FRAGGLE_LOG_UNIT, *) "--------------------------------------------------------------------" @@ -61,8 +219,9 @@ module subroutine fraggle_io_log_regime(param, colliders, frag) write(FRAGGLE_LOG_UNIT, *) "Remaining fragment mass : ", frag%mass_dist(3) write(FRAGGLE_LOG_UNIT, *) "Center of mass position : ", frag%xbcom(:) write(FRAGGLE_LOG_UNIT, *) "Center of mass velocity : ", frag%vbcom(:) - write(FRAGGLE_LOG_UNIT, *) "Energy loss : ",frag%Qloss + write(FRAGGLE_LOG_UNIT, *) "Energy loss : ", frag%Qloss write(FRAGGLE_LOG_UNIT, *) "--------------------------------------------------------------------" + close(FRAGGLE_LOG_UNIT) return 667 continue @@ -86,6 +245,7 @@ module subroutine fraggle_io_log_start(param) open(unit=FRAGGLE_LOG_UNIT, file=FRAGGLE_LOG_OUT, status="REPLACE", err = 667, iomsg = errmsg) write(FRAGGLE_LOG_UNIT, *, err = 667, iomsg = errmsg) "Fraggle logfile" end if + close(FRAGGLE_LOG_UNIT) return diff --git a/src/fraggle/fraggle_regime.f90 b/src/fraggle/fraggle_regime.f90 index bdc11f7ef..eb614d951 100644 --- a/src/fraggle/fraggle_regime.f90 +++ b/src/fraggle/fraggle_regime.f90 @@ -64,7 +64,7 @@ module subroutine fraggle_regime_colliders(self, frag, system, param) frag%xbcom(:) = (colliders%mass(1) * colliders%xb(:,1) + colliders%mass(2) * colliders%xb(:,2)) / frag%mtot frag%vbcom(:) = (colliders%mass(1) * colliders%vb(:,1) + colliders%mass(2) * colliders%vb(:,2)) / frag%mtot - call fraggle_io_log_regime(param, colliders, frag) + call fraggle_io_log_regime(colliders, frag) end associate return diff --git a/src/modules/fraggle_classes.f90 b/src/modules/fraggle_classes.f90 index 669d2a91c..8dc81c303 100644 --- a/src/modules/fraggle_classes.f90 +++ b/src/modules/fraggle_classes.f90 @@ -9,7 +9,8 @@ module fraggle_classes integer(I4B), parameter :: FRAGGLE_NMASS_DIST = 3 !! Number of mass bins returned by the regime calculation (largest fragment, second largest, and remainder) character(len=*), parameter :: FRAGGLE_LOG_OUT = "fraggle.log" !! Name of log file for Fraggle diagnostic information - integer(I4B), parameter :: FRAGGLE_LOG_UNIT = 88 !! Unit number for Fraggle log file + integer(I4B), parameter :: FRAGGLE_LOG_UNIT = 76 !! Unit number for Fraggle log file + !******************************************************************************************************************************** ! fraggle_colliders class definitions and method interfaces !******************************************************************************************************************************* @@ -107,9 +108,25 @@ module subroutine fraggle_generate_fragments(self, colliders, system, param, lfa logical, intent(out) :: lfailure !! Answers the question: Should this have been a merger instead? end subroutine fraggle_generate_fragments - module subroutine fraggle_io_log_regime(param, colliders, frag) + module subroutine fraggle_io_log_generate(frag) + implicit none + class(fraggle_fragments), intent(in) :: frag + end subroutine fraggle_io_log_generate + + module subroutine fraggle_io_log_one_message(message) + implicit none + character(len=*), intent(in) :: message + character(STRMAX) :: errmsg + end subroutine fraggle_io_log_one_message + + module subroutine fraggle_io_log_pl(pl, param) + implicit none + class(swiftest_pl), intent(in) :: pl !! Swiftest massive body object (only the new bodies generated in a collision) + class(swiftest_parameters), intent(in) :: param !! Current swiftest run configuration parameters + end subroutine fraggle_io_log_pl + + module subroutine fraggle_io_log_regime(colliders, frag) implicit none - class(swiftest_parameters), intent(in) :: param class(fraggle_colliders), intent(in) :: colliders class(fraggle_fragments), intent(in) :: frag end subroutine fraggle_io_log_regime diff --git a/src/modules/swiftest_globals.f90 b/src/modules/swiftest_globals.f90 index 72d204a49..1f9c6028c 100644 --- a/src/modules/swiftest_globals.f90 +++ b/src/modules/swiftest_globals.f90 @@ -24,6 +24,8 @@ module swiftest_globals real(DP), parameter :: THIRD = 0.333333333333333333333333333333333333333_DP !! Definition of 1 / 3 real(DP), parameter :: DEG2RAD = PI / 180.0_DP !! Definition of conversion factor from degrees to radians real(DP), parameter :: RAD2DEG = 180.0_DP / PI !! Definition of conversion factor from degrees to radians + 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 integer(I4B), parameter :: LOWERCASE_BEGIN = iachar('a') !! ASCII character set parameter for lower to upper conversion - start of lowercase integer(I4B), parameter :: LOWERCASE_END = iachar('z') !! ASCII character set parameter for lower to upper conversion - end of lowercase @@ -69,7 +71,6 @@ module swiftest_globals integer(I4B), parameter :: USAGE = -2 !! Symbolic name for function return/flag code for printing the usage message integer(I4B), parameter :: HELP = -3 !! Symbolic name for function return/flag code for printing the usage message - character(*), parameter :: SUCCESS_MSG = '(/, "Normal termination of Swiftest (version ", f3.1, ")")' character(*), parameter :: FAIL_MSG = '(/, "Terminating Swiftest (version ", f3.1, ") due to error!!")' character(*), parameter :: USAGE_MSG = '("Usage: swiftest [bs|helio|ra15|rmvs|symba|tu4|whm] ")' @@ -126,15 +127,11 @@ module swiftest_globals character(*), parameter :: PARTICLE_OUTFILE = 'particle.dat' integer(I4B), parameter :: PARTICLEUNIT = 44 !! File unit number for the binary particle info 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 = 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 :: einsteinC = 299792458.0_DP !! Speed of light in SI units - !> NetCDF variable names and constants character(*), parameter :: NETCDF_OUTFILE = 'bin.nc' !! Default output file name character(*), parameter :: TIME_DIMNAME = "time" !! NetCDF name of the time dimension diff --git a/src/modules/symba_classes.f90 b/src/modules/symba_classes.f90 index b929b5040..21986b920 100644 --- a/src/modules/symba_classes.f90 +++ b/src/modules/symba_classes.f90 @@ -322,16 +322,6 @@ module function symba_collision_casemerge(system, param, colliders, frag) result integer(I4B) :: status !! Status flag assigned to this outcome end function symba_collision_casemerge - module function symba_collision_casesupercatastrophic(system, param, colliders, frag) result(status) - use fraggle_classes, only : fraggle_colliders, fraggle_fragments - implicit none - class(symba_nbody_system), intent(inout) :: system !! SyMBA nbody system object - class(symba_parameters), intent(inout) :: param !! Current run configuration parameters with SyMBA additions - class(fraggle_colliders), intent(inout) :: colliders !! Fraggle colliders object - class(fraggle_fragments), intent(inout) :: frag !! Fraggle fragmentation system object - integer(I4B) :: status !! Status flag assigned to this outcome - end function symba_collision_casesupercatastrophic - module subroutine symba_util_index_eucl_plpl(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 a3bf27e99..5327fefd9 100644 --- a/src/symba/symba_collision.f90 +++ b/src/symba/symba_collision.f90 @@ -21,14 +21,20 @@ module function symba_collision_casedisruption(system, param, colliders, frag) ! Internals integer(I4B) :: i, nfrag logical :: lfailure - character(len=STRMAX) :: collider_message - - collider_message = "Disruption between" - call symba_collision_collider_message(system%pl, colliders%idx, collider_message) - write(*,*) trim(adjustl(collider_message)) + character(len=STRMAX) :: message + + select case(frag%regime) + case(COLLRESOLVE_REGIME_DISRUPTION) + message = "Disruption between" + nfrag = NFRAG_DISRUPT + case(COLLRESOLVE_REGIME_SUPERCATASTROPHIC) + message = "Supercatastrophic disruption between" + nfrag = NFRAG_SUPERCAT + end select + call symba_collision_collider_message(system%pl, colliders%idx, message) + call fraggle_io_log_one_message(message) ! Collisional fragments will be uniformly distributed around the pre-impact barycenter - nfrag = NFRAG_DISRUPT call frag%setup(nfrag, param) call frag%set_mass_dist(colliders) frag%id(1:nfrag) = [(i, i = param%maxid + 1, param%maxid + nfrag)] @@ -38,7 +44,7 @@ module function symba_collision_casedisruption(system, param, colliders, frag) call frag%generate_fragments(colliders, system, param, lfailure) if (lfailure) then - write(*,*) 'No fragment solution found, so treat as a pure hit-and-run' + call fraggle_io_log_one_message("No fragment solution found, so treat as a pure hit-and-run") status = ACTIVE nfrag = 0 select type(pl => system%pl) @@ -49,8 +55,14 @@ module function symba_collision_casedisruption(system, param, colliders, frag) end select else ! Populate the list of new bodies - write(*,'("Generating ",I2.0," fragments")') nfrag - status = DISRUPTION + write(message, *) nfrag + call fraggle_io_log_one_message("Generating " // trim(adjustl(message)) // " fragments") + select case(frag%regime) + case(COLLRESOLVE_REGIME_DISRUPTION) + status = DISRUPTION + case(COLLRESOLVE_REGIME_SUPERCATASTROPHIC) + status = SUPERCATASTROPHIC + end select call symba_collision_mergeaddsub(system, param, colliders, frag, status) end if @@ -74,12 +86,12 @@ module function symba_collision_casehitandrun(system, param, colliders, frag) r ! Internals integer(I4B) :: i, ibiggest, nfrag, jtarg, jproj logical :: lpure - character(len=STRMAX) :: collider_message + character(len=STRMAX) :: message character(len=NAMELEN) :: idstr - collider_message = "Hit and run between" - call symba_collision_collider_message(system%pl, colliders%idx, collider_message) - write(*,*) trim(adjustl(collider_message)) + message = "Hit and run between" + call symba_collision_collider_message(system%pl, colliders%idx, message) + call fraggle_io_log_one_message(trim(adjustl(message))) if (colliders%mass(1) > colliders%mass(2)) then jtarg = 1 @@ -90,7 +102,7 @@ module function symba_collision_casehitandrun(system, param, colliders, frag) r end if if (frag%mass_dist(2) > 0.9_DP * colliders%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.' + call fraggle_io_log_one_message("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 @@ -107,10 +119,11 @@ module function symba_collision_casehitandrun(system, param, colliders, frag) r call frag%generate_fragments(colliders, system, param, lpure) if (lpure) then - write(*,*) 'Should have been a pure hit and run instead' + call fraggle_io_log_one_message("Should have been a pure hit and run instead") nfrag = 0 else - write(*,'("Generating ",I2.0," fragments")') nfrag + write(message, *) nfrag + call fraggle_io_log_one_message("Generating " // trim(adjustl(message)) // " fragments") end if end if if (lpure) then ! Reset these bodies back to being active so that nothing further is done to them @@ -133,7 +146,7 @@ end function symba_collision_casehitandrun module function symba_collision_casemerge(system, param, colliders, frag) result(status) !! author: Jennifer L.L. Pouplin, Carlisle A. Wishard, and David A. Minton !! - !! Merge planets. + !! Merge massive bodies. !! !! Adapted from David E. Kaufmann's Swifter routines symba_merge_pl.f90 and symba_discard_merge_pl.f90 !! @@ -151,12 +164,12 @@ module function symba_collision_casemerge(system, param, colliders, frag) resul real(DP), dimension(2) :: volume, density real(DP) :: pe real(DP), dimension(NDIM) :: L_spin_new - character(len=STRMAX) :: collider_message character(len=NAMELEN) :: idstr + character(len=STRMAX) :: message - collider_message = "Merging" - call symba_collision_collider_message(system%pl, colliders%idx, collider_message) - write(*,*) trim(adjustl(collider_message)) + message = "Merging" + call symba_collision_collider_message(system%pl, colliders%idx, message) + call fraggle_io_log_one_message(message) select type(pl => system%pl) class is (symba_pl) @@ -215,59 +228,6 @@ module function symba_collision_casemerge(system, param, colliders, frag) resul end function symba_collision_casemerge - module function symba_collision_casesupercatastrophic(system, param, colliders, frag) 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(inout) :: param !! Current run configuration parameters with SyMBA additions - class(fraggle_colliders), intent(inout) :: colliders !! Fraggle colliders object - class(fraggle_fragments), intent(inout) :: frag !! Fraggle fragmentation system object - ! Result - integer(I4B) :: status !! Status flag assigned to this outcom - ! Internals - integer(I4B) :: i, j, nfrag - logical :: lfailure - character(len=STRMAX) :: collider_message - character(len=NAMELEN) :: idstr - - collider_message = "Supercatastrophic disruption between" - call symba_collision_collider_message(system%pl, colliders%idx, collider_message) - write(*,*) trim(adjustl(collider_message)) - - nfrag = NFRAG_SUPERCAT - call frag%setup(nfrag, param) - call frag%set_mass_dist(colliders) - frag%id(1:nfrag) = [(i, i = param%maxid + 1, param%maxid + nfrag)] - param%maxid = frag%id(nfrag) - - ! Generate the position and velocity distributions of the fragments - call frag%generate_fragments(colliders, system, param, lfailure) - - if (lfailure) then - write(*,*) 'No fragment solution found, so treat as a pure hit-and-run' - status = ACTIVE - nfrag = 0 - select type(pl => system%pl) - class is (symba_pl) - pl%status(colliders%idx(:)) = status - pl%ldiscard(colliders%idx(:)) = .false. - pl%lcollision(colliders%idx(:)) = .false. - end select - else - ! Populate the list of new bodies - write(*,'("Generating ",I2.0," fragments")') nfrag - status = SUPERCATASTROPHIC - call symba_collision_mergeaddsub(system, param, colliders, frag, status) - end if - - return - end function symba_collision_casesupercatastrophic - - subroutine symba_collision_collider_message(pl, collidx, collider_message) !! author: David A. Minton !! @@ -320,7 +280,8 @@ module function symba_collision_check_encounter(self, system, param, t, dt, irec integer(I4B) :: i, j, k, nenc real(DP) :: rlim, Gmtot logical :: isplpl - character(len=STRMAX) :: timestr, idstri, idstrj + character(len=STRMAX) :: timestr, idstri, idstrj, message + lany_collision = .false. if (self%nenc == 0) return @@ -401,9 +362,10 @@ module function symba_collision_check_encounter(self, system, param, t, dt, irec write(idstrj, *) tp%id(j) write(timestr, *) t call tp%info(j)%set_value(status="DISCARDED_PLR", discard_time=t, discard_xh=tp%xh(:,j), discard_vh=tp%vh(:,j)) - write(*, *) "Particle " // trim(adjustl(tp%info(j)%name)) // " (" // trim(adjustl(idstrj)) // ")" & + write(message, *) "Particle " // trim(adjustl(tp%info(j)%name)) // " (" // trim(adjustl(idstrj)) // ")" & // " collided with massive body " // trim(adjustl(pl%info(i)%name)) // " (" // trim(adjustl(idstri)) // ")" & // " at t = " // trim(adjustl(timestr)) + call fraggle_io_log_one_message(message) end if end if end do @@ -752,6 +714,7 @@ subroutine symba_collision_mergeaddsub(system, param, colliders, frag, status) class(symba_pl), allocatable :: plnew, plsub character(*), parameter :: FRAGFMT = '("Newbody",I0.7)' character(len=NAMELEN) :: newname + character(len=STRMAX) :: message select type(pl => system%pl) class is (symba_pl) @@ -852,6 +815,9 @@ subroutine symba_collision_mergeaddsub(system, param, colliders, frag, status) plnew%ldiscard(1:nfrag) = .false. plnew%levelg(1:nfrag) = pl%levelg(ibiggest) plnew%levelm(1:nfrag) = pl%levelm(ibiggest) + + ! Log the properties of the new bodies + call fraggle_io_log_pl(plnew, param) ! Append the new merged body to the list nstart = pl_adds%nbody + 1 @@ -924,10 +890,8 @@ module subroutine symba_collision_resolve_fragmentations(self, system, param) call colliders%regime(frag, system, param) select case (frag%regime) - case (COLLRESOLVE_REGIME_DISRUPTION) + case (COLLRESOLVE_REGIME_DISRUPTION, COLLRESOLVE_REGIME_SUPERCATASTROPHIC) plplcollision_list%status(i) = symba_collision_casedisruption(system, param, colliders, frag) - case (COLLRESOLVE_REGIME_SUPERCATASTROPHIC) - plplcollision_list%status(i) = symba_collision_casesupercatastrophic(system, param, colliders, frag) case (COLLRESOLVE_REGIME_HIT_AND_RUN) plplcollision_list%status(i) = symba_collision_casehitandrun(system, param, colliders, frag) case (COLLRESOLVE_REGIME_MERGE, COLLRESOLVE_REGIME_GRAZE_AND_MERGE) @@ -1024,7 +988,10 @@ module subroutine symba_collision_resolve_plplenc(self, system, param, t, dt, ir do write(timestr,*) t - write(*, *) "Collision between massive bodies detected at time t = " // trim(adjustl(timestr)) + call fraggle_io_log_one_message("") + call fraggle_io_log_one_message("--------------------------------------------------------------------") + call fraggle_io_log_one_message("Collision between massive bodies detected at time t = " // trim(adjustl(timestr))) + call fraggle_io_log_one_message("--------------------------------------------------------------------") allocate(tmp_param, source=param) tmp_param%t = t if (param%lfragmentation) then diff --git a/src/symba/symba_discard.f90 b/src/symba/symba_discard.f90 index 24f40b1bd..704d11f85 100644 --- a/src/symba/symba_discard.f90 +++ b/src/symba/symba_discard.f90 @@ -20,7 +20,7 @@ subroutine symba_discard_cb_pl(pl, system, param) ! Internals integer(I4B) :: i, j real(DP) :: energy, vb2, rb2, rh2, rmin2, rmax2, rmaxu2 - character(len=STRMAX) :: idstr, timestr + character(len=STRMAX) :: idstr, timestr, message associate(npl => pl%nbody, cb => system%cb) call system%set_msys() @@ -36,7 +36,12 @@ subroutine symba_discard_cb_pl(pl, system, param) pl%status(i) = DISCARDED_RMAX write(idstr, *) pl%id(i) write(timestr, *) param%t - write(*, *) trim(adjustl(pl%info(i)%name)) // " (" // trim(adjustl(idstr)) // ")" // " too far from the central body at t = " // trim(adjustl(timestr)) + write(message, *) trim(adjustl(pl%info(i)%name)) // " (" // trim(adjustl(idstr)) // ")" // " too far from the central body at t = " // trim(adjustl(timestr)) + call fraggle_io_log_one_message("") + call fraggle_io_log_one_message("***********************************************************************************************************************") + call fraggle_io_log_one_message(message) + call fraggle_io_log_one_message("***********************************************************************************************************************") + call fraggle_io_log_one_message("") call pl%info(i)%set_value(status="DISCARDED_RMAX", discard_time=param%t, discard_xh=pl%xh(:,i), discard_vh=pl%vh(:,i)) else if ((param%rmin >= 0.0_DP) .and. (rh2 < rmin2)) then pl%ldiscard(i) = .true. @@ -44,7 +49,12 @@ subroutine symba_discard_cb_pl(pl, system, param) pl%status(i) = DISCARDED_RMIN write(idstr, *) pl%id(i) write(timestr, *) param%t - write(*, *) trim(adjustl(pl%info(i)%name)) // " (" // trim(adjustl(idstr)) // ")" // " too close to the central body at t = " // trim(adjustl(timestr)) + write(message, *) trim(adjustl(pl%info(i)%name)) // " (" // trim(adjustl(idstr)) // ")" // " too close to the central body at t = " // trim(adjustl(timestr)) + call fraggle_io_log_one_message("") + call fraggle_io_log_one_message("***********************************************************************************************************************") + call fraggle_io_log_one_message(message) + call fraggle_io_log_one_message("***********************************************************************************************************************") + call fraggle_io_log_one_message("") call pl%info(i)%set_value(status="DISCARDED_RMIN", discard_time=param%t, discard_xh=pl%xh(:,i), discard_vh=pl%vh(:,i), discard_body_id=cb%id) else if (param%rmaxu >= 0.0_DP) then rb2 = dot_product(pl%xb(:,i), pl%xb(:,i)) @@ -56,7 +66,12 @@ subroutine symba_discard_cb_pl(pl, system, param) pl%status(i) = DISCARDED_RMAXU write(idstr, *) pl%id(i) write(timestr, *) param%t - write(*, *) trim(adjustl(pl%info(i)%name)) // " (" // trim(adjustl(idstr)) // ")" // " is unbound and too far from barycenter at t = " // trim(adjustl(timestr)) + write(message, *) trim(adjustl(pl%info(i)%name)) // " (" // trim(adjustl(idstr)) // ")" // " is unbound and too far from barycenter at t = " // trim(adjustl(timestr)) + call fraggle_io_log_one_message("") + call fraggle_io_log_one_message("***********************************************************************************************************************") + call fraggle_io_log_one_message(message) + call fraggle_io_log_one_message("***********************************************************************************************************************") + call fraggle_io_log_one_message("") call pl%info(i)%set_value(status="DISCARDED_RMAXU", discard_time=param%t, discard_xh=pl%xh(:,i), discard_vh=pl%vh(:,i)) end if end if diff --git a/src/symba/symba_io.f90 b/src/symba/symba_io.f90 index d7741e38f..42f36ea64 100644 --- a/src/symba/symba_io.f90 +++ b/src/symba/symba_io.f90 @@ -99,8 +99,6 @@ module subroutine symba_io_param_reader(self, unit, iotype, v_list, iostat, ioms write(*,*) "SEED: N,VAL = ",size(param%seed), param%seed(:) if (param%min_GMfrag < 0.0_DP) param%min_GMfrag = param%GMTINY write(*,*) "MIN_GMFRAG = ", self%min_GMfrag - ! For the Fraggle log file, delete it if this is a new run and the file exists - call fraggle_io_log_start(param) end if if (.not.self%lclose) then @@ -108,6 +106,8 @@ module subroutine symba_io_param_reader(self, unit, iotype, v_list, iostat, ioms iostat = -1 return end if + ! All reporting of collision information in SyMBA (including mergers) is now recorded in the Fraggle logfile + call fraggle_io_log_start(param) end associate iostat = 0 From fd1c9cb7899c01e89f9bd1d7689dc47a9ee8f7f8 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Fri, 3 Sep 2021 12:41:59 -0400 Subject: [PATCH 122/154] Fixed formatting of collision detection message to make each individual event more prominent in the logfile --- src/symba/symba_collision.f90 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/symba/symba_collision.f90 b/src/symba/symba_collision.f90 index 5327fefd9..bc9afd880 100644 --- a/src/symba/symba_collision.f90 +++ b/src/symba/symba_collision.f90 @@ -989,9 +989,9 @@ module subroutine symba_collision_resolve_plplenc(self, system, param, t, dt, ir do write(timestr,*) t call fraggle_io_log_one_message("") - call fraggle_io_log_one_message("--------------------------------------------------------------------") + call fraggle_io_log_one_message("***********************************************************************************************************************") call fraggle_io_log_one_message("Collision between massive bodies detected at time t = " // trim(adjustl(timestr))) - call fraggle_io_log_one_message("--------------------------------------------------------------------") + call fraggle_io_log_one_message("***********************************************************************************************************************") allocate(tmp_param, source=param) tmp_param%t = t if (param%lfragmentation) then From da5d95be276f1b96773acacbf69e9e8d391f4660 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Fri, 3 Sep 2021 13:37:50 -0400 Subject: [PATCH 123/154] Simplified the algorithm for distributing mass. It now matches more exactly what comes out of the regime code (Largest frgment, second-largest, and remainder distributed equally among fragments for the two flavors of disruption). --- src/fraggle/fraggle_io.f90 | 1 - src/fraggle/fraggle_set.f90 | 45 +++++++++++-------------------------- 2 files changed, 13 insertions(+), 33 deletions(-) diff --git a/src/fraggle/fraggle_io.f90 b/src/fraggle/fraggle_io.f90 index 72d4adfa1..dbd721216 100644 --- a/src/fraggle/fraggle_io.f90 +++ b/src/fraggle/fraggle_io.f90 @@ -216,7 +216,6 @@ module subroutine fraggle_io_log_regime(colliders, frag) write(FRAGGLE_LOG_UNIT, *) "Largest fragment mass : ", frag%mass_dist(1) write(FRAGGLE_LOG_UNIT, *) "Second-largest fragment mass : ", frag%mass_dist(2) write(FRAGGLE_LOG_UNIT, *) "Remaining fragment mass : ", frag%mass_dist(3) - write(FRAGGLE_LOG_UNIT, *) "Remaining fragment mass : ", frag%mass_dist(3) write(FRAGGLE_LOG_UNIT, *) "Center of mass position : ", frag%xbcom(:) write(FRAGGLE_LOG_UNIT, *) "Center of mass velocity : ", frag%vbcom(:) write(FRAGGLE_LOG_UNIT, *) "Energy loss : ", frag%Qloss diff --git a/src/fraggle/fraggle_set.f90 b/src/fraggle/fraggle_set.f90 index b0b2a69be..7ea47e14f 100644 --- a/src/fraggle/fraggle_set.f90 +++ b/src/fraggle/fraggle_set.f90 @@ -37,48 +37,29 @@ module subroutine fraggle_set_mass_dist_fragments(self, colliders) class(fraggle_fragments), intent(inout) :: self !! Fraggle fragment system object class(fraggle_colliders), intent(inout) :: colliders !! Fraggle collider system object ! Internals - integer(I4B) :: i, istart, jproj, jtarg - real(DP), dimension(2) :: vol - real(DP) :: min_frag_mass + integer(I4B) :: i, jproj, jtarg + real(DP), dimension(2) :: volume real(DP), dimension(NDIM) :: Ip_avg associate(frag => self, nfrag => self%nbody) ! Get mass weighted mean of Ip and density - vol(1:2) = 4._DP / 3._DP * PI * colliders%radius(1:2)**3 - frag%density(1:nfrag) = frag%mtot / sum(vol(:)) + volume(1:2) = 4._DP / 3._DP * PI * colliders%radius(1:2)**3 + frag%density(1:nfrag) = frag%mtot / sum(volume(:)) Ip_avg(:) = (colliders%mass(1) * colliders%Ip(:,1) + colliders%mass(2) * colliders%Ip(:,2)) / frag%mtot do i = 1, nfrag frag%Ip(:, i) = Ip_avg(:) end do select case(frag%regime) - case(COLLRESOLVE_REGIME_DISRUPTION) - ! Distribute the mass among fragments, with a branch to check for the size of the second largest fragment - frag%mass(1) = frag%mass_dist(1) - if (frag%mass_dist(2) > frag%mass_dist(1) / 3._DP) then - frag%mass(2) = frag%mass_dist(2) - istart = 3 - else - istart = 2 - end if - ! Distribute remaining mass among the remaining bodies - do i = istart, nfrag - frag%mass(i) = (frag%mtot - sum(frag%mass(1:istart - 1))) / (nfrag - istart + 1) + case(COLLRESOLVE_REGIME_DISRUPTION, COLLRESOLVE_REGIME_SUPERCATASTROPHIC) + ! Assign the first and second-largest masses that came out of the regime determination subroutine to the first two fragments + frag%mass(1:2) = frag%mass_dist(1:2) + + ! Distribute remaining mass among the remaining fragments + do i = 3, nfrag + frag%mass(i) = (frag%mtot - sum(frag%mass(1:2))) / (nfrag - 2) end do frag%radius(1:nfrag) = (3 * frag%mass(1:nfrag) / (4 * PI * frag%density(1:nfrag)))**(1.0_DP / 3.0_DP) - case(COLLRESOLVE_REGIME_SUPERCATASTROPHIC) - ! 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 = frag%mtot / nfrag - if (frag%mass_dist(1) < min_frag_mass) then - frag%mass(:) = min_frag_mass - else - frag%mass(1) = frag%mass_dist(1) - frag%mass(2:nfrag) = (frag%mtot - frag%mass_dist(1)) / (nfrag - 1) - end if - ! Distribute any residual mass if there is any and set the radius - frag%mass(nfrag) = frag%mass(nfrag) + (frag%mtot - sum(frag%mass(:))) - frag%radius(1:nfrag) = (3 * frag%mass(1:nfrag) / (4 * PI * frag%density(1:nfrag)))**(1.0_DP / 3.0_DP) case(COLLRESOLVE_REGIME_HIT_AND_RUN) if (colliders%mass(1) > colliders%mass(2)) then jtarg = 1 @@ -89,14 +70,14 @@ module subroutine fraggle_set_mass_dist_fragments(self, colliders) end if frag%mass(1) = frag%mass_dist(1) frag%radius(1) = colliders%radius(jtarg) - frag%density(1) = frag%mass_dist(1) / vol(jtarg) + frag%density(1) = frag%mass_dist(1) / volume(jtarg) frag%mass(2:nfrag) = (frag%mtot - frag%mass(1)) / (nfrag - 1) frag%mass(nfrag) = frag%mass(nfrag) + (frag%mtot - sum(frag%mass(:))) frag%radius(2:nfrag) = (3 * frag%mass(2:nfrag) / (4 * PI * frag%density(2:nfrag)))**(1.0_DP / 3.0_DP) case (COLLRESOLVE_REGIME_MERGE, COLLRESOLVE_REGIME_GRAZE_AND_MERGE) frag%mass(1) = frag%mtot - frag%radius(1) = (3 * sum(vol(:)) / (4 * PI))**(1._DP / 3._DP) + frag%radius(1) = (3 * sum(volume(:)) / (4 * PI))**(1._DP / 3._DP) case default write(*,*) "fraggle_set_mass_dist_fragments error: Unrecognized regime code",frag%regime end select From 210c1f2dedcb6200dc0e21237bc954b9ab55002b Mon Sep 17 00:00:00 2001 From: David A Minton Date: Fri, 3 Sep 2021 16:26:40 -0400 Subject: [PATCH 124/154] Fixed a number of issues with the formatting of the dump files that was preventing many values from being read in properly on restart. Also changted the way that the NetCDF tslot is calculated to prevent skipping array elements. --- src/io/io.f90 | 121 +++++++++++++++++++---------------- src/main/swiftest_driver.f90 | 6 +- src/symba/symba_io.f90 | 30 +++++---- 3 files changed, 87 insertions(+), 70 deletions(-) diff --git a/src/io/io.f90 b/src/io/io.f90 index c00939516..7756747bf 100644 --- a/src/io/io.f90 +++ b/src/io/io.f90 @@ -623,30 +623,32 @@ module subroutine io_param_reader(self, unit, iotype, v_list, iostat, iomsg) case("GMTOT_ORIG") read(param_value, *, err = 667, iomsg = iomsg) param%GMtot_orig case("LTOT_ORIG") + write(*,*) param_value read(param_value, *, err = 667, iomsg = iomsg) param%Ltot_orig(1) do i = 2, NDIM - ifirst = ilast + 1 + ifirst = ilast + 2 param_value = io_get_token(line, ifirst, ilast, iostat) + write(*,*) param_value read(param_value, *, err = 667, iomsg = iomsg) param%Ltot_orig(i) end do case("LORBIT_ORIG") read(param_value, *, err = 667, iomsg = iomsg) param%Lorbit_orig(1) do i = 2, NDIM - ifirst = ilast + 1 + ifirst = ilast + 2 param_value = io_get_token(line, ifirst, ilast, iostat) read(param_value, *, err = 667, iomsg = iomsg) param%Lorbit_orig(i) end do case("LSPIN_ORIG") read(param_value, *, err = 667, iomsg = iomsg) param%Lspin_orig(1) do i = 2, NDIM - ifirst = ilast + 1 + ifirst = ilast + 2 param_value = io_get_token(line, ifirst, ilast, iostat) read(param_value, *, err = 667, iomsg = iomsg) param%Lspin_orig(i) end do case("LESCAPE") read(param_value, *, err = 667, iomsg = iomsg) param%Lescape(1) do i = 2, NDIM - ifirst = ilast + 1 + ifirst = ilast + 2 param_value = io_get_token(line, ifirst, ilast, iostat) read(param_value, *, err = 667, iomsg = iomsg) param%Lescape(i) end do @@ -850,10 +852,9 @@ module subroutine io_param_writer(self, unit, iotype, v_list, iostat, iomsg) ! 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 + character(len=NAMELEN) :: param_name + character(LEN=STRMAX) :: param_value, v1, v2, v3 type character_array character(25) :: value end type character_array @@ -861,64 +862,76 @@ module subroutine io_param_writer(self, unit, iotype, v_list, iostat, iomsg) integer(I4B) :: i associate(param => self) - write(param_name, Afmt) "T0"; write(param_value,Rfmt) param%t0; write(unit, Afmt, err = 667, iomsg = iomsg) adjustl(param_name), adjustl(param_value) - write(param_name, Afmt) "TSTOP"; write(param_value, Rfmt) param%tstop; write(unit, Afmt, err = 667, iomsg = iomsg) adjustl(param_name), adjustl(param_value) - write(param_name, Afmt) "DT"; write(param_value, Rfmt) param%dt; write(unit, Afmt, err = 667, iomsg = iomsg) adjustl(param_name), adjustl(param_value) - write(param_name, Afmt) "CB_IN"; write(param_value, Afmt) trim(adjustl(param%incbfile)); write(unit, Afmt, err = 667, iomsg = iomsg) adjustl(param_name), adjustl(param_value) - write(param_name, Afmt) "PL_IN"; write(param_value, Afmt) trim(adjustl(param%inplfile)); write(unit, Afmt, err = 667, iomsg = iomsg) adjustl(param_name), adjustl(param_value) - write(param_name, Afmt) "TP_IN"; write(param_value, Afmt) trim(adjustl(param%intpfile)); write(unit, Afmt, err = 667, iomsg = iomsg) adjustl(param_name), adjustl(param_value) - write(param_name, Afmt) "IN_TYPE"; write(param_value, Afmt) trim(adjustl(param%in_type)); write(unit, Afmt, err = 667, iomsg = iomsg) adjustl(param_name), adjustl(param_value) - write(param_name, Afmt) "IN_FORM"; write(param_value, Afmt) trim(adjustl(param%in_form)); write(unit, Afmt, err = 667, iomsg = iomsg) adjustl(param_name), adjustl(param_value) - if (param%istep_dump > 0) write(param_name, Afmt) "ISTEP_DUMP"; write(param_value, Ifmt) param%istep_dump; write(unit, Afmt, err = 667, iomsg = iomsg) adjustl(param_name), adjustl(param_value) + write(param_name, *) "T0"; write(param_value,Rfmt) param%t0; write(unit, *, err = 667, iomsg = iomsg) adjustl(param_name) // trim(adjustl(param_value)) + write(param_name, *) "TSTOP"; write(param_value, Rfmt) param%tstop; write(unit, *, err = 667, iomsg = iomsg) adjustl(param_name) // trim(adjustl(param_value)) + write(param_name, *) "DT"; write(param_value, Rfmt) param%dt; write(unit, *, err = 667, iomsg = iomsg) adjustl(param_name) // trim(adjustl(param_value)) + write(param_name, *) "CB_IN"; write(param_value, *) trim(adjustl(param%incbfile)); write(unit, *, err = 667, iomsg = iomsg) adjustl(param_name) // trim(adjustl(param_value)) + write(param_name, *) "PL_IN"; write(param_value, *) trim(adjustl(param%inplfile)); write(unit, *, err = 667, iomsg = iomsg) adjustl(param_name) // trim(adjustl(param_value)) + write(param_name, *) "TP_IN"; write(param_value, *) trim(adjustl(param%intpfile)); write(unit, *, err = 667, iomsg = iomsg) adjustl(param_name) // trim(adjustl(param_value)) + write(param_name, *) "IN_TYPE"; write(param_value, *) trim(adjustl(param%in_type)); write(unit, *, err = 667, iomsg = iomsg) adjustl(param_name) // trim(adjustl(param_value)) + write(param_name, *) "IN_FORM"; write(param_value, *) trim(adjustl(param%in_form)); write(unit, *, err = 667, iomsg = iomsg) adjustl(param_name) // trim(adjustl(param_value)) + if (param%istep_dump > 0) write(param_name, *) "ISTEP_DUMP"; write(param_value, Ifmt) param%istep_dump; write(unit, *, err = 667, iomsg = iomsg) adjustl(param_name) // trim(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, err = 667, iomsg = iomsg) adjustl(param_name), adjustl(param_value) - write(param_name, Afmt) "BIN_OUT"; write(param_value, Afmt) trim(adjustl(param%outfile)); write(unit, Afmt, err = 667, iomsg = iomsg) adjustl(param_name), adjustl(param_value) - write(param_name, Afmt) "OUT_TYPE"; write(param_value, Afmt) trim(adjustl(param%out_type)); write(unit, Afmt, err = 667, iomsg = iomsg) adjustl(param_name), adjustl(param_value) - write(param_name, Afmt) "OUT_FORM"; write(param_value, Afmt) trim(adjustl(param%out_form)); write(unit, Afmt, err = 667, iomsg = iomsg) adjustl(param_name), adjustl(param_value) - write(param_name, Afmt) "OUT_STAT"; write(param_value, Afmt) "APPEND"; write(unit, Afmt, err = 667, iomsg = iomsg) adjustl(param_name), adjustl(param_value) + write(param_name, *) "ISTEP_OUT"; write(param_value, Ifmt) param%istep_out; write(unit, *, err = 667, iomsg = iomsg) adjustl(param_name) // trim(adjustl(param_value)) + write(param_name, *) "BIN_OUT"; write(param_value, *) trim(adjustl(param%outfile)); write(unit, *, err = 667, iomsg = iomsg) adjustl(param_name) // trim(adjustl(param_value)) + write(param_name, *) "OUT_TYPE"; write(param_value, *) trim(adjustl(param%out_type)); write(unit, *, err = 667, iomsg = iomsg) adjustl(param_name) // trim(adjustl(param_value)) + write(param_name, *) "OUT_FORM"; write(param_value, *) trim(adjustl(param%out_form)); write(unit, *, err = 667, iomsg = iomsg) adjustl(param_name) // trim(adjustl(param_value)) + write(param_name, *) "OUT_STAT"; write(param_value, *) "APPEND"; write(unit, *, err = 667, iomsg = iomsg) adjustl(param_name) // trim(adjustl(param_value)) end if - write(param_name, Afmt) "PARTICLE_OUT"; write(param_value, Afmt) trim(adjustl(param%particle_out)); write(unit, Afmt, err = 667, iomsg = iomsg) adjustl(param_name), adjustl(param_value) - write(param_name, Afmt) "ENC_OUT"; write(param_value, Afmt) trim(adjustl(param%enc_out)); write(unit, Afmt, err = 667, iomsg = iomsg) adjustl(param_name), adjustl(param_value) - write(param_name, Afmt) "CHK_RMIN"; write(param_value, Rfmt) param%rmin; write(unit, Afmt, err = 667, iomsg = iomsg) adjustl(param_name), adjustl(param_value) - write(param_name, Afmt) "CHK_RMAX"; write(param_value, Rfmt) param%rmax; write(unit, Afmt, err = 667, iomsg = iomsg) adjustl(param_name), adjustl(param_value) - write(param_name, Afmt) "CHK_EJECT"; write(param_value, Rfmt) param%rmaxu; write(unit, Afmt, err = 667, iomsg = iomsg) adjustl(param_name), adjustl(param_value) - write(param_name, Afmt) "CHK_QMIN"; write(param_value, Rfmt) param%qmin; write(unit, Afmt, err = 667, iomsg = iomsg) adjustl(param_name), adjustl(param_value) + write(param_name, *) "PARTICLE_OUT"; write(param_value, *) trim(adjustl(param%particle_out)); write(unit, *, err = 667, iomsg = iomsg) adjustl(param_name) // trim(adjustl(param_value)) + if (param%enc_out /= "") then + write(param_name, *) "ENC_OUT"; write(param_value, *) trim(adjustl(param%enc_out)); write(unit, *, err = 667, iomsg = iomsg) adjustl(param_name) // trim(adjustl(param_value)) + end if + write(param_name, *) "CHK_RMIN"; write(param_value, Rfmt) param%rmin; write(unit, *, err = 667, iomsg = iomsg) adjustl(param_name) // trim(adjustl(param_value)) + write(param_name, *) "CHK_RMAX"; write(param_value, Rfmt) param%rmax; write(unit, *, err = 667, iomsg = iomsg) adjustl(param_name) // trim(adjustl(param_value)) + write(param_name, *) "CHK_EJECT"; write(param_value, Rfmt) param%rmaxu; write(unit, *, err = 667, iomsg = iomsg) adjustl(param_name) // trim(adjustl(param_value)) + write(param_name, *) "CHK_QMIN"; write(param_value, Rfmt) param%qmin; write(unit, *, err = 667, iomsg = iomsg) adjustl(param_name) // trim(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, err = 667, iomsg = iomsg) adjustl(param_name), adjustl(param_value) + write(param_name, *) "CHK_QMIN_COORD"; write(param_value, *) trim(adjustl(param%qmin_coord)); write(unit, *, err = 667, iomsg = iomsg) adjustl(param_name) // trim(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, err = 667, iomsg = iomsg) adjustl(param_name), adjustl(param_array(1)%value), adjustl(param_array(2)%value) + write(param_name, *) "CHK_QMIN_RANGE"; write(unit, *, err = 667, iomsg = iomsg) adjustl(param_name), adjustl(param_array(1)%value), adjustl(param_array(2)%value) + end if + write(param_name, *) "MU2KG"; write(param_value, Rfmt) param%MU2KG; write(unit, *, err = 667, iomsg = iomsg) adjustl(param_name) // trim(adjustl(param_value)) + write(param_name, *) "TU2S"; write(param_value, Rfmt) param%TU2S ; write(unit, *, err = 667, iomsg = iomsg) adjustl(param_name) // trim(adjustl(param_value)) + write(param_name, *) "DU2M"; write(param_value, Rfmt) param%DU2M; write(unit, *, err = 667, iomsg = iomsg) adjustl(param_name) // trim(adjustl(param_value)) + write(param_name, *) "RHILL_PRESENT"; write(param_value, Lfmt) param%lrhill_present; write(unit, *, err = 667, iomsg = iomsg) adjustl(param_name) // trim(adjustl(param_value)) + write(param_name, *) "EXTRA_FORCE"; write(param_value, Lfmt) param%lextra_force; write(unit, *, err = 667, iomsg = iomsg) adjustl(param_name) // trim(adjustl(param_value)) + if (param%discard_out /= "") then + write(param_name, *) "DISCARD_OUT"; write(param_value, *) trim(adjustl(param%discard_out)); write(unit, *, err = 667, iomsg = iomsg) adjustl(param_name) // trim(adjustl(param_value)) + end if + if (param%discard_out /= "") then + write(param_name, *) "BIG_DISCARD"; write(param_value, Lfmt) param%lbig_discard; write(unit, *, err = 667, iomsg = iomsg) adjustl(param_name) // trim(adjustl(param_value)) + end if + write(param_name, *) "CHK_CLOSE"; write(param_value, Lfmt) param%lclose; write(unit, *, err = 667, iomsg = iomsg) adjustl(param_name) // trim(adjustl(param_value)) + write(param_name, *) "ENERGY"; write(param_value, Lfmt) param%lenergy; write(unit, *, err = 667, iomsg = iomsg) adjustl(param_name) // trim(adjustl(param_value)) + if (param%lenergy .and. (param%energy_out /= "")) then + write(param_name, *) "ENERGY_OUT"; write(param_value, *) trim(adjustl(param%energy_out)); write(unit, *, err = 667, iomsg = iomsg) adjustl(param_name) // trim(adjustl(param_value)) end if - write(param_name, Afmt) "MU2KG"; write(param_value, Rfmt) param%MU2KG; write(unit, Afmt, err = 667, iomsg = iomsg) adjustl(param_name), adjustl(param_value) - write(param_name, Afmt) "TU2S"; write(param_value, Rfmt) param%TU2S ; write(unit, Afmt, err = 667, iomsg = iomsg) adjustl(param_name), adjustl(param_value) - write(param_name, Afmt) "DU2M"; write(param_value, Rfmt) param%DU2M; write(unit, Afmt, err = 667, iomsg = iomsg) adjustl(param_name), adjustl(param_value) - write(param_name, Afmt) "RHILL_PRESENT"; write(param_value, Lfmt) param%lrhill_present; write(unit, Afmt, err = 667, iomsg = iomsg) adjustl(param_name), adjustl(param_value) - write(param_name, Afmt) "EXTRA_FORCE"; write(param_value, Lfmt) param%lextra_force; write(unit, Afmt, err = 667, iomsg = iomsg) adjustl(param_name), adjustl(param_value) - if (param%discard_out /= "") write(param_name, Afmt) "DISCARD_OUT"; write(param_value, Afmt) trim(adjustl(param%discard_out)); write(unit, Afmt, err = 667, iomsg = iomsg) adjustl(param_name), adjustl(param_value) - if (param%discard_out /= "") write(param_name, Afmt) "BIG_DISCARD"; write(param_value, Lfmt) param%lbig_discard; write(unit, Afmt, err = 667, iomsg = iomsg) adjustl(param_name), adjustl(param_value) - write(param_name, Afmt) "CHK_CLOSE"; write(param_value, Lfmt) param%lclose; write(unit, Afmt, err = 667, iomsg = iomsg) adjustl(param_name), adjustl(param_value) - write(param_name, Afmt) "ENERGY"; write(param_value, Lfmt) param%lenergy; write(unit, Afmt, err = 667, iomsg = iomsg) adjustl(param_name), adjustl(param_value) - if (param%lenergy) write(param_name, Afmt) "ENERGY_OUT"; write(param_value, Afmt) trim(adjustl(param%energy_out)); write(unit, Afmt, err = 667, iomsg = iomsg) adjustl(param_name), adjustl(param_value) - write(param_name, Afmt) "GR"; write(param_value, Lfmt) param%lgr; write(unit, Afmt, err = 667, iomsg = iomsg) adjustl(param_name), adjustl(param_value) - write(param_name, Afmt) "ROTATION"; write(param_value, Lfmt) param%lrotation; write(unit, Afmt, err = 667, iomsg = iomsg) adjustl(param_name), adjustl(param_value) - write(param_name, Afmt) "TIDES"; write(param_value, Lfmt) param%ltides; write(unit, Afmt, err = 667, iomsg = iomsg) adjustl(param_name), adjustl(param_value) + write(param_name, *) "GR"; write(param_value, Lfmt) param%lgr; write(unit, *, err = 667, iomsg = iomsg) adjustl(param_name) // trim(adjustl(param_value)) + write(param_name, *) "ROTATION"; write(param_value, Lfmt) param%lrotation; write(unit, *, err = 667, iomsg = iomsg) adjustl(param_name) // trim(adjustl(param_value)) + write(param_name, *) "TIDES"; write(param_value, Lfmt) param%ltides; write(unit, *, err = 667, iomsg = iomsg) adjustl(param_name) // trim(adjustl(param_value)) if (param%lenergy) then - write(param_name, Afmt) "FIRSTENERGY"; write(param_value, Lfmt) param%lfirstenergy; write(unit, Afmt, err = 667, iomsg = iomsg) adjustl(param_name), adjustl(param_value) - write(param_name, Afmt) "EORBIT_ORIG"; write(param_value, Rfmt) param%Eorbit_orig; write(unit, Afmt, err = 667, iomsg = iomsg) adjustl(param_name), adjustl(param_value) - write(param_name, Afmt) "GMTOT_ORIG"; write(param_value, Rfmt) param%GMtot_orig; write(unit, Afmt, err = 667, iomsg = iomsg) 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, *) "FIRSTENERGY"; write(param_value, Lfmt) param%lfirstenergy; write(unit, *, err = 667, iomsg = iomsg) adjustl(param_name) // trim(adjustl(param_value)) + write(param_name, *) "EORBIT_ORIG"; write(param_value, Rfmt) param%Eorbit_orig; write(unit, *, err = 667, iomsg = iomsg) adjustl(param_name) // trim(adjustl(param_value)) + write(param_name, *) "GMTOT_ORIG"; write(param_value, Rfmt) param%GMtot_orig; write(unit, *, err = 667, iomsg = iomsg) adjustl(param_name) // trim(adjustl(param_value)) + write(param_name, *) "LTOT_ORIG"; write(v1, Rfmt) param%Ltot_orig(1); write(v2, Rfmt) param%Ltot_orig(2); write(v3, Rfmt) param%Ltot_orig(3) + write(unit, *, err = 667, iomsg = iomsg) adjustl(param_name) // trim(adjustl(v1)) // " " // trim(adjustl(v2)) // " " // trim(adjustl(v3)) + write(param_name, *) "LORBIT_ORIG"; write(v1, Rfmt) param%Lorbit_orig(1); write(v2, Rfmt) param%Lorbit_orig(2); write(v3, Rfmt) param%Lorbit_orig(3) + write(unit, *, err = 667, iomsg = iomsg) adjustl(param_name) // trim(adjustl(v1)) // " " // trim(adjustl(v2)) // " " // trim(adjustl(v3)) + write(param_name, *) "LSPIN_ORIG"; write(v1, Rfmt) param%Lspin_orig(1); write(v2, Rfmt) param%Lspin_orig(2); write(v3, Rfmt) param%Lspin_orig(3) + write(unit, *, err = 667, iomsg = iomsg) adjustl(param_name) // trim(adjustl(v1)) // " " // trim(adjustl(v2)) // " " // trim(adjustl(v3)) + write(param_name, *) "LESCAPE"; write(v1, Rfmt) param%Lescape(1); write(v2, Rfmt) param%Lescape(2); write(v3, Rfmt) param%Lescape(3) + write(unit, *, err = 667, iomsg = iomsg) adjustl(param_name) // trim(adjustl(v1)) // " " // trim(adjustl(v2)) // " " // trim(adjustl(v3)) - write(param_name, Afmt) "GMESCAPE"; write(param_value, Rfmt) param%GMescape; write(unit, Afmt, err = 667, iomsg = iomsg) adjustl(param_name), adjustl(param_value) - write(param_name, Afmt) "ECOLLISIONS"; write(param_value, Rfmt) param%Ecollisions; write(unit, Afmt, err = 667, iomsg = iomsg) adjustl(param_name), adjustl(param_value) - write(param_name, Afmt) "EUNTRACKED"; write(param_value, Rfmt) param%Euntracked; write(unit, Afmt, err = 667, iomsg = iomsg) adjustl(param_name), adjustl(param_value) + write(param_name, *) "GMESCAPE"; write(param_value, Rfmt) param%GMescape; write(unit, *, err = 667, iomsg = iomsg) adjustl(param_name) // trim(adjustl(param_value)) + write(param_name, *) "ECOLLISIONS"; write(param_value, Rfmt) param%Ecollisions; write(unit, *, err = 667, iomsg = iomsg) adjustl(param_name) // trim(adjustl(param_value)) + write(param_name, *) "EUNTRACKED"; write(param_value, Rfmt) param%Euntracked; write(unit, *, err = 667, iomsg = iomsg) adjustl(param_name) // trim(adjustl(param_value)) end if - write(param_name, Afmt) "FIRSTKICK"; write(param_value, Lfmt) param%lfirstkick; write(unit, Afmt, err = 667, iomsg = iomsg) adjustl(param_name), adjustl(param_value) - write(param_name, Afmt) "MAXID"; write(param_value, Ifmt) param%maxid; write(unit, Afmt, err = 667, iomsg = iomsg) adjustl(param_name), adjustl(param_value) + write(param_name, *) "FIRSTKICK"; write(param_value, Lfmt) param%lfirstkick; write(unit, *, err = 667, iomsg = iomsg) adjustl(param_name) // trim(adjustl(param_value)) + write(param_name, *) "MAXID"; write(param_value, Ifmt) param%maxid; write(unit, *, err = 667, iomsg = iomsg) adjustl(param_name) // trim(adjustl(param_value)) iostat = 0 iomsg = "UDIO not implemented" diff --git a/src/main/swiftest_driver.f90 b/src/main/swiftest_driver.f90 index 7f35cb0d2..9d06d1ddb 100644 --- a/src/main/swiftest_driver.f90 +++ b/src/main/swiftest_driver.f90 @@ -17,6 +17,7 @@ program swiftest_driver integer(I8B) :: iloop !! Loop counter integer(I8B) :: idump !! Dump cadence counter integer(I8B) :: iout !! Output cadence counter + integer(I8B) :: ioutput_t0 !! The output frame counter at time 0 integer(I8B) :: nloops !! Number of steps to take in the simulation real(DP) :: old_t_final = 0.0_DP !! Output time at which writing should start, in order to prevent duplicate lines being written for restarts @@ -51,7 +52,8 @@ program swiftest_driver iout = istep_out idump = istep_dump nloops = ceiling(tstop / dt, kind=I8B) - ioutput = ceiling(t0/ dt, kind=I8B) / int(istep_out, kind=I8B) + ioutput_t0 = int(t0 / dt / istep_out, kind=I8B) + ioutput = ioutput_t0 ! Prevent duplicate frames from being written if this is a restarted run if ((param%lrestart) .and. ((param%out_type == REAL8_TYPE) .or. param%out_type == REAL4_TYPE)) then old_t_final = nbody_system%get_old_t_final(param) @@ -81,7 +83,7 @@ program swiftest_driver if (istep_out > 0) then iout = iout - 1 if (iout == 0) then - ioutput = ceiling(t / dt, kind=I8B) / int(istep_out, kind=I8B) + ioutput = ioutput_t0 + iloop / istep_out if (t > old_t_final) call nbody_system%write_frame(param) iout = istep_out end if diff --git a/src/symba/symba_io.f90 b/src/symba/symba_io.f90 index 42f36ea64..c97904079 100644 --- a/src/symba/symba_io.f90 +++ b/src/symba/symba_io.f90 @@ -63,13 +63,13 @@ module subroutine symba_io_param_reader(self, unit, iotype, v_list, iostat, ioms deallocate(param%seed) allocate(param%seed(nseeds)) do i = 1, nseeds - ifirst = ilast + 1 + ifirst = ilast + 2 param_value = io_get_token(line, ifirst, ilast, iostat) read(param_value, *) param%seed(i) end do else ! Seed array in file is too small do i = 1, nseeds_from_file - ifirst = ilast + 1 + ifirst = ilast + 2 param_value = io_get_token(line, ifirst, ilast, iostat) read(param_value, *) param%seed(i) end do @@ -138,36 +138,37 @@ module subroutine symba_io_param_writer(self, unit, iotype, v_list, iostat, ioms 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 + character(len=NAMELEN) :: param_name + character(len=STRMAX) :: param_value type character_array character(25) :: value end type character_array type(character_array), dimension(:), allocatable :: param_array - integer(I4B) :: i + integer(I4B) :: i, nstr associate(param => self) call io_param_writer(param, unit, iotype, v_list, iostat, iomsg) ! Special handling is required for writing the random number seed array as its size is not known until runtime ! For the "SEED" parameter line, the first value will be the size of the seed array and the rest will be the seed array elements - write(param_name, Afmt) "GMTINY"; write(param_value, Rfmt) param%GMTINY; write(unit, Afmt, err = 667, iomsg = iomsg) adjustl(param_name), adjustl(param_value) - write(param_name, Afmt) "MIN_GMFRAG"; write(param_value, Rfmt) param%min_GMfrag; write(unit, Afmt, err = 667, iomsg = iomsg) adjustl(param_name), adjustl(param_value) - write(param_name, Afmt) "FRAGMENTATION"; write(param_value, Lfmt) param%lfragmentation; write(unit, Afmt, err = 667, iomsg = iomsg) adjustl(param_name), adjustl(param_value) + write(param_name, *) "GMTINY"; write(param_value, Rfmt) param%GMTINY; write(unit, *, err = 667, iomsg = iomsg) adjustl(param_name) // trim(adjustl(param_value)) + write(param_name, *) "MIN_GMFRAG"; write(param_value, Rfmt) param%min_GMfrag; write(unit, *, err = 667, iomsg = iomsg) adjustl(param_name) // trim(adjustl(param_value)) + write(param_name, *) "FRAGMENTATION"; write(param_value, Lfmt) param%lfragmentation; write(unit, *, err = 667, iomsg = iomsg) adjustl(param_name) // trim(adjustl(param_value)) if (param%lfragmentation) then - write(param_name, Afmt) "SEED" + write(param_name, *) "SEED" if (allocated(param_array)) deallocate(param_array) allocate(param_array(0:size(param%seed))) write(param_array(0)%value, Ifmt) size(param%seed) do i = 1, size(param%seed) write(param_array(i)%value, Ifmt) param%seed(i) end do - write(unit, Afmt, advance='no', err = 667, iomsg = iomsg) adjustl(param_name), adjustl(param_array(0)%value) - do i = 1, size(param%seed) + write(unit, '(" ",A32)', advance='no', err = 667, iomsg = iomsg) adjustl(param_name) + do i = 0, size(param%seed) + nstr = len(trim(adjustl(param_array(i)%value))) if (i < size(param%seed)) then - write(unit, Afmt, advance='no', err = 667, iomsg = iomsg) adjustl(param_array(i)%value) + write(unit, '(A12)', advance='no', err = 667, iomsg = iomsg) trim(adjustl(param_array(i)%value)) // " " else - write(unit, Afmt, err = 667, iomsg = iomsg) adjustl(param_array(i)%value) + write(unit, '(A12)', err = 667, iomsg = iomsg) trim(adjustl(param_array(i)%value)) end if end do end if @@ -175,8 +176,9 @@ module subroutine symba_io_param_writer(self, unit, iotype, v_list, iostat, ioms iostat = 0 end associate - 667 continue return + 667 continue + write(*,*) "Error writing parameter file for SyMBA: " // trim(adjustl(iomsg)) end subroutine symba_io_param_writer From 6e728a37e71007df4b9a75ea87cc60b3a4e18bcc Mon Sep 17 00:00:00 2001 From: David Minton Date: Fri, 3 Sep 2021 16:40:57 -0400 Subject: [PATCH 125/154] Fixed collision movie maker to work with the new NetCDF files --- .../symba_energy_momentum/collision_movie.py | 34 ++++++++++++------- 1 file changed, 21 insertions(+), 13 deletions(-) diff --git a/examples/symba_energy_momentum/collision_movie.py b/examples/symba_energy_momentum/collision_movie.py index 56ed66b9b..1a17034c5 100755 --- a/examples/symba_energy_momentum/collision_movie.py +++ b/examples/symba_energy_momentum/collision_movie.py @@ -10,15 +10,21 @@ xmax = 20.0 ymin = -20.0 ymax = 20.0 +framejump = 1 +ncutoff = 1e20 +radscale = 2000 cases = ['supercat_head', 'supercat_off', 'disruption_head', 'disruption_off'] +#cases = ['supercat_head'] -def scale_sim(ds): - +def scale_sim(ds, Rcb): + dst0 = ds.isel(time=0) + dst0 = dst0.where(dst0['radius'] < Rcb, drop=True) + dst0 = dst0.where(dst0.id > 0, drop=True) + GMtot = dst0['Gmass'].sum(skipna=True, dim="id") dsscale = ds.where(ds.id > 0, drop=True) # Remove the central body - - GMtot = dsscale['Gmass'].sum(skipna=True, dim="id").isel(time=0) - rscale = ds['radius'].sel(id=1, time=0) + + rscale = ds['radius'].sel(id=1, time=0).values dsscale['radius'] /= rscale dsscale['radmarker'] = dsscale['radius'].fillna(0) @@ -64,12 +70,12 @@ class AnimatedScatter(object): """An animated scatter plot using matplotlib.animations.FuncAnimation.""" def __init__(self, ds, param): - frame = 0 - nframes = ds['time'].size - self.ds = scale_sim(ds) + nframes = int(ds['time'].size / framejump) self.param = param + self.Rcb = ds['radius'].sel(id=0, time=0).values self.rot_angle = {} + self.ds = scale_sim(ds, self.Rcb) self.clist = {'Initial conditions' : 'xkcd:windows blue', 'Disruption' : 'xkcd:baby poop', @@ -94,8 +100,9 @@ def __init__(self, ds, param): # Then setup FuncAnimation. self.ani = animation.FuncAnimation(fig, self.update, interval=1, frames=nframes, init_func=self.setup_plot, blit=False) - self.ani.save(animfile, fps=60, dpi=300, - extra_args=['-vcodec', 'libx264']) + self.ani.save(animfile, fps=60, dpi=300, extra_args=['-vcodec', 'mpeg4']) + #self.ani.save(animfile, fps=60, dpi=300, extra_args=['-vcodec', 'libx264']) + print(f"Finished writing {animfile}") def plot_pl_circles(self, pl, radmarker): patches = [] @@ -239,14 +246,15 @@ def update(self,frame): def data_stream(self, frame=0): while True: d = self.ds.isel(time=frame) - radius = d['radmarker'].values + #d = d.where(d['radius'] > 0.0, drop=True) + radius = d['radius'].values Gmass = d['Gmass'].values x = d['xhxb'].values y = d['pyb'].values vhx = d['vhxb'].values vhy = d['vhyb'].values name = d['id'].values - npl = d.id.count().values + npl = d['npl'].values[0] id = d['id'].values rotx = d['rotx'].values roty = d['roty'].values @@ -256,7 +264,7 @@ def data_stream(self, frame=0): origin = d['origin_type'].values t = self.ds.coords['time'].values[frame] - self.mask = np.logical_not(np.isnan(x)) + self.mask = np.logical_not(radius > self.Rcb) x = np.nan_to_num(x, copy=False) y = np.nan_to_num(y, copy=False) From dfa9b560b33fb2a1b81d16cc89b5d292e98888e1 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Fri, 3 Sep 2021 16:45:10 -0400 Subject: [PATCH 126/154] Replaced the FORCE MERGE message with a more descriptive message for the Fraggle logfile. --- src/fraggle/fraggle_regime.f90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/fraggle/fraggle_regime.f90 b/src/fraggle/fraggle_regime.f90 index eb614d951..2888d234f 100644 --- a/src/fraggle/fraggle_regime.f90 +++ b/src/fraggle/fraggle_regime.f90 @@ -179,7 +179,7 @@ subroutine fraggle_regime_collresolve(Mcb, m1, m2, rad1, rad2, xh1, xh2, vb1, vb Mlr = Mtot Mslr = 0.0_DP Qloss = 0.0_DP - write(*,*) "FORCE MERGE" + call fraggle_io_log_one_message("Fragments would have mass below the minimum. Converting this collision into a merger.") else if( Vimp < Vescp) then regime = COLLRESOLVE_REGIME_MERGE !perfect merging regime From c0a21aa66a5af38af1426db3287623b81b6a1069 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Fri, 3 Sep 2021 17:31:41 -0400 Subject: [PATCH 127/154] Removed old write statements from the param reader --- src/io/io.f90 | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/io/io.f90 b/src/io/io.f90 index 7756747bf..21c165e23 100644 --- a/src/io/io.f90 +++ b/src/io/io.f90 @@ -623,12 +623,10 @@ module subroutine io_param_reader(self, unit, iotype, v_list, iostat, iomsg) case("GMTOT_ORIG") read(param_value, *, err = 667, iomsg = iomsg) param%GMtot_orig case("LTOT_ORIG") - write(*,*) param_value read(param_value, *, err = 667, iomsg = iomsg) param%Ltot_orig(1) do i = 2, NDIM ifirst = ilast + 2 param_value = io_get_token(line, ifirst, ilast, iostat) - write(*,*) param_value read(param_value, *, err = 667, iomsg = iomsg) param%Ltot_orig(i) end do case("LORBIT_ORIG") From e5ee63d3683e5089329964c726badd4f0fa93866 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Fri, 3 Sep 2021 17:55:17 -0400 Subject: [PATCH 128/154] Moved the fragment total mass and barycenter calculations outside of the regime determination, as that does not get run when fragmentation is turned off --- src/fraggle/fraggle_regime.f90 | 3 --- src/symba/symba_collision.f90 | 6 ++++++ 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/fraggle/fraggle_regime.f90 b/src/fraggle/fraggle_regime.f90 index 2888d234f..a20b08d29 100644 --- a/src/fraggle/fraggle_regime.f90 +++ b/src/fraggle/fraggle_regime.f90 @@ -60,9 +60,6 @@ module subroutine fraggle_regime_colliders(self, frag, system, param) ! Convert quantities back to the system units and save them into the fragment system frag%mass_dist(:) = (frag%mass_dist(:) / param%MU2KG) frag%Qloss = frag%Qloss * (param%TU2S / param%DU2M)**2 / param%MU2KG - frag%mtot = sum(colliders%mass(:)) - frag%xbcom(:) = (colliders%mass(1) * colliders%xb(:,1) + colliders%mass(2) * colliders%xb(:,2)) / frag%mtot - frag%vbcom(:) = (colliders%mass(1) * colliders%vb(:,1) + colliders%mass(2) * colliders%vb(:,2)) / frag%mtot call fraggle_io_log_regime(colliders, frag) end associate diff --git a/src/symba/symba_collision.f90 b/src/symba/symba_collision.f90 index bc9afd880..11b3b874c 100644 --- a/src/symba/symba_collision.f90 +++ b/src/symba/symba_collision.f90 @@ -888,6 +888,9 @@ module subroutine symba_collision_resolve_fragmentations(self, system, param) if ((.not. lgoodcollision) .or. any(pl%status(idx_parent(:)) /= COLLISION)) cycle call colliders%regime(frag, system, param) + frag%mtot = sum(colliders%mass(:)) + frag%xbcom(:) = (colliders%mass(1) * colliders%xb(:,1) + colliders%mass(2) * colliders%xb(:,2)) / frag%mtot + frag%vbcom(:) = (colliders%mass(1) * colliders%vb(:,1) + colliders%mass(2) * colliders%vb(:,2)) / frag%mtot select case (frag%regime) case (COLLRESOLVE_REGIME_DISRUPTION, COLLRESOLVE_REGIME_SUPERCATASTROPHIC) @@ -941,6 +944,9 @@ module subroutine symba_collision_resolve_mergers(self, system, param) if (any(pl%status(idx_parent(:)) /= COLLISION)) cycle ! One of these two bodies has already been resolved frag%regime = COLLRESOLVE_REGIME_MERGE + frag%mtot = sum(colliders%mass(:)) + frag%xbcom(:) = (colliders%mass(1) * colliders%xb(:,1) + colliders%mass(2) * colliders%xb(:,2)) / frag%mtot + frag%vbcom(:) = (colliders%mass(1) * colliders%vb(:,1) + colliders%mass(2) * colliders%vb(:,2)) / frag%mtot plplcollision_list%status(i) = symba_collision_casemerge(system, param, colliders, frag) end do end select From 87fc551c56c9e7ca5863b4b7339539e8f9f82dbc Mon Sep 17 00:00:00 2001 From: David A Minton Date: Fri, 3 Sep 2021 18:03:11 -0400 Subject: [PATCH 129/154] Reduced the number of tries because it appears to be pretty bimodal (it either succeeds after a few tries, or not at all) --- src/fraggle/fraggle_generate.f90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/fraggle/fraggle_generate.f90 b/src/fraggle/fraggle_generate.f90 index f66904599..d0c1374f9 100644 --- a/src/fraggle/fraggle_generate.f90 +++ b/src/fraggle/fraggle_generate.f90 @@ -24,7 +24,7 @@ module subroutine fraggle_generate_fragments(self, colliders, system, param, lfa integer(I4B) :: i integer(I4B) :: try real(DP) :: r_max_start, f_spin, dEtot, dLmag - integer(I4B), parameter :: MAXTRY = 3000 + integer(I4B), parameter :: MAXTRY = 100 logical :: lk_plpl logical, dimension(size(IEEE_ALL)) :: fpe_halting_modes, fpe_quiet_modes logical, dimension(size(IEEE_USUAL)) :: fpe_flag From b33dd1e064fbe97a310042229dde292a19c249c7 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Fri, 3 Sep 2021 20:36:26 -0400 Subject: [PATCH 130/154] Removed extra terminal output of conservation report for non pl-pl collisions/escapes and made the halting condition on lack of mass conservation more robust. --- src/discard/discard.f90 | 2 +- src/io/io.f90 | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/discard/discard.f90 b/src/discard/discard.f90 index 97bbfbfc4..2ee3dafec 100644 --- a/src/discard/discard.f90 +++ b/src/discard/discard.f90 @@ -31,7 +31,7 @@ module subroutine discard_system(self, param) end if if (lpl_discards .or. ltp_discards) call system%write_discard(param) - if (lpl_discards .and. param%lenergy) call self%conservation_report(param, lterminal=.true.) + if (lpl_discards .and. param%lenergy) call self%conservation_report(param, lterminal=.false.) if (lpl_check) call pl_discards%setup(0,param) if (ltp_check) call tp_discards%setup(0,param) diff --git a/src/io/io.f90 b/src/io/io.f90 index 21c165e23..5fcae92b5 100644 --- a/src/io/io.f90 +++ b/src/io/io.f90 @@ -61,15 +61,15 @@ module subroutine io_conservation_report(self, param, lterminal) close(EGYIU, err = 667, iomsg = errmsg) end if - if (.not.param%lfirstenergy .and. lterminal) then + if (.not.param%lfirstenergy) then Lerror = norm2(Ltot_now(:) - param%Ltot_orig(:)) / norm2(param%Ltot_orig(:)) Eorbit_error = (Eorbit_now - param%Eorbit_orig) / abs(param%Eorbit_orig) Ecoll_error = param%Ecollisions / abs(param%Eorbit_orig) Etotal_error = (Eorbit_now - param%Ecollisions - param%Eorbit_orig - param%Euntracked) / abs(param%Eorbit_orig) Merror = (GMtot_now - param%GMtot_orig) / param%GMtot_orig - write(*, EGYTERMFMT) Lerror, Ecoll_error, Etotal_error, Merror - if (Merror < -10 * epsilon(Merror)) then - write(*,*) 'Mass loss! Halting!' + if (lterminal) write(*, EGYTERMFMT) Lerror, Ecoll_error, Etotal_error, Merror + if (abs(Merror) > 100 * epsilon(Merror)) then + write(*,*) "Severe error! Mass not conserved! Halting!" call pl%xv2el(cb) call param%nciu%open(param) call self%write_hdr(param%nciu, param) From 840ed476f76ca412738c9080f19b5a7fe36787f2 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Fri, 3 Sep 2021 20:37:46 -0400 Subject: [PATCH 131/154] Tweaked input file for symba mars disk so that the mass cutoff is larger, leading to fewer tiny particles. --- examples/symba_mars_disk/param.in | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/examples/symba_mars_disk/param.in b/examples/symba_mars_disk/param.in index 78c087566..3a2851566 100644 --- a/examples/symba_mars_disk/param.in +++ b/examples/symba_mars_disk/param.in @@ -6,8 +6,8 @@ CB_IN cb.in PL_IN mars.in TP_IN tp.in IN_TYPE ASCII -ISTEP_OUT 1 -ISTEP_DUMP 1 +ISTEP_OUT 100 +ISTEP_DUMP 100 BIN_OUT bin.nc PARTICLE_OUT particle.dat OUT_TYPE NETCDF_DOUBLE @@ -22,8 +22,8 @@ CHK_QMIN_COORD HELIO CHK_QMIN_RANGE 3389500.0 338950000000.0 EXTRA_FORCE no RHILL_PRESENT yes -GMTINY 1000.0 -MIN_GMFRAG 10.0 +GMTINY 10000.0 +MIN_GMFRAG 1000.0 ENERGY yes FRAGMENTATION yes ROTATION yes From b12a40afb280832eaea2e415943ef53895ac3abc Mon Sep 17 00:00:00 2001 From: David A Minton Date: Sat, 4 Sep 2021 15:53:58 -0400 Subject: [PATCH 132/154] Fixed problem involving setting string values of info variables. Variables were not being replaced properly because only part of the strings were being replaced. Fixed by always printing NAMELEN-length strings to the string info variables. --- src/symba/symba_util.f90 | 4 +++- src/util/util_set.f90 | 18 ++++++++++++------ 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/src/symba/symba_util.f90 b/src/symba/symba_util.f90 index b68635b0e..8b8e48f47 100644 --- a/src/symba/symba_util.f90 +++ b/src/symba/symba_util.f90 @@ -455,7 +455,9 @@ module subroutine symba_util_rearray_pl(self, system, param) ! Reset all of the status flags for this body pl%status(1:npl) = ACTIVE - pl%info(1:npl)%status = "ACTIVE" + do i = 1, npl + call pl%info(i)%set_value(status="ACTIVE") + end do pl%ldiscard(1:npl) = .false. pl%lcollision(1:npl) = .false. pl%lmask(1:npl) = .true. diff --git a/src/util/util_set.f90 b/src/util/util_set.f90 index 48c0006c2..80ed89b1f 100644 --- a/src/util/util_set.f90 +++ b/src/util/util_set.f90 @@ -116,15 +116,24 @@ module subroutine util_set_particle_info(self, name, particle_type, status, orig real(DP), dimension(:), intent(in), optional :: discard_xh !! The heliocentric distance vector at the time of the particle's discard real(DP), dimension(:), intent(in), optional :: discard_vh !! The heliocentric velocity vector at the time of the particle's discard integer(I4B), intent(in), optional :: discard_body_id !! The id of the other body involved in the discard (0 if no other body involved) + ! Internals + character(len=NAMELEN) :: lenstr + character(len=:), allocatable :: fmtlabel + + write(lenstr, *) NAMELEN + fmtlabel = "(A" // trim(adjustl(lenstr)) // ")" if (present(name)) then - self%name = name + write(self%name, fmtlabel) trim(adjustl(name)) end if if (present(particle_type)) then - self%particle_type = particle_type + write(self%particle_type, fmtlabel) trim(adjustl(particle_type)) end if + if (present(status)) then + write(self%status, fmtlabel) trim(adjustl(status)) + end if if (present(origin_type)) then - self%origin_type = origin_type + write(self%origin_type, fmtlabel) trim(adjustl(origin_type)) end if if (present(origin_time)) then self%origin_time = origin_time @@ -138,9 +147,6 @@ module subroutine util_set_particle_info(self, name, particle_type, status, orig if (present(discard_time)) then self%discard_time = discard_time end if - if (present(status)) then - self%status = status - end if if (present(discard_xh)) then self%discard_xh(:) = discard_xh(:) end if From aa1bcd1f1993e9766eeddcf6e368ca5d86315aa4 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Sat, 4 Sep 2021 16:28:02 -0400 Subject: [PATCH 133/154] Fixed issue where failed fragmentation generation still advanced the maxid counter ahead as if it succeeded, leading to gaps in the ids of bodies. Also changed the way names are saved to the info variable. --- src/io/io.f90 | 23 +++++++++++++++-------- src/symba/symba_collision.f90 | 12 ++++++------ 2 files changed, 21 insertions(+), 14 deletions(-) diff --git a/src/io/io.f90 b/src/io/io.f90 index 5fcae92b5..b938af8c2 100644 --- a/src/io/io.f90 +++ b/src/io/io.f90 @@ -1022,12 +1022,14 @@ module subroutine io_read_in_cb(self, param) integer(I4B) :: iu = LUN character(len=STRMAX) :: errmsg integer(I4B) :: ierr, idold + character(len=NAMELEN) :: name if (param%in_type == 'ASCII') then self%id = 0 param%maxid = 0 open(unit = iu, file = param%incbfile, status = 'old', form = 'FORMATTED', err = 667, iomsg = errmsg) - read(iu, *, err = 667, iomsg = errmsg) self%info%name + read(iu, *, err = 667, iomsg = errmsg) name + call self%info%set_value(name=name) read(iu, *, err = 667, iomsg = errmsg) self%Gmass self%mass = real(self%Gmass / param%GU, kind=DP) read(iu, *, err = 667, iomsg = errmsg) self%radius @@ -1133,6 +1135,7 @@ module function io_read_frame_body(self, iu, param) result(ierr) integer(I4B) :: ierr !! Error code: returns 0 if the read is successful ! Internals character(len=STRMAX) :: errmsg + character(len=NAMELEN), dimension(self%nbody) :: name integer(I4B) :: i real(QP) :: val @@ -1157,9 +1160,10 @@ module function io_read_frame_body(self, iu, param) result(ierr) select case(param%in_type) case (REAL4_TYPE, REAL8_TYPE) read(iu, err = 667, iomsg = errmsg) self%id(:) - associate(name => self%info%name) - read(iu, err = 667, iomsg = errmsg) name(:) - end associate + read(iu, err = 667, iomsg = errmsg) name(:) + do i = 1, n + call self%info(i)%set_value(name=name(i)) + end do select case (param%in_form) case (XV) @@ -1205,10 +1209,11 @@ module function io_read_frame_body(self, iu, param) result(ierr) select type(self) class is (swiftest_pl) if (param%lrhill_present) then - read(iu, *, err = 667, iomsg = errmsg) self%info(i)%name, val, self%rhill(i) + read(iu, *, err = 667, iomsg = errmsg) name(i), val, self%rhill(i) else - read(iu, *, err = 667, iomsg = errmsg) self%info(i)%name, val + read(iu, *, err = 667, iomsg = errmsg) name(i), val end if + call self%info(i)%set_value(name=name(i)) self%Gmass(i) = real(val, kind=DP) self%mass(i) = real(val / param%GU, kind=DP) read(iu, *, err = 667, iomsg = errmsg) self%radius(i) @@ -1280,10 +1285,12 @@ module function io_read_frame_cb(self, iu, param) result(ierr) ! Result integer(I4B) :: ierr !! Error code: returns 0 if the read is successful ! Internals - character(len=STRMAX) :: errmsg + character(len=STRMAX) :: errmsg + character(len=NAMELEN) :: name read(iu, err = 667, iomsg = errmsg) self%id - read(iu, err = 667, iomsg = errmsg) self%info%name + read(iu, err = 667, iomsg = errmsg) name + call self%info%set_value(name=name) read(iu, err = 667, iomsg = errmsg) self%Gmass self%mass = self%Gmass / param%GU read(iu, err = 667, iomsg = errmsg) self%radius diff --git a/src/symba/symba_collision.f90 b/src/symba/symba_collision.f90 index 11b3b874c..20e90909d 100644 --- a/src/symba/symba_collision.f90 +++ b/src/symba/symba_collision.f90 @@ -37,8 +37,6 @@ module function symba_collision_casedisruption(system, param, colliders, frag) ! Collisional fragments will be uniformly distributed around the pre-impact barycenter call frag%setup(nfrag, param) call frag%set_mass_dist(colliders) - frag%id(1:nfrag) = [(i, i = param%maxid + 1, param%maxid + nfrag)] - param%maxid = frag%id(nfrag) ! Generate the position and velocity distributions of the fragments call frag%generate_fragments(colliders, system, param, lfailure) @@ -63,6 +61,8 @@ module function symba_collision_casedisruption(system, param, colliders, frag) case(COLLRESOLVE_REGIME_SUPERCATASTROPHIC) status = SUPERCATASTROPHIC end select + frag%id(1:nfrag) = [(i, i = param%maxid + 1, param%maxid + nfrag)] + param%maxid = frag%id(nfrag) call symba_collision_mergeaddsub(system, param, colliders, frag, status) end if @@ -110,10 +110,6 @@ module function symba_collision_casehitandrun(system, param, colliders, frag) r lpure = .false. call frag%setup(nfrag, param) call frag%set_mass_dist(colliders) - ibiggest = colliders%idx(maxloc(system%pl%Gmass(colliders%idx(:)), dim=1)) - frag%id(1) = system%pl%id(ibiggest) - frag%id(2:nfrag) = [(i, i = param%maxid + 1, param%maxid + nfrag - 1)] - param%maxid = frag%id(nfrag) ! Generate the position and velocity distributions of the fragments call frag%generate_fragments(colliders, system, param, lpure) @@ -135,6 +131,10 @@ module function symba_collision_casehitandrun(system, param, colliders, frag) r pl%lcollision(colliders%idx(:)) = .false. end select else + ibiggest = colliders%idx(maxloc(system%pl%Gmass(colliders%idx(:)), dim=1)) + frag%id(1) = system%pl%id(ibiggest) + frag%id(2:nfrag) = [(i, i = param%maxid + 1, param%maxid + nfrag - 1)] + param%maxid = frag%id(nfrag) status = HIT_AND_RUN_DISRUPT call symba_collision_mergeaddsub(system, param, colliders, frag, status) end if From c8bf996adebe9bffe1091ffa62b00b709d50bcbb Mon Sep 17 00:00:00 2001 From: David A Minton Date: Sat, 4 Sep 2021 16:39:57 -0400 Subject: [PATCH 134/154] Changed how string variables are saved in NetCDF format. Strings are no longer trimmed --- src/netcdf/netcdf.f90 | 54 ++++++++++++++++++------------------------- 1 file changed, 22 insertions(+), 32 deletions(-) diff --git a/src/netcdf/netcdf.f90 b/src/netcdf/netcdf.f90 index 64b30a44a..96101eb70 100644 --- a/src/netcdf/netcdf.f90 +++ b/src/netcdf/netcdf.f90 @@ -249,7 +249,7 @@ module subroutine netcdf_write_frame_base(self, iu, param) class(netcdf_parameters), intent(inout) :: iu !! Parameters used to identify a particular NetCDF dataset class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters ! Internals - integer(I4B) :: i, j, tslot, strlen, idslot + integer(I4B) :: i, j, tslot, NAMELEN, idslot integer(I4B), dimension(:), allocatable :: ind character(len=:), allocatable :: charstring @@ -317,13 +317,11 @@ module subroutine netcdf_write_frame_base(self, iu, param) idslot = self%id + 1 call check( nf90_put_var(iu%ncid, iu%id_varid, self%id, start=[idslot]) ) - charstring = trim(adjustl(self%info%name)) - strlen = len(charstring) - call check( nf90_put_var(iu%ncid, iu%name_varid, charstring, start=[1, idslot], count=[strlen, 1]) ) + charstring = adjustl(self%info%name) + call check( nf90_put_var(iu%ncid, iu%name_varid, charstring, start=[1, idslot], count=[NAMELEN, 1]) ) - charstring = trim(adjustl(self%info%particle_type)) - strlen = len(charstring) - call check( nf90_put_var(iu%ncid, iu%ptype_varid, charstring, start=[1, idslot], count=[strlen, 1]) ) + charstring = adjustl(self%info%particle_type) + call check( nf90_put_var(iu%ncid, iu%ptype_varid, charstring, start=[1, idslot], count=[NAMELEN, 1]) ) call check( nf90_put_var(iu%ncid, iu%Gmass_varid, self%Gmass, start=[idslot, tslot]) ) call check( nf90_put_var(iu%ncid, iu%radius_varid, self%radius, start=[idslot, tslot]) ) @@ -355,7 +353,7 @@ module subroutine netcdf_write_particle_info_base(self, iu) class(swiftest_base), intent(in) :: self !! Swiftest particle object class(netcdf_parameters), intent(inout) :: iu !! Parameters used to identify a particular NetCDF dataset ! Internals - integer(I4B) :: i, j, tslot, strlen, idslot + integer(I4B) :: i, j, tslot, NAMELEN, idslot integer(I4B), dimension(:), allocatable :: ind character(len=:), allocatable :: charstring @@ -370,21 +368,17 @@ module subroutine netcdf_write_particle_info_base(self, iu) j = ind(i) idslot = self%id(j) + 1 call check( nf90_put_var(iu%ncid, iu%id_varid, self%id(j), start=[idslot]) ) - charstring = trim(adjustl(self%info(j)%name)) - strlen = len(charstring) - call check( nf90_put_var(iu%ncid, iu%name_varid, charstring, start=[1, idslot], count=[strlen, 1]) ) + charstring = adjustl(self%info(j)%name) + call check( nf90_put_var(iu%ncid, iu%name_varid, charstring, start=[1, idslot], count=[NAMELEN, 1]) ) - charstring = trim(adjustl(self%info(j)%particle_type)) - strlen = len(charstring) - call check( nf90_put_var(iu%ncid, iu%ptype_varid, charstring, start=[1, idslot], count=[strlen, 1]) ) + charstring = adjustl(self%info(j)%particle_type) + call check( nf90_put_var(iu%ncid, iu%ptype_varid, charstring, start=[1, idslot], count=[NAMELEN, 1]) ) - charstring = trim(adjustl(self%info(j)%status)) - strlen = len(charstring) - call check( nf90_put_var(iu%ncid, iu%status_varid, charstring, start=[1, idslot], count=[strlen, 1]) ) + charstring = adjustl(self%info(j)%status) + call check( nf90_put_var(iu%ncid, iu%status_varid, charstring, start=[1, idslot], count=[NAMELEN, 1]) ) - charstring = trim(adjustl(self%info(j)%origin_type)) - strlen = len(charstring) - call check( nf90_put_var(iu%ncid, iu%origin_type_varid, charstring, start=[1, idslot], count=[strlen, 1]) ) + charstring = adjustl(self%info(j)%origin_type) + call check( nf90_put_var(iu%ncid, iu%origin_type_varid, charstring, start=[1, idslot], count=[NAMELEN, 1]) ) call check( nf90_put_var(iu%ncid, iu%origin_time_varid, self%info(j)%origin_time, start=[idslot]) ) call check( nf90_put_var(iu%ncid, iu%origin_xhx_varid, self%info(j)%origin_xh(1), start=[idslot]) ) @@ -408,21 +402,17 @@ module subroutine netcdf_write_particle_info_base(self, iu) idslot = self%id + 1 call check( nf90_put_var(iu%ncid, iu%id_varid, self%id, start=[idslot]) ) - charstring = trim(adjustl(self%info%name)) - strlen = len(charstring) - call check( nf90_put_var(iu%ncid, iu%name_varid, charstring, start=[1, idslot], count=[strlen, 1]) ) + charstring = adjustl(self%info%name) + call check( nf90_put_var(iu%ncid, iu%name_varid, charstring, start=[1, idslot], count=[NAMELEN, 1]) ) - charstring = trim(adjustl(self%info%particle_type)) - strlen = len(charstring) - call check( nf90_put_var(iu%ncid, iu%ptype_varid, charstring, start=[1, idslot], count=[strlen, 1]) ) + charstring = adjustl(self%info%particle_type) + call check( nf90_put_var(iu%ncid, iu%ptype_varid, charstring, start=[1, idslot], count=[NAMELEN, 1]) ) - charstring = trim(adjustl(self%info%status)) - strlen = len(charstring) - call check( nf90_put_var(iu%ncid, iu%status_varid, charstring, start=[1, idslot], count=[strlen, 1]) ) + charstring = adjustl(self%info%status) + call check( nf90_put_var(iu%ncid, iu%status_varid, charstring, start=[1, idslot], count=[NAMELEN, 1]) ) - charstring = trim(adjustl(self%info%origin_type)) - strlen = len(charstring) - call check( nf90_put_var(iu%ncid, iu%origin_type_varid, charstring, start=[1, idslot], count=[strlen, 1]) ) + charstring = adjustl(self%info%origin_type) + call check( nf90_put_var(iu%ncid, iu%origin_type_varid, charstring, start=[1, idslot], count=[NAMELEN, 1]) ) call check( nf90_put_var(iu%ncid, iu%origin_time_varid, self%info%origin_time, start=[idslot]) ) call check( nf90_put_var(iu%ncid, iu%origin_xhx_varid, self%info%origin_xh(1), start=[idslot]) ) From df7a7192cef7ca2ff024681633ab4d241383a048 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Sat, 4 Sep 2021 16:49:44 -0400 Subject: [PATCH 135/154] Fixed problem with NetCDF string writing --- src/netcdf/netcdf.f90 | 73 ++++++++++++++++++++++++++----------------- 1 file changed, 45 insertions(+), 28 deletions(-) diff --git a/src/netcdf/netcdf.f90 b/src/netcdf/netcdf.f90 index 96101eb70..80bcdcb5d 100644 --- a/src/netcdf/netcdf.f90 +++ b/src/netcdf/netcdf.f90 @@ -249,7 +249,7 @@ module subroutine netcdf_write_frame_base(self, iu, param) class(netcdf_parameters), intent(inout) :: iu !! Parameters used to identify a particular NetCDF dataset class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters ! Internals - integer(I4B) :: i, j, tslot, NAMELEN, idslot + integer(I4B) :: i, j, tslot, strlen, idslot integer(I4B), dimension(:), allocatable :: ind character(len=:), allocatable :: charstring @@ -261,7 +261,6 @@ module subroutine netcdf_write_frame_base(self, iu, param) class is (swiftest_body) associate(n => self%nbody) if (n == 0) return - allocate(ind(n)) call util_sort(self%id(1:n), ind) @@ -317,12 +316,6 @@ module subroutine netcdf_write_frame_base(self, iu, param) idslot = self%id + 1 call check( nf90_put_var(iu%ncid, iu%id_varid, self%id, start=[idslot]) ) - charstring = adjustl(self%info%name) - call check( nf90_put_var(iu%ncid, iu%name_varid, charstring, start=[1, idslot], count=[NAMELEN, 1]) ) - - charstring = adjustl(self%info%particle_type) - call check( nf90_put_var(iu%ncid, iu%ptype_varid, charstring, start=[1, idslot], count=[NAMELEN, 1]) ) - call check( nf90_put_var(iu%ncid, iu%Gmass_varid, self%Gmass, start=[idslot, tslot]) ) call check( nf90_put_var(iu%ncid, iu%radius_varid, self%radius, start=[idslot, tslot]) ) if (param%lrotation) then @@ -353,9 +346,16 @@ module subroutine netcdf_write_particle_info_base(self, iu) class(swiftest_base), intent(in) :: self !! Swiftest particle object class(netcdf_parameters), intent(inout) :: iu !! Parameters used to identify a particular NetCDF dataset ! Internals - integer(I4B) :: i, j, tslot, NAMELEN, idslot + integer(I4B) :: i, j, tslot, strlen, idslot integer(I4B), dimension(:), allocatable :: ind character(len=:), allocatable :: charstring + character(len=NAMELEN) :: emptystr, lenstr + character(len=:), allocatable :: fmtlabel + + ! This string of spaces of length NAMELEN is used to clear out any old data left behind inside the string variables + write(lenstr, *) NAMELEN + fmtlabel = "(A" // trim(adjustl(lenstr)) // ")" + write(emptystr, fmtlabel) " " select type(self) class is (swiftest_body) @@ -368,17 +368,26 @@ module subroutine netcdf_write_particle_info_base(self, iu) j = ind(i) idslot = self%id(j) + 1 call check( nf90_put_var(iu%ncid, iu%id_varid, self%id(j), start=[idslot]) ) - charstring = adjustl(self%info(j)%name) - call check( nf90_put_var(iu%ncid, iu%name_varid, charstring, start=[1, idslot], count=[NAMELEN, 1]) ) - charstring = adjustl(self%info(j)%particle_type) - call check( nf90_put_var(iu%ncid, iu%ptype_varid, charstring, start=[1, idslot], count=[NAMELEN, 1]) ) + charstring = trim(adjustl(self%info(j)%name)) + strlen = len(charstring) + call check( nf90_put_var(iu%ncid, iu%name_varid, emptystr, start=[1, idslot], count=[NAMELEN, 1]) ) + call check( nf90_put_var(iu%ncid, iu%name_varid, charstring, start=[1, idslot], count=[strlen, 1]) ) + + charstring = trim(adjustl(self%info(j)%particle_type)) + strlen = len(charstring) + call check( nf90_put_var(iu%ncid, iu%ptype_varid, emptystr, start=[1, idslot], count=[NAMELEN, 1]) ) + call check( nf90_put_var(iu%ncid, iu%ptype_varid, charstring, start=[1, idslot], count=[strlen, 1]) ) - charstring = adjustl(self%info(j)%status) - call check( nf90_put_var(iu%ncid, iu%status_varid, charstring, start=[1, idslot], count=[NAMELEN, 1]) ) + charstring = trim(adjustl(self%info(j)%status)) + strlen = len(charstring) + call check( nf90_put_var(iu%ncid, iu%status_varid, emptystr, start=[1, idslot], count=[NAMELEN, 1]) ) + call check( nf90_put_var(iu%ncid, iu%status_varid, charstring, start=[1, idslot], count=[strlen, 1]) ) - charstring = adjustl(self%info(j)%origin_type) - call check( nf90_put_var(iu%ncid, iu%origin_type_varid, charstring, start=[1, idslot], count=[NAMELEN, 1]) ) + charstring = trim(adjustl(self%info(j)%origin_type)) + strlen = len(charstring) + call check( nf90_put_var(iu%ncid, iu%origin_type_varid, emptystr, start=[1, idslot], count=[NAMELEN, 1]) ) + call check( nf90_put_var(iu%ncid, iu%origin_type_varid, charstring, start=[1, idslot], count=[strlen, 1]) ) call check( nf90_put_var(iu%ncid, iu%origin_time_varid, self%info(j)%origin_time, start=[idslot]) ) call check( nf90_put_var(iu%ncid, iu%origin_xhx_varid, self%info(j)%origin_xh(1), start=[idslot]) ) @@ -402,17 +411,25 @@ module subroutine netcdf_write_particle_info_base(self, iu) idslot = self%id + 1 call check( nf90_put_var(iu%ncid, iu%id_varid, self%id, start=[idslot]) ) - charstring = adjustl(self%info%name) - call check( nf90_put_var(iu%ncid, iu%name_varid, charstring, start=[1, idslot], count=[NAMELEN, 1]) ) - - charstring = adjustl(self%info%particle_type) - call check( nf90_put_var(iu%ncid, iu%ptype_varid, charstring, start=[1, idslot], count=[NAMELEN, 1]) ) - - charstring = adjustl(self%info%status) - call check( nf90_put_var(iu%ncid, iu%status_varid, charstring, start=[1, idslot], count=[NAMELEN, 1]) ) - - charstring = adjustl(self%info%origin_type) - call check( nf90_put_var(iu%ncid, iu%origin_type_varid, charstring, start=[1, idslot], count=[NAMELEN, 1]) ) + charstring = trim(adjustl(self%info%name)) + strlen = len(charstring) + call check( nf90_put_var(iu%ncid, iu%name_varid, emptystr, start=[1, idslot], count=[NAMELEN, 1]) ) + call check( nf90_put_var(iu%ncid, iu%name_varid, charstring, start=[1, idslot], count=[strlen, 1]) ) + + charstring = trim(adjustl(self%info%particle_type)) + strlen = len(charstring) + call check( nf90_put_var(iu%ncid, iu%ptype_varid, emptystr, start=[1, idslot], count=[NAMELEN, 1]) ) + call check( nf90_put_var(iu%ncid, iu%ptype_varid, charstring, start=[1, idslot], count=[strlen, 1]) ) + + charstring = trim(adjustl(self%info%status)) + strlen = len(charstring) + call check( nf90_put_var(iu%ncid, iu%status_varid, emptystr, start=[1, idslot], count=[NAMELEN, 1]) ) + call check( nf90_put_var(iu%ncid, iu%status_varid, charstring, start=[1, idslot], count=[strlen, 1]) ) + + charstring = trim(adjustl(self%info%origin_type)) + strlen = len(charstring) + call check( nf90_put_var(iu%ncid, iu%origin_type_varid, emptystr, start=[1, idslot], count=[NAMELEN, 1]) ) + call check( nf90_put_var(iu%ncid, iu%origin_type_varid, charstring, start=[1, idslot], count=[strlen, 1]) ) call check( nf90_put_var(iu%ncid, iu%origin_time_varid, self%info%origin_time, start=[idslot]) ) call check( nf90_put_var(iu%ncid, iu%origin_xhx_varid, self%info%origin_xh(1), start=[idslot]) ) From 9349bf3bbffc1202e2675278c5fcf7cfb24364cc Mon Sep 17 00:00:00 2001 From: David Minton Date: Sat, 4 Sep 2021 17:09:20 -0400 Subject: [PATCH 136/154] Fixed how character strings are stripped and encoded --- python/swiftest/swiftest/io.py | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/python/swiftest/swiftest/io.py b/python/swiftest/swiftest/io.py index a82c5f043..cae553b13 100644 --- a/python/swiftest/swiftest/io.py +++ b/python/swiftest/swiftest/io.py @@ -704,6 +704,9 @@ def swiftest2xr(param): return ds +def xstrip(a): + func = lambda x: np.char.strip(x) + return xr.apply_ufunc(func, a.str.decode(encoding='utf-8')) def clean_string_values(param, ds): """ @@ -719,13 +722,13 @@ def clean_string_values(param, ds): ds : xarray dataset with the strings cleaned up """ if 'name' in ds: - ds['name'] = ds['name'].str.decode(encoding='utf-8') + ds['name'] = xstrip(ds['name']) if 'particle_type' in ds: - ds['particle_type'] = ds['particle_type'].str.decode(encoding='utf-8') + ds['particle_type'] = xstrip(ds['particle_type']) if 'status' in ds: - ds['status'] = ds['status'].str.decode(encoding='utf-8') + ds['status'] = xstrip(ds['status']) if 'origin_type' in ds: - ds['origin_type'] = ds['origin_type'].str.decode(encoding='utf-8') + ds['origin_type'] = xstrip(ds['origin_type']) return ds From a23dcd9ac62c77a4730be225dfbacf8168f18948 Mon Sep 17 00:00:00 2001 From: David Minton Date: Sun, 5 Sep 2021 09:22:59 -0400 Subject: [PATCH 137/154] Updated plotting script to be compatible with NetCDF, and make the markers equal sized --- .../symba_chambers_2013/aescattermovie.py | 23 ++++++++++++------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/examples/symba_chambers_2013/aescattermovie.py b/examples/symba_chambers_2013/aescattermovie.py index 27d2ef06b..ebecc470d 100755 --- a/examples/symba_chambers_2013/aescattermovie.py +++ b/examples/symba_chambers_2013/aescattermovie.py @@ -12,7 +12,8 @@ xmax = 2.00 ymin = 1e-4 ymax = 1.0 -framejump = 10 +framejump = 1 +ncutoff = 1e20 class AnimatedScatter(object): """An animated scatter plot using matplotlib.animations.FuncAnimation.""" @@ -22,8 +23,7 @@ def __init__(self, ds, param): nframes = int(ds['time'].size / framejump) self.ds = ds self.param = param - self.ds['radmarker'] = self.ds['radius'].fillna(0) - self.ds['radmarker'] = self.ds['radmarker'] / self.ds['radmarker'].max() * radscale + self.Rcb = self.ds['radius'].sel(id=0, time=0).values self.clist = {'Initial conditions' : 'xkcd:faded blue', 'Disruption' : 'xkcd:marigold', @@ -38,14 +38,15 @@ def __init__(self, ds, param): self.ax.set_xlim(xmin, xmax) self.ax.set_ylim(ymin, ymax) fig.add_axes(self.ax) - self.ani = animation.FuncAnimation(fig, self.update, interval=1, frames=nframes, init_func=self.setup_plot, blit=False) + self.ani = animation.FuncAnimation(fig, self.update, interval=1, frames=nframes, init_func=self.setup_plot, blit=True) + #self.ani.save('aescatter.mp4', fps=30, dpi=300, extra_args=['-vcodec', 'libx264']) self.ani.save('aescatter.mp4', fps=30, dpi=300, extra_args=['-vcodec', 'mpeg4']) print('Finished writing aescattter.mp4') def scatters(self, pl, radmarker, origin): scat = [] for key, value in self.clist.items(): - idx = origin == value + idx = origin == key s = self.ax.scatter(pl[idx, 0], pl[idx, 1], marker='o', s=radmarker[idx], c=value, alpha=0.75, label=key) scat.append(s) return scat @@ -70,19 +71,25 @@ def setup_plot(self): self.s1 = slist[1] self.s2 = slist[2] self.s3 = slist[3] - self.ax.legend(loc='lower right') + leg = self.ax.legend(loc='lower right') + leg = plt.legend(loc="lower left", scatterpoints=1, fontsize=10) + for i,l in enumerate(leg.legendHandles): + leg.legendHandles[i]._sizes = [20] return self.s0, self.s1, self.s2, self.s3, self.title def data_stream(self, frame=0): while True: d = self.ds.isel(time = frame) - d = d.where(np.invert(np.isnan(d['a'])), drop=True) + d = d.where(d['radius'] < self.Rcb, drop=True) + d['radmarker'] = (d['radius'] / self.Rcb) * radscale + radius = d['radmarker'].values + radius = d['radmarker'].values Gmass = d['Gmass'].values a = d['a'].values / AU e = d['e'].values name = d['id'].values - npl = d.id.count().values + npl = d['npl'].values[0] radmarker = d['radmarker'] origin = d['origin_type'] From 0e325db07d3c87cf153e223a3a80c33697bb02e3 Mon Sep 17 00:00:00 2001 From: David Minton Date: Sun, 5 Sep 2021 09:30:12 -0400 Subject: [PATCH 138/154] Updated plotting scripts with better legends --- .../symba_chambers_2013/aescattermovie.py | 3 +-- examples/symba_clement_2018/aescattermovie.py | 21 ++++++++++++------- examples/symba_mars_disk/aescattermovie.py | 6 ++++-- 3 files changed, 19 insertions(+), 11 deletions(-) diff --git a/examples/symba_chambers_2013/aescattermovie.py b/examples/symba_chambers_2013/aescattermovie.py index ebecc470d..6f73a32dc 100755 --- a/examples/symba_chambers_2013/aescattermovie.py +++ b/examples/symba_chambers_2013/aescattermovie.py @@ -71,8 +71,7 @@ def setup_plot(self): self.s1 = slist[1] self.s2 = slist[2] self.s3 = slist[3] - leg = self.ax.legend(loc='lower right') - leg = plt.legend(loc="lower left", scatterpoints=1, fontsize=10) + leg = plt.legend(loc="lower right", scatterpoints=1, fontsize=10) for i,l in enumerate(leg.legendHandles): leg.legendHandles[i]._sizes = [20] return self.s0, self.s1, self.s2, self.s3, self.title diff --git a/examples/symba_clement_2018/aescattermovie.py b/examples/symba_clement_2018/aescattermovie.py index 8e9fe9964..d256dbe96 100755 --- a/examples/symba_clement_2018/aescattermovie.py +++ b/examples/symba_clement_2018/aescattermovie.py @@ -5,6 +5,7 @@ from matplotlib import animation import matplotlib.colors as mcolors + titletext = "Clement et al. (2018)" radscale = 2000 AU = 1.0 @@ -13,6 +14,7 @@ ymin = 1e-4 ymax = 1.0 framejump = 1 +ncutoff = 1e20 class AnimatedScatter(object): """An animated scatter plot using matplotlib.animations.FuncAnimation.""" @@ -22,8 +24,7 @@ def __init__(self, ds, param): nframes = int(ds['time'].size / framejump) self.ds = ds self.param = param - self.ds['radmarker'] = self.ds['radius'].fillna(0) - self.ds['radmarker'] = self.ds['radmarker'] / self.ds['radmarker'].max() * radscale + self.Rcb = self.ds['radius'].sel(id=0, time=0).values self.clist = {'Initial conditions' : 'xkcd:faded blue', 'Disruption' : 'xkcd:marigold', @@ -38,14 +39,15 @@ def __init__(self, ds, param): self.ax.set_xlim(xmin, xmax) self.ax.set_ylim(ymin, ymax) fig.add_axes(self.ax) - self.ani = animation.FuncAnimation(fig, self.update, interval=1, frames=nframes, init_func=self.setup_plot, blit=False) + self.ani = animation.FuncAnimation(fig, self.update, interval=1, frames=nframes, init_func=self.setup_plot, blit=True) + #self.ani.save('aescatter.mp4', fps=30, dpi=300, extra_args=['-vcodec', 'libx264']) self.ani.save('aescatter.mp4', fps=30, dpi=300, extra_args=['-vcodec', 'mpeg4']) print('Finished writing aescattter.mp4') def scatters(self, pl, radmarker, origin): scat = [] for key, value in self.clist.items(): - idx = origin == value + idx = origin == key s = self.ax.scatter(pl[idx, 0], pl[idx, 1], marker='o', s=radmarker[idx], c=value, alpha=0.75, label=key) scat.append(s) return scat @@ -70,19 +72,24 @@ def setup_plot(self): self.s1 = slist[1] self.s2 = slist[2] self.s3 = slist[3] - self.ax.legend(loc='lower right') + leg = plt.legend(loc="lower right", scatterpoints=1, fontsize=10) + for i,l in enumerate(leg.legendHandles): + leg.legendHandles[i]._sizes = [20] return self.s0, self.s1, self.s2, self.s3, self.title def data_stream(self, frame=0): while True: d = self.ds.isel(time = frame) - d = d.where(np.invert(np.isnan(d['a'])), drop=True) + d = d.where(d['radius'] < self.Rcb, drop=True) + d['radmarker'] = (d['radius'] / self.Rcb) * radscale + radius = d['radmarker'].values + radius = d['radmarker'].values Gmass = d['Gmass'].values a = d['a'].values / AU e = d['e'].values name = d['id'].values - npl = d.id.count().values + npl = d['npl'].values[0] radmarker = d['radmarker'] origin = d['origin_type'] diff --git a/examples/symba_mars_disk/aescattermovie.py b/examples/symba_mars_disk/aescattermovie.py index f4da3762e..85b99c0fa 100755 --- a/examples/symba_mars_disk/aescattermovie.py +++ b/examples/symba_mars_disk/aescattermovie.py @@ -71,7 +71,9 @@ def setup_plot(self): self.s1 = slist[1] self.s2 = slist[2] self.s3 = slist[3] - self.ax.legend(loc='upper right') + leg = plt.legend(loc="upper right", scatterpoints=1, fontsize=10) + for i,l in enumerate(leg.legendHandles): + leg.legendHandles[i]._sizes = [20] return self.s0, self.s1, self.s2, self.s3, self.title def data_stream(self, frame=0): @@ -85,7 +87,7 @@ def data_stream(self, frame=0): Gmass = d['Gmass'].values a = d['a'].values / self.Rcb e = d['e'].values - name = d['id'].values + name = d['name'].values npl = d['npl'].values[0] radmarker = d['radmarker'] origin = d['origin_type'].values From b66037b3520d3b2679e01f2a1df40a9f3de9e388 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Mon, 6 Sep 2021 03:16:40 -0400 Subject: [PATCH 139/154] Improved the SFD of fragments. Fragment number is now variable, and weakly depends on the collisional system mass. --- .../param.disruption_headon.in | 3 +- .../param.disruption_off_axis.in | 3 +- .../param.supercatastrophic_headon.in | 5 +- .../param.supercatastrophic_off_axis.in | 3 +- src/fraggle/fraggle_regime.f90 | 20 +++- src/fraggle/fraggle_set.f90 | 109 +++++++++++++----- src/modules/fraggle_classes.f90 | 9 +- src/symba/symba_collision.f90 | 18 +-- 8 files changed, 110 insertions(+), 60 deletions(-) diff --git a/examples/symba_energy_momentum/param.disruption_headon.in b/examples/symba_energy_momentum/param.disruption_headon.in index 4d187d26b..24e79be5d 100644 --- a/examples/symba_energy_momentum/param.disruption_headon.in +++ b/examples/symba_energy_momentum/param.disruption_headon.in @@ -21,7 +21,8 @@ ENC_OUT enc.disruption_headon.dat EXTRA_FORCE no ! no extra user-defined forces BIG_DISCARD no ! output all planets if anything discarded RHILL_PRESENT yes ! Hill's sphere radii in input file -GMTINY 1.0e-16 +GMTINY 1.0e-16 +MIN_GMFRAG 1.0e-10 FRAGMENTATION yes MU2KG 1.98908e30 TU2S 3.1556925e7 diff --git a/examples/symba_energy_momentum/param.disruption_off_axis.in b/examples/symba_energy_momentum/param.disruption_off_axis.in index b4ba7f8ba..58922133f 100644 --- a/examples/symba_energy_momentum/param.disruption_off_axis.in +++ b/examples/symba_energy_momentum/param.disruption_off_axis.in @@ -22,7 +22,8 @@ DISCARD_OUT discard.disruption_off_axis.out EXTRA_FORCE no ! no extra user-defined forces BIG_DISCARD no ! output all planets if anything discarded RHILL_PRESENT yes ! Hill's sphere radii in input file -GMTINY 1.0e-16 +GMTINY 1.0e-16 +MIN_GMFRAG 1.0e-12 FRAGMENTATION yes MU2KG 1.98908e30 TU2S 3.1556925e7 diff --git a/examples/symba_energy_momentum/param.supercatastrophic_headon.in b/examples/symba_energy_momentum/param.supercatastrophic_headon.in index aaa1db99d..1effdd15b 100644 --- a/examples/symba_energy_momentum/param.supercatastrophic_headon.in +++ b/examples/symba_energy_momentum/param.supercatastrophic_headon.in @@ -17,12 +17,11 @@ CHK_RMIN 0.005 CHK_RMAX 1e6 CHK_EJECT -1.0 ! ignore this check CHK_QMIN -1.0 ! ignore this check -DISCARD_OUT discard.supercatastrophic_headon.out -ENC_OUT enc.supercatastrophic_headon.dat EXTRA_FORCE no ! no extra user-defined forces BIG_DISCARD no ! output all planets if anything discarded RHILL_PRESENT yes ! Hill's sphere radii in input file -GMTINY 1.0e-16 +GMTINY 1.0e-16 +MIN_GMFRAG 1.0e-11 FRAGMENTATION yes MU2KG 1.98908e30 TU2S 3.1556925e7 diff --git a/examples/symba_energy_momentum/param.supercatastrophic_off_axis.in b/examples/symba_energy_momentum/param.supercatastrophic_off_axis.in index 0bf836be5..47bce3775 100644 --- a/examples/symba_energy_momentum/param.supercatastrophic_off_axis.in +++ b/examples/symba_energy_momentum/param.supercatastrophic_off_axis.in @@ -21,7 +21,8 @@ ENC_OUT enc.supercatastrophic_off_axis.dat EXTRA_FORCE no ! no extra user-defined forces BIG_DISCARD no ! output all planets if anything discarded RHILL_PRESENT yes ! Hill's sphere radii in input file -GMTINY 1.0e-16 +GMTINY 1.0e-16 +MIN_GMFRAG 1.0e-11 FRAGMENTATION yes MU2KG 1.98908e30 TU2S 3.1556925e7 diff --git a/src/fraggle/fraggle_regime.f90 b/src/fraggle/fraggle_regime.f90 index a20b08d29..4ce4699fa 100644 --- a/src/fraggle/fraggle_regime.f90 +++ b/src/fraggle/fraggle_regime.f90 @@ -56,6 +56,7 @@ module subroutine fraggle_regime_colliders(self, frag, system, param) frag%mass_dist(1) = min(max(mlr, 0.0_DP), mtot) frag%mass_dist(2) = min(max(mslr, 0.0_DP), mtot) frag%mass_dist(3) = min(max(mtot - mlr - mslr, 0.0_DP), mtot) + frag%mtot = sum(frag%mass_dist(1:3)) ! Convert quantities back to the system units and save them into the fragment system frag%mass_dist(:) = (frag%mass_dist(:) / param%MU2KG) @@ -98,6 +99,7 @@ subroutine fraggle_regime_collresolve(Mcb, m1, m2, rad1, rad2, xh1, xh2, vb1, vb 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 :: ETA = -1.50_DP !! LS12 eq. (44) 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) @@ -108,7 +110,7 @@ subroutine fraggle_regime_collresolve(Mcb, m1, m2, rad1, rad2, xh1, xh2, vb1, vb 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) :: Mint, Mtot, Mtmp real(DP) :: Rp, rhill real(DP) :: Mresidual real(DP) :: U_binding @@ -157,7 +159,7 @@ subroutine fraggle_regime_collresolve(Mcb, m1, m2, rad1, rad2, xh1, xh2, vb1, vb 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) + Mlr = max((1.0_DP - Qr / Qrd_pstar / 2.0_DP) * Mtot, min_mfrag) ! [kg] # LS12 eq (5) !calculate Vsupercat Qr_supercat = SUPERCAT_QRATIO * Qrd_pstar ! See LS12 Section 4.1 @@ -196,7 +198,7 @@ subroutine fraggle_regime_collresolve(Mcb, m1, m2, rad1, rad2, xh1, xh2, vb1, vb Qloss = 0.0_DP else Mlr = m1 - Mslr = calc_Qrd_rev(m2, m1, Mint, den1, den2, Vimp, c_star) + Mslr = max(calc_Qrd_rev(m2, m1, Mint, den1, den2, Vimp, c_star), min_mfrag) regime = COLLRESOLVE_REGIME_HIT_AND_RUN !hit and run Qloss = (c_star + 1.0_DP) * U_binding ! Qr end if @@ -207,13 +209,13 @@ subroutine fraggle_regime_collresolve(Mcb, m1, m2, rad1, rad2, xh1, xh2, vb1, vb 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) + Mslr = max(Mtot * (3.0_DP - BETA) * (1.0_DP - N1 * Mlr / Mtot) / (N2 * BETA), min_mfrag) ! 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) + Mlr = max(Mtot * 0.1_DP * (Qr / (Qrd_pstar * SUPERCAT_QRATIO))**(ETA), min_mfrag) !LS12 eq (44) + Mslr = max(Mtot * (3.0_DP - BETA) * (1.0_DP - N1 * Mlr / Mtot) / (N2 * BETA), min_mfrag) !LS12 eq (37) regime = COLLRESOLVE_REGIME_SUPERCATASTROPHIC ! supercatastrophic Qloss = (c_star + 1.0_DP) * U_binding ! Qr - Qr_supercat else @@ -221,6 +223,12 @@ subroutine fraggle_regime_collresolve(Mcb, m1, m2, rad1, rad2, xh1, xh2, vb1, vb end if end if + if (Mslr > Mlr) then ! The second-largest fragment is actually larger than the largest, so we will swap them + Mtmp = Mlr + Mlr = Mslr + Mslr = Mtmp + end if + Mresidual = Mtot - Mlr - Mslr if (Mresidual < 0.0_DP) then ! prevents final masses from going negative Mlr = Mlr + Mresidual diff --git a/src/fraggle/fraggle_set.f90 b/src/fraggle/fraggle_set.f90 index 7ea47e14f..f9238f5f8 100644 --- a/src/fraggle/fraggle_set.f90 +++ b/src/fraggle/fraggle_set.f90 @@ -27,60 +27,106 @@ module subroutine fraggle_set_budgets_fragments(self, colliders) end subroutine fraggle_set_budgets_fragments - module subroutine fraggle_set_mass_dist_fragments(self, colliders) + module subroutine fraggle_set_mass_dist_fragments(self, colliders, param) !! author: David A. Minton !! !! Sets the mass of fragments based on the mass distribution returned by the regime calculation. !! This subroutine must be run after the the setup rourtine has been run on the fragments implicit none ! Arguments - class(fraggle_fragments), intent(inout) :: self !! Fraggle fragment system object - class(fraggle_colliders), intent(inout) :: colliders !! Fraggle collider system object + class(fraggle_fragments), intent(inout) :: self !! Fraggle fragment system object + class(fraggle_colliders), intent(inout) :: colliders !! Fraggle collider system object + class(swiftest_parameters), intent(in) :: param !! Current Swiftest run configuration parameters ! Internals - integer(I4B) :: i, jproj, jtarg + integer(I4B) :: i, jproj, jtarg, nfrag, istart real(DP), dimension(2) :: volume real(DP), dimension(NDIM) :: Ip_avg + real(DP) :: mfrag, mremaining, min_mfrag + real(DP), parameter :: BETA = 2.85_DP + integer(I4B), parameter :: NFRAGMAX = 100 !! Maximum number of fragments that can be generated + integer(I4B), parameter :: NFRAGMIN = 7 !! Minimum number of fragments that can be generated (set by the fraggle_generate algorithm for constraining momentum and energy) + integer(I4B), parameter :: NFRAG_SIZE_MULTIPLIER = 3 !! Log-space scale factor that scales the number of fragments by the collisional system mass - associate(frag => self, nfrag => self%nbody) + associate(frag => self) ! Get mass weighted mean of Ip and density volume(1:2) = 4._DP / 3._DP * PI * colliders%radius(1:2)**3 - frag%density(1:nfrag) = frag%mtot / sum(volume(:)) Ip_avg(:) = (colliders%mass(1) * colliders%Ip(:,1) + colliders%mass(2) * colliders%Ip(:,2)) / frag%mtot - do i = 1, nfrag - frag%Ip(:, i) = Ip_avg(:) - end do + if (colliders%mass(1) > colliders%mass(2)) then + jtarg = 1 + jproj = 2 + else + jtarg = 2 + jproj = 1 + end if + + select type(param) + class is (symba_parameters) + min_mfrag = (param%min_GMfrag / param%GU) + nfrag = ceiling(NFRAG_SIZE_MULTIPLIER * log(frag%mtot / min_mfrag)) + nfrag = max(min(nfrag, NFRAGMAX), NFRAGMIN) + class default + min_mfrag = 0.0_DP + nfrag = NFRAGMAX + end select select case(frag%regime) case(COLLRESOLVE_REGIME_DISRUPTION, COLLRESOLVE_REGIME_SUPERCATASTROPHIC) - ! Assign the first and second-largest masses that came out of the regime determination subroutine to the first two fragments - frag%mass(1:2) = frag%mass_dist(1:2) + istart = 2 + case(COLLRESOLVE_REGIME_HIT_AND_RUN) + istart = 1 + case (COLLRESOLVE_REGIME_MERGE, COLLRESOLVE_REGIME_GRAZE_AND_MERGE) + call frag%setup(1, param) + frag%mass(1) = frag%mass_dist(1) + frag%radius(1) = colliders%radius(jtarg) + frag%density(1) = frag%mass_dist(1) / volume(jtarg) + frag%Ip(:, 1) = colliders%Ip(:,1) + return + case default + write(*,*) "fraggle_set_mass_dist_fragments error: Unrecognized regime code",frag%regime + end select - ! Distribute remaining mass among the remaining fragments - do i = 3, nfrag - frag%mass(i) = (frag%mtot - sum(frag%mass(1:2))) / (nfrag - 2) - end do - frag%radius(1:nfrag) = (3 * frag%mass(1:nfrag) / (4 * PI * frag%density(1:nfrag)))**(1.0_DP / 3.0_DP) + i = istart + mremaining = max(frag%mtot - sum(frag%mass_dist(1:istart)), 0.0_DP) + do while (i <= NFRAGMAX) + mfrag = (i - istart + 1)**(-3._DP / BETA) * frag%mass_dist(istart) + if (mremaining - mfrag < 0.0_DP) exit + mremaining = mremaining - mfrag + i = i + 1 + end do + + call frag%setup(nfrag, param) + frag%mass(1:istart) = frag%mass_dist(1:istart) + mremaining = max(frag%mtot - sum(frag%mass_dist(1:istart)), 0.0_DP) + do i = istart + 1, nfrag + mfrag = (i - istart + 1)**(-3._DP / BETA) * frag%mass_dist(istart) + mfrag = min(mfrag, mremaining) + frag%mass(i) = mfrag + mremaining = mremaining - mfrag + end do + select case(frag%regime) case(COLLRESOLVE_REGIME_HIT_AND_RUN) - if (colliders%mass(1) > colliders%mass(2)) then - jtarg = 1 - jproj = 2 - else - jtarg = 2 - jproj = 1 - end if frag%mass(1) = frag%mass_dist(1) frag%radius(1) = colliders%radius(jtarg) frag%density(1) = frag%mass_dist(1) / volume(jtarg) - - frag%mass(2:nfrag) = (frag%mtot - frag%mass(1)) / (nfrag - 1) - frag%mass(nfrag) = frag%mass(nfrag) + (frag%mtot - sum(frag%mass(:))) - frag%radius(2:nfrag) = (3 * frag%mass(2:nfrag) / (4 * PI * frag%density(2:nfrag)))**(1.0_DP / 3.0_DP) - case (COLLRESOLVE_REGIME_MERGE, COLLRESOLVE_REGIME_GRAZE_AND_MERGE) - frag%mass(1) = frag%mtot - frag%radius(1) = (3 * sum(volume(:)) / (4 * PI))**(1._DP / 3._DP) + frag%Ip(:, 1) = colliders%Ip(:,1) + istart = 2 case default - write(*,*) "fraggle_set_mass_dist_fragments error: Unrecognized regime code",frag%regime + istart = 1 end select + if (mremaining > 0.0_DP) then + ! Distribute remaining mass among the fragments + mfrag = 1._DP + mremaining / sum(frag%mass(istart:nfrag)) + do i = istart, nfrag + frag%mass(i) = frag%mass(i) * mfrag + end do + mremaining = frag%mtot - sum(frag%mass(1:nfrag)) + frag%mass(nfrag) = frag%mass(nfrag) + mremaining + end if + frag%density(istart:nfrag) = frag%mtot / sum(volume(:)) + frag%radius(istart:nfrag) = (3 * frag%mass(istart:nfrag) / (4 * PI * frag%density(istart:nfrag)))**(1.0_DP / 3.0_DP) + do i = istart, nfrag + frag%Ip(:, i) = Ip_avg(:) + end do end associate @@ -181,7 +227,6 @@ module subroutine fraggle_set_natural_scale_factors(self, colliders) associate(frag => self) ! Find the center of mass of the collisional system - frag%mtot = sum(colliders%mass(:)) frag%xbcom(:) = (colliders%mass(1) * colliders%xb(:,1) + colliders%mass(2) * colliders%xb(:,2)) / frag%mtot frag%vbcom(:) = (colliders%mass(1) * colliders%vb(:,1) + colliders%mass(2) * colliders%vb(:,2)) / frag%mtot diff --git a/src/modules/fraggle_classes.f90 b/src/modules/fraggle_classes.f90 index 8dc81c303..5a8a4a392 100644 --- a/src/modules/fraggle_classes.f90 +++ b/src/modules/fraggle_classes.f90 @@ -173,7 +173,7 @@ module subroutine fraggle_regime_colliders(self, frag, system, param) class(fraggle_colliders), intent(inout) :: self !! Fraggle colliders object class(fraggle_fragments), intent(inout) :: frag !! Fraggle fragment system object class(swiftest_nbody_system), intent(in) :: system !! Swiftest nbody system object - class(swiftest_parameters), intent(in) :: param !! Current Swiftest run configuration parameter + class(swiftest_parameters), intent(in) :: param !! Current Swiftest run configuration parameters end subroutine fraggle_regime_colliders module subroutine fraggle_set_budgets_fragments(self, colliders) @@ -188,10 +188,11 @@ module subroutine fraggle_set_coordinate_system(self, colliders) class(fraggle_colliders), intent(inout) :: colliders !! Fraggle collider system object end subroutine fraggle_set_coordinate_system - module subroutine fraggle_set_mass_dist_fragments(self, colliders) + module subroutine fraggle_set_mass_dist_fragments(self, colliders, param) implicit none - class(fraggle_fragments), intent(inout) :: self !! Fraggle fragment system object - class(fraggle_colliders), intent(inout) :: colliders !! Fraggle collider system object + class(fraggle_fragments), intent(inout) :: self !! Fraggle fragment system object + class(fraggle_colliders), intent(inout) :: colliders !! Fraggle collider system object + class(swiftest_parameters), intent(in) :: param !! Current Swiftest run configuration parameters end subroutine fraggle_set_mass_dist_fragments module subroutine fraggle_set_natural_scale_factors(self, colliders) diff --git a/src/symba/symba_collision.f90 b/src/symba/symba_collision.f90 index 20e90909d..6cd2fd093 100644 --- a/src/symba/symba_collision.f90 +++ b/src/symba/symba_collision.f90 @@ -1,8 +1,6 @@ submodule (symba_classes) s_symba_collision use swiftest - integer(I4B), parameter :: NFRAG_DISRUPT = 12 - integer(I4B), parameter :: NFRAG_SUPERCAT = 20 contains module function symba_collision_casedisruption(system, param, colliders, frag) result(status) @@ -26,17 +24,14 @@ module function symba_collision_casedisruption(system, param, colliders, frag) select case(frag%regime) case(COLLRESOLVE_REGIME_DISRUPTION) message = "Disruption between" - nfrag = NFRAG_DISRUPT case(COLLRESOLVE_REGIME_SUPERCATASTROPHIC) message = "Supercatastrophic disruption between" - nfrag = NFRAG_SUPERCAT end select call symba_collision_collider_message(system%pl, colliders%idx, message) call fraggle_io_log_one_message(message) ! Collisional fragments will be uniformly distributed around the pre-impact barycenter - call frag%setup(nfrag, param) - call frag%set_mass_dist(colliders) + call frag%set_mass_dist(colliders, param) ! Generate the position and velocity distributions of the fragments call frag%generate_fragments(colliders, system, param, lfailure) @@ -53,6 +48,7 @@ module function symba_collision_casedisruption(system, param, colliders, frag) end select else ! Populate the list of new bodies + nfrag = frag%nbody write(message, *) nfrag call fraggle_io_log_one_message("Generating " // trim(adjustl(message)) // " fragments") select case(frag%regime) @@ -106,10 +102,8 @@ module function symba_collision_casehitandrun(system, param, colliders, frag) r 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. - call frag%setup(nfrag, param) - call frag%set_mass_dist(colliders) + call frag%set_mass_dist(colliders, param) ! Generate the position and velocity distributions of the fragments call frag%generate_fragments(colliders, system, param, lpure) @@ -118,6 +112,7 @@ module function symba_collision_casehitandrun(system, param, colliders, frag) r call fraggle_io_log_one_message("Should have been a pure hit and run instead") nfrag = 0 else + nfrag = frag%nbody write(message, *) nfrag call fraggle_io_log_one_message("Generating " // trim(adjustl(message)) // " fragments") end if @@ -174,8 +169,7 @@ module function symba_collision_casemerge(system, param, colliders, frag) resul select type(pl => system%pl) class is (symba_pl) - call frag%setup(1, param) - call frag%set_mass_dist(colliders) + call frag%set_mass_dist(colliders, param) ibiggest = colliders%idx(maxloc(pl%Gmass(colliders%idx(:)), dim=1)) frag%id(1) = pl%id(ibiggest) frag%xb(:,1) = frag%xbcom(:) @@ -723,7 +717,7 @@ subroutine symba_collision_mergeaddsub(system, param, colliders, frag, status) associate(info => pl%info, pl_adds => system%pl_adds, cb => system%cb, npl => pl%nbody) ! Add the colliders%idx bodies to the subtraction list ncolliders = colliders%ncoll - nfrag = size(frag%mass(:)) + nfrag = frag%nbody ! Setup new bodies allocate(plnew, mold=pl) From 95d551bcd905101126357c2753bc6bb084ad232d Mon Sep 17 00:00:00 2001 From: David A Minton Date: Tue, 7 Sep 2021 09:33:31 -0400 Subject: [PATCH 140/154] Improved fragment SFD calculation. Previously, hit and runs with fragmentation were failing because the number of fragments required by the SFD was lower than the number we calculated, which filled mass bins with 0 mass and led to floating point errors in fraggle_generate. Mass is distributed much more carefully now. --- src/fraggle/fraggle_regime.f90 | 6 ++- src/fraggle/fraggle_set.f90 | 80 +++++++++++++++++++--------------- src/symba/symba_collision.f90 | 3 -- 3 files changed, 51 insertions(+), 38 deletions(-) diff --git a/src/fraggle/fraggle_regime.f90 b/src/fraggle/fraggle_regime.f90 index 4ce4699fa..df9265ae7 100644 --- a/src/fraggle/fraggle_regime.f90 +++ b/src/fraggle/fraggle_regime.f90 @@ -56,7 +56,11 @@ module subroutine fraggle_regime_colliders(self, frag, system, param) frag%mass_dist(1) = min(max(mlr, 0.0_DP), mtot) frag%mass_dist(2) = min(max(mslr, 0.0_DP), mtot) frag%mass_dist(3) = min(max(mtot - mlr - mslr, 0.0_DP), mtot) - frag%mtot = sum(frag%mass_dist(1:3)) + + ! Find the center of mass of the collisional system + frag%mtot = sum(colliders%mass(:)) + frag%xbcom(:) = (colliders%mass(1) * colliders%xb(:,1) + colliders%mass(2) * colliders%xb(:,2)) / frag%mtot + frag%vbcom(:) = (colliders%mass(1) * colliders%vb(:,1) + colliders%mass(2) * colliders%vb(:,2)) / frag%mtot ! Convert quantities back to the system units and save them into the fragment system frag%mass_dist(:) = (frag%mass_dist(:) / param%MU2KG) diff --git a/src/fraggle/fraggle_set.f90 b/src/fraggle/fraggle_set.f90 index f9238f5f8..d520b2c5d 100644 --- a/src/fraggle/fraggle_set.f90 +++ b/src/fraggle/fraggle_set.f90 @@ -46,6 +46,9 @@ module subroutine fraggle_set_mass_dist_fragments(self, colliders, param) integer(I4B), parameter :: NFRAGMAX = 100 !! Maximum number of fragments that can be generated integer(I4B), parameter :: NFRAGMIN = 7 !! Minimum number of fragments that can be generated (set by the fraggle_generate algorithm for constraining momentum and energy) integer(I4B), parameter :: NFRAG_SIZE_MULTIPLIER = 3 !! Log-space scale factor that scales the number of fragments by the collisional system mass + integer(I4B), parameter :: iMlr = 1 + integer(I4B), parameter :: iMslr = 2 + integer(I4B), parameter :: iMrem = 3 associate(frag => self) ! Get mass weighted mean of Ip and density @@ -62,6 +65,9 @@ module subroutine fraggle_set_mass_dist_fragments(self, colliders, param) select type(param) class is (symba_parameters) min_mfrag = (param%min_GMfrag / param%GU) + ! The number of fragments we generate is bracked by the minimum required by fraggle_generate (7) and the + ! maximum set by the NFRAG_SIZE_MULTIPLIER which limits the total number of fragments to prevent the nbody + ! code from getting an overwhelmingly large number of fragments nfrag = ceiling(NFRAG_SIZE_MULTIPLIER * log(frag%mtot / min_mfrag)) nfrag = max(min(nfrag, NFRAGMAX), NFRAGMIN) class default @@ -70,10 +76,22 @@ module subroutine fraggle_set_mass_dist_fragments(self, colliders, param) end select select case(frag%regime) - case(COLLRESOLVE_REGIME_DISRUPTION, COLLRESOLVE_REGIME_SUPERCATASTROPHIC) - istart = 2 - case(COLLRESOLVE_REGIME_HIT_AND_RUN) - istart = 1 + case(COLLRESOLVE_REGIME_DISRUPTION, COLLRESOLVE_REGIME_SUPERCATASTROPHIC, COLLRESOLVE_REGIME_HIT_AND_RUN) + ! The first two bins of the mass_dist are the largest and second-largest fragments that came out of fraggle_regime. + ! The remainder from the third bin will be distributed among nfrag-2 bodies. The following code will determine nfrag based on + ! the limits bracketed above and the model size distribution of fragments. + ! Check to see if our size distribution would give us a smaller number of fragments than the maximum number + i = iMrem + mremaining = frag%mass_dist(iMrem) + do while (i <= nfrag) + mfrag = (1 + i - iMslr)**(-3._DP / BETA) * frag%mass_dist(iMslr) + if (mremaining - mfrag < 0.0_DP) exit + mremaining = mremaining - mfrag + i = i + 1 + end do + if (i < nfrag) nfrag = max(i, NFRAGMIN) ! The sfd would actually give us fewer fragments than our maximum + + call frag%setup(nfrag, param) case (COLLRESOLVE_REGIME_MERGE, COLLRESOLVE_REGIME_GRAZE_AND_MERGE) call frag%setup(1, param) frag%mass(1) = frag%mass_dist(1) @@ -85,43 +103,41 @@ module subroutine fraggle_set_mass_dist_fragments(self, colliders, param) write(*,*) "fraggle_set_mass_dist_fragments error: Unrecognized regime code",frag%regime end select - i = istart - mremaining = max(frag%mtot - sum(frag%mass_dist(1:istart)), 0.0_DP) - do while (i <= NFRAGMAX) - mfrag = (i - istart + 1)**(-3._DP / BETA) * frag%mass_dist(istart) - if (mremaining - mfrag < 0.0_DP) exit - mremaining = mremaining - mfrag - i = i + 1 - end do + ! Make the first two bins the same as the Mlr and Mslr values that came from fraggle_regime + frag%mass(1) = frag%mass_dist(iMlr) + frag%mass(2) = frag%mass_dist(iMslr) - call frag%setup(nfrag, param) - frag%mass(1:istart) = frag%mass_dist(1:istart) - mremaining = max(frag%mtot - sum(frag%mass_dist(1:istart)), 0.0_DP) - do i = istart + 1, nfrag - mfrag = (i - istart + 1)**(-3._DP / BETA) * frag%mass_dist(istart) - mfrag = min(mfrag, mremaining) + ! Distribute the remaining mass the 3:nfrag bodies following the model SFD given by slope BETA + mremaining = frag%mass_dist(iMrem) + do i = iMrem, nfrag + mfrag = (1 + i - iMslr)**(-3._DP / BETA) * frag%mass_dist(iMslr) frag%mass(i) = mfrag mremaining = mremaining - mfrag end do + + ! If there is any residual mass (either positive or negative) we will distribute remaining mass proportionally among the the fragments + if (mremaining < 0.0_DP) then ! If the remainder is negative, this means that that the number of fragments required by the SFD is smaller than our lower limit set by fraggle_generate. + istart = iMrem ! We will reduce the mass of the 3:nfrag bodies to prevent the second-largest fragment from going smaller + else ! If the remainder is postiive, this means that the number of fragments required by the SFD is larger than our upper limit set by computational expediency. + istart = iMslr ! We will increase the mass of the 2:nfrag bodies to compensate, which ensures that the second largest fragment remains the second largest + end if + mfrag = 1._DP + mremaining / sum(frag%mass(istart:nfrag)) + frag%mass(istart:nfrag) = frag%mass(istart:nfrag) * mfrag + + ! There may still be some small residual due to round-off error. If so, simply add it to the last bin of the mass distribution. + mremaining = frag%mtot - sum(frag%mass(1:nfrag)) + frag%mass(nfrag) = frag%mass(nfrag) + mremaining + + ! Compute physical properties of the new fragments select case(frag%regime) - case(COLLRESOLVE_REGIME_HIT_AND_RUN) - frag%mass(1) = frag%mass_dist(1) + case(COLLRESOLVE_REGIME_HIT_AND_RUN) ! The hit and run case always preserves the largest body intact, so there is no need to recompute the physical properties of the first fragment frag%radius(1) = colliders%radius(jtarg) - frag%density(1) = frag%mass_dist(1) / volume(jtarg) + frag%density(1) = frag%mass_dist(iMlr) / volume(jtarg) frag%Ip(:, 1) = colliders%Ip(:,1) istart = 2 case default istart = 1 end select - if (mremaining > 0.0_DP) then - ! Distribute remaining mass among the fragments - mfrag = 1._DP + mremaining / sum(frag%mass(istart:nfrag)) - do i = istart, nfrag - frag%mass(i) = frag%mass(i) * mfrag - end do - mremaining = frag%mtot - sum(frag%mass(1:nfrag)) - frag%mass(nfrag) = frag%mass(nfrag) + mremaining - end if frag%density(istart:nfrag) = frag%mtot / sum(volume(:)) frag%radius(istart:nfrag) = (3 * frag%mass(istart:nfrag) / (4 * PI * frag%density(istart:nfrag)))**(1.0_DP / 3.0_DP) do i = istart, nfrag @@ -226,10 +242,6 @@ module subroutine fraggle_set_natural_scale_factors(self, colliders) integer(I4B) :: i associate(frag => self) - ! Find the center of mass of the collisional system - frag%xbcom(:) = (colliders%mass(1) * colliders%xb(:,1) + colliders%mass(2) * colliders%xb(:,2)) / frag%mtot - frag%vbcom(:) = (colliders%mass(1) * colliders%vb(:,1) + colliders%mass(2) * colliders%vb(:,2)) / frag%mtot - ! Set scale factors frag%Escale = 0.5_DP * (colliders%mass(1) * dot_product(colliders%vb(:,1), colliders%vb(:,1)) + colliders%mass(2) * dot_product(colliders%vb(:,2), colliders%vb(:,2))) frag%dscale = sum(colliders%radius(:)) diff --git a/src/symba/symba_collision.f90 b/src/symba/symba_collision.f90 index 6cd2fd093..c5ca6426f 100644 --- a/src/symba/symba_collision.f90 +++ b/src/symba/symba_collision.f90 @@ -882,9 +882,6 @@ module subroutine symba_collision_resolve_fragmentations(self, system, param) if ((.not. lgoodcollision) .or. any(pl%status(idx_parent(:)) /= COLLISION)) cycle call colliders%regime(frag, system, param) - frag%mtot = sum(colliders%mass(:)) - frag%xbcom(:) = (colliders%mass(1) * colliders%xb(:,1) + colliders%mass(2) * colliders%xb(:,2)) / frag%mtot - frag%vbcom(:) = (colliders%mass(1) * colliders%vb(:,1) + colliders%mass(2) * colliders%vb(:,2)) / frag%mtot select case (frag%regime) case (COLLRESOLVE_REGIME_DISRUPTION, COLLRESOLVE_REGIME_SUPERCATASTROPHIC) From 4c64632e893ed552a50bc67ee043c9d18c51d9c5 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Tue, 7 Sep 2021 17:06:05 -0400 Subject: [PATCH 141/154] Improved the success rate of fraggle_generate by introducing small amounts of noise into the initial conditions that are fed to the BFGS minimizer each time it fails to find a solution at a given tolerance. --- src/fraggle/fraggle_generate.f90 | 66 ++++++++++++++++++-------------- 1 file changed, 38 insertions(+), 28 deletions(-) diff --git a/src/fraggle/fraggle_generate.f90 b/src/fraggle/fraggle_generate.f90 index d0c1374f9..5a8b08949 100644 --- a/src/fraggle/fraggle_generate.f90 +++ b/src/fraggle/fraggle_generate.f90 @@ -38,6 +38,8 @@ module subroutine fraggle_generate_fragments(self, colliders, system, param, lfa associate(frag => self, nfrag => self%nbody, pl => system%pl) + write(message,*) nfrag + call fraggle_io_log_one_message("Fraggle generating " // trim(adjustl(message)) // " fragments.") if (nfrag < NFRAG_MIN) then write(message,*) "Fraggle needs at least ",NFRAG_MIN," fragments, but only ",nfrag," were given." call fraggle_io_log_one_message(message) @@ -294,10 +296,11 @@ subroutine fraggle_generate_tan_vel(frag, colliders, lfailure) integer(I4B) :: i real(DP), parameter :: TOL_MIN = 1e-1_DP ! This doesn't have to be very accurate, as we really just want a tangential velocity distribution with less kinetic energy than our initial guess. real(DP), parameter :: TOL_INIT = 1e-14_DP + real(DP), parameter :: VNOISE_MAG = 1e-3_DP !! Magnitude of the noise to apply to initial conditions to help minimizer find a solution in case of failure integer(I4B), parameter :: MAXLOOP = 10 - real(DP) :: tol + real(DP) :: tol, ke_remainder real(DP), dimension(:), allocatable :: v_t_initial - real(DP), dimension(frag%nbody) :: kefrag + real(DP), dimension(frag%nbody) :: kefrag, vnoise type(lambda_obj) :: spinfunc type(lambda_obj_err) :: objective_function real(DP), dimension(NDIM) :: Li, L_remainder, L_frag_tot @@ -332,6 +335,9 @@ subroutine fraggle_generate_tan_vel(frag, colliders, lfailure) v_t_initial(7:nfrag) = frag%v_t_mag(7:nfrag) if (.not.lfailure) exit tol = tol * 2_DP ! Keep increasing the tolerance until we converge on a solution + call random_number(vnoise(1:nfrag)) ! Adding a bit of noise to the initial conditions helps it find a solution more often + vnoise(:) = 1.0_DP + VNOISE_MAG * (2 * vnoise(:) - 1._DP) + v_t_initial(:) = v_t_initial(:) * vnoise(:) end do frag%v_t_mag(1:nfrag) = solve_fragment_tan_vel(v_t_mag_input=v_t_initial(7:nfrag), lfailure=lfailure) @@ -466,11 +472,13 @@ subroutine fraggle_generate_rad_vel(frag, colliders, lfailure) ! Internals real(DP), parameter :: TOL_MIN = FRAGGLE_ETOL ! This needs to be more accurate than the tangential step, as we are trying to minimize the total residual energy real(DP), parameter :: TOL_INIT = 1e-14_DP + real(DP), parameter :: VNOISE_MAG = 1e-10_DP !! Magnitude of the noise to apply to initial conditions to help minimizer find a solution in case of failure integer(I4B), parameter :: MAXLOOP = 100 real(DP) :: ke_radial, tol integer(I4B) :: i, j - real(DP), dimension(:), allocatable :: v_r_initial, v_r_sigma + real(DP), dimension(:), allocatable :: v_r_initial real(DP), dimension(:,:), allocatable :: v_r + real(DP), dimension(frag%nbody) :: vnoise type(lambda_obj) :: objective_function character(len=STRMAX) :: message @@ -479,11 +487,10 @@ subroutine fraggle_generate_rad_vel(frag, colliders, lfailure) ke_radial = frag%ke_budget - frag%ke_spin - frag%ke_orbit allocate(v_r_initial, source=frag%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=frag%v_r_mag) - call random_number(v_r_sigma(1:nfrag)) - v_r_sigma(1:nfrag) = sqrt(1.0_DP + 2 * (v_r_sigma(1:nfrag) - 0.5_DP) * 1e-4_DP) - v_r_initial(1:nfrag) = v_r_sigma(1:nfrag) * sqrt(abs(2 * ke_radial) / (frag%mass(1:nfrag) * nfrag)) + ! Initialize radial velocity magnitudes with a random value that related to equipartition of kinetic energy with some noise + call random_number(vnoise(1:nfrag)) + vnoise(:) = 1.0_DP + VNOISE_MAG * (2 * vnoise(:) - 1.0_DP) + v_r_initial(1:nfrag) = sqrt(abs(2 * ke_radial) / (frag%mass(1:nfrag) * nfrag)) * vnoise(1:nfrag) ! Initialize the lambda function using a structure constructor that calls the init method ! Minimize the ke objective function using the BFGS optimizer @@ -494,30 +501,33 @@ subroutine fraggle_generate_rad_vel(frag, colliders, lfailure) if (.not.lfailure) exit tol = tol * 2 ! Keep increasing the tolerance until we converge on a solution v_r_initial(:) = frag%v_r_mag(:) + call random_number(vnoise(1:nfrag)) ! Adding a bit of noise to the initial conditions helps it find a solution more often + vnoise(:) = 1.0_DP + VNOISE_MAG * (2 * vnoise(:) - 1._DP) + v_r_initial(:) = v_r_initial(:) * vnoise(:) end do ! Shift the radial velocity vectors to align with the center of mass of the collisional system (the origin) frag%ke_orbit = 0.0_DP frag%vb(:,1:nfrag) = fraggle_util_vmag_to_vb(frag%v_r_mag(1:nfrag), frag%v_r_unit(:,1:nfrag), frag%v_t_mag(1:nfrag), frag%v_t_unit(:,1:nfrag), frag%mass(1:nfrag), frag%vbcom(:)) - do i = 1, nfrag - frag%v_coll(:, i) = frag%vb(:, i) - frag%vbcom(:) - frag%ke_orbit = frag%ke_orbit + frag%mass(i) * dot_product(frag%vb(:, i), frag%vb(:, i)) - end do - frag%ke_orbit = 0.5_DP * frag%ke_orbit - - lfailure = abs((frag%ke_budget - (frag%ke_orbit + frag%ke_spin)) / frag%ke_budget) > FRAGGLE_ETOL - if (lfailure) then - call fraggle_io_log_one_message(" ") - call fraggle_io_log_one_message("Radial velocity failure diagnostics") - write(message, *) frag%ke_budget - call fraggle_io_log_one_message("ke_budget : " // trim(adjustl(message))) - write(message, *) frag%ke_spin - call fraggle_io_log_one_message("ke_spin : " // trim(adjustl(message))) - write(message, *) frag%ke_orbit - call fraggle_io_log_one_message("ke_orbit : " // trim(adjustl(message))) - write(message, *) frag%ke_budget - (frag%ke_orbit + frag%ke_spin) - call fraggle_io_log_one_message("ke_remainder : " // trim(adjustl(message))) - end if + do i = 1, nfrag + frag%v_coll(:, i) = frag%vb(:, i) - frag%vbcom(:) + frag%ke_orbit = frag%ke_orbit + frag%mass(i) * dot_product(frag%vb(:, i), frag%vb(:, i)) + end do + frag%ke_orbit = 0.5_DP * frag%ke_orbit + + lfailure = abs((frag%ke_budget - (frag%ke_orbit + frag%ke_spin)) / frag%ke_budget) > FRAGGLE_ETOL + if (lfailure) then + call fraggle_io_log_one_message(" ") + call fraggle_io_log_one_message("Radial velocity failure diagnostics") + write(message, *) frag%ke_budget + call fraggle_io_log_one_message("ke_budget : " // trim(adjustl(message))) + write(message, *) frag%ke_spin + call fraggle_io_log_one_message("ke_spin : " // trim(adjustl(message))) + write(message, *) frag%ke_orbit + call fraggle_io_log_one_message("ke_orbit : " // trim(adjustl(message))) + write(message, *) frag%ke_budget - (frag%ke_orbit + frag%ke_spin) + call fraggle_io_log_one_message("ke_remainder : " // trim(adjustl(message))) + end if end associate return @@ -556,4 +566,4 @@ end function radial_objective_function end subroutine fraggle_generate_rad_vel -end submodule s_fraggle_generate \ No newline at end of file +end submodule s_fraggle_generate From 50afb8f9d00a4c24657c280a104ef39724e5a7ee Mon Sep 17 00:00:00 2001 From: David A Minton Date: Tue, 7 Sep 2021 17:11:12 -0400 Subject: [PATCH 142/154] Tweaked the noise parameter for trangential velocities. --- src/fraggle/fraggle_generate.f90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/fraggle/fraggle_generate.f90 b/src/fraggle/fraggle_generate.f90 index 5a8b08949..58965f7ee 100644 --- a/src/fraggle/fraggle_generate.f90 +++ b/src/fraggle/fraggle_generate.f90 @@ -296,7 +296,7 @@ subroutine fraggle_generate_tan_vel(frag, colliders, lfailure) integer(I4B) :: i real(DP), parameter :: TOL_MIN = 1e-1_DP ! This doesn't have to be very accurate, as we really just want a tangential velocity distribution with less kinetic energy than our initial guess. real(DP), parameter :: TOL_INIT = 1e-14_DP - real(DP), parameter :: VNOISE_MAG = 1e-3_DP !! Magnitude of the noise to apply to initial conditions to help minimizer find a solution in case of failure + real(DP), parameter :: VNOISE_MAG = 1e-2_DP !! Magnitude of the noise to apply to initial conditions to help minimizer find a solution in case of failure integer(I4B), parameter :: MAXLOOP = 10 real(DP) :: tol, ke_remainder real(DP), dimension(:), allocatable :: v_t_initial From ed5bfffbbfe881d9fd7289a00bac45af945c5fc9 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Tue, 7 Sep 2021 18:17:37 -0400 Subject: [PATCH 143/154] Removed restriction on spins of first two bodies. Success rate of fraggle_generation is improved. --- src/fraggle/fraggle_generate.f90 | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/src/fraggle/fraggle_generate.f90 b/src/fraggle/fraggle_generate.f90 index 58965f7ee..6f7ccb7a3 100644 --- a/src/fraggle/fraggle_generate.f90 +++ b/src/fraggle/fraggle_generate.f90 @@ -234,10 +234,8 @@ subroutine fraggle_generate_spins(frag, colliders, f_spin, lfailure) lfailure = .false. ! Start the first two bodies with the same rotation as the original two impactors, then distribute the remaining angular momentum among the rest - frag%rot(:,1:2) = colliders%rot(:, :) - frag%rot(:,3:nfrag) = 0.0_DP - call frag%get_ang_mtm() - L_remainder(:) = frag%L_budget(:) - frag%L_spin(:) + L_remainder(:) = frag%L_budget(:) + frag%rot(:,:) = 0.0_DP frag%ke_spin = 0.0_DP do i = 1, nfrag @@ -245,9 +243,9 @@ subroutine fraggle_generate_spins(frag, colliders, f_spin, lfailure) rot_ke(:) = sqrt(2 * f_spin * frag%ke_budget / (nfrag * frag%mass(i) * frag%radius(i)**2 * frag%Ip(3, i))) * L_remainder(:) / norm2(L_remainder(:)) rot_L(:) = f_spin * L_remainder(:) / (nfrag * frag%mass(i) * frag%radius(i)**2 * frag%Ip(3, i)) if (norm2(rot_ke) < norm2(rot_L)) then - frag%rot(:,i) = frag%rot(:, i) + rot_ke(:) + frag%rot(:,i) = rot_ke(:) else - frag%rot(:, i) = frag%rot(:, i) + rot_L(:) + frag%rot(:, i) = rot_L(:) end if frag%ke_spin = frag%ke_spin + frag%mass(i) * frag%Ip(3, i) * frag%radius(i)**2 * dot_product(frag%rot(:, i), frag%rot(:, i)) end do @@ -296,7 +294,7 @@ subroutine fraggle_generate_tan_vel(frag, colliders, lfailure) integer(I4B) :: i real(DP), parameter :: TOL_MIN = 1e-1_DP ! This doesn't have to be very accurate, as we really just want a tangential velocity distribution with less kinetic energy than our initial guess. real(DP), parameter :: TOL_INIT = 1e-14_DP - real(DP), parameter :: VNOISE_MAG = 1e-2_DP !! Magnitude of the noise to apply to initial conditions to help minimizer find a solution in case of failure + real(DP), parameter :: VNOISE_MAG = 1e-3_DP !! Magnitude of the noise to apply to initial conditions to help minimizer find a solution in case of failure integer(I4B), parameter :: MAXLOOP = 10 real(DP) :: tol, ke_remainder real(DP), dimension(:), allocatable :: v_t_initial From 0f6f3a119c15f89093d2e401a35f99ffbf1e71de Mon Sep 17 00:00:00 2001 From: David Minton Date: Wed, 8 Sep 2021 15:51:10 -0400 Subject: [PATCH 144/154] Added memory line to SLURM script in symba_mars_disk example --- .../symba_energy_momentum/Untitled1.ipynb | 2388 +++++++++++++++++ examples/symba_mars_disk/runswiftest.sh | 1 + 2 files changed, 2389 insertions(+) create mode 100644 examples/symba_energy_momentum/Untitled1.ipynb diff --git a/examples/symba_energy_momentum/Untitled1.ipynb b/examples/symba_energy_momentum/Untitled1.ipynb new file mode 100644 index 000000000..a90d1792c --- /dev/null +++ b/examples/symba_energy_momentum/Untitled1.ipynb @@ -0,0 +1,2388 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "import xarray as xr\n", + "import numpy as np" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "ds = xr.open_dataset('bin.supercatastrophic_headon.nc')" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
    \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
    <xarray.DataArray 'discard_time' (id: 23)>\n",
    +       "array([ 0.000000e+000,  5.800000e-006,  5.800000e-006, -1.797693e+308,\n",
    +       "       -1.797693e+308, -1.797693e+308, -1.797693e+308, -1.797693e+308,\n",
    +       "       -1.797693e+308, -1.797693e+308, -1.797693e+308, -1.797693e+308,\n",
    +       "       -1.797693e+308, -1.797693e+308, -1.797693e+308, -1.797693e+308,\n",
    +       "       -1.797693e+308, -1.797693e+308, -1.797693e+308, -1.797693e+308,\n",
    +       "       -1.797693e+308, -1.797693e+308, -1.797693e+308])\n",
    +       "Coordinates:\n",
    +       "  * id       (id) int32 0 1 2 3 4 5 6 7 8 9 10 ... 13 14 15 16 17 18 19 20 21 22
    " + ], + "text/plain": [ + "\n", + "array([ 0.000000e+000, 5.800000e-006, 5.800000e-006, -1.797693e+308,\n", + " -1.797693e+308, -1.797693e+308, -1.797693e+308, -1.797693e+308,\n", + " -1.797693e+308, -1.797693e+308, -1.797693e+308, -1.797693e+308,\n", + " -1.797693e+308, -1.797693e+308, -1.797693e+308, -1.797693e+308,\n", + " -1.797693e+308, -1.797693e+308, -1.797693e+308, -1.797693e+308,\n", + " -1.797693e+308, -1.797693e+308, -1.797693e+308])\n", + "Coordinates:\n", + " * id (id) int32 0 1 2 3 4 5 6 7 8 9 10 ... 13 14 15 16 17 18 19 20 21 22" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "ds['discard_time']" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "ds1 = ds.where(np.abs(ds['discard_time']) < 1e99, drop=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
    \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
    <xarray.Dataset>\n",
    +       "Dimensions:          (id: 3, time: 301)\n",
    +       "Coordinates:\n",
    +       "  * time             (time) float64 0.0 1e-07 2e-07 ... 2.98e-05 2.99e-05 3e-05\n",
    +       "  * id               (id) int32 0 1 2\n",
    +       "Data variables: (12/57)\n",
    +       "    npl              (time, id) float64 2.0 2.0 2.0 2.0 ... 20.0 20.0 20.0 20.0\n",
    +       "    ntp              (time, id) float64 0.0 0.0 0.0 0.0 0.0 ... 0.0 0.0 0.0 0.0\n",
    +       "    name             (id) object b'0' b'1' b'2'\n",
    +       "    particle_type    (id) object b'Central Body' b'Massive Body' b'Massive Body'\n",
    +       "    xhx              (time, id) float64 0.0 1.0 1.0 0.0 1.0 ... 0.0 0.0 0.0 0.0\n",
    +       "    xhy              (time, id) float64 0.0 -4.2e-05 4.2e-05 0.0 ... 0.0 0.0 0.0\n",
    +       "    ...               ...\n",
    +       "    discard_xhy      (id) float64 -2.736e+299 -5.125e-06 5.125e-06\n",
    +       "    discard_xhz      (id) float64 0.0 0.0 0.0\n",
    +       "    discard_vhx      (id) float64 2.171e-314 -0.0002318 -0.0002318\n",
    +       "    discard_vhy      (id) float64 0.0 6.28 -6.281\n",
    +       "    discard_vhz      (id) float64 2.171e-314 0.0 0.0\n",
    +       "    discard_body_id  (id) float64 -2.147e+09 -2.147e+09 -2.147e+09
    " + ], + "text/plain": [ + "\n", + "Dimensions: (id: 3, time: 301)\n", + "Coordinates:\n", + " * time (time) float64 0.0 1e-07 2e-07 ... 2.98e-05 2.99e-05 3e-05\n", + " * id (id) int32 0 1 2\n", + "Data variables: (12/57)\n", + " npl (time, id) float64 2.0 2.0 2.0 2.0 ... 20.0 20.0 20.0 20.0\n", + " ntp (time, id) float64 0.0 0.0 0.0 0.0 0.0 ... 0.0 0.0 0.0 0.0\n", + " name (id) object b'0' b'1' b'2'\n", + " particle_type (id) object b'Central Body' b'Massive Body' b'Massive Body'\n", + " xhx (time, id) float64 0.0 1.0 1.0 0.0 1.0 ... 0.0 0.0 0.0 0.0\n", + " xhy (time, id) float64 0.0 -4.2e-05 4.2e-05 0.0 ... 0.0 0.0 0.0\n", + " ... ...\n", + " discard_xhy (id) float64 -2.736e+299 -5.125e-06 5.125e-06\n", + " discard_xhz (id) float64 0.0 0.0 0.0\n", + " discard_vhx (id) float64 2.171e-314 -0.0002318 -0.0002318\n", + " discard_vhy (id) float64 0.0 6.28 -6.281\n", + " discard_vhz (id) float64 2.171e-314 0.0 0.0\n", + " discard_body_id (id) float64 -2.147e+09 -2.147e+09 -2.147e+09" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "ds1" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "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.8.6" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/examples/symba_mars_disk/runswiftest.sh b/examples/symba_mars_disk/runswiftest.sh index 96dd99928..748a9d774 100644 --- a/examples/symba_mars_disk/runswiftest.sh +++ b/examples/symba_mars_disk/runswiftest.sh @@ -5,6 +5,7 @@ #SBATCH --time=14-00:00:00 #SBATCH --ntasks-per-node=1 #SBATCH --cpus-per-task=12 +#SBATCH --mem=96G #SBATCH --job-name=high_high #SBATCH --no-requeue #SBATCH -o %x.out From a12ad18b496530bf7d0e443941a87a53b3a0db75 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Wed, 8 Sep 2021 17:43:04 -0400 Subject: [PATCH 145/154] Fixed the SLURM script for the test case to ask for 1 GB per cpu, which is how Bell is configured. --- examples/symba_mars_disk/runswiftest.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/symba_mars_disk/runswiftest.sh b/examples/symba_mars_disk/runswiftest.sh index 748a9d774..c7d069d39 100644 --- a/examples/symba_mars_disk/runswiftest.sh +++ b/examples/symba_mars_disk/runswiftest.sh @@ -4,8 +4,8 @@ #SBATCH --ntasks=1 #SBATCH --time=14-00:00:00 #SBATCH --ntasks-per-node=1 -#SBATCH --cpus-per-task=12 -#SBATCH --mem=96G +#SBATCH --cpus-per-task=4 +#SBATCH --mem-per-cpu=1G #SBATCH --job-name=high_high #SBATCH --no-requeue #SBATCH -o %x.out From 4675c7668da8bf05948e58850d49f9870e5d0456 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Thu, 9 Sep 2021 09:48:29 -0400 Subject: [PATCH 146/154] Re-wrote the wall timer as its own module and class. Now add a file I/O timer report. --- Makefile | 1 + src/io/io.f90 | 13 +--- src/main/swiftest_driver.f90 | 4 ++ src/modules/swiftest.f90 | 1 + src/modules/swiftest_classes.f90 | 1 - src/modules/walltime_classes.f90 | 119 +++++++++++++++++++++++++++++++ 6 files changed, 126 insertions(+), 13 deletions(-) create mode 100644 src/modules/walltime_classes.f90 diff --git a/Makefile b/Makefile index fb555345f..b5fb81071 100644 --- a/Makefile +++ b/Makefile @@ -47,6 +47,7 @@ SWIFTEST_MODULES = swiftest_globals.f90 \ swiftest_operators.f90 \ lambda_function.f90\ + walltime_classes.f90 \ swiftest_classes.f90 \ fraggle_classes.f90 \ whm_classes.f90 \ diff --git a/src/io/io.f90 b/src/io/io.f90 index b938af8c2..eacaacf48 100644 --- a/src/io/io.f90 +++ b/src/io/io.f90 @@ -275,18 +275,12 @@ module subroutine io_dump_system(self, param) 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) :: deltawall, wallperstep, tfrac - integer(I8B) :: clock_count, count_rate, count_max + real(DP) :: tfrac character(*), parameter :: statusfmt = '("Time = ", ES12.5, "; fraction done = ", F6.3, "; Number of active pl, tp = ", I5, ", ", I5)' character(*), parameter :: symbastatfmt = '("Time = ", ES12.5, "; fraction done = ", F6.3, "; Number of active plm, pl, tp = ", I5, ", ", I5, ", ", I5)' - character(len=*), parameter :: walltimefmt = '(" Wall time (s): ", es12.5, "; Wall time/step in this interval (s): ", es12.5)' logical, save :: lfirst = .true. - real(DP), save :: start, finish if (lfirst) then - call system_clock(clock_count, count_rate, count_max) - start = clock_count / (count_rate * 1.0_DP) - finish = start lfirst = .false. if (param%lenergy) call self%conservation_report(param, lterminal=.false.) else @@ -312,17 +306,12 @@ module subroutine io_dump_system(self, param) tfrac = (param%t - param%t0) / (param%tstop - param%t0) - call system_clock(clock_count, count_rate, count_max) - deltawall = clock_count / (count_rate * 1.0_DP) - finish - wallperstep = deltawall / param%istep_dump - finish = clock_count / (count_rate * 1.0_DP) select type(pl => self%pl) class is (symba_pl) write(*, symbastatfmt) param%t, tfrac, pl%nplm, pl%nbody, self%tp%nbody class default write(*, statusfmt) param%t, tfrac, pl%nbody, self%tp%nbody end select - write(*, walltimefmt) finish - start, wallperstep end if return diff --git a/src/main/swiftest_driver.f90 b/src/main/swiftest_driver.f90 index 9d06d1ddb..876e0effd 100644 --- a/src/main/swiftest_driver.f90 +++ b/src/main/swiftest_driver.f90 @@ -20,6 +20,7 @@ program swiftest_driver integer(I8B) :: ioutput_t0 !! The output frame counter at time 0 integer(I8B) :: nloops !! Number of steps to take in the simulation real(DP) :: old_t_final = 0.0_DP !! Output time at which writing should start, in order to prevent duplicate lines being written for restarts + type(walltimer) :: timer !! Object used for computing elapsed wall time ierr = io_get_args(integrator, param_file_name) if (ierr /= 0) then @@ -69,6 +70,7 @@ program swiftest_driver !$ write(*,'(a)') ' OpenMP parameters:' !$ write(*,'(a)') ' ------------------' !$ write(*,'(a,i3,/)') ' Number of threads = ', nthreads + call timer%reset() write(*, *) " *************** Main Loop *************** " do iloop = 1, nloops !> Step the system forward in time @@ -84,7 +86,9 @@ program swiftest_driver iout = iout - 1 if (iout == 0) then ioutput = ioutput_t0 + iloop / istep_out + call timer%finish(nsubsteps=istep_out, message="Integration steps:") if (t > old_t_final) call nbody_system%write_frame(param) + call timer%finish(nsubsteps=1, message="File I/O: ") iout = istep_out end if end if diff --git a/src/modules/swiftest.f90 b/src/modules/swiftest.f90 index a6daff9a7..d3f8996f0 100644 --- a/src/modules/swiftest.f90 +++ b/src/modules/swiftest.f90 @@ -12,6 +12,7 @@ module swiftest use symba_classes use fraggle_classes use lambda_function + use walltime_classes !use advisor_annotate !$ use omp_lib implicit none diff --git a/src/modules/swiftest_classes.f90 b/src/modules/swiftest_classes.f90 index 363ed6f66..82d684f1a 100644 --- a/src/modules/swiftest_classes.f90 +++ b/src/modules/swiftest_classes.f90 @@ -7,7 +7,6 @@ module swiftest_classes implicit none public - type :: netcdf_parameters integer(I4B) :: out_type !! NetCDF output type (will be assigned either NF90_DOUBLE or NF90_FLOAT, depending on the user parameter) integer(I4B) :: ncid !! NetCDF ID for the output file diff --git a/src/modules/walltime_classes.f90 b/src/modules/walltime_classes.f90 new file mode 100644 index 000000000..71334db0f --- /dev/null +++ b/src/modules/walltime_classes.f90 @@ -0,0 +1,119 @@ +module walltime_classes + !! author: David A. Minton + !! + !! Classes and methods used to compute elasped wall time + use swiftest_globals + implicit none + public + + type :: walltimer + integer(I8B) :: count_rate !! Rate at wich the clock ticks + integer(I8B) :: count_max !! Maximum value of the clock ticker + integer(I8B) :: count_start_main !! Value of the clock ticker at when the timer is first called + integer(I8B) :: count_start_step !! Value of the clock ticker at the start of a timed step + integer(I8B) :: count_finish_step !! Value of the clock ticker at the end of a timed step + logical :: lmain_is_started = .false. !! Logical flag indicating whether or not the main timer has been reset or not + contains + procedure :: reset => walltime_reset !! Resets the clock ticker, settting main_start to the current ticker value + procedure :: start => walltime_start !! Starts the timer, setting step_start to the current ticker value + procedure :: finish => walltime_finish !! Ends the timer, setting step_finish to the current ticker value and printing the elapsed time information to the terminal + end type + + interface + module subroutine walltime_finish(self, nsubsteps, message) + implicit none + class(walltimer), intent(inout) :: self !! Walltimer object + integer(I4B), intent(in) :: nsubsteps !! Number of substeps used to compute the time per step + character(len=*), intent(in) :: message !! Message to prepend to the wall time terminal output + end subroutine walltime_finish + + module subroutine walltime_reset(self) + implicit none + class(walltimer), intent(inout) :: self !! Walltimer object + end subroutine walltime_reset + + module subroutine walltime_start(self) + implicit none + class(walltimer), intent(inout) :: self !! Walltimer object + end subroutine walltime_start + end interface + + contains + + module subroutine walltime_finish(self, nsubsteps, message) + !! author: David A. Minton + !! + !! Ends the timer, setting step_finish to the current ticker value and printing the elapsed time information to the terminal + use swiftest_globals + implicit none + ! Arguments + class(walltimer), intent(inout) :: self !! Walltimer object + integer(I4B), intent(in) :: nsubsteps !! Number of substeps used to compute the time per step + character(len=*), intent(in) :: message !! Message to prepend to the wall time terminal output + ! Internals + character(len=*), parameter :: walltimefmt = '" Wall time (s): ", es12.5, "; Wall time/step in this interval (s): ", es12.5' + character(len=STRMAX) :: fmt + integer(I8B) :: count_delta_step, count_delta_main + real(DP) :: wall_main !! Value of total elapsed time at the end of a timed step + real(DP) :: wall_step !! Value of elapsed time since the start of a timed step + real(DP) :: wall_per_substep !! Value of time per substep + + if (.not.self%lmain_is_started) then + write(*,*) "Wall timer error: The step finish time cannot be calculated because the timer is not started!" + return + end if + + call system_clock(self%count_finish_step) + + count_delta_step = self%count_finish_step - self%count_start_step + count_delta_main = self%count_finish_step - self%count_start_main + wall_step = count_delta_step / (self%count_rate * 1.0_DP) + wall_main = count_delta_main / (self%count_rate * 1.0_DP) + wall_per_substep = wall_step / nsubsteps + + fmt = '("' // trim(adjustl(message)) // '",' // walltimefmt // ')' + write(*,trim(adjustl(fmt))) wall_main, wall_per_substep + + call self%start() + + return + end subroutine walltime_finish + + module subroutine walltime_reset(self) + !! author: David A. Minton + !! + !! Resets the clock ticker, settting main_start to the current ticker value + use swiftest_globals + implicit none + ! Arguments + class(walltimer), intent(inout) :: self + + call system_clock(self%count_start_main, self%count_rate, self%count_max) + self%lmain_is_started = .true. + call self%start() + + return + end subroutine walltime_reset + + + module subroutine walltime_start(self) + !! author: David A. Minton + !! + !! Starts the timer, setting step_start to the current ticker value + use swiftest_globals + implicit none + ! Arguments + class(walltimer), intent(inout) :: self + + if (.not.self%lmain_is_started) then + write(*,*) "Wall timer error: Cannot start the step time until reset is called at least once!" + return + end if + + call system_clock(self%count_start_step) + + return + end subroutine walltime_start + + +end module walltime_classes \ No newline at end of file From ef8ac1d0f2e0e62ec8faa8c1a17cbd7524233daa Mon Sep 17 00:00:00 2001 From: David A Minton Date: Thu, 9 Sep 2021 09:52:58 -0400 Subject: [PATCH 147/154] Removed the trim from the message passer so that formatting can be aligned manually. --- src/modules/walltime_classes.f90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/modules/walltime_classes.f90 b/src/modules/walltime_classes.f90 index 71334db0f..6425b5b5f 100644 --- a/src/modules/walltime_classes.f90 +++ b/src/modules/walltime_classes.f90 @@ -71,7 +71,7 @@ module subroutine walltime_finish(self, nsubsteps, message) wall_main = count_delta_main / (self%count_rate * 1.0_DP) wall_per_substep = wall_step / nsubsteps - fmt = '("' // trim(adjustl(message)) // '",' // walltimefmt // ')' + fmt = '("' // adjustl(message) // '",' // walltimefmt // ')' write(*,trim(adjustl(fmt))) wall_main, wall_per_substep call self%start() From 8df8847599ff2a6a0f261139d6a21afec4f211d4 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Thu, 9 Sep 2021 17:17:37 -0400 Subject: [PATCH 148/154] Fixed typo in metadata tag for hit and run fragment --- 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 c5ca6426f..a3990cabd 100644 --- a/src/symba/symba_collision.f90 +++ b/src/symba/symba_collision.f90 @@ -775,7 +775,7 @@ subroutine symba_collision_mergeaddsub(system, param, colliders, frag, status) plnew%status(1) = OLD_PARTICLE do i = 2, nfrag write(newname, FRAGFMT) frag%id(i) - call plnew%info(i)%set_value(origin_type="Hit and run fragmention", origin_time=param%t, name=newname, origin_xh=plnew%xh(:,i), origin_vh=plnew%vh(:,i)) + call plnew%info(i)%set_value(origin_type="Hit and run fragment", origin_time=param%t, name=newname, origin_xh=plnew%xh(:,i), origin_vh=plnew%vh(:,i)) end do do i = 1, ncolliders if (colliders%idx(i) == ibiggest) cycle From aaf708c170c3247b2de6991ecc4067731a25615d Mon Sep 17 00:00:00 2001 From: David A Minton Date: Thu, 9 Sep 2021 19:10:57 -0400 Subject: [PATCH 149/154] Updated several of the example inputs --- examples/helio_gr_test/cb.swiftest.in | 2 +- examples/helio_gr_test/init_cond.py | 9 +- examples/helio_gr_test/param.swifter.in | 8 +- examples/helio_gr_test/param.swiftest.in | 15 ++- examples/helio_gr_test/pl.swifter.in | 50 ++++----- examples/helio_gr_test/pl.swiftest.in | 48 ++++---- .../param.disruption_off_axis.in | 4 +- examples/symba_mars_disk/param.in | 4 +- examples/symba_mars_disk/timetest.sh | 9 ++ examples/whm_gr_test/init_cond.py | 9 +- examples/whm_gr_test/param.swifter.in | 6 +- examples/whm_gr_test/param.swiftest.in | 6 +- examples/whm_gr_test/param.swiftest.nogr.in | 33 ++++++ examples/whm_gr_test/pl.swifter.in | 48 ++++---- examples/whm_gr_test/pl.swiftest.in | 48 ++++---- .../whm_gr_test/swiftest_relativity.ipynb | 104 ++++++++++++------ 16 files changed, 239 insertions(+), 164 deletions(-) create mode 100755 examples/symba_mars_disk/timetest.sh create mode 100644 examples/whm_gr_test/param.swiftest.nogr.in diff --git a/examples/helio_gr_test/cb.swiftest.in b/examples/helio_gr_test/cb.swiftest.in index e4a010b1e..64406c4cf 100644 --- a/examples/helio_gr_test/cb.swiftest.in +++ b/examples/helio_gr_test/cb.swiftest.in @@ -1,4 +1,4 @@ -0 +Sun 39.476926408897626 0.004650467260962157 4.7535806948127355e-12 diff --git a/examples/helio_gr_test/init_cond.py b/examples/helio_gr_test/init_cond.py index 5b378da74..e4351de42 100755 --- a/examples/helio_gr_test/init_cond.py +++ b/examples/helio_gr_test/init_cond.py @@ -5,8 +5,7 @@ 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['BIN_OUT'] = "bin.swiftest.nc" sim.param['MU2KG'] = swiftest.MSun sim.param['TU2S'] = swiftest.YR2S @@ -22,9 +21,11 @@ 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['RHILL_PRESENT'] = "NO" +sim.param['IN_FORM'] = "EL" +sim.param['OUT_FORM'] = "XVEL" +sim.param['OUT_TYPE'] = "NETCDF_DOUBLE" +sim.param['RHILL_PRESENT'] = "YES" sim.param['GR'] = 'YES' bodyid = { diff --git a/examples/helio_gr_test/param.swifter.in b/examples/helio_gr_test/param.swifter.in index acca6f7aa..14a2e67ab 100644 --- a/examples/helio_gr_test/param.swifter.in +++ b/examples/helio_gr_test/param.swifter.in @@ -4,24 +4,24 @@ TSTOP 1000.0 DT 0.0006844626967830253 ISTEP_OUT 1461 ISTEP_DUMP 1461 -OUT_FORM EL -OUT_TYPE REAL8 +OUT_FORM XVEL +OUT_TYPE NETCDF_DOUBLE 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 +ENC_OUT enc.swifter.dat EXTRA_FORCE NO BIG_DISCARD NO CHK_CLOSE YES -RHILL_PRESENT NO +RHILL_PRESENT YES C 63241.07708426628 J2 4.7535806948127355e-12 J4 -2.2473967953572827e-18 diff --git a/examples/helio_gr_test/param.swiftest.in b/examples/helio_gr_test/param.swiftest.in index f5a748693..06cd551b5 100644 --- a/examples/helio_gr_test/param.swiftest.in +++ b/examples/helio_gr_test/param.swiftest.in @@ -4,15 +4,14 @@ TSTOP 1000.0 DT 0.0006844626967830253 ISTEP_OUT 1461 ISTEP_DUMP 1461 -OUT_FORM EL -OUT_TYPE REAL8 +OUT_FORM XVEL +OUT_TYPE NETCDF_DOUBLE 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 +BIN_OUT bin.swiftest.nc CHK_QMIN 0.004650467260962157 CHK_RMIN 0.004650467260962157 CHK_RMAX 1000.0 @@ -22,15 +21,15 @@ CHK_QMIN_RANGE 0.004650467260962157 1000.0 MU2KG 1.988409870698051e+30 TU2S 31557600.0 DU2M 149597870700.0 +IN_FORM EL +ENC_OUT enc.dat EXTRA_FORCE NO +DISCARD_OUT discard.out BIG_DISCARD NO CHK_CLOSE YES -RHILL_PRESENT NO +RHILL_PRESENT 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 index f39e7af56..9add1dc1a 100644 --- a/examples/helio_gr_test/pl.swifter.in +++ b/examples/helio_gr_test/pl.swifter.in @@ -1,36 +1,36 @@ 9 -0 39.476926408897625196 +0 39.476926408897626 0.0 0.0 0.0 0.0 0.0 0.0 -1 6.5537098095653139645e-06 +1 6.5537098095653139645e-06 0.001475131156288637831 1.6306381826061645943e-05 --0.30949970210807342674 0.1619004125820537876 0.041620272188990829754 --6.8742992150644793847 -8.672423996611946485 -0.078109307586001638286 -2 9.663313399581537916e-05 +-0.0361820239646683528 -0.46276010580341980782 -0.034496398006472611675 +8.183688458560222766 -0.27616682338432374386 -0.7732476400340904169 +2 9.663313399581537916e-05 0.0067590747715647875607 4.0453784346544178454e-05 --0.5567137338251560985 -0.46074173273652380134 0.02580196630219121906 -4.6580776303108450487 -5.726444072926637749 -0.3473859047161406309 -3 0.000120026935827952453094 +0.04707194870345993154 -0.7255425078625500346 -0.012673782840571969424 +7.3226765098927520106 0.45143529808423807744 -0.4163607714267330732 +3 0.000120026935827952453094 0.01004493295891520948 4.25875607065040958e-05 -0.6978790186886838498 -0.73607603319120218366 3.261671020506711323e-05 -4.4579240279134950613 4.300011122687349501 -0.00022055769049333364448 -4 1.2739802010675941456e-05 +0.9784182446151709067 -0.2394545623617302943 7.8432240502479141865e-06 +1.3916805835822199726 6.0802455505175572043 -0.00029695052429473289775 +4 1.2739802010675941456e-05 0.007246527815634877893 2.265740805092889601e-05 --1.617661473167097963 0.38314370807747849534 0.04771055403546069218 --0.98751874613118001086 -4.5371239937302254657 -0.07086074102213555221 -5 0.037692251088985676735 +-1.64827450584581503 -0.04818173529735803734 0.039422108862210397673 +0.3393812176064170994 -4.672429323734897043 -0.1062469093563351878 +5 0.037692251088985676735 0.3552712221482522291 0.00046732617030490929307 -4.1527454588897487753 -2.8347492039446908763 -0.081136554176388195336 -1.5225069137843642898 2.4087104911325327961 -0.044067446366273183833 -6 0.011285899820091272997 +4.2888079225575648223 -2.6068082746690541818 -0.08512743586621877856 +1.4000629754656241179 2.4876377693334669565 -0.04165606656604725836 +6 0.011285899820091272997 0.4376655756331854547 0.00038925687730393611812 -6.39471595410062843 -7.621162747287802297 -0.121992225877669294154 -1.4493167787574136286 1.3075474785896286071 -0.08039429377859412155 -7 0.0017236589478267730203 +6.528501376442308768 -7.4981197287393284157 -0.12945412016904539465 +1.4250071771025915456 1.33599992135721594 -0.07992159012428249671 +7 0.0017236589478267730203 0.46970222329693796102 0.00016953449859497231466 -14.793135356927480828 13.074218343364380601 -0.14311846037737518955 --0.9605086875596024784 1.0118431725941020164 0.016148779866732710198 -8 0.0020336100526728302319 +14.703390521074780395 13.168120788311910019 -0.14161196287363458923 +-0.96768368440931795183 1.0056701102995595347 0.01621895610074016891 +8 0.0020336100526728302319 0.78148373992374883156 0.000164587904124493665 -29.568629894896030663 -4.5543028991960081697 -0.58771107137394917874 -0.16867624969736024011 1.1427992197933557251 -0.027387722828706092838 +29.584136736556288838 -4.4478894754775319953 -0.5902566603324214123 +0.16448791459483679965 1.1435219564135608914 -0.027304639012640681262 diff --git a/examples/helio_gr_test/pl.swiftest.in b/examples/helio_gr_test/pl.swiftest.in index b624d25ba..cd6a82534 100644 --- a/examples/helio_gr_test/pl.swiftest.in +++ b/examples/helio_gr_test/pl.swiftest.in @@ -1,33 +1,33 @@ 8 -1 6.5537098095653139645e-06 +Mercury 6.5537098095653139645e-06 0.001475131156288637831 1.6306381826061645943e-05 --0.30949970210807342674 0.1619004125820537876 0.041620272188990829754 --6.8742992150644793847 -8.672423996611946485 -0.078109307586001638286 -2 9.663313399581537916e-05 +0.38709993253896590737 0.20562614632859010921 7.0036272314159866426 +48.303648911363737284 29.187750438580689405 192.22398026813181104 +Venus 9.663313399581537916e-05 0.0067590747715647875607 4.0453784346544178454e-05 --0.5567137338251560985 -0.46074173273652380134 0.02580196630219121906 -4.6580776303108450487 -5.726444072926637749 -0.3473859047161406309 -3 0.000120026935827952453094 +0.7233249152313999675 0.006782779674600277614 3.3945084679511872139 +76.62172192899298295 55.11871576732421829 141.51944714681908977 +Earth 0.000120026935827952453094 0.01004493295891520948 4.25875607065040958e-05 -0.6978790186886838498 -0.73607603319120218366 3.261671020506711323e-05 -4.4579240279134950613 4.300011122687349501 -0.00022055769049333364448 -4 1.2739802010675941456e-05 +1.0000207198983319667 0.01667731166077134064 0.0027576432734417160447 +175.55813761562768605 287.40166532678227895 245.00485341438161413 +Mars 1.2739802010675941456e-05 0.007246527815634877893 2.265740805092889601e-05 --1.617661473167097963 0.38314370807747849534 0.04771055403546069218 --0.98751874613118001086 -4.5371239937302254657 -0.07086074102213555221 -5 0.037692251088985676735 +1.5236922769560579116 0.093361659829406723476 1.8479133359077690724 +49.490611477105659333 286.70751815915190264 210.36775515565921069 +Jupiter 0.037692251088985676735 0.3552712221482522291 0.00046732617030490929307 -4.1527454588897487753 -2.8347492039446908763 -0.081136554176388195336 -1.5225069137843642898 2.4087104911325327961 -0.044067446366273183833 -6 0.011285899820091272997 +5.203523661489898977 0.04851833897394460665 1.3035686835324369337 +100.51671881401649955 273.38319313278452682 318.65986979714938343 +Saturn 0.011285899820091272997 0.4376655756331854547 0.00038925687730393611812 -6.39471595410062843 -7.621162747287802297 -0.121992225877669294154 -1.4493167787574136286 1.3075474785896286071 -0.08039429377859412155 -7 0.0017236589478267730203 +9.581904852310625387 0.052236260603057811658 2.486258128114103183 +113.595257336893098454 335.64742317800698856 225.92836894588160135 +Uranus 0.0017236589478267730203 0.46970222329693796102 0.00016953449859497231466 -14.793135356927480828 13.074218343364380601 -0.14311846037737518955 --0.9605086875596024784 1.0118431725941020164 0.016148779866732710198 -8 0.0020336100526728302319 +19.238019712529130345 0.0442880601027018303 0.770350326736000679 +74.09520891350530292 95.7524345508490029 236.07863258800219342 +Neptune 0.0020336100526728302319 0.78148373992374883156 0.000164587904124493665 -29.568629894896030663 -4.5543028991960081697 -0.58771107137394917874 -0.16867624969736024011 1.1427992197933557251 -0.027387722828706092838 +30.291369954344219195 0.013531244039650480379 1.7689741418447819665 +131.74449502957048708 245.89296040993210113 334.5035290478779757 diff --git a/examples/symba_energy_momentum/param.disruption_off_axis.in b/examples/symba_energy_momentum/param.disruption_off_axis.in index 58922133f..b10ecee63 100644 --- a/examples/symba_energy_momentum/param.disruption_off_axis.in +++ b/examples/symba_energy_momentum/param.disruption_off_axis.in @@ -22,8 +22,8 @@ DISCARD_OUT discard.disruption_off_axis.out EXTRA_FORCE no ! no extra user-defined forces BIG_DISCARD no ! output all planets if anything discarded RHILL_PRESENT yes ! Hill's sphere radii in input file -GMTINY 1.0e-16 -MIN_GMFRAG 1.0e-12 +GMTINY 1.0e-11 +MIN_GMFRAG 1.0e-11 FRAGMENTATION yes MU2KG 1.98908e30 TU2S 3.1556925e7 diff --git a/examples/symba_mars_disk/param.in b/examples/symba_mars_disk/param.in index 3a2851566..1fac92462 100644 --- a/examples/symba_mars_disk/param.in +++ b/examples/symba_mars_disk/param.in @@ -6,8 +6,8 @@ CB_IN cb.in PL_IN mars.in TP_IN tp.in IN_TYPE ASCII -ISTEP_OUT 100 -ISTEP_DUMP 100 +ISTEP_OUT 1 +ISTEP_DUMP 1 BIN_OUT bin.nc PARTICLE_OUT particle.dat OUT_TYPE NETCDF_DOUBLE diff --git a/examples/symba_mars_disk/timetest.sh b/examples/symba_mars_disk/timetest.sh new file mode 100755 index 000000000..e881f6ceb --- /dev/null +++ b/examples/symba_mars_disk/timetest.sh @@ -0,0 +1,9 @@ +#!/bin/bash +outname="timetest.csv" +echo "N cores, wall time (s)" > $outname +for value in {1..12} +do + export OMP_NUM_THREADS=$value + walltime="$(/usr/bin/time -f %e ./swiftest_driver symba param.in 2>&1 > /dev/null)" + echo "$value,$walltime" >> $outname +done \ No newline at end of file diff --git a/examples/whm_gr_test/init_cond.py b/examples/whm_gr_test/init_cond.py index ab7e7370a..d4d9a37fa 100755 --- a/examples/whm_gr_test/init_cond.py +++ b/examples/whm_gr_test/init_cond.py @@ -13,12 +13,9 @@ 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['TSTOP'] = 2*sim.param['DT'] -sim.param['ISTEP_OUT'] = 1 -sim.param['ISTEP_DUMP'] = 1 +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 diff --git a/examples/whm_gr_test/param.swifter.in b/examples/whm_gr_test/param.swifter.in index 4ff880f6b..105579a82 100644 --- a/examples/whm_gr_test/param.swifter.in +++ b/examples/whm_gr_test/param.swifter.in @@ -1,9 +1,9 @@ ! VERSION Swifter parameter file converted from Swiftest T0 0.0 -TSTOP 0.0013689253935660506 +TSTOP 1000.0 DT 0.0006844626967830253 -ISTEP_OUT 1 -ISTEP_DUMP 1 +ISTEP_OUT 1461 +ISTEP_DUMP 1461 OUT_FORM EL OUT_TYPE REAL8 OUT_STAT UNKNOWN diff --git a/examples/whm_gr_test/param.swiftest.in b/examples/whm_gr_test/param.swiftest.in index 257def623..d7f584790 100644 --- a/examples/whm_gr_test/param.swiftest.in +++ b/examples/whm_gr_test/param.swiftest.in @@ -1,9 +1,9 @@ ! VERSION Swiftest parameter input T0 0.0 -TSTOP 0.0013689253935660506 +TSTOP 1000.0 DT 0.0006844626967830253 -ISTEP_OUT 1 -ISTEP_DUMP 1 +ISTEP_OUT 1461 +ISTEP_DUMP 1461 OUT_FORM XVEL OUT_TYPE NETCDF_DOUBLE OUT_STAT UNKNOWN diff --git a/examples/whm_gr_test/param.swiftest.nogr.in b/examples/whm_gr_test/param.swiftest.nogr.in new file mode 100644 index 000000000..d6047ee82 --- /dev/null +++ b/examples/whm_gr_test/param.swiftest.nogr.in @@ -0,0 +1,33 @@ +! VERSION Swiftest parameter input +T0 0.0 +TSTOP 1000.0 +DT 0.0006844626967830253 +ISTEP_OUT 1461 +ISTEP_DUMP 1461 +OUT_FORM XVEL +OUT_TYPE NETCDF_DOUBLE +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.nogr.nc +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 +IN_FORM EL +EXTRA_FORCE NO +BIG_DISCARD NO +CHK_CLOSE YES +RHILL_PRESENT YES +FRAGMENTATION NO +ROTATION NO +TIDES NO +ENERGY NO +GR NO diff --git a/examples/whm_gr_test/pl.swifter.in b/examples/whm_gr_test/pl.swifter.in index a27e62f95..9add1dc1a 100644 --- a/examples/whm_gr_test/pl.swifter.in +++ b/examples/whm_gr_test/pl.swifter.in @@ -2,35 +2,35 @@ 0 39.476926408897626 0.0 0.0 0.0 0.0 0.0 0.0 -1 6.553709809565314146e-06 0.0014751261514880139061 +1 6.5537098095653139645e-06 0.001475131156288637831 1.6306381826061645943e-05 --0.29510017042975300594 -0.34346884022084378518 -0.000997917547895216684 -5.709185893355676925 -6.2220892824670268354 -1.0321515701207669188 -2 9.6633133995815381836e-05 0.006759061578633710828 +-0.0361820239646683528 -0.46276010580341980782 -0.034496398006472611675 +8.183688458560222766 -0.27616682338432374386 -0.7732476400340904169 +2 9.663313399581537916e-05 0.0067590747715647875607 4.0453784346544178454e-05 --0.21096294566811030213 -0.6945147553261317164 0.0026420019351886940041 -7.0187176732445560167 -2.1783670470162428854 -0.43491289164169576724 -3 0.000120026935827952456416 0.010044949983771724966 +0.04707194870345993154 -0.7255425078625500346 -0.012673782840571969424 +7.3226765098927520106 0.45143529808423807744 -0.4163607714267330732 +3 0.000120026935827952453094 0.01004493295891520948 4.25875607065040958e-05 -0.905522725638602366 -0.44829515638659761523 1.8122901980659660508e-05 -2.685845700565266851 5.6080546137104218133 -0.00027833838024725729542 -4 1.2739802010675941808e-05 0.0072465915674003790445 +0.9784182446151709067 -0.2394545623617302943 7.8432240502479141865e-06 +1.3916805835822199726 6.0802455505175572043 -0.00029695052429473289775 +4 1.2739802010675941456e-05 0.007246527815634877893 2.265740805092889601e-05 --1.6511945936824949932 0.1180803833522415941 0.042978148735422203042 --0.17443328105136805607 -4.661619009141641736 -0.09341597039948347882 -5 0.03769225108898567778 0.3552713110772063853 +-1.64827450584581503 -0.04818173529735803734 0.039422108862210397673 +0.3393812176064170994 -4.672429323734897043 -0.1062469093563351878 +5 0.037692251088985676735 0.3552712221482522291 0.00046732617030490929307 -4.2381319671740662614 -2.694827110197309139 -0.08362807329786287047 -1.44742540330701551 2.4581907268113588696 -0.042593445938391914576 -6 0.01128589982009127331 0.4376635990332856823 +4.2888079225575648223 -2.6068082746690541818 -0.08512743586621877856 +1.4000629754656241179 2.4876377693334669565 -0.04165606656604725836 +6 0.011285899820091272997 0.4376655756331854547 0.00038925687730393611812 -6.4776155764849425722 -7.5454781609219372385 -0.12660625214421539209 -1.4343694668413992401 1.3251694474665614901 -0.08010594537316981756 -7 0.001723658947826773068 0.46966224198242572768 +6.528501376442308768 -7.4981197287393284157 -0.12945412016904539465 +1.4250071771025915456 1.33599992135721594 -0.07992159012428249671 +7 0.0017236589478267730203 0.46970222329693796102 0.00016953449859497231466 -14.737783583010530819 13.132284780084109599 -0.14218874866247160904 --0.96494157148906816704 1.0080364706941240677 0.016191990849809560611 -8 0.0020336100526728302882 0.7814394516095526881 +14.703390521074780395 13.168120788311910019 -0.14161196287363458923 +-0.96768368440931795183 1.0056701102995595347 0.01621895610074016891 +8 0.0020336100526728302319 0.78148373992374883156 0.000164587904124493665 -29.578253698940308425 -4.488584904681241383 -0.58928426126360722304 -0.16609282485651713797 1.143247554888599065 -0.027336661118935745503 +29.584136736556288838 -4.4478894754775319953 -0.5902566603324214123 +0.16448791459483679965 1.1435219564135608914 -0.027304639012640681262 diff --git a/examples/whm_gr_test/pl.swiftest.in b/examples/whm_gr_test/pl.swiftest.in index 9d3171b2a..cd6a82534 100644 --- a/examples/whm_gr_test/pl.swiftest.in +++ b/examples/whm_gr_test/pl.swiftest.in @@ -1,33 +1,33 @@ 8 -Mercury 6.553709809565314146e-06 0.0014751261514880139061 +Mercury 6.5537098095653139645e-06 0.001475131156288637831 1.6306381826061645943e-05 -0.38709861919270799335 0.20562987442219879397 7.0036598799530471737 -48.303764444546942514 29.187012577257871015 139.02452846395490837 -Venus 9.6633133995815381836e-05 0.006759061578633710828 +0.38709993253896590737 0.20562614632859010921 7.0036272314159866426 +48.303648911363737284 29.187750438580689405 192.22398026813181104 +Venus 9.663313399581537916e-05 0.0067590747715647875607 4.0453784346544178454e-05 -0.72332350338494522113 0.0067851993472706276234 3.3945100118236060105 -76.62172575937908903 55.11451498626085055 120.69543184874230235 -Earth 0.000120026935827952456416 0.010044949983771724966 +0.7233249152313999675 0.006782779674600277614 3.3945084679511872139 +76.62172192899298295 55.11871576732421829 141.51944714681908977 +Earth 0.000120026935827952453094 0.01004493295891520948 4.25875607065040958e-05 -1.000022414803547921 0.016679693167334301573 0.002750719340522077977 -175.59912721852418827 287.3487256951211748 232.20474506920808722 -Mars 1.2739802010675941808e-05 0.0072465915674003790445 +1.0000207198983319667 0.01667731166077134064 0.0027576432734417160447 +175.55813761562768605 287.40166532678227895 245.00485341438161413 +Mars 1.2739802010675941456e-05 0.007246527815634877893 2.265740805092889601e-05 -1.5237056817307590428 0.09335454089002033495 1.8479086301002540793 -49.490790672135332784 286.7030449733272235 203.56009534652309867 -Jupiter 0.03769225108898567778 0.3552713110772063853 +1.5236922769560579116 0.093361659829406723476 1.8479133359077690724 +49.490611477105659333 286.70751815915190264 210.36775515565921069 +Jupiter 0.037692251088985676735 0.3552712221482522291 0.00046732617030490929307 -5.203524963998765074 0.048518619089771883313 1.3035691332389880426 -100.516740776557597314 273.38311024861741316 317.57998688455870706 -Saturn 0.01128589982009127331 0.4376635990332856823 +5.203523661489898977 0.04851833897394460665 1.3035686835324369337 +100.51671881401649955 273.38319313278452682 318.65986979714938343 +Saturn 0.011285899820091272997 0.4376655756331854547 0.00038925687730393611812 -9.581861578191695372 0.05220296447788015659 2.4862598063103709123 -113.59526938704850352 335.69019804854252698 225.44748806008931297 -Uranus 0.001723658947826773068 0.46966224198242572768 +9.581904852310625387 0.052236260603057811658 2.486258128114103183 +113.595257336893098454 335.64742317800698856 225.92836894588160135 +Uranus 0.0017236589478267730203 0.46970222329693796102 0.00016953449859497231466 -19.23638216159032055 0.04433184777155944195 0.7703424893861580136 -74.09557761028084144 95.84993853316392176 235.82773290830229485 -Neptune 0.0020336100526728302882 0.7814394516095526881 +19.238019712529130345 0.0442880601027018303 0.770350326736000679 +74.09520891350530292 95.7524345508490029 236.07863258800219342 +Neptune 0.0020336100526728302319 0.78148373992374883156 0.000164587904124493665 -30.289653279202511271 0.013458737599393380546 1.769000156955224945 -131.74519418988560915 245.79890439350270981 334.51418242279709148 +30.291369954344219195 0.013531244039650480379 1.7689741418447819665 +131.74449502957048708 245.89296040993210113 334.5035290478779757 diff --git a/examples/whm_gr_test/swiftest_relativity.ipynb b/examples/whm_gr_test/swiftest_relativity.ipynb index bbc87d783..da1946b2f 100644 --- a/examples/whm_gr_test/swiftest_relativity.ipynb +++ b/examples/whm_gr_test/swiftest_relativity.ipynb @@ -37,7 +37,30 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Reading Swiftest file param.swiftest.nogr.in\n", + "\n", + "Creating Dataset\n", + "Successfully converted 1001 output frames.\n", + "Swiftest simulation data stored as xarray DataSet .ds\n" + ] + } + ], + "source": [ + "nogrsim = swiftest.Simulation(param_file=\"param.swiftest.nogr.in\")\n", + "nogrsim.bin2xr()\n", + "nogrdat = nogrsim.ds" + ] + }, + { + "cell_type": "code", + "execution_count": 5, "metadata": {}, "outputs": [ { @@ -45,7 +68,7 @@ "output_type": "stream", "text": [ "Reading Swiftest file param.swiftest.in\n", - "Reading in time 1.000e+03\n", + "\n", "Creating Dataset\n", "Successfully converted 1001 output frames.\n", "Swiftest simulation data stored as xarray DataSet .ds\n" @@ -60,17 +83,18 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "swifterdat['varpi'] = swifterdat['omega'] + swifterdat['capom']\n", - "swiftestdat['varpi'] = swiftestdat['omega'] + swiftestdat['capom']" + "swiftestdat['varpi'] = swiftestdat['omega'] + swiftestdat['capom']\n", + "nogrdat['varpi'] = nogrdat['omega'] + nogrdat['capom']" ] }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 7, "metadata": {}, "outputs": [], "source": [ @@ -84,29 +108,31 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 8, "metadata": {}, "outputs": [], "source": [ - "varpiswiftest = swiftestdat['varpi'].sel(id=1) * 180.0 / np.pi\n", + "varpiswiftest = swiftestdat['varpi'].sel(id=1) \n", + "varpinogr = nogrdat['varpi'].sel(id=1)\n", "varpiswifter = swifterdat['varpi'].sel(id=1) * 180.0 / np.pi\n", "tsim = swiftestdat['time']" ] }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "dvarpi_swiftest = np.diff(varpiswiftest) * 3600 * 100 \n", "dvarpi_swifter = np.diff(varpiswifter) * 3600 * 100 \n", + "dvarpi_nogr = np.diff(varpinogr) * 3600 * 100\n", "dvarpi_obs = np.diff(varpi_obs) / np.diff(t) * 3600 * 100 " ] }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 26, "metadata": {}, "outputs": [ { @@ -114,43 +140,46 @@ "output_type": "stream", "text": [ "Mean precession rate for Mercury long. peri. (arcsec/100 y)\n", - "JPL Horizons : 571.3210506300043\n", - "Swifter GR : 571.6183105524942\n", - "Swiftest GR : 571.5670367229116\n", - "Obs - Swifter : -0.2972599224899675\n", - "Obs - Swiftest : -0.2459860929071831\n", - "Swiftest - Swifter: -0.05127382958278304\n" + "Swiftest WHM No GR : 528.5802151329052\n", + "Swiftest WHM GR : 571.5193636321641\n", + "JPL Horizons : 571.3210506300043\n", + "Obs - Swiftest No GR : 42.740835497099155\n", + "Obs - Swiftest GR : -0.19831300215981776\n" ] }, { "data": { - "image/png": "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\n", + "image/png": "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KjmWN3//kG27u2MY7kXGGblepMdGcFu1k/TqezMtagfi7a6PsIiIiIjIlaafyuWKWrlzER8f+ArDJQvvGq6knuheZGwVEvmg3TGa3/IUmEyXcZQiIiIiIlIcJZZyZZyIZO2vL/J/wW6YXCwAeFXdQXZKGNnJdQuEt/Y8yeu31Kdqs6GXe6QiIiIiIlIC7WMpl9/e+eTM6MmyXC+ans6/9NWvznKcXFPynXvuhjA+f2YMVZv1uJyjFBERERERGymxlMvHMOCPD+GHIZCbyZuxP9M463S+ECeXTPzqLAMstHXay9wRNRjcrTlOTlr6KiIiIiJytdJSWLl80s/CxncAA1eTwXGnIH4Oq4qJLGuIYUD1VJji9RzhI6ZCWMsrN14REREREbGJZizl8vEOhmG/gIsHhgEvhPXH5JqVL6TFcR9mdOhI+MMrIKzTFRqoiIiIiIiUhmYs5fIK6wS3f8tnv00lKfBcvkteaU14/cF3Mbk4X6HBiYiIiIiIPTRjKZdfs9up1bgnHskBGBZnyAqisdstzLjzbVyUVIqIiIiIXHM0YylXxC0Dn+OWje+S0egOPKs2uNLDERERERERByixlCvDZIJuz+J5pcchIiIiIiIO01JYERERERERcYgSSxEREREREXGIEksRERERERFxiBJLERERERERcYgSSxEREREREXGIEksRERERERFxiBJLERERERERcYgSSxEREREREXGIEksRERERERFxiBJLERERERERcYgSSxEREREREXGIEksRERERERFxiBJLERERERERcYgSSxEREREREXGIEksRERERERFxiBJLERERERERcYgSSxEREREREXGIEksRERERERFxiBJLERERERERcYgSSxEREREREXGIyTAM40oPQi6f4OBgwsPDr/QwrOLi4ggJCbnSw5BrjD43Yg99bsQe+tyIPfS5EXtcbZ+bI0eOEB8fb3O8Eku5oiIiIoiMjLzSw5BrjD43Yg99bsQe+tyIPfS5EXtc658bLYUVERERERERhyixFBEREREREYcosZQrauLEiVd6CHIN0udG7KHPjdhDnxuxhz43Yo9r/XOjZyxFRERERETEIZqxFBEREREREYcosRQRERERERGHKLGUyyo6OpoXXniBNm3aEBgYiJeXWLKl6gAAH1FJREFUF/Xr12f48OH89ttvV3p44gDDMNi0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A126dKnQdj09PdG+fXsAJUcMzZ2hNjIyUrajo6Nl29R7V5a6ePEicnNzAZQcwbW3tzerPxER6cbJe4iIiCyIl5cXtm/fjmHDhuHp06dISEhAq1at8MYbb6BHjx5wc3NDQUEBMjMzkZycjF9++QVqtbpSZk8dNWoULl26BCEEjh49itDQULP6enh44MGDB3J224YNGyIkJMSsfTh69Khsjxgxwqy+RESkHwtLIiIiCxMUFISkpCSEhYXh559/hkajwYkTJ3DixAm9fUqPNlbExIkT8dlnnwEA4uPjzSos7ezsEBYWhuXLl8u/hYWFmXxPzFLx8fEAAFtbW4wfP96svkREpB9PhSUiIrJA/v7+OHfuHA4cOIDp06ejXbt2cHNzg7W1NZydndGiRQuEhITg888/x6VLl5CYmFjhbbZs2VLeFmTPnj14/PixWf2nTZumtWzuabA3b97Ef//7XwDA2LFjtW6/QkREFaMSFb0an4iIiMhEe/fuxfDhwwEAa9euxZ/+9CeT+yYkJCAoKAgAEBgYKO9jaaq5c+di4cKFAIBz586hW7duZvUnIiL9eMSSiIiIqs2wYcNkQff3v/8dGo3G5L5xcXGyHRERYdZ2CwoK8PXXXwMA3nzzTRaVRESVjIUlERERVatFixYBKLmfZek1j8ZkZ2dj8+bNAAAXFxezrs8EgPXr1+PBgwewsrKS2yciosrDwpKIiIiq1eDBg+WMrHPnzoVarTbaZ968ecjPzwdQcuuROnXqmLy9p0+fymIyIiICnTt3LsdeExGRIbzGkoiIiKrdzZs35amtYWFh8PX11VqflJSEpKQk5OXl4dixYzh48CCAkqOVqamp8PDwMHlbFy9elEdGo6KiOGkPEVEVYGFJREREL5358+djwYIFWn9TqVT44Ycf8Pbbb9fQXhERkT48FZaIiIheap6enggODkZCQgKLSiKilxSPWBIREREREVGF8IglERERERERVQgLSyIiIiIiIqoQFpZERERERERUISwsiYiIiIiIqEJYWBIREREREVGFsLAkIiIiIiKiCvk/Lw7ypdKIE6UAAAAASUVORK5CYII=\n", "text/plain": [ - "
    " + "
    " ] }, - "metadata": { - "needs_background": "light" - }, + "metadata": {}, "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", + "axes_fontsize = 32\n", + "legend_fontsize = 24\n", + "CB_color_cycle = ['#377eb8', '#ff7f00', '#4daf4a',\n", + " '#f781bf', '#a65628', '#984ea3',\n", + " '#999999', '#e41a1c', '#dede00']\n", + "fig = plt.figure(1, figsize=(14,10), facecolor=\"white\")\n", + "ax = fig.add_subplot(111)\n", + "plt.setp(ax.get_xticklabels(), fontsize=axes_fontsize)\n", + "plt.setp(ax.get_yticklabels(), fontsize=axes_fontsize)\n", + "ax.plot(t, varpi_obs, label=\"JPL Horizons\", linestyle='-',linewidth=6,c=CB_color_cycle[1])\n", + "ax.plot(tsim, varpinogr, label=\"Swiftest WHM No GR\", linestyle='--', linewidth=6, c=CB_color_cycle[0])\n", + "ax.plot(tsim, varpiswiftest, label=\"Swiftest WHM GR\", linestyle=':', linewidth=6,c=CB_color_cycle[2])\n", + "ax.set_xlabel(\"Time (y)\", fontsize=axes_fontsize)\n", + "ax.set_ylabel(\"Mercury $\\\\varpi$ (deg)\", fontsize=axes_fontsize)\n", + "ax.legend(loc=\"upper left\", fontsize=legend_fontsize, markerscale=1)\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)}')" + "print(f'Swiftest WHM No GR : {np.mean(dvarpi_nogr)}')\n", + "print(f'Swiftest WHM GR : {np.mean(dvarpi_swiftest)}')\n", + "print(f'JPL Horizons : {np.mean(dvarpi_obs)}')\n", + "print(f'Obs - Swiftest No GR : {np.mean(dvarpi_obs - dvarpi_nogr)}')\n", + "print(f'Obs - Swiftest GR : {np.mean(dvarpi_obs - dvarpi_swiftest)}')\n" ] }, { @@ -160,6 +189,13 @@ "outputs": [], "source": [] }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, { "cell_type": "code", "execution_count": null, From f428be3a17190e8232ac9fcea8a161d763a3a2e9 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Thu, 9 Sep 2021 19:14:57 -0400 Subject: [PATCH 150/154] Fixed bug that was causing re-started runs to go longer than tstop --- src/main/swiftest_driver.f90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/swiftest_driver.f90 b/src/main/swiftest_driver.f90 index 876e0effd..b4260f115 100644 --- a/src/main/swiftest_driver.f90 +++ b/src/main/swiftest_driver.f90 @@ -52,7 +52,7 @@ program swiftest_driver iloop = 0 iout = istep_out idump = istep_dump - nloops = ceiling(tstop / dt, kind=I8B) + nloops = ceiling((tstop - t0) / dt, kind=I8B) ioutput_t0 = int(t0 / dt / istep_out, kind=I8B) ioutput = ioutput_t0 ! Prevent duplicate frames from being written if this is a restarted run From 7d61dd48232403a84ec5cb6b8ce55459c86b90f6 Mon Sep 17 00:00:00 2001 From: Carlisle Wishard Date: Thu, 9 Sep 2021 19:49:13 -0400 Subject: [PATCH 151/154] added hit and run case to symba_energy_momentum example directory --- examples/symba_energy_momentum/hitandrun.in | 13 ++++++++ .../symba_energy_momentum/param.hitandrun.in | 32 +++++++++++++++++++ 2 files changed, 45 insertions(+) create mode 100644 examples/symba_energy_momentum/hitandrun.in create mode 100644 examples/symba_energy_momentum/param.hitandrun.in diff --git a/examples/symba_energy_momentum/hitandrun.in b/examples/symba_energy_momentum/hitandrun.in new file mode 100644 index 000000000..45f3654f8 --- /dev/null +++ b/examples/symba_energy_momentum/hitandrun.in @@ -0,0 +1,13 @@ +2 +1 1e-07 0.0009 +7e-06 +1.0 -4.20E-05 0.0 +0.00 6.28 0.0 +0.4 0.4 0.4 !Ip +0.0 0.0 6.0e4 !rot +2 7e-10 0.0004 +3.25e-06 +1.0 4.20E-05 0.0 +-1.50 -6.28 0.0 +0.4 0.4 0.4 !Ip +0.0 0.0 1.0e5 !rot diff --git a/examples/symba_energy_momentum/param.hitandrun.in b/examples/symba_energy_momentum/param.hitandrun.in new file mode 100644 index 000000000..c4c29a05b --- /dev/null +++ b/examples/symba_energy_momentum/param.hitandrun.in @@ -0,0 +1,32 @@ +T0 0.0e0 +TSTOP 0.000100 ! simulation length in seconds = 100 years +DT 0.0000001 ! stepsize in seconds +CB_IN cb.in +PL_IN hitandrun.in +TP_IN tp.in +IN_TYPE ASCII +ISTEP_OUT 1 ! output cadence every year +BIN_OUT bin.hitandrun.nc +PARTICLE_OUT particle.hitandrun.dat +OUT_TYPE NETCDF_DOUBLE ! double precision real output +OUT_FORM XVEL ! osculating element output +OUT_STAT REPLACE +ISTEP_DUMP 1 ! system dump cadence +CHK_CLOSE yes ! check for planetary close encounters +CHK_RMIN 0.005 +CHK_RMAX 1e6 +CHK_EJECT -1.0 ! ignore this check +CHK_QMIN -1.0 ! ignore this check +ENC_OUT enc.hitandrun.dat +DISCARD_OUT discard.hitandrun.out +EXTRA_FORCE no ! no extra user-defined forces +BIG_DISCARD no ! output all planets if anything discarded +RHILL_PRESENT yes ! Hill's sphere radii in input file +GMTINY 1.0e-16 +FRAGMENTATION yes +MU2KG 1.98908e30 +TU2S 3.1556925e7 +DU2M 1.49598e11 +ENERGY yes +ROTATION yes +SEED 8 933097 -220886113 -118730874 233084005 32111237 -823335422 524551114 -61162322 From 57c10acad237c2b71930c4fe0ef3b67935c66559 Mon Sep 17 00:00:00 2001 From: David Minton Date: Thu, 9 Sep 2021 19:51:25 -0400 Subject: [PATCH 152/154] Updated the IO package with a swift converter. Also fixed an issue with the collision_movie script --- .../symba_energy_momentum/collision_movie.py | 10 ++-- python/swiftest/swiftest/io.py | 51 ++++++++++++++++++- 2 files changed, 55 insertions(+), 6 deletions(-) diff --git a/examples/symba_energy_momentum/collision_movie.py b/examples/symba_energy_momentum/collision_movie.py index 1a17034c5..e40048c91 100755 --- a/examples/symba_energy_momentum/collision_movie.py +++ b/examples/symba_energy_momentum/collision_movie.py @@ -14,8 +14,8 @@ ncutoff = 1e20 radscale = 2000 -cases = ['supercat_head', 'supercat_off', 'disruption_head', 'disruption_off'] -#cases = ['supercat_head'] +#cases = ['supercat_head', 'supercat_off', 'disruption_head', 'disruption_off'] +cases = ['disruption_off'] def scale_sim(ds, Rcb): dst0 = ds.isel(time=0) @@ -100,8 +100,8 @@ def __init__(self, ds, param): # Then setup FuncAnimation. self.ani = animation.FuncAnimation(fig, self.update, interval=1, frames=nframes, init_func=self.setup_plot, blit=False) - self.ani.save(animfile, fps=60, dpi=300, extra_args=['-vcodec', 'mpeg4']) - #self.ani.save(animfile, fps=60, dpi=300, extra_args=['-vcodec', 'libx264']) + #self.ani.save(animfile, fps=60, dpi=300, extra_args=['-vcodec', 'mpeg4']) + self.ani.save(animfile, fps=60, dpi=300, extra_args=['-vcodec', 'libx264']) print(f"Finished writing {animfile}") def plot_pl_circles(self, pl, radmarker): @@ -264,7 +264,7 @@ def data_stream(self, frame=0): origin = d['origin_type'].values t = self.ds.coords['time'].values[frame] - self.mask = np.logical_not(radius > self.Rcb) + self.mask = np.logical_not(radius == 0.0) x = np.nan_to_num(x, copy=False) y = np.nan_to_num(y, copy=False) diff --git a/python/swiftest/swiftest/io.py b/python/swiftest/swiftest/io.py index cae553b13..da1c49f17 100644 --- a/python/swiftest/swiftest/io.py +++ b/python/swiftest/swiftest/io.py @@ -1503,4 +1503,53 @@ def swiftest2swifter_param(swiftest_param, J2=0.0, J4=0.0): swifter_param['OUT_STAT'] = "UNKNOWN" swifter_param['! VERSION'] = "Swifter parameter file converted from Swiftest" - return swifter_param \ No newline at end of file + return swifter_param + + +def swifter2swift_param(swifter_param, J2=0.0, J4=0.0): + swift_param = { + '! VERSION': f"Swift parameter input file converted from Swifter", + 'T0': 0.0, + 'TSTOP': 0.0, + 'DT': 0.0, + 'DTOUT': 0.0, + 'DTDUMP': 0.0, + 'L1': "F", + 'L1': "F", + 'L2': "F", + 'L3': "F", + 'L4': "F", + 'L5': "T", + 'L6': "F", + 'RMIN': -1, + 'RMAX': -1, + 'RMAXU': -1, + 'QMIN': -1, + 'LCLOSE': "F", + 'BINARY_OUTPUTFILE': "bin.dat", + 'STATUS_FLAG_FOR_OPEN_STATEMENTS': "NEW", + } + + swift_param['T0'] = swifter_param['T0'] + swift_param['TSTOP'] = swifter_param['TSTOP'] + swift_param['DT'] = swifter_param['DT'] + # Convert the parameter file values + swift_param['DTOUT'] = swifter_param['ISTEP_OUT'] * swifter_param['DT'] + swift_param['DTDUMP'] = swifter_param['ISTEP_DUMP'] * swifter_param['DT'] + swift_param['BINARY_OUTPUTFILE'] = swifter_param['BIN_OUT'] + swift_param['STATUS_FLAG_FOR_OPEN_STATEMENTS'] = swifter_param['OUT_STAT'] + + if swifter_param['CHK_CLOSE'] == "YES": + swift_param['LCLOSE'] = "T" + else: + swift_param['LCLOSE'] = "F" + + swift_param['RMIN'] = swifter_param['CHK_RMIN'] + swift_param['RMAX'] = swifter_param['CHK_RMAX'] + swift_param['QMIN'] = swifter_param['CHK_QMIN'] + + if swift_param['RMIN'] > 0 or swift_param['RMAX'] > 0 or swift_param['QMIN'] > 0: + swift_param['L2'] = 'T' + + + return swift_param \ No newline at end of file From 1bc1dadcabd72d5ece8d4854e178f32016f10cd4 Mon Sep 17 00:00:00 2001 From: David Minton Date: Fri, 10 Sep 2021 10:34:08 -0400 Subject: [PATCH 153/154] Added hit and run to collision movie maker --- examples/symba_energy_momentum/collision_movie.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/examples/symba_energy_momentum/collision_movie.py b/examples/symba_energy_momentum/collision_movie.py index e40048c91..4f472d9ff 100755 --- a/examples/symba_energy_momentum/collision_movie.py +++ b/examples/symba_energy_momentum/collision_movie.py @@ -312,6 +312,10 @@ def data_stream(self, frame=0): animfile = 'movies/merger.mp4' titletext = "Merger" paramfile = 'param.merger.in' + elif case == 'hit_and_run': + animfile = 'movies/hitandrun.mp4' + titletext = "Hit and run with fragmentation" + paramfile = 'param.hitandrun.in' else: print(f'{case} is an unknown case') exit(-1) From 0c83693178d988d52a86a0a165ace4f1528095e2 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Fri, 10 Sep 2021 10:35:15 -0400 Subject: [PATCH 154/154] Fixed collision outcome initial minimum mass values to prevent runaway collisional cascade --- examples/symba_energy_momentum/param.disruption_headon.in | 8 ++++---- .../symba_energy_momentum/param.disruption_off_axis.in | 2 +- examples/symba_energy_momentum/param.hitandrun.in | 3 ++- .../param.supercatastrophic_headon.in | 2 +- .../param.supercatastrophic_off_axis.in | 2 +- 5 files changed, 9 insertions(+), 8 deletions(-) diff --git a/examples/symba_energy_momentum/param.disruption_headon.in b/examples/symba_energy_momentum/param.disruption_headon.in index 24e79be5d..a012c5505 100644 --- a/examples/symba_energy_momentum/param.disruption_headon.in +++ b/examples/symba_energy_momentum/param.disruption_headon.in @@ -1,6 +1,6 @@ T0 0.0e0 -TSTOP 0.000100 ! simulation length in seconds = 100 years -DT 0.0000001 ! stepsize in seconds +TSTOP 0.0001000 ! simulation length in seconds = 100 years +DT 0.0000001 ! stepsize in seconds CB_IN cb.in PL_IN disruption_headon.in TP_IN tp.in @@ -21,8 +21,8 @@ ENC_OUT enc.disruption_headon.dat EXTRA_FORCE no ! no extra user-defined forces BIG_DISCARD no ! output all planets if anything discarded RHILL_PRESENT yes ! Hill's sphere radii in input file -GMTINY 1.0e-16 -MIN_GMFRAG 1.0e-10 +GMTINY 1.0e-11 +MIN_GMFRAG 1.0e-11 FRAGMENTATION yes MU2KG 1.98908e30 TU2S 3.1556925e7 diff --git a/examples/symba_energy_momentum/param.disruption_off_axis.in b/examples/symba_energy_momentum/param.disruption_off_axis.in index b10ecee63..831f310d5 100644 --- a/examples/symba_energy_momentum/param.disruption_off_axis.in +++ b/examples/symba_energy_momentum/param.disruption_off_axis.in @@ -1,5 +1,5 @@ T0 0.0e0 -TSTOP 0.0000100 ! simulation length in seconds = 100 years +TSTOP 0.0001000 ! simulation length in seconds = 100 years DT 0.0000001 ! stepsize in seconds CB_IN cb.in PL_IN disruption_off_axis.in diff --git a/examples/symba_energy_momentum/param.hitandrun.in b/examples/symba_energy_momentum/param.hitandrun.in index c4c29a05b..1e2e2eea7 100644 --- a/examples/symba_energy_momentum/param.hitandrun.in +++ b/examples/symba_energy_momentum/param.hitandrun.in @@ -22,7 +22,8 @@ DISCARD_OUT discard.hitandrun.out EXTRA_FORCE no ! no extra user-defined forces BIG_DISCARD no ! output all planets if anything discarded RHILL_PRESENT yes ! Hill's sphere radii in input file -GMTINY 1.0e-16 +GMTINY 1.0e-11 +MIN_GMFRAG 1.0e-11 FRAGMENTATION yes MU2KG 1.98908e30 TU2S 3.1556925e7 diff --git a/examples/symba_energy_momentum/param.supercatastrophic_headon.in b/examples/symba_energy_momentum/param.supercatastrophic_headon.in index 1effdd15b..fd15c00dd 100644 --- a/examples/symba_energy_momentum/param.supercatastrophic_headon.in +++ b/examples/symba_energy_momentum/param.supercatastrophic_headon.in @@ -20,7 +20,7 @@ CHK_QMIN -1.0 ! ignore this check EXTRA_FORCE no ! no extra user-defined forces BIG_DISCARD no ! output all planets if anything discarded RHILL_PRESENT yes ! Hill's sphere radii in input file -GMTINY 1.0e-16 +GMTINY 1.0e-11 MIN_GMFRAG 1.0e-11 FRAGMENTATION yes MU2KG 1.98908e30 diff --git a/examples/symba_energy_momentum/param.supercatastrophic_off_axis.in b/examples/symba_energy_momentum/param.supercatastrophic_off_axis.in index 47bce3775..51ab91e5d 100644 --- a/examples/symba_energy_momentum/param.supercatastrophic_off_axis.in +++ b/examples/symba_energy_momentum/param.supercatastrophic_off_axis.in @@ -21,7 +21,7 @@ ENC_OUT enc.supercatastrophic_off_axis.dat EXTRA_FORCE no ! no extra user-defined forces BIG_DISCARD no ! output all planets if anything discarded RHILL_PRESENT yes ! Hill's sphere radii in input file -GMTINY 1.0e-16 +GMTINY 1.0e-11 MIN_GMFRAG 1.0e-11 FRAGMENTATION yes MU2KG 1.98908e30