Issue with DSST propagator setup

Hi Orekit developers,

I am attempting to build a DSST propagator and I’ve run into an issue. I believe it stems from the MeanPlusShortPeriodicMapper, however I may be wrong about that.

  Stack Trace: 
ByteCodeHelper.LoadTypeWrapper(String clazz, CallerID callerId)
EquinoctialOrbit.ctor(Double a, Double ex, Double ey, Double hx, Double hy, Double l, Double aDot, Double exDot, Double eyDot, Double hxDot, Double hyDot, Double lDot, PositionAngle type, Frame frame, AbsoluteDate date, Double mu)
3.mapArrayToOrbit(Double[] , Double[] , PositionAngle , AbsoluteDate , Double , Frame )
3.mapArrayToOrbit(Double[] , Double[] , PositionAngle , AbsoluteDate , Double , Frame )
MeanPlusShortPeriodicMapper.mapArrayToState(AbsoluteDate , Double[] , Double[] , PropagationType )
AbstractIntegratedPropagator.propagate(AbsoluteDate tEnd, Boolean activateHandlers)
AbstractIntegratedPropagator.propagate(AbsoluteDate tStart, AbsoluteDate tEnd)
AbstractIntegratedPropagator.propagate(AbsoluteDate target)
Ephemeris.ctor(AbstractPropagator propagator, Double timeSpan, Double step, String stepHandler) line 45
Propagators.PropagationWizard(SpacecraftState initialState, String propagatorType, String stepHandler, Double timeSpan, Double stepSize) line 46
AstroTests.WizardMasterTest() line 222

Here is my current propagator setup. I’ve tried to use both the RK integrator and DP853.

        // Setup integrator
        double step = 60;
        ClassicalRungeKuttaIntegrator integrator = new ClassicalRungeKuttaIntegrator(step);

        // Setup propagator
        DSSTPropagator propagator = new DSSTPropagator(integrator, PropagationType.MEAN);

        // Celestial Objects
        FactoryManagedFrame bodyFrame = FramesFactory.getITRF(IERSConventions.IERS_2010, true);
        CelestialBody sun = CelestialBodyFactory.getSun();
        CelestialBody moon = CelestialBodyFactory.getMoon();
        OneAxisEllipsoid earth = new OneAxisEllipsoid(org.orekit.utils.Constants.WGS84_EARTH_EQUATORIAL_RADIUS, org.orekit.utils.Constants.WGS84_EARTH_FLATTENING, bodyFrame);

        // Drag
        double cr = 1.88;
        double cd = 1;
        double area = 1;
        NRLMSISE00InputParameters flux = new CssiSpaceWeatherData("SpaceWeather-All-v1.2.txt");
        Atmosphere atmosphere = new NRLMSISE00(flux, sun, earth);
        DragSensitive spacecraft = new IsotropicDrag(area, cd);
        DSSTForceModel atmDrag = new DSSTAtmosphericDrag(new DragForce(atmosphere, spacecraft), state.getMu());

        // Solar radiation pressure
        DSSTForceModel solarPressure = new DSSTSolarRadiationPressure(cr, area, sun, earth.getEquatorialRadius(), state.getMu());

I’ve also tried using an osculating propagator type. Depending on which setup I use the error message varies slightly, although the underlying “MeanPlusShortPeriodicMapper” error persists.

I’m somewhat new to Orekit, so any help is appreciated.

– Connor

Hi @muld00n

Welcome to the Orekit forum.

DSST is very powerful. However, it is a bit difficult to use and it may be fussy.

DSST performs the computation of the osculating orbital elements by separating it into two contributions: the mean orbital elements and the short periodic terms. The first one are computed numerically whereas the other ones are computed analytically. Because the elements computed numerically are the mean elements, DSST allows to use big integration steps for their computation (i.e. several orbits). This is the main advantage of DSST compare to a numerical orbit propagator.

I need more information to help you:

  • Could you give me your state? Because if I use a LEO test case as presented below with a propagation of one day, everything work.

      private static SpacecraftState getLEO() {
          final Vector3D position = new Vector3D(-6142438.668, 3492467.560, -25767.25680);
          final Vector3D velocity = new Vector3D(505.8479685, 942.7809215, 7435.922231);
          // Spring equinoxe 21st mars 2003 1h00m
          final AbsoluteDate initDate = new AbsoluteDate(new DateComponents(2003, 03, 21), new    TimeComponents(1, 0, 0.), TimeScalesFactory.getUTC());
          return new SpacecraftState(new EquinoctialOrbit(new PVCoordinates(position, velocity),
  • What is the duration of your orbit propagation? I ask this question because your integration step of 60 seconds seems a bit small to take advantage of DSST capabilities.

  • Are you only using drag and solar radiation pressure force models? Do you also use zonal and tesseral harmonics?

Thank you for your answers,

My state:

        Frame inertialFrame = FramesFactory.getEME2000();
        TimeScale utc = TimeScalesFactory.getUTC();
        AbsoluteDate initialDate = new AbsoluteDate(2020, 07, 31, 06, 07, 00.00000, utc);
        Vector3D Position = new Vector3D(-4220904.995870797, -3024765.964056029, -5671817.171476793);
        Vector3D Velocity = new Vector3D(-908.5773530674808, -5998.47392841928, 3872.5602999557);
        Orbit orbit = new CartesianOrbit(new PVCoordinates(Position, Velocity), inertialFrame, initialDate, CONSTANTS.MU_m);
        SpacecraftState initialState = new SpacecraftState(orbit);

Here is the function I used to initialize the propagation, where the stephandler is set to Master, the step is an hour, and the length is a day. I’ve also tried setting the propagator to “slave” mode as well with no success.

Ephemeris ephem = Propagators.PropagationWizard(initialState, PROPAGATORS.SEMI_ANALYTICAL, STEPHANDLERS.MASTER, 43200, 3600);

I’ve also added the zonal and tesseral harmonics shown below.

        // Zonal and tesseral harmonics
        UnnormalizedSphericalHarmonicsProvider provider = GravityFieldFactory.getUnnormalizedProvider(7, 7);
        DSSTZonal zonal = new DSSTZonal(provider);
        DSSTTesseral tesseral = new DSSTTesseral(bodyFrame, CONSTANTS.EARTH_ROTATION_RATE, provider);


And the error message:

java.lang.NoClassDefFoundError: org.hipparchus.analysis.differentiation.Gradient

I think you are using an old version of Hipparchus library. Therefore, you have to update your Hipparchus version to 1.7. Gradient class was introduce in version 1.7.

After that, your code will certainly work. Indeed, everything work in my computer.


Thanks for the help!

One follow up:

I’ve run into another new bug that seems to be happening when adding IERS conventions.

  Stack Trace: 
    3.getNutationArguments(TimeScale , TimeScales )
    IERSConventions.getNutationArguments(TimeScales timeScales)
    3.getXYSpXY2Function(TimeScales )
    CIRFProvider.ctor(EOPHistory )
    AbstractFrames.getCIRF(IERSConventions conventions, Boolean simpleEOP)
    AbstractFrames.getTIRF(IERSConventions conventions, Boolean simpleEOP)
    AbstractFrames.getITRF(IERSConventions conventions, Boolean simpleEOP)
    FramesFactory.getITRF(IERSConventions conventions, Boolean simpleEOP)

In the source code I found this:

        /** {@inheritDoc} */
    public FundamentalNutationArguments getNutationArguments(final TimeScale timeScale,
                                                             final TimeScales timeScales) {
        try (InputStream in = getStream(NUTATION_ARGUMENTS)) {
            return new FundamentalNutationArguments(this, timeScale,
                    in, NUTATION_ARGUMENTS, timeScales);
        } catch (IOException e) {
            throw new OrekitException(OrekitMessages.INTERNAL_ERROR, e);

When I looked at the file path for NUTATION_ARGUMENTS the correct file was there, so I don’t see where the error is coming from or why the exception is being thrown. This error happens for each IERS [YEAR] convention. I’ve upgraded both Orekit and Hipparchus to their latest versions.

Another thing to note: I am using a DLL converted from the JAR created in Eclipse.

This may be the source of the problem, but I’m not sure. The jar created by maven will include not only the compiled classes but also the internal resource data, which include among other the nutation tables. So you should make sure the jar created by eclipse also includes everything that is in the src/main/resources folder and that the conversion into a DLL also get the data and not only the binary code.

1 Like

Yes, that worked. When I was building the JAR file in Eclipse, I needed to seal a manifest file (src/main/resources) into the JAR which fixed the issue.