|
|
|
|
|
|
|
|
|
|
|
#=Satellite State=#
|
|
|
abstract type State end
|
|
|
|
|
|
struct SingleStates <: State
|
|
|
stocks::Vector{Float32}
|
|
|
debris::Vector{Float32}
|
|
|
end
|
|
|
|
|
|
struct MultiStates <: State
|
|
|
stocks::Array{Float32}
|
|
|
debris::Array{Float32}
|
|
|
end
|
|
|
|
|
|
#function state_to_tuple(s::State)
|
|
|
# return (s.stocks ,s.debris)
|
|
|
#end
|
|
|
|
|
|
#=Physical Model
|
|
|
This contains parameters describing the physical model.
|
|
|
=#
|
|
|
abstract type PhysicalModel end
|
|
|
|
|
|
#=Basic implementation of a physical model=#
|
|
|
struct BasicPhysics <: PhysicalModel
|
|
|
#rate at which debris hits satellites
|
|
|
debris_collision_rate::Real
|
|
|
#rate at which satellites of different constellations collide
|
|
|
satellite_collision_rates::Matrix{Float64}
|
|
|
#rate at which debris exits orbits
|
|
|
decay_rate::Real
|
|
|
#rate at which satellites
|
|
|
autocatalysis_rate::Real
|
|
|
#ratio at which a collision between satellites produced debris
|
|
|
satellite_collision_debris_ratio::Real
|
|
|
#Ratio at which launches produce debris
|
|
|
launch_debris_ratio::Real
|
|
|
end
|
|
|
|
|
|
function state_transition(
|
|
|
physics::BasicPhysics
|
|
|
,state::State
|
|
|
,launches::Vector{Float32}
|
|
|
,survival_rate::Function
|
|
|
)
|
|
|
#=
|
|
|
Physical Transitions
|
|
|
=#
|
|
|
survival_rates = survival_rate(state,physics)
|
|
|
|
|
|
# Debris transitions
|
|
|
|
|
|
# get changes in debris from natural dynamics
|
|
|
natural_debris_dynamics = (1 - physics.decay_rate + physics.autocatalysis_rate) * state.debris
|
|
|
|
|
|
# get changes in debris from satellite loss
|
|
|
satellite_loss_debris = physics.satellite_collision_debris_ratio * (1 .- survival_rates)' * state.stocks
|
|
|
|
|
|
# get changes in debris from launches
|
|
|
launch_debris = physics.launch_debris_ratio * sum(launches)
|
|
|
|
|
|
# total debris level
|
|
|
debris′ = natural_debris_dynamics .+ satellite_loss_debris .+ launch_debris
|
|
|
|
|
|
|
|
|
# Stocks Transitions
|
|
|
stocks′ = (LinearAlgebra.diagm(survival_rates) .- physics.decay_rate)*state.stocks + launches
|
|
|
|
|
|
return State(stocks′,debris′)
|
|
|
end
|
|
|
|
|
|
function survival_rates_1(
|
|
|
#This function describes the rate at which satellites survive each period.
|
|
|
state::State
|
|
|
,physical_model::BasicPhysics
|
|
|
)
|
|
|
#TODO! get this to broadcast correctly.
|
|
|
return exp.(-(physical_model.satellite_collision_rates .+ physical_model.decay_rate) * state.stocks .- (physical_model.debris_collision_rate * state.debris))
|
|
|
end
|