DSST propagation and tesseral force model

Hello,

I am propagating an orbit using the semianalytical propagator DSST. As you can see in the code, I tried to add a DSST tesseral force model to one propagator. However, I get the same results when performing the same propagation without the tesseral force model. I also tried to change the integration step / duration of propagation, but no improvements. Did I do something wrong in my code?

Thank you!
Marco

        Vector3D position = new Vector3D(-605000.7922166, -5870000.2295111, 3493000.0531990);
        Vector3D velocity = new Vector3D(-1568.254290, -3702.348910, -6479.483950);
		PVCoordinates pvCoordinates = new PVCoordinates(position, velocity);
        AbsoluteDate startAbsoluteDate = new AbsoluteDate(2022, 05, 22, 10, 30, 0.0, TimeScalesFactory.getUTC());
		Orbit orbit = new CartesianOrbit(pvCoordinates, FramesFactory.getGCRF(), startAbsoluteDate, Constants.IERS2010_EARTH_MU);
		SpacecraftState initialState = new SpacecraftState(orbit, 1000);
        
        NormalizedSphericalHarmonicsProvider normalizedSphericalHarmonicsProvider = GravityFieldFactory.getNormalizedProvider(GravityFieldFactory.getUnnormalizedProvider(Constants.IERS2010_EARTH_EQUATORIAL_RADIUS, Constants.IERS2010_EARTH_MU, TideSystem.TIDE_FREE,
                                                                                             								  new double[][] { { 1.0 }, { 0.0 }, { Constants.IERS2010_EARTH_C20 }, 
																															  									 { Constants.EGM96_EARTH_C30 }, 
																																								 { Constants.EGM96_EARTH_C40 }, 
																																								 { Constants.EGM96_EARTH_C50 }, 
																																								 { Constants.EGM96_EARTH_C60 }, },
                                                                                             								  new double[][] { { 0.0 }, { 0.0 }, { 0.0 }, { 0.0 }, { 0.0 }, { 0.0 }, { 0.0 }, }));

		DSSTForceModel forceModel = new DSSTTesseral(FramesFactory.getITRF(IERSConventions.IERS_2010, false), Constants.IERS2010_EARTH_ANGULAR_VELOCITY, GravityFieldFactory.getUnnormalizedProvider(normalizedSphericalHarmonicsProvider));

		// Propagate
		DSSTPropagator propagator = new DSSTPropagator(new EulerIntegrator(0.5));
		DSSTPropagator propagatorNoForce = new DSSTPropagator(new EulerIntegrator(0.5));

		propagator.setInitialState(initialState);
		propagatorNoForce.setInitialState(initialState);

		propagator.addForceModel(forceModel);

		SpacecraftState finalSpacecraftState = propagator.propagate(startAbsoluteDate.shiftedBy(3000));
		SpacecraftState finalSpacecraftStateNoForce = propagatorNoForce.propagate(startAbsoluteDate.shiftedBy(3000));

        System.out.println(finalSpacecraftState.getPVCoordinates().getPosition().getX() == finalSpacecraftStateNoForce.getPVCoordinates().getPosition().getX()); // TRUE

Hi @MarcoTosato

That’s because the sine part of the un-normalized tesseral-sectorial coefficients are equals to 0.0. You should replace the following code

        NormalizedSphericalHarmonicsProvider normalizedSphericalHarmonicsProvider = GravityFieldFactory.getNormalizedProvider(GravityFieldFactory.getUnnormalizedProvider(Constants.IERS2010_EARTH_EQUATORIAL_RADIUS, Constants.IERS2010_EARTH_MU, TideSystem.TIDE_FREE,
                                                                                                                              new double[][] { { 1.0 }, { 0.0 }, { Constants.IERS2010_EARTH_C20 }, 
                                                                                                                                                                 { Constants.EGM96_EARTH_C30 }, 
                                                                                                                                                                 { Constants.EGM96_EARTH_C40 }, 
                                                                                                                                                                 { Constants.EGM96_EARTH_C50 }, 
                                                                                                                                                                 { Constants.EGM96_EARTH_C60 }, },
                                                                                                                              new double[][] { { 0.0 }, { 0.0 }, { 0.0 }, { 0.0 }, { 0.0 }, { 0.0 }, { 0.0 }, }));

        DSSTForceModel forceModel = new DSSTTesseral(FramesFactory.getITRF(IERSConventions.IERS_2010, false), Constants.IERS2010_EARTH_ANGULAR_VELOCITY, GravityFieldFactory.getUnnormalizedProvider(normalizedSphericalHarmonicsProvider));

By

        UnnormalizedSphericalHarmonicsProvider unnormalizedSphericalHarmonicsProvider = GravityFieldFactory.getUnnormalizedProvider(6, 6);

        DSSTForceModel forceModel = new DSSTTesseral(FramesFactory.getITRF(IERSConventions.IERS_2010, false), Constants.IERS2010_EARTH_ANGULAR_VELOCITY, unnormalizedSphericalHarmonicsProvider);

An additional remark, you use an integration step of 0.5 seconds for the integrator. A semi-analytical method computes the mean elements (i.e., long term variations) using a numerical method and the short period variations using analytical methods. Because only the mean elements are computed numerically, semi-analytical models can use big integration steps (e.g., 12 hours or even 24 hours). So, I recommend you to use bigger integration steps.

Best regards,
Bryan

Hello, could you please tell me when to use UnnormalizedSphericalHarmonicsProvider or NormalizedSphericalHarmonicsProvider , and what is the difference between them? Thank you so much!

Hi @newWL,

It depends on the equations of the propagation model. DSST, as well as the analytical orbit propagator (i.e., Brouwer-Lydanne and Eckstein-Hechler) need un-normalized spherical harmonics coefficients, so an UnnormalizedSphericalHarmonicsProvider. At the opposite, the numerical propagation model uses normalized spherical harmonics coefficients, so a NormalizedSphericalHarmonicsProvider.

Best regards,
Bryan