Skip to content
This repository was archived by the owner on Aug 28, 2024. It is now read-only.

Commit

Permalink
Started getting the bounce model written
Browse files Browse the repository at this point in the history
  • Loading branch information
daminton committed Dec 22, 2022
1 parent 83c3ae2 commit cb8cf38
Show file tree
Hide file tree
Showing 13 changed files with 229 additions and 152 deletions.
90 changes: 81 additions & 9 deletions src/collision/collision_generate.f90
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,57 @@
!! You should have received a copy of the GNU General Public License along with Swiftest.
!! If not, see: https://www.gnu.org/licenses.

submodule(collision) s_collision_model
submodule(collision) s_collision_generate
use swiftest
contains

module subroutine collision_generate_merge_system(self, nbody_system, param, t)
module subroutine collision_generate_hitandrun(collider, nbody_system, param, t)
!! 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(collision_merge), intent(inout) :: collider !! Fraggle collision system object
class(base_nbody_system), intent(inout) :: nbody_system !! Swiftest nbody system object
class(base_parameters), intent(inout) :: param !! Current run configuration parameters with SyMBA additions
real(DP), intent(in) :: t !! Time of collision
! Internals
integer(I4B) :: i, ibiggest, nfrag, jtarg, jproj
logical :: lpure
character(len=STRMAX) :: message
real(DP) :: dpe

select type(nbody_system)
class is (swiftest_nbody_system)
select type (pl => nbody_system%pl)
class is (swiftest_pl)
select type(before => collider%after)
class is (swiftest_nbody_system)
select type(after => collider%after)
class is (swiftest_nbody_system)
associate(impactors => collider%impactors, fragments => collider%fragments, pl => nbody_system%pl)
message = "Hit and run between"
call collision_io_collider_message(nbody_system%pl, impactors%id, message)
call swiftest_io_log_one_message(COLLISION_LOG_OUT, trim(adjustl(message)))

collider%status = HIT_AND_RUN_PURE
pl%status(impactors%id(:)) = ACTIVE
pl%ldiscard(impactors%id(:)) = .false.
pl%lcollision(impactors%id(:)) = .false.
allocate(after%pl, source=before%pl) ! Be sure to save the pl so that snapshots still work
end associate
end select
end select
end select
end select


return
end subroutine collision_generate_hitandrun


module subroutine collision_generate_merge(self, nbody_system, param, t)
!! author: Jennifer L.L. Pouplin, Carlisle A. Wishard, and David A. Minton
!!
!! Merge massive bodies in any collisionals ystem.
Expand All @@ -22,7 +68,7 @@ module subroutine collision_generate_merge_system(self, nbody_system, param, t)
!! Adapted from Hal Levison's Swift routines symba5_merge.f and discard_mass_merge.f
implicit none
! Arguments
class(collision_system), intent(inout) :: self !! Merge fragment system object
class(collision_merge), intent(inout) :: self !! Merge fragment system object
class(base_nbody_system), intent(inout) :: nbody_system !! Swiftest nbody system object
class(base_parameters), intent(inout) :: param !! Current run configuration parameters
real(DP), intent(in) :: t !! The time of the collision
Expand Down Expand Up @@ -106,23 +152,49 @@ module subroutine collision_generate_merge_system(self, nbody_system, param, t)
end associate
end select
return
end subroutine collision_generate_merge_system
end subroutine collision_generate_merge


module subroutine collision_generate_bounce_system(self, nbody_system, param, t)
module subroutine collision_generate_bounce(self, nbody_system, param, t)
!! author: David A. Minton
!!
!! In this collision model, if the collision would result in a disruption, the bodies are instead "bounced" off
!! of the center of mass. This is done as a reflection in the 2-body equivalent distance vector direction.
implicit none
! Arguments
class(collision_bounce), intent(inout) :: self !! Bounce fragment system object
class(base_nbody_system), intent(inout) :: nbody_system !! Swiftest nbody system object
class(base_parameters), intent(inout) :: param !! Current run configuration parameters
real(DP), intent(in) :: t !! The time of the collision
end subroutine collision_generate_bounce_system
! Internals
integer(I4B) :: nfrag

select type(nbody_system)
class is (swiftest_nbody_system)
associate(impactors => nbody_system%collider%impactors, fragments => nbody_system%collider%fragments)
select case (impactors%regime)
case (COLLRESOLVE_REGIME_DISRUPTION, COLLRESOLVE_REGIME_SUPERCATASTROPHIC)
nfrag = size(impactors%id(:))
case (COLLRESOLVE_REGIME_HIT_AND_RUN)
call collision_generate_hitandrun(self, nbody_system, param, t)
case (COLLRESOLVE_REGIME_MERGE, COLLRESOLVE_REGIME_GRAZE_AND_MERGE)
call self%collision_merge%generate(nbody_system, param, t) ! Use the default collision model, which is merge
case default
write(*,*) "Error in swiftest_collision, unrecognized collision regime"
call util_exit(FAILURE)
end select
end associate
end select

return
end subroutine collision_generate_bounce

module subroutine collision_generate_simple_system(self, nbody_system, param, t)
module subroutine collision_generate_simple(self, nbody_system, param, t)
implicit none
class(collision_simple), intent(inout) :: self !! Simple fragment system object
class(base_nbody_system), intent(inout) :: nbody_system !! Swiftest nbody system object
class(base_parameters), intent(inout) :: param !! Current run configuration parameters
real(DP), intent(in) :: t !! The time of the collision
end subroutine collision_generate_simple_system
end subroutine collision_generate_simple

end submodule s_collision_model
end submodule s_collision_generate
2 changes: 1 addition & 1 deletion src/collision/collision_io.f90
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ module subroutine collision_io_log_regime(self)
!! Writes a log of the results of the collisional regime determination
implicit none
! Arguments
class(collision_system), intent(inout) :: self !! Collision system object
class(collision_merge), intent(inout) :: self !! Collision system object
! Internals
character(STRMAX) :: errmsg

Expand Down
73 changes: 40 additions & 33 deletions src/collision/collision_module.f90
Original file line number Diff line number Diff line change
Expand Up @@ -110,11 +110,11 @@ module collision
end type collision_fragments


type :: collision_system
type :: collision_merge
!! This class defines a collisional nbody_system that stores impactors and fragments. This is written so that various collision models (i.e. Fraggle) could potentially be used
!! to resolve collision by defining extended types of encounters_impactors and/or encounetr_fragments
!!
!! The generate method for this class is the merge model. This allows any extended type to have access to the merge procedure by selecting the collision_system parent class
!! The generate method for this class is the merge model. This allows any extended type to have access to the merge procedure by selecting the collision_merge parent class
class(collision_fragments(:)), allocatable :: fragments !! Object containing information on the pre-collision system
class(collision_impactors), allocatable :: impactors !! Object containing information on the post-collision system
class(base_nbody_system), allocatable :: before !! A snapshot of the subset of the nbody_system involved in the collision
Expand All @@ -138,19 +138,19 @@ module collision
procedure :: get_energy_and_momentum => collision_util_get_energy_momentum !! Calculates total nbody_system energy in either the pre-collision outcome state (lbefore = .true.) or the post-collision outcome state (lbefore = .false.)
procedure :: reset => collision_util_reset_system !! Deallocates all allocatables
procedure :: set_coordinate_system => collision_util_set_coordinate_system !! Sets the coordinate nbody_system of the collisional nbody_system
procedure :: generate => collision_generate_merge_system !! Merges the impactors to make a single final body
end type collision_system
procedure :: generate => collision_generate_merge !! Merges the impactors to make a single final body
end type collision_merge

type, extends(collision_system) :: collision_bounce
type, extends(collision_merge) :: collision_bounce
contains
procedure :: generate => collision_generate_bounce_system !! If a collision would result in a disruption, "bounce" the bodies instead.
final :: collision_final_bounce_system !! Finalizer will deallocate all allocatables
procedure :: generate => collision_generate_bounce !! If a collision would result in a disruption, "bounce" the bodies instead.
final :: collision_final_bounce !! Finalizer will deallocate all allocatables
end type collision_bounce

type, extends(collision_system) :: collision_simple
type, extends(collision_merge) :: collision_simple
contains
procedure :: generate => collision_generate_simple_system !! If a collision would result in a disruption [TODO: SOMETHING LIKE CHAMBERS 2012]
final :: collision_final_simple_system !! Finalizer will deallocate all allocatables
procedure :: generate => collision_generate_simple !! If a collision would result in a disruption [TODO: SOMETHING LIKE CHAMBERS 2012]
final :: collision_final_simple !! Finalizer will deallocate all allocatables
end type collision_simple


Expand Down Expand Up @@ -178,7 +178,7 @@ module collision

type, extends(encounter_snapshot) :: collision_snapshot
logical :: lcollision !! Indicates that this snapshot contains at least one collision
class(collision_system), allocatable :: collider !! Collider object at this snapshot
class(collision_merge), allocatable :: collider !! Collider object at this snapshot
contains
procedure :: write_frame => collision_io_netcdf_write_frame_snapshot !! Writes a frame of encounter data to file
procedure :: get_idvals => collision_util_get_idvalues_snapshot !! Gets an array of all id values saved in this snapshot
Expand All @@ -197,29 +197,38 @@ module collision


interface
module subroutine collision_generate_merge_system(self, nbody_system, param, t)

module subroutine collision_generate_hitandrun(collider, nbody_system, param, t)
implicit none
class(collision_merge), intent(inout) :: collider !! Merge (or extended) collision system object
class(base_nbody_system), intent(inout) :: nbody_system !! Swiftest nbody system object
class(base_parameters), intent(inout) :: param !! Current run configuration parameters with SyMBA additions
real(DP), intent(in) :: t !! Time of collision
end subroutine collision_generate_hitandrun

module subroutine collision_generate_merge(self, nbody_system, param, t)
implicit none
class(collision_system), intent(inout) :: self !! Merge fragment nbody_system object
class(collision_merge), intent(inout) :: self !! Merge fragment nbody_system object
class(base_nbody_system), intent(inout) :: nbody_system !! Swiftest nbody system object
class(base_parameters), intent(inout) :: param !! Current run configuration parameters
real(DP), intent(in) :: t !! The time of the collision
end subroutine collision_generate_merge_system
end subroutine collision_generate_merge

module subroutine collision_generate_bounce_system(self, nbody_system, param, t)
module subroutine collision_generate_bounce(self, nbody_system, param, t)
implicit none
class(collision_bounce), intent(inout) :: self !! Bounce fragment nbody_system object
class(base_nbody_system), intent(inout) :: nbody_system !! Swiftest nbody system object
class(base_parameters), intent(inout) :: param !! Current run configuration parameters
real(DP), intent(in) :: t !! The time of the collision
end subroutine collision_generate_bounce_system
end subroutine collision_generate_bounce

module subroutine collision_generate_simple_system(self, nbody_system, param, t)
module subroutine collision_generate_simple(self, nbody_system, param, t)
implicit none
class(collision_simple), intent(inout) :: self !! Simple fragment nbody_system object
class(base_nbody_system), intent(inout) :: nbody_system !! Swiftest nbody system object
class(base_parameters), intent(inout) :: param !! Current run configuration parameters
real(DP), intent(in) :: t !! The time of the collision
end subroutine collision_generate_simple_system
end subroutine collision_generate_simple

module subroutine collision_io_collider_message(pl, collidx, collider_message)
implicit none
Expand All @@ -230,7 +239,7 @@ end subroutine collision_io_collider_message

module subroutine collision_io_log_regime(self)
implicit none
class(collision_system), intent(inout) :: self !! Collision system object
class(collision_merge), intent(inout) :: self !! Collision system object
end subroutine collision_io_log_regime

module subroutine collision_io_netcdf_dump(self, param)
Expand Down Expand Up @@ -339,36 +348,36 @@ end subroutine collision_resolve_pltp

module subroutine collision_util_set_coordinate_system(self)
implicit none
class(collision_system), intent(inout) :: self !! Collisional nbody_system
class(collision_merge), intent(inout) :: self !! Collisional nbody_system
end subroutine collision_util_set_coordinate_system

module subroutine collision_setup_system(self, nbody_system)
implicit none
class(collision_system), intent(inout) :: self !! Encounter collision system object
class(collision_merge), intent(inout) :: self !! Encounter collision system object
class(base_nbody_system), intent(in) :: nbody_system !! Current nbody system. Used as a mold for the before/after snapshots
end subroutine collision_setup_system

module subroutine collision_setup_impactors_system(self)
implicit none
class(collision_system), intent(inout) :: self !! Encounter collision system object
class(collision_merge), intent(inout) :: self !! Encounter collision system object
end subroutine collision_setup_impactors_system

module subroutine collision_setup_fragments_system(self, nfrag)
implicit none
class(collision_system), intent(inout) :: self !! Encounter collision system object
class(collision_merge), intent(inout) :: self !! Encounter collision system object
integer(I4B), intent(in) :: nfrag !! Number of fragments to create
end subroutine collision_setup_fragments_system

module subroutine collision_util_add_fragments_to_system(self, nbody_system, param)
implicit none
class(collision_system), intent(in) :: self !! Collision system object
class(collision_merge), intent(in) :: self !! Collision system object
class(base_nbody_system), intent(inout) :: nbody_system !! Swiftest nbody system object
class(base_parameters), intent(in) :: param !! Current swiftest run configuration parameters
end subroutine collision_util_add_fragments_to_system

module subroutine collision_util_construct_temporary_system(self, nbody_system, param, tmpsys, tmpparam)
implicit none
class(collision_system), intent(inout) :: self !! Collision system object
class(collision_merge), intent(inout) :: self !! Collision system object
class(base_nbody_system), intent(in) :: nbody_system !! Original swiftest nbody system object
class(base_parameters), intent(in) :: param !! Current swiftest run configuration parameters
class(base_nbody_system), allocatable, intent(out) :: tmpsys !! Output temporary swiftest nbody system object
Expand All @@ -389,7 +398,7 @@ end subroutine collision_util_get_idvalues_snapshot
module subroutine collision_util_get_energy_momentum(self, nbody_system, param, lbefore)
use base, only : base_nbody_system, base_parameters
implicit none
class(collision_system), intent(inout) :: self !! Encounter collision system object
class(collision_merge), intent(inout) :: self !! Encounter collision system object
class(base_nbody_system), intent(inout) :: nbody_system !! Swiftest nbody system object
class(base_parameters), intent(inout) :: param !! Current swiftest run configuration parameters
logical, intent(in) :: lbefore !! Flag indicating that this the "before" state of the nbody_system, with impactors included and fragments excluded or vice versa
Expand All @@ -407,7 +416,7 @@ end subroutine collision_util_reset_impactors

module subroutine collision_util_reset_system(self)
implicit none
class(collision_system), intent(inout) :: self !! Collision system object
class(collision_merge), intent(inout) :: self !! Collision system object
end subroutine collision_util_reset_system

module subroutine collision_util_snapshot(self, param, nbody_system, t, arg)
Expand Down Expand Up @@ -523,7 +532,7 @@ subroutine collision_final_storage(self)
end subroutine collision_final_storage


subroutine collision_final_bounce_system(self)
subroutine collision_final_bounce(self)
!! author: David A. Minton
!!
!! Finalizer will deallocate all allocatables
Expand All @@ -536,10 +545,10 @@ subroutine collision_final_bounce_system(self)
if (allocated(self%fragments)) deallocate(self%fragments)

return
end subroutine collision_final_bounce_system
end subroutine collision_final_bounce


subroutine collision_final_simple_system(self)
subroutine collision_final_simple(self)
!! author: David A. Minton
!!
!! Finalizer will deallocate all allocatables
Expand All @@ -552,9 +561,7 @@ subroutine collision_final_simple_system(self)
if (allocated(self%fragments)) deallocate(self%fragments)

return
end subroutine collision_final_simple_system


end subroutine collision_final_simple

end module collision

Loading

0 comments on commit cb8cf38

Please sign in to comment.