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