Hi @ReeceHumphreys
Welcome to the Orekit forum!
For orbit propagation with a long duration, I recommend you to use the DSST (Draper Semi-analytical Satellite Theory) orbit propagator. DSST is an orbit propagator based on a semi-analytical theory. It combines the accuracy of a numerical method with the characteristic speed of an analytical method.
DSST orbit propagator is represented by the object DSSTPropagator
in Orekit.
You can easily initialize it with a numerical integrator and an enumerate telling if your initial orbit is defined with mean or osculating elements. With DSST propagator, you can use a variable step numerical integrator with big minimum and maximum integration steps (i.e. several orbits). It is a big advantage compare to the numerical orbit propagator. Indeed, with a numerical method your integration steps need to be small (i.e. between 1 millisecond and tens of seconds). To initialize the DSST propagator, please find a example below (I assume you already defined your initial SpacecraftState
using your Keplerian elements).
final SpacecraftState initialState = // Please define the initial state using the Keplerian elements
// Initialize the DSST propagator
final double minStep = initialState.getKeplerianPeriod();
final double maxStep = 100. * minStep;
final double[][] tol = DSSTPropagator.tolerances(1.0, initialState.getOrbit());
final AdaptiveStepsizeIntegrator integrator = new DormandPrince853Integrator(minStep, maxStep, tol[0], tol[1]);
final DSSTPropagator dsstProp = new DSSTPropagator(integrator, PropagationType.MEAN);
dsstProp.setInitialState(initialState, PropagationType.MEAN);
Now, you have to add the force models to the DSST orbit propagator. Orekit’s DSST orbit propagator can consider zonal (represented by DSSTZonal
class) and tesseral (represented by DSSTTesseral
class) harmonics of the Earth’s potential, third body attraction (represented by DSSTThirdBody
class), atmospheric drag (represented by DSSTAtmosphericDrag class), and solar radiation pressure (represented by DSSTSolarRadiationPressure
class). Please find an example on how to add J2 and atmospheric drag to previously initialized DSST propagator.
// Central Body geopotential 2x0 (J2 only)
final UnnormalizedSphericalHarmonicsProvider provider = GravityFieldFactory.getUnnormalizedProvider(2, 0);
// Atmosphere model
final OneAxisEllipsoid earth = new OneAxisEllipsoid(provider.getAe(),
Constants.WGS84_EARTH_FLATTENING,
FramesFactory.getITRF(IERSConventions.IERS_2010, true));
final Atmosphere atm = new HarrisPriester(CelestialBodyFactory.getSun(), earth, 6);
// Spacecraft characteristics for atmospheric drag
final double cd = 2.0;
final double area = 1.0; // TODO To be updated with your spacecraft area
// Add the force models to the propagator
dsstProp.addForceModel(new DSSTZonal(provider));
dsstProp.addForceModel(new DSSTTesseral(earth.getBodyFrame(), Constants.WGS84_EARTH_ANGULAR_VELOCITY, provider));
dsstProp.addForceModel(new DSSTAtmosphericDrag(atm, cd, area, provider.getMu()));
And now, it’s time to do the propagation!
// 3 years propagation
final SpacecraftState finalState = dsstProp.propagate(initDate.shiftedBy(3. * Constants.JULIAN_YEAR));
Please note that I wrote the different codes directly in the forum, so they may contain some errors of “;” or “)” missing.
I hope this will help you.
Best regards,
Bryan