Here is a simple version of my code that runs into this issue:
import orekit;
orekit.initVM();
from orekit.pyhelpers import setup_orekit_curdir;
setup_orekit_curdir();
from org.hipparchus.geometry.euclidean.threed import Vector3D
from org.hipparchus.ode.nonstiff import DormandPrince853Integrator;
from org.orekit.attitudes import BodyCenterPointing;
from org.orekit.bodies import CelestialBodyFactory, OneAxisEllipsoid;
from org.orekit.forces.drag import DragForce, IsotropicDrag;
from org.orekit.forces.gravity import HolmesFeatherstoneAttractionModel, OceanTides, SolidTides, ThirdBodyAttraction;
from org.orekit.forces.gravity.potential import GravityFieldFactory;
from org.orekit.forces.maneuvers import ConstantThrustManeuver;
from org.orekit.forces.radiation import SolarRadiationPressure, IsotropicRadiationSingleCoefficient;
from org.orekit.frames import FramesFactory;
from org.orekit.models.earth.atmosphere import HarrisPriester;
from org.orekit.orbits import CircularOrbit, PositionAngle;
from org.orekit.propagation import PropagatorsParallelizer, SpacecraftState;
from org.orekit.propagation.numerical import NumericalPropagator;
from org.orekit.propagation.semianalytical.dsst.forces import DSSTAtmosphericDrag, DSSTSolarRadiationPressure, DSSTTesseral, DSSTThirdBody, DSSTZonal;
from org.orekit.time import AbsoluteDate, TimeScalesFactory;
from org.orekit.utils import Constants, IERSConventions;
from globalStepHandlers import GlobalCustomStepHandler;
from math import pi;
from numpy import degrees;
from java.util import Arrays;
# %% INITIAL STATES
# =============================================================================
# =============================================================================
Re = Constants.WGS84_EARTH_EQUATORIAL_RADIUS;
mu = Constants.WGS84_EARTH_MU;
earth = OneAxisEllipsoid(Re,
Constants.WGS84_EARTH_FLATTENING,
FramesFactory.getITRF(IERSConventions.IERS_2010, True));
earthCenterAttitudeLaw0 = BodyCenterPointing(FramesFactory.getEME2000(), earth);
earthCenterAttitudeLaw1 = BodyCenterPointing(FramesFactory.getEME2000(), earth);
mass = 150.;
area = 1.;
CD = 2.2;
CR = 1.2;
a0 = Constants.WGS84_EARTH_EQUATORIAL_RADIUS + 500e3;
a1 = a0 + 5e3;
ex = 1e-4;
ey = 1e-4;
i = 1.5;
raan = pi/6;
u = pi/18;
orbit0 = CircularOrbit(a0, ex, ey, i, raan, u, PositionAngle.MEAN,
FramesFactory.getEME2000(), AbsoluteDate.ARBITRARY_EPOCH, Constants.WGS84_EARTH_MU);
initState0 = SpacecraftState(orbit0, mass);
orbit1 = CircularOrbit(a1, ex, ey, i, raan, u, PositionAngle.MEAN,
FramesFactory.getEME2000(), AbsoluteDate.ARBITRARY_EPOCH, Constants.WGS84_EARTH_MU);
initState1 = SpacecraftState(orbit1, mass);
# %% DYNAMICAL MODEL
# =============================================================================
# =============================================================================
n, m = 4, 4;
nonSphericalGravity = HolmesFeatherstoneAttractionModel(FramesFactory.getITRF(IERSConventions.IERS_2010, True),
GravityFieldFactory.getConstantNormalizedProvider(n,m));
sunThirdBody = ThirdBodyAttraction(CelestialBodyFactory.getSun());
moonThirdBody = ThirdBodyAttraction(CelestialBodyFactory.getMoon());
dragForce = DragForce(HarrisPriester(CelestialBodyFactory.getSun(), earth), IsotropicDrag(area, CD));
srpForce = SolarRadiationPressure(CelestialBodyFactory.getSun(),
Re, IsotropicRadiationSingleCoefficient(area, CR));
oceanicTides = OceanTides(FramesFactory.getITRF(IERSConventions.IERS_2010, True),
Re, mu, n, m, IERSConventions.IERS_2010,
TimeScalesFactory.getUT1(IERSConventions.IERS_2010, True));
solidTides = SolidTides(FramesFactory.getITRF(IERSConventions.IERS_2010, True),
Re, mu, GravityFieldFactory.getConstantNormalizedProvider(n, m).getTideSystem(),
IERSConventions.IERS_2010, TimeScalesFactory.getUT1(IERSConventions.IERS_2010, True),
[CelestialBodyFactory.getSun(), CelestialBodyFactory.getMoon()]);
forces = [nonSphericalGravity, sunThirdBody, moonThirdBody, dragForce, srpForce, oceanicTides, solidTides];
zonalDsst = DSSTZonal(GravityFieldFactory.getConstantUnnormalizedProvider(n,m));
tesseralDsst = DSSTTesseral(FramesFactory.getITRF(IERSConventions.IERS_2010, True),
Constants.WGS84_EARTH_ANGULAR_VELOCITY,
GravityFieldFactory.getConstantUnnormalizedProvider(n,m));
sunThirdBodyDsst = DSSTThirdBody(CelestialBodyFactory.getSun(), mu);
moonThirdBodyDsst = DSSTThirdBody(CelestialBodyFactory.getMoon(), mu);
dragForceDsst = DSSTAtmosphericDrag(HarrisPriester(CelestialBodyFactory.getSun(), earth),
IsotropicDrag(area, CD), mu);
srpForceDsst = DSSTSolarRadiationPressure(CelestialBodyFactory.getSun(), Re,
IsotropicRadiationSingleCoefficient(area, CR), mu);
forcesDsst = [zonalDsst, tesseralDsst, sunThirdBodyDsst, moonThirdBodyDsst, dragForceDsst, srpForceDsst];
# %% PROPAGATORS
# =============================================================================
# =============================================================================
minStep = 1e-2;
maxStep = 1e+2;
absTol = 1e-9;
relTol = 1e-9;
integrator0 = DormandPrince853Integrator(minStep, maxStep, absTol, relTol);
integrator0.setInitialStepSize(60.0);
integrator1 = DormandPrince853Integrator(minStep, maxStep, absTol, relTol);
integrator1.setInitialStepSize(60.0);
propagator0 = NumericalPropagator(integrator0);
propagator0.setAttitudeProvider(earthCenterAttitudeLaw0);
for force in forces:
propagator0.addForceModel(force);
propagator0.setInitialState(initState0);
propagator1 = NumericalPropagator(integrator1);
propagator1.setAttitudeProvider(earthCenterAttitudeLaw1);
for force in forces:
propagator1.addForceModel(force);
propagator1.setInitialState(initState1);
myHandler = GlobalCustomStepHandler();
parallelizer = PropagatorsParallelizer(Arrays.asList([propagator0, propagator1]), myHandler);
day = 24*60*60.;
initDate = orbit0.getDate();
finalDate = initDate.shiftedBy(day);
parallelizer.propagate(initDate, finalDate);
print(degrees(myHandler.getRaanDiff()));
dateNow = finalDate;
firingDate = dateNow.shiftedBy(day/3);
firing = ConstantThrustManeuver(firingDate, 1e3, 1e-1, 1e3, Vector3D.PLUS_I);
propagator1.addForceModel(firing);
parallelizer.propagate(dateNow, dateNow.shiftedBy(day));
print(degrees(myHandler.getRaanDiff()));
This is my step handler:
from org.orekit.orbits import CircularOrbit;
from org.orekit.propagation.sampling import PythonMultiSatStepHandler, OrekitStepInterpolator;
from org.orekit.propagation.semianalytical.dsst import DSSTPropagator;
class GlobalCustomStepHandler(PythonMultiSatStepHandler):
def init(self, states0, t):
pass;
def handleStep(self, interpolators):
raanDiff = [];
interpolators = list(interpolators);
stateChief = OrekitStepInterpolator.cast_(interpolators[0]).getCurrentState();
orbitChief = CircularOrbit(stateChief.getOrbit());
raanChief = orbitChief.getRightAscensionOfAscendingNode();
for ii in range(1, len(interpolators)):
stateNow = OrekitStepInterpolator.cast_(interpolators[ii]).getCurrentState();
orbitNow = CircularOrbit(stateNow.getOrbit());
raanDiff.append(orbitNow.getRightAscensionOfAscendingNode() - raanChief);
print(raanDiff);
self.raanDiff = raanDiff;
def getRaanDiff(self) -> list:
return self.raanDiff;
def finish(self, finalStates):
pass;