20 years of LEO - (collisions)#

In this example we will consider the tracked population of objects orbiting in Low Earth Orbit and run a simulation to detect collisions and objects decay.

We start, as always, with some imports:

# core imports
import pykep as pk
import numpy as np
import pickle as pkl
import cascade as csc
from copy import deepcopy

Loading the initial LEO population#

We consider an initial LEO population containing all objects tracked by the US Space Surveillance Network (SSN). The necessary steps to prepare such data are described by the code made available as a cascade utility in The current LEO population

The file needed (and provided with the cascade code) is:

# r is in km and v in km/s
with open("data/leo_population.pk", "rb") as file:
    r_ic,v_ic,to_satcat_index,satcat = pkl.load(file)

# reference epoch for the initial conditions
t0_jd = pk.epoch_from_iso_string("20220301T000000").jd # Julian date corresponding to 2022-Mar-01 00:00:00
  • r_ic: contains the initial position of all satellites to be simulated (in km)

  • v_ic: contains the initial velocity of all satellites to be simulated (in km/sec)

  • to_satcat_index: contains the indexes in the satcat list of the corresponding r_ic,v_ic entry

  • satcat: the database created of all tracked objects

The object described by the entry satcat[to_satcat_index[j]] has initial position r_ic[j] and initial velocity v_ic[j]. Let us inspect one entry

print("Dictionary entry: ", satcat[to_satcat_index[3685]])
print("Position (km): ", r_ic[3685])
print("Velocity (km/s): ", v_ic[3685])
Dictionary entry:  {'CCSDS_OMM_VERS': '2.0', 'COMMENT': 'GENERATED VIA SPACE-TRACK.ORG API', 'CREATION_DATE': '2022-02-03T04:23:25', 'ORIGINATOR': '18 SPCS', 'OBJECT_NAME': 'SL-14 DEB', 'OBJECT_ID': '1978-100F', 'CENTER_NAME': 'EARTH', 'REF_FRAME': 'TEME', 'TIME_SYSTEM': 'UTC', 'MEAN_ELEMENT_THEORY': 'SGP4', 'EPOCH': '2022-02-02T22:42:05.237280', 'MEAN_MOTION': '12.56769207', 'ECCENTRICITY': '0.00286110', 'INCLINATION': '82.3526', 'RA_OF_ASC_NODE': '268.9057', 'ARG_OF_PERICENTER': '297.9015', 'MEAN_ANOMALY': '75.7071', 'EPHEMERIS_TYPE': '0', 'CLASSIFICATION_TYPE': 'U', 'NORAD_CAT_ID': '19133', 'ELEMENT_SET_NO': '999', 'REV_AT_EPOCH': '93528', 'BSTAR': '0.02113600000000', 'MEAN_MOTION_DOT': '0.00003527', 'MEAN_MOTION_DDOT': '0.0000000000000', 'SEMIMAJOR_AXIS': '7814.445', 'PERIOD': '114.580', 'APOAPSIS': '1458.668', 'PERIAPSIS': '1413.952', 'OBJECT_TYPE': 'DEBRIS', 'RCS_SIZE': 'MEDIUM', 'COUNTRY_CODE': 'CIS', 'LAUNCH_DATE': '1978-10-26', 'SITE': 'PKMTR', 'DECAY_DATE': None, 'FILE': '3290513', 'GP_ID': '195174860', 'TLE_LINE0': '0 SL-14 DEB', 'TLE_LINE1': '1 19133U 78100F   22033.94589395  .00003527  00000-0  21136-1 0  9996', 'TLE_LINE2': '2 19133  82.3526 268.9057 0028611 297.9015  75.7071 12.56769207935282', 'RADIUS': 0.2631205051777122}
Position (km):  [2129.88342848 3695.71335128 6552.37467945]
Velocity (km/s):  [ 1.38399824  5.88779107 -3.78530589]

On top of all the info distributed from the US Space Surveillance Network (SSN) we have added to each satcat list entry (see The current LEO population notebook) dictionary an estimate of the object radius. This will be used to detect collisions between objects.

We now extract from the satcat list and store it into separate arrays the objects’ BSTAR coefficients and radius.

# Array containing the BSTAR coefficient in the SI units used
BSTARS = []
RADIUS = []
for idx in to_satcat_index:
    BSTARS.append(float(satcat[idx]["BSTAR"]))
    RADIUS.append(float(satcat[idx]["RADIUS"]))
# We transform the BSTAR in SI units
BSTARS = np.array(BSTARS) / pk.EARTH_RADIUS
RADIUS = np.array(RADIUS)
# .. and remove negative BSTARS (this can happen for objects that where performing orbital manouvres during the tle definition) setting the value to zero in those occasions.
BSTARS[BSTARS<0] = 0.
# We also transform r_ic and v_ic in SI
r_ic = r_ic*1000
v_ic = v_ic*1000

Building the dynamical system to integrate#

The dynamics in the LEO environment is dominated by drag and gravitational effects. The effect of the Moon gravity, Sun gravity and solar radiation pressure are much weaker and thus not considered here, adding them is just a matter of changing a few of the values passed when constructing the expressions. We make use of the cascade function cascade.dynamics.simple_earth() returning analytical expressions for such a dynamics in the EME2000 reference frame.

dyn =  csc.dynamics.simple_earth(J2=True, J3=False, J4=False, C22S22=True,sun=False,moon=False,SRP=False,drag=True)

Let us inspect the dynamics visually to check that all is defined as expected. The analytical expression are long and complex, but this will not be an issue for heyoka that is using LLVM behind the scenes to compile them, as well as all the needed high order derivatives needed to define a Taylor integration scheme.

dyn
[(x, vx),
 (y, vy),
 (z, vz),
 (vx,
  ((((((-398600440779972.44 * x) * pow((x**2 + y**2 + z**2), -1.5000000000000000)) + (((-1.7555131752869961e+25 / (2.0000000000000000 * sqrt((x**2 + y**2 + z**2)))) * x) * ((3.0000000000000000 / (x**2 + y**2 + z**2)**2) - ((15.000000000000000 * z**2) / ((x**2 + y**2 + z**2)**2 * (x**2 + y**2 + z**2)))))) + ((((((7.6591108648176011e+23 / (2.0000000000000000 * pow((x**2 + y**2 + z**2), 3.5000000000000000))) * ((x * cos((4.8949608921188084 + (7.2921158548340406e-05 * t)))) + (y * sin((4.8949608921188084 + (7.2921158548340406e-05 * t)))))) * (((-x * sin((4.8949608921188084 + (7.2921158548340406e-05 * t)))) + (y * cos((4.8949608921188084 + (7.2921158548340406e-05 * t)))))**2 - ((x * cos((4.8949608921188084 + (7.2921158548340406e-05 * t)))) + (y * sin((4.8949608921188084 + (7.2921158548340406e-05 * t)))))**2)) + ((1.5318221729635202e+23 / pow((x**2 + y**2 + z**2), 2.5000000000000000)) * ((x * cos((4.8949608921188084 + (7.2921158548340406e-05 * t)))) + (y * sin((4.8949608921188084 + (7.2921158548340406e-05 * t))))))) * cos((4.8949608921188084 + (7.2921158548340406e-05 * t)))) - (((((7.6591108648176011e+23 / (2.0000000000000000 * pow((x**2 + y**2 + z**2), 3.5000000000000000))) * ((-x * sin((4.8949608921188084 + (7.2921158548340406e-05 * t)))) + (y * cos((4.8949608921188084 + (7.2921158548340406e-05 * t)))))) * (((-x * sin((4.8949608921188084 + (7.2921158548340406e-05 * t)))) + (y * cos((4.8949608921188084 + (7.2921158548340406e-05 * t)))))**2 - ((x * cos((4.8949608921188084 + (7.2921158548340406e-05 * t)))) + (y * sin((4.8949608921188084 + (7.2921158548340406e-05 * t)))))**2)) - ((1.5318221729635202e+23 / pow((x**2 + y**2 + z**2), 2.5000000000000000)) * ((-x * sin((4.8949608921188084 + (7.2921158548340406e-05 * t)))) + (y * cos((4.8949608921188084 + (7.2921158548340406e-05 * t))))))) * sin((4.8949608921188084 + (7.2921158548340406e-05 * t)))))) + (((((-(-4.3966387893411792e+23 / pow((x**2 + y**2 + z**2), 3.5000000000000000)) * ((x * cos((4.8949608921188084 + (7.2921158548340406e-05 * t)))) + (y * sin((4.8949608921188084 + (7.2921158548340406e-05 * t)))))**2) * ((-x * sin((4.8949608921188084 + (7.2921158548340406e-05 * t)))) + (y * cos((4.8949608921188084 + (7.2921158548340406e-05 * t)))))) + ((-8.7932775786823574e+22 / pow((x**2 + y**2 + z**2), 2.5000000000000000)) * ((-x * sin((4.8949608921188084 + (7.2921158548340406e-05 * t)))) + (y * cos((4.8949608921188084 + (7.2921158548340406e-05 * t))))))) * cos((4.8949608921188084 + (7.2921158548340406e-05 * t)))) - ((((-(-4.3966387893411792e+23 / pow((x**2 + y**2 + z**2), 3.5000000000000000)) * ((x * cos((4.8949608921188084 + (7.2921158548340406e-05 * t)))) + (y * sin((4.8949608921188084 + (7.2921158548340406e-05 * t)))))) * ((-x * sin((4.8949608921188084 + (7.2921158548340406e-05 * t)))) + (y * cos((4.8949608921188084 + (7.2921158548340406e-05 * t)))))**2) + ((-8.7932775786823574e+22 / pow((x**2 + y**2 + z**2), 2.5000000000000000)) * ((x * cos((4.8949608921188084 + (7.2921158548340406e-05 * t)))) + (y * sin((4.8949608921188084 + (7.2921158548340406e-05 * t))))))) * sin((4.8949608921188084 + (7.2921158548340406e-05 * t)))))) + (-(((((((1.0170993499999999e-06 * exp((-4.6382291000000000e-05 * (-6383152.2451599995 + sqrt((x**2 + y**2 + z**2)))))) + (0.78644337499999994 * exp((-0.00018608004800000001 * (-6400979.2808999997 + sqrt((x**2 + y**2 + z**2))))))) + (7.5034188300000001e-09 * exp((-2.4866717600000000e-05 * (-6382415.8782899994 + sqrt((x**2 + y**2 + z**2))))))) + (8.6393425200000000e-14 * exp((-4.8108085200000002e-06 * (-6378292.5916729998 + sqrt((x**2 + y**2 + z**2))))))) / 2.4615341004863758e-08) * p0) * sqrt((vx**2 + vy**2 + vz**2))) * vx))),
 (vy,
  ((((((-398600440779972.44 * y) * pow((x**2 + y**2 + z**2), -1.5000000000000000)) + (((-1.7555131752869961e+25 / (2.0000000000000000 * sqrt((x**2 + y**2 + z**2)))) * y) * ((3.0000000000000000 / (x**2 + y**2 + z**2)**2) - ((15.000000000000000 * z**2) / ((x**2 + y**2 + z**2)**2 * (x**2 + y**2 + z**2)))))) + ((((((7.6591108648176011e+23 / (2.0000000000000000 * pow((x**2 + y**2 + z**2), 3.5000000000000000))) * ((x * cos((4.8949608921188084 + (7.2921158548340406e-05 * t)))) + (y * sin((4.8949608921188084 + (7.2921158548340406e-05 * t)))))) * (((-x * sin((4.8949608921188084 + (7.2921158548340406e-05 * t)))) + (y * cos((4.8949608921188084 + (7.2921158548340406e-05 * t)))))**2 - ((x * cos((4.8949608921188084 + (7.2921158548340406e-05 * t)))) + (y * sin((4.8949608921188084 + (7.2921158548340406e-05 * t)))))**2)) + ((1.5318221729635202e+23 / pow((x**2 + y**2 + z**2), 2.5000000000000000)) * ((x * cos((4.8949608921188084 + (7.2921158548340406e-05 * t)))) + (y * sin((4.8949608921188084 + (7.2921158548340406e-05 * t))))))) * sin((4.8949608921188084 + (7.2921158548340406e-05 * t)))) + (((((7.6591108648176011e+23 / (2.0000000000000000 * pow((x**2 + y**2 + z**2), 3.5000000000000000))) * ((-x * sin((4.8949608921188084 + (7.2921158548340406e-05 * t)))) + (y * cos((4.8949608921188084 + (7.2921158548340406e-05 * t)))))) * (((-x * sin((4.8949608921188084 + (7.2921158548340406e-05 * t)))) + (y * cos((4.8949608921188084 + (7.2921158548340406e-05 * t)))))**2 - ((x * cos((4.8949608921188084 + (7.2921158548340406e-05 * t)))) + (y * sin((4.8949608921188084 + (7.2921158548340406e-05 * t)))))**2)) - ((1.5318221729635202e+23 / pow((x**2 + y**2 + z**2), 2.5000000000000000)) * ((-x * sin((4.8949608921188084 + (7.2921158548340406e-05 * t)))) + (y * cos((4.8949608921188084 + (7.2921158548340406e-05 * t))))))) * cos((4.8949608921188084 + (7.2921158548340406e-05 * t)))))) + (((((-(-4.3966387893411792e+23 / pow((x**2 + y**2 + z**2), 3.5000000000000000)) * ((x * cos((4.8949608921188084 + (7.2921158548340406e-05 * t)))) + (y * sin((4.8949608921188084 + (7.2921158548340406e-05 * t)))))**2) * ((-x * sin((4.8949608921188084 + (7.2921158548340406e-05 * t)))) + (y * cos((4.8949608921188084 + (7.2921158548340406e-05 * t)))))) + ((-8.7932775786823574e+22 / pow((x**2 + y**2 + z**2), 2.5000000000000000)) * ((-x * sin((4.8949608921188084 + (7.2921158548340406e-05 * t)))) + (y * cos((4.8949608921188084 + (7.2921158548340406e-05 * t))))))) * sin((4.8949608921188084 + (7.2921158548340406e-05 * t)))) + ((((-(-4.3966387893411792e+23 / pow((x**2 + y**2 + z**2), 3.5000000000000000)) * ((x * cos((4.8949608921188084 + (7.2921158548340406e-05 * t)))) + (y * sin((4.8949608921188084 + (7.2921158548340406e-05 * t)))))) * ((-x * sin((4.8949608921188084 + (7.2921158548340406e-05 * t)))) + (y * cos((4.8949608921188084 + (7.2921158548340406e-05 * t)))))**2) + ((-8.7932775786823574e+22 / pow((x**2 + y**2 + z**2), 2.5000000000000000)) * ((x * cos((4.8949608921188084 + (7.2921158548340406e-05 * t)))) + (y * sin((4.8949608921188084 + (7.2921158548340406e-05 * t))))))) * cos((4.8949608921188084 + (7.2921158548340406e-05 * t)))))) + (-(((((((1.0170993499999999e-06 * exp((-4.6382291000000000e-05 * (-6383152.2451599995 + sqrt((x**2 + y**2 + z**2)))))) + (0.78644337499999994 * exp((-0.00018608004800000001 * (-6400979.2808999997 + sqrt((x**2 + y**2 + z**2))))))) + (7.5034188300000001e-09 * exp((-2.4866717600000000e-05 * (-6382415.8782899994 + sqrt((x**2 + y**2 + z**2))))))) + (8.6393425200000000e-14 * exp((-4.8108085200000002e-06 * (-6378292.5916729998 + sqrt((x**2 + y**2 + z**2))))))) / 2.4615341004863758e-08) * p0) * sqrt((vx**2 + vy**2 + vz**2))) * vy))),
 (vz,
  ((((((-398600440779972.44 * z) * pow((x**2 + y**2 + z**2), -1.5000000000000000)) + (((-1.7555131752869961e+25 / (2.0000000000000000 * sqrt((x**2 + y**2 + z**2)))) * z) * ((3.0000000000000000 * (3.0000000000000000 / (x**2 + y**2 + z**2)**2)) - ((15.000000000000000 * z**2) / ((x**2 + y**2 + z**2)**2 * (x**2 + y**2 + z**2)))))) + (((7.6591108648176011e+23 / (2.0000000000000000 * pow((x**2 + y**2 + z**2), 3.5000000000000000))) * z) * (((-x * sin((4.8949608921188084 + (7.2921158548340406e-05 * t)))) + (y * cos((4.8949608921188084 + (7.2921158548340406e-05 * t)))))**2 - ((x * cos((4.8949608921188084 + (7.2921158548340406e-05 * t)))) + (y * sin((4.8949608921188084 + (7.2921158548340406e-05 * t)))))**2))) + (((-(-4.3966387893411792e+23 / pow((x**2 + y**2 + z**2), 3.5000000000000000)) * ((x * cos((4.8949608921188084 + (7.2921158548340406e-05 * t)))) + (y * sin((4.8949608921188084 + (7.2921158548340406e-05 * t)))))) * ((-x * sin((4.8949608921188084 + (7.2921158548340406e-05 * t)))) + (y * cos((4.8949608921188084 + (7.2921158548340406e-05 * t)))))) * z)) + (-(((((((1.0170993499999999e-06 * exp((-4.6382291000000000e-05 * (-6383152.2451599995 + sqrt((x**2 + y**2 + z**2)))))) + (0.78644337499999994 * exp((-0.00018608004800000001 * (-6400979.2808999997 + sqrt((x**2 + y**2 + z**2))))))) + (7.5034188300000001e-09 * exp((-2.4866717600000000e-05 * (-6382415.8782899994 + sqrt((x**2 + y**2 + z**2))))))) + (8.6393425200000000e-14 * exp((-4.8108085200000002e-06 * (-6378292.5916729998 + sqrt((x**2 + y**2 + z**2))))))) / 2.4615341004863758e-08) * p0) * sqrt((vx**2 + vy**2 + vz**2))) * vz)))]

Setup of the simulation#

The global cascade logger is here informed of the level of information we want to be reported to screen during the simulation. We also set the number of threads to be used to 32, clearly this number depends on the resources available on the particular computer used to run the simulation and the ability to run the threads in parallel.

csc.set_logger_level_info()
csc.set_nthreads(32)

We now define the radius that will be used to check for decayed objects. We will assume that once the position of some object is below 150km altitude, the object can be considered as decayed.

reentry_radius = pk.EARTH_RADIUS+150000.
# Detecting the particles
inside_the_radius = np.where(np.linalg.norm(r_ic,axis=1) < reentry_radius)[0]
print("Removing ", len(inside_the_radius), " orbiting objects:")
for idx in inside_the_radius:
    print(satcat[to_satcat_index[idx]]["OBJECT_NAME"], "-", satcat[to_satcat_index[idx]]["OBJECT_ID"])

# Deleting the particles
r_ic = np.delete(r_ic, inside_the_radius, axis=0)
BSTARS = np.delete(BSTARS, inside_the_radius, axis=0)
v_ic = np.delete(v_ic, inside_the_radius, axis=0)
to_satcat_index = np.delete(to_satcat_index, inside_the_radius, axis=0)
RADIUS = np.delete(RADIUS, inside_the_radius, axis=0)
Removing  22  orbiting objects:
LEMUR 2 ROCKETJONAH - 2017-071E
ISARA - 2017-071P
FREGAT DEB - 2011-037EM
STARLINK-1684 - 2020-070H
COSMOS 1408 DEB - 1982-092Z
COSMOS 1408 DEB - 1982-092AK
COSMOS 1408 DEB - 1982-092ES
COSMOS 1408 DEB - 1982-092FK
COSMOS 1408 DEB - 1982-092FY
COSMOS 1408 DEB - 1982-092GU
COSMOS 1408 DEB - 1982-092NA
COSMOS 1408 DEB - 1982-092PV
COSMOS 1408 DEB - 1982-092PW
COSMOS 1408 DEB - 1982-092RM
COSMOS 1408 DEB - 1982-092ACG
COSMOS 1408 DEB - 1982-092AQC
COSMOS 1408 DEB - 1982-092ARK
COSMOS 1408 DEB - 1982-092AXA
COSMOS 1408 DEB - 1982-092AXD
COSMOS 1408 DEB - 1982-092BDB
COSMOS 1408 DEB - 1982-092BFU
COSMOS 1408 DEB - 1982-092BKD

We can now instantiate the cascade simulation. This will trigger the LLVM compilation of the needed Taylor integrators representing the selected dynamics as well as the event detection, thus taking a few seconds. Note that this cost is to be paid only once. As far as the dynamics remains unchanged other simulations can be made reusing the same object.

As a collisional timestep, a parameter that can be tuned to get the best efficiency, we use the value of the ISS orbital period divided by 40.

# Prepare the data in the shape expected by the simulation object.
ic_state = np.hstack([r_ic, v_ic, RADIUS.reshape((r_ic.shape[0], 1))])
BSTARS = BSTARS.reshape((r_ic.shape[0], 1))
# The collisional timestep is set to 1/40 of the ISS orbital period
collisional_step = 90*60 / 40
sim = csc.sim(ic_state, collisional_step, dyn=dyn, pars=BSTARS, reentry_radius=reentry_radius, n_par_ct = 120)

we also need to set the starting time of the simulation so that the dynamics, written in the EME2000 reference frame (see cascade.dynamics.simple_earth()) will be correctly computing perturbations affected by the Sun, Moon and Earth positions. The EME reference frame we used to write the equations of motion as defined at noon of the 1st of January 2000. We thus need to start our simulation at a \(t_0\) accounting for the time passed since that epoch.

# We define here the simulation starting time knowing that in the dynamics t=0 corresponds to 1st Jan 2000 12:00. 
t0 = (t0_jd - pk.epoch_from_iso_string("20000101T120000").jd) * pk.DAY2SEC
sim.time = t0

Running the simulation#

The following block will perform a simulation where the method cascade.sim.step of a cascade cascade.sim is called in a loop up to when the simulation time reaches the maximum allocated (final_t). All collision events and orbital decays are logged on files and on screen.

Note

The simulation can take up to days to complete if we are set to simulate 20 years and on a few CPUs only. In this notebook we thus set the simulation time to be 30 days and will only report the expected time to complete a simulation for 20 years.

As a consequence, mostly reentry events are triggered. You can let the simulation run for longer by changing the value for final_t and collision events will also appear.

import time
final_t = t0 + 30 * pk.DAY2SEC
print("Starting the simulation:", flush=True)
start = time.time()

current_year = 0
while sim.time < final_t:
    years_elapsed = (sim.time - t0) * pk.SEC2DAY // 365.25

    if years_elapsed == current_year:
        with open("out/year_"+str(current_year)+".pk", "wb") as file:
            pkl.dump((sim.state, sim.pars, to_satcat_index), file)
        current_year += 1

    oc = sim.step()

    if oc == csc.outcome.collision:
        pi, pj = sim.interrupt_info
        # We log the event to file
        satcat_idx1 = to_satcat_index[pi]
        satcat_idx2 = to_satcat_index[pj]
        days_elapsed = (sim.time - t0) * pk.SEC2DAY
        with open("out/collision_log.txt", "a") as file_object:
            file_object.write(
                f"{days_elapsed}, {satcat_idx1}, {satcat_idx2}, {sim.state[pi]}, {sim.state[pj]}\n")
        # We log the event to screen
        o1, o2 = satcat[satcat_idx1]["OBJECT_TYPE"], satcat[satcat_idx2]["OBJECT_TYPE"]
        s1, s2 = satcat[satcat_idx1]["RCS_SIZE"], satcat[satcat_idx2]["RCS_SIZE"]
        print(
            f"\nCollision detected, {o1} ({s1}) and {o2} ({s2}) after {days_elapsed} days\n")
        # We remove the objects and restart the simulation
        sim.remove_particles([pi,pj])
        to_satcat_index = np.delete(to_satcat_index, [max(pi,pj)], axis=0)        
        to_satcat_index = np.delete(to_satcat_index, [min(pi,pj)], axis=0)


    elif oc == csc.outcome.reentry:
        pi = sim.interrupt_info
        # We log the event to file
        satcat_idx = to_satcat_index[pi]
        days_elapsed = (sim.time - t0) * pk.SEC2DAY
        with open("out/decay_log.txt", "a") as file_object:
            file_object.write(f"{days_elapsed},{satcat_idx}\n")
        # We log the event to screen
        print(f'{satcat[satcat_idx]["OBJECT_NAME"].strip()} ({satcat[satcat_idx]["OBJECT_ID"].strip()}) days: {days_elapsed:3.3f} - REMOVED')
        # We remove the re-entered object and restart the simulation
        sim.remove_particles([pi])
        to_satcat_index = np.delete(to_satcat_index, [pi], axis=0)    
end = time.time()
elapsed = end - start
print("Elapsed [s]: ", end - start)
print("Time projected to simulate 20 years is ", elapsed / 30 * 20 *365.25 / 60 / 60, " hours")
Starting the simulation:
COSMOS 1408 DEB (1982-092FH) days: 0.001 - REMOVED
COSMOS 1408 DEB (1982-092GM) days: 0.004 - REMOVED
SL-4 R/B (2006-061B) days: 0.006 - REMOVED
FREGAT DEB (2011-037ET) days: 0.007 - REMOVED
CZ-3B R/B (2021-010B) days: 0.018 - REMOVED
COSMOS 1408 DEB (1982-092AEC) days: 0.030 - REMOVED
COSMOS 2241 (1993-022A) days: 0.043 - REMOVED
CZ-3B R/B (2021-003B) days: 0.061 - REMOVED
FREGAT DEB (2011-037LV) days: 0.073 - REMOVED
FREGAT DEB (2011-037NV) days: 0.079 - REMOVED
COSMOS 1408 DEB (1982-092UM) days: 0.079 - REMOVED
COSMOS 1408 DEB (1982-092AHN) days: 0.116 - REMOVED
STARLINK-1919 (2020-074AG) days: 0.158 - REMOVED
COSMOS 1408 DEB (1982-092KJ) days: 0.527 - REMOVED
COSMOS 2251 DEB (1993-036AEZ) days: 0.673 - REMOVED
COSMOS 1408 DEB (1982-092GN) days: 1.128 - REMOVED
FALCON 9 DEB (2020-055BR) days: 1.188 - REMOVED
COSMOS 1408 DEB (1982-092SQ) days: 1.326 - REMOVED
COSMOS 1408 DEB (1982-092ANG) days: 1.410 - REMOVED
COSMOS 1408 DEB (1982-092TY) days: 1.525 - REMOVED
COSMOS 1408 DEB (1982-092APD) days: 1.574 - REMOVED
COSMOS 1408 DEB (1982-092AQN) days: 1.977 - REMOVED
CZ-2D DEB (2017-077D) days: 2.858 - REMOVED
COSMOS 1408 DEB (1982-092BBR) days: 3.149 - REMOVED
COSMOS 2251 DEB (1993-036BGH) days: 3.160 - REMOVED
COSMOS 1408 DEB (1982-092ACC) days: 3.166 - REMOVED
COSMOS 1408 DEB (1982-092BCU) days: 3.266 - REMOVED
STARLINK-1064 (2019-074BJ) days: 3.399 - REMOVED
COSMOS 1408 DEB (1982-092HV) days: 4.207 - REMOVED
COSMOS 1408 DEB (1982-092AWP) days: 5.088 - REMOVED
COSMOS 1408 DEB (1982-092PQ) days: 5.157 - REMOVED
FREGAT DEB (2011-037BC) days: 5.861 - REMOVED
COSMOS 1408 DEB (1982-092QH) days: 6.125 - REMOVED
FENGYUN 1C DEB (1999-025CVY) days: 6.797 - REMOVED
COSMOS 1408 DEB (1982-092BHF) days: 7.790 - REMOVED
COSMOS 1408 DEB (1982-092KV) days: 8.100 - REMOVED
COSMOS 1408 DEB (1982-092PG) days: 8.489 - REMOVED
COSMOS 1408 DEB (1982-092MN) days: 9.667 - REMOVED
COSMOS 1408 DEB (1982-092SZ) days: 10.160 - REMOVED
COSMOS 1408 DEB (1982-092AWZ) days: 10.264 - REMOVED
COSMOS 1408 DEB (1982-092AWJ) days: 11.038 - REMOVED
FREGAT DEB (2011-037L) days: 11.056 - REMOVED
COSMOS 1408 DEB (1982-092AYM) days: 11.243 - REMOVED
COSMOS 1408 DEB (1982-092KE) days: 11.851 - REMOVED
QUETZAL-1 (1998-067RL) days: 12.409 - REMOVED
COSMOS 1408 DEB (1982-092NE) days: 13.676 - REMOVED
COSMOS 1408 DEB (1982-092ACJ) days: 13.952 - REMOVED
COSMOS 1408 DEB (1982-092AJN) days: 14.792 - REMOVED
STARLINK-1859 (2020-088AA) days: 15.143 - REMOVED
IRIDIUM 33 DEB (1997-051DC) days: 15.542 - REMOVED
COSMOS 1408 DEB (1982-092YV) days: 16.435 - REMOVED
STARLINK-2306 (2021-024M) days: 16.813 - REMOVED
COSMOS 1408 DEB (1982-092AKT) days: 17.615 - REMOVED
COSMOS 1408 DEB (1982-092AZH) days: 17.748 - REMOVED
COSMOS 1408 DEB (1982-092AMJ) days: 18.196 - REMOVED
COSMOS 1408 DEB (1982-092AP) days: 18.974 - REMOVED
COSMOS 1408 DEB (1982-092BEY) days: 20.103 - REMOVED
COSMOS 1408 DEB (1982-092ASS) days: 20.386 - REMOVED
COSMOS 1408 DEB (1982-092ASR) days: 23.654 - REMOVED
SL-4 R/B (2021-008B) days: 23.867 - REMOVED
COSMOS 1408 DEB (1982-092BAJ) days: 24.877 - REMOVED
COSMOS 1408 DEB (1982-092BBQ) days: 25.088 - REMOVED
COSMOS 1408 DEB (1982-092AER) days: 26.649 - REMOVED
COSMOS 1408 DEB (1982-092BGC) days: 29.469 - REMOVED
COSMOS 1408 DEB (1982-092MS) days: 29.704 - REMOVED
Elapsed [s]:  64.27284359931946
Time projected to simulate 20 years is  4.347343726787303  hours

The total simulation time, ultimately determined by the underlying CPU architecture, is sensitive also to the choices made for cascade.sim.ct and cascade.sim.n_par_ct which determine the efficient use of the CPUs as well as the perfromances of the underlying Collision Algorithm based on the manipulation of the dense output of the Taylor integrators.