Search in sources :

Example 46 with Orbit

use of org.orekit.orbits.Orbit in project Orekit by CS-SI.

the class JacobiansMapper method getdYdC.

/**
 * Get the conversion Jacobian between state parameters and Cartesian parameters.
 * @param state spacecraft state
 * @return conversion Jacobian
 */
private double[][] getdYdC(final SpacecraftState state) {
    final double[][] dYdC = new double[STATE_DIMENSION][STATE_DIMENSION];
    // make sure the state is in the desired orbit type
    final Orbit orbit = orbitType.convertType(state.getOrbit());
    // compute the Jacobian, taking the position angle type into account
    orbit.getJacobianWrtCartesian(angleType, dYdC);
    return dYdC;
}
Also used : Orbit(org.orekit.orbits.Orbit)

Example 47 with Orbit

use of org.orekit.orbits.Orbit in project Orekit by CS-SI.

the class NumericalPropagator method tolerances.

/**
 * Estimate tolerance vectors for integrators.
 * <p>
 * The errors are estimated from partial derivatives properties of orbits,
 * starting from a scalar position error specified by the user.
 * Considering the energy conservation equation V = sqrt(mu (2/r - 1/a)),
 * we get at constant energy (i.e. on a Keplerian trajectory):
 * <pre>
 * V² r |dV| = mu |dr|
 * </pre>
 * <p> So we deduce a scalar velocity error consistent with the position error.
 * From here, we apply orbits Jacobians matrices to get consistent errors
 * on orbital parameters.
 *
 * <p>
 * The tolerances are only <em>orders of magnitude</em>, and integrator tolerances
 * are only local estimates, not global ones. So some care must be taken when using
 * these tolerances. Setting 1mm as a position error does NOT mean the tolerances
 * will guarantee a 1mm error position after several orbits integration.
 * </p>
 * @param dP user specified position error
 * @param orbit reference orbit
 * @param type propagation type for the meaning of the tolerance vectors elements
 * (it may be different from {@code orbit.getType()})
 * @return a two rows array, row 0 being the absolute tolerance error and row 1
 * being the relative tolerance error
 * @exception OrekitException if Jacobian is singular
 */
public static double[][] tolerances(final double dP, final Orbit orbit, final OrbitType type) throws OrekitException {
    // estimate the scalar velocity error
    final PVCoordinates pv = orbit.getPVCoordinates();
    final double r2 = pv.getPosition().getNormSq();
    final double v = pv.getVelocity().getNorm();
    final double dV = orbit.getMu() * dP / (v * r2);
    final double[] absTol = new double[7];
    final double[] relTol = new double[7];
    // we set the mass tolerance arbitrarily to 1.0e-6 kg, as mass evolves linearly
    // with trust, this often has no influence at all on propagation
    absTol[6] = 1.0e-6;
    if (type == OrbitType.CARTESIAN) {
        absTol[0] = dP;
        absTol[1] = dP;
        absTol[2] = dP;
        absTol[3] = dV;
        absTol[4] = dV;
        absTol[5] = dV;
    } else {
        // convert the orbit to the desired type
        final double[][] jacobian = new double[6][6];
        final Orbit converted = type.convertType(orbit);
        converted.getJacobianWrtCartesian(PositionAngle.TRUE, jacobian);
        for (int i = 0; i < 6; ++i) {
            final double[] row = jacobian[i];
            absTol[i] = FastMath.abs(row[0]) * dP + FastMath.abs(row[1]) * dP + FastMath.abs(row[2]) * dP + FastMath.abs(row[3]) * dV + FastMath.abs(row[4]) * dV + FastMath.abs(row[5]) * dV;
            if (Double.isNaN(absTol[i])) {
                throw new OrekitException(OrekitMessages.SINGULAR_JACOBIAN_FOR_ORBIT_TYPE, type);
            }
        }
    }
    Arrays.fill(relTol, dP / FastMath.sqrt(r2));
    return new double[][] { absTol, relTol };
}
Also used : Orbit(org.orekit.orbits.Orbit) TimeStampedPVCoordinates(org.orekit.utils.TimeStampedPVCoordinates) PVCoordinates(org.orekit.utils.PVCoordinates) OrekitException(org.orekit.errors.OrekitException)

Example 48 with Orbit

use of org.orekit.orbits.Orbit in project Orekit by CS-SI.

the class RelativityTest method testSmallEffectOnOrbit.

/**
 * check against example in Tapley, Schutz, and Born, p 65-66. They predict a
 * progression of perigee of 11 arcsec/year. To get the same results we must set the
 * propagation tolerances to 1e-5.
 *
 * @throws OrekitException on error
 */
@Test
public void testSmallEffectOnOrbit() throws OrekitException {
    // setup
    final double gm = Constants.EIGEN5C_EARTH_MU;
    Orbit orbit = new KeplerianOrbit(7500e3, 0.025, FastMath.toRadians(41.2), 0, 0, 0, PositionAngle.TRUE, frame, date, gm);
    double[][] tol = NumericalPropagator.tolerances(0.00001, orbit, OrbitType.CARTESIAN);
    AbstractIntegrator integrator = new DormandPrince853Integrator(1, 3600, tol[0], tol[1]);
    NumericalPropagator propagator = new NumericalPropagator(integrator);
    propagator.setOrbitType(OrbitType.CARTESIAN);
    propagator.addForceModel(new Relativity(gm));
    propagator.setInitialState(new SpacecraftState(orbit));
    // action: propagate a period
    AbsoluteDate end = orbit.getDate().shiftedBy(30 * Constants.JULIAN_DAY);
    PVCoordinates actual = propagator.getPVCoordinates(end, frame);
    // verify
    KeplerianOrbit endOrbit = new KeplerianOrbit(actual, frame, end, gm);
    KeplerianOrbit startOrbit = new KeplerianOrbit(orbit);
    double dp = endOrbit.getPerigeeArgument() - startOrbit.getPerigeeArgument();
    double dtYears = end.durationFrom(orbit.getDate()) / Constants.JULIAN_YEAR;
    double dpDeg = FastMath.toDegrees(dp);
    // change in argument of perigee in arcseconds per year
    double arcsecPerYear = dpDeg * 3600 / dtYears;
    Assert.assertEquals(11, arcsecPerYear, 0.5);
}
Also used : FieldSpacecraftState(org.orekit.propagation.FieldSpacecraftState) SpacecraftState(org.orekit.propagation.SpacecraftState) Orbit(org.orekit.orbits.Orbit) CircularOrbit(org.orekit.orbits.CircularOrbit) CartesianOrbit(org.orekit.orbits.CartesianOrbit) FieldKeplerianOrbit(org.orekit.orbits.FieldKeplerianOrbit) KeplerianOrbit(org.orekit.orbits.KeplerianOrbit) FieldNumericalPropagator(org.orekit.propagation.numerical.FieldNumericalPropagator) NumericalPropagator(org.orekit.propagation.numerical.NumericalPropagator) AbstractIntegrator(org.hipparchus.ode.AbstractIntegrator) FieldPVCoordinates(org.orekit.utils.FieldPVCoordinates) PVCoordinates(org.orekit.utils.PVCoordinates) FieldKeplerianOrbit(org.orekit.orbits.FieldKeplerianOrbit) KeplerianOrbit(org.orekit.orbits.KeplerianOrbit) DormandPrince853Integrator(org.hipparchus.ode.nonstiff.DormandPrince853Integrator) FieldAbsoluteDate(org.orekit.time.FieldAbsoluteDate) AbsoluteDate(org.orekit.time.AbsoluteDate) AbstractLegacyForceModelTest(org.orekit.forces.AbstractLegacyForceModelTest) Test(org.junit.Test)

Example 49 with Orbit

use of org.orekit.orbits.Orbit in project Orekit by CS-SI.

the class SolidTidesTest method testTideEffect1996.

@Test
public void testTideEffect1996() throws OrekitException {
    Frame eme2000 = FramesFactory.getEME2000();
    TimeScale utc = TimeScalesFactory.getUTC();
    AbsoluteDate date = new AbsoluteDate(2003, 07, 01, 13, 59, 27.816, utc);
    Orbit orbit = new KeplerianOrbit(7201009.7124401, 1e-3, FastMath.toRadians(98.7), FastMath.toRadians(93.0), FastMath.toRadians(15.0 * 22.5), 0, PositionAngle.MEAN, eme2000, date, Constants.EIGEN5C_EARTH_MU);
    doTestTideEffect(orbit, IERSConventions.IERS_1996, 44.09481, 0.00000);
}
Also used : Frame(org.orekit.frames.Frame) Orbit(org.orekit.orbits.Orbit) FieldCartesianOrbit(org.orekit.orbits.FieldCartesianOrbit) KeplerianOrbit(org.orekit.orbits.KeplerianOrbit) KeplerianOrbit(org.orekit.orbits.KeplerianOrbit) TimeScale(org.orekit.time.TimeScale) FieldAbsoluteDate(org.orekit.time.FieldAbsoluteDate) AbsoluteDate(org.orekit.time.AbsoluteDate) AbstractLegacyForceModelTest(org.orekit.forces.AbstractLegacyForceModelTest) Test(org.junit.Test)

Example 50 with Orbit

use of org.orekit.orbits.Orbit in project Orekit by CS-SI.

the class SolidTidesTest method testTideEffect2010BeforePoleModelChange.

@Test
public void testTideEffect2010BeforePoleModelChange() throws OrekitException {
    Frame eme2000 = FramesFactory.getEME2000();
    TimeScale utc = TimeScalesFactory.getUTC();
    AbsoluteDate date = new AbsoluteDate(2003, 07, 01, 13, 59, 27.816, utc);
    Orbit orbit = new KeplerianOrbit(7201009.7124401, 1e-3, FastMath.toRadians(98.7), FastMath.toRadians(93.0), FastMath.toRadians(15.0 * 22.5), 0, PositionAngle.MEAN, eme2000, date, Constants.EIGEN5C_EARTH_MU);
    doTestTideEffect(orbit, IERSConventions.IERS_2010, 44.25001, 0.70710);
}
Also used : Frame(org.orekit.frames.Frame) Orbit(org.orekit.orbits.Orbit) FieldCartesianOrbit(org.orekit.orbits.FieldCartesianOrbit) KeplerianOrbit(org.orekit.orbits.KeplerianOrbit) KeplerianOrbit(org.orekit.orbits.KeplerianOrbit) TimeScale(org.orekit.time.TimeScale) FieldAbsoluteDate(org.orekit.time.FieldAbsoluteDate) AbsoluteDate(org.orekit.time.AbsoluteDate) AbstractLegacyForceModelTest(org.orekit.forces.AbstractLegacyForceModelTest) Test(org.junit.Test)

Aggregations

Orbit (org.orekit.orbits.Orbit)211 KeplerianOrbit (org.orekit.orbits.KeplerianOrbit)161 Test (org.junit.Test)153 AbsoluteDate (org.orekit.time.AbsoluteDate)153 SpacecraftState (org.orekit.propagation.SpacecraftState)129 Vector3D (org.hipparchus.geometry.euclidean.threed.Vector3D)99 EquinoctialOrbit (org.orekit.orbits.EquinoctialOrbit)94 CartesianOrbit (org.orekit.orbits.CartesianOrbit)88 FieldAbsoluteDate (org.orekit.time.FieldAbsoluteDate)74 CircularOrbit (org.orekit.orbits.CircularOrbit)68 PVCoordinates (org.orekit.utils.PVCoordinates)66 Frame (org.orekit.frames.Frame)51 NumericalPropagator (org.orekit.propagation.numerical.NumericalPropagator)51 DateComponents (org.orekit.time.DateComponents)48 FieldSpacecraftState (org.orekit.propagation.FieldSpacecraftState)46 Propagator (org.orekit.propagation.Propagator)46 TimeComponents (org.orekit.time.TimeComponents)44 OneAxisEllipsoid (org.orekit.bodies.OneAxisEllipsoid)43 AbstractLegacyForceModelTest (org.orekit.forces.AbstractLegacyForceModelTest)41 FieldKeplerianOrbit (org.orekit.orbits.FieldKeplerianOrbit)39