This is a very simple code that runs my handler class and runs into the error (beware, there is a small modification to GlobalCustomStepHandler
with respect to the one I provided before, since I added the attitude providers as you suggested)
import orekit;
orekit.initVM();
from orekit.pyhelpers import setup_orekit_curdir;
setup_orekit_curdir();
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.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(Arrays.asList(forcesDsst), [prop.getAttitudeProvider() for prop in [propagator0, propagator1]]);
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()));
I’ve read in some other thread that it’s probably better to not reuse the force models for the different propagators, but since they didn’t cause any issue with the simpler version of the handler I don’t think that’s what is causing my error.
The new GlobalCustomStepHandler
is defined as:
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, dsstModel, attProv):
self.dsstModel = dsstModel;
self.attProv = attProv;
def init(self, states0, t):
pass;
def handleStep(self, interpolators):
raanDiff = [];
interpolators = list(interpolators);
stateChief = OrekitStepInterpolator.cast_(interpolators[0]).getCurrentState();
stateChief = DSSTPropagator.computeMeanState(stateChief, self.attProv[0], self.dsstModel, 1e-6, 1000);
orbitChief = CircularOrbit(stateChief.getOrbit());
raanChief = orbitChief.getRightAscensionOfAscendingNode();
for ii in range(1, len(interpolators)):
stateNow = OrekitStepInterpolator.cast_(interpolators[ii]).getCurrentState();
stateNow = self.propagatorDsst.computeMeanState(stateNow, self.attProv[ii], self.propagatorDsst.getAllForceModels(), 1e-6, 1000);
orbitNow = CircularOrbit(stateNow.getOrbit());
raanDiff.append(orbitNow.getRightAscensionOfAscendingNode() - raanChief);
self.raanDiff = raanDiff;
def getRaanDiff(self) -> list:
return self.raanDiff;
def finish(self, finalStates):
pass;
Thank you very much for your help.
Best regards,
Emiliano