private double[] stateToArray( SpacecraftState state, OrbitType orbitType, PositionAngle angleType, boolean withMass) { double[] array = new double[withMass ? 7 : 6]; switch (orbitType) { case CARTESIAN: { CartesianOrbit cart = (CartesianOrbit) orbitType.convertType(state.getOrbit()); array[0] = cart.getPVCoordinates().getPosition().getX(); array[1] = cart.getPVCoordinates().getPosition().getY(); array[2] = cart.getPVCoordinates().getPosition().getZ(); array[3] = cart.getPVCoordinates().getVelocity().getX(); array[4] = cart.getPVCoordinates().getVelocity().getY(); array[5] = cart.getPVCoordinates().getVelocity().getZ(); } break; case CIRCULAR: { CircularOrbit circ = (CircularOrbit) orbitType.convertType(state.getOrbit()); array[0] = circ.getA(); array[1] = circ.getCircularEx(); array[2] = circ.getCircularEy(); array[3] = circ.getI(); array[4] = circ.getRightAscensionOfAscendingNode(); array[5] = circ.getAlpha(angleType); } break; case EQUINOCTIAL: { EquinoctialOrbit equ = (EquinoctialOrbit) orbitType.convertType(state.getOrbit()); array[0] = equ.getA(); array[1] = equ.getEquinoctialEx(); array[2] = equ.getEquinoctialEy(); array[3] = equ.getHx(); array[4] = equ.getHy(); array[5] = equ.getL(angleType); } break; case KEPLERIAN: { KeplerianOrbit kep = (KeplerianOrbit) orbitType.convertType(state.getOrbit()); array[0] = kep.getA(); array[1] = kep.getE(); array[2] = kep.getI(); array[3] = kep.getPerigeeArgument(); array[4] = kep.getRightAscensionOfAscendingNode(); array[5] = kep.getAnomaly(angleType); } break; } if (withMass) { array[6] = state.getMass(); } return array; }
@Test public void testPropagationTypesElliptical() throws OrekitException, ParseException, IOException { NormalizedSphericalHarmonicsProvider provider = GravityFieldFactory.getNormalizedProvider(5, 5); ForceModel gravityField = new HolmesFeatherstoneAttractionModel( FramesFactory.getITRF(IERSConventions.IERS_2010, true), provider); Orbit initialOrbit = new KeplerianOrbit( 8000000.0, 0.01, 0.1, 0.7, 0, 1.2, PositionAngle.TRUE, FramesFactory.getEME2000(), AbsoluteDate.J2000_EPOCH, provider.getMu()); double dt = 900; double dP = 0.001; for (OrbitType orbitType : OrbitType.values()) { for (PositionAngle angleType : PositionAngle.values()) { // compute state Jacobian using PartialDerivatives NumericalPropagator propagator = setUpPropagator(initialOrbit, dP, orbitType, angleType, gravityField); PartialDerivativesEquations partials = new PartialDerivativesEquations("partials", propagator); final SpacecraftState initialState = partials.setInitialJacobians(new SpacecraftState(initialOrbit), 6, 0); propagator.setInitialState(initialState); final JacobiansMapper mapper = partials.getMapper(); PickUpHandler pickUp = new PickUpHandler(mapper, null); propagator.setMasterMode(pickUp); propagator.propagate(initialState.getDate().shiftedBy(dt)); double[][] dYdY0 = pickUp.getdYdY0(); // compute reference state Jacobian using finite differences double[][] dYdY0Ref = new double[6][6]; AbstractIntegratedPropagator propagator2 = setUpPropagator(initialOrbit, dP, orbitType, angleType, gravityField); double[] steps = NumericalPropagator.tolerances(1000000 * dP, initialOrbit, orbitType)[0]; for (int i = 0; i < 6; ++i) { propagator2.resetInitialState( shiftState(initialState, orbitType, angleType, -4 * steps[i], i)); SpacecraftState sM4h = propagator2.propagate(initialState.getDate().shiftedBy(dt)); propagator2.resetInitialState( shiftState(initialState, orbitType, angleType, -3 * steps[i], i)); SpacecraftState sM3h = propagator2.propagate(initialState.getDate().shiftedBy(dt)); propagator2.resetInitialState( shiftState(initialState, orbitType, angleType, -2 * steps[i], i)); SpacecraftState sM2h = propagator2.propagate(initialState.getDate().shiftedBy(dt)); propagator2.resetInitialState( shiftState(initialState, orbitType, angleType, -1 * steps[i], i)); SpacecraftState sM1h = propagator2.propagate(initialState.getDate().shiftedBy(dt)); propagator2.resetInitialState( shiftState(initialState, orbitType, angleType, 1 * steps[i], i)); SpacecraftState sP1h = propagator2.propagate(initialState.getDate().shiftedBy(dt)); propagator2.resetInitialState( shiftState(initialState, orbitType, angleType, 2 * steps[i], i)); SpacecraftState sP2h = propagator2.propagate(initialState.getDate().shiftedBy(dt)); propagator2.resetInitialState( shiftState(initialState, orbitType, angleType, 3 * steps[i], i)); SpacecraftState sP3h = propagator2.propagate(initialState.getDate().shiftedBy(dt)); propagator2.resetInitialState( shiftState(initialState, orbitType, angleType, 4 * steps[i], i)); SpacecraftState sP4h = propagator2.propagate(initialState.getDate().shiftedBy(dt)); fillJacobianColumn( dYdY0Ref, i, orbitType, angleType, steps[i], sM4h, sM3h, sM2h, sM1h, sP1h, sP2h, sP3h, sP4h); } for (int i = 0; i < 6; ++i) { for (int j = 0; j < 6; ++j) { double error = FastMath.abs((dYdY0[i][j] - dYdY0Ref[i][j]) / dYdY0Ref[i][j]); Assert.assertEquals(0, error, 6.0e-2); } } } } }