From aa1bcd1f1993e9766eeddcf6e368ca5d86315aa4 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Sat, 4 Sep 2021 16:28:02 -0400 Subject: [PATCH] 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