Search in sources :

Example 26 with Orbit

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

the class SmallManeuverAnalyticalModel method evaluateJ0Dot.

/**
 * Lazy evaluation of the initial Jacobian time derivative.
 * @exception OrekitException if initial orbit cannot be shifted
 */
private void evaluateJ0Dot() throws OrekitException {
    if (j0Dot == null) {
        j0Dot = new double[6][3];
        final double dt = 1.0e-5 / state0.getOrbit().getKeplerianMeanMotion();
        final Orbit orbit = type.convertType(state0.getOrbit());
        // compute shifted Jacobians
        final double[][] j0m1 = new double[6][6];
        orbit.shiftedBy(-1 * dt).getJacobianWrtCartesian(PositionAngle.MEAN, j0m1);
        final double[][] j0p1 = new double[6][6];
        orbit.shiftedBy(+1 * dt).getJacobianWrtCartesian(PositionAngle.MEAN, j0p1);
        // evaluate derivative by finite differences
        for (int i = 0; i < j0Dot.length; ++i) {
            final double[] m1Row = j0m1[i];
            final double[] p1Row = j0p1[i];
            final double[] j0DotRow = j0Dot[i];
            for (int j = 0; j < 3; ++j) {
                j0DotRow[j] = (p1Row[j + 3] - m1Row[j + 3]) / (2 * dt);
            }
        }
    }
}
Also used : Orbit(org.orekit.orbits.Orbit)

Example 27 with Orbit

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

the class SmallManeuverAnalyticalModel method getJacobian.

/**
 * Compute the Jacobian of the orbit with respect to maneuver parameters.
 * <p>
 * The Jacobian matrix is a 6x4 matrix. Element jacobian[i][j] corresponds to
 * the partial derivative of orbital parameter i with respect to maneuver
 * parameter j. The rows order is the same order as used in {@link
 * Orbit#getJacobianWrtCartesian(PositionAngle, double[][]) Orbit.getJacobianWrtCartesian}
 * method. Columns (0, 1, 2) correspond to the velocity increment coordinates
 * (ΔV<sub>x</sub>, ΔV<sub>y</sub>, ΔV<sub>z</sub>) in the
 * inertial frame returned by {@link #getInertialFrame()}, and column 3
 * corresponds to the maneuver date t₀.
 * </p>
 * @param orbit1 original orbit at t₁, without maneuver
 * @param positionAngle type of the position angle to use
 * @param jacobian placeholder 6x4 (or larger) matrix to be filled with the Jacobian, if matrix
 * is larger than 6x4, only the 6x4 upper left corner will be modified
 * @see #apply(Orbit)
 * @exception OrekitException if time derivative of the initial Jacobian cannot be computed
 */
public void getJacobian(final Orbit orbit1, final PositionAngle positionAngle, final double[][] jacobian) throws OrekitException {
    final double dt = orbit1.getDate().durationFrom(state0.getDate());
    if (dt < 0) {
        // the maneuver has not occurred yet, Jacobian is null
        for (int i = 0; i < 6; ++i) {
            Arrays.fill(jacobian[i], 0, 4, 0.0);
        }
        return;
    }
    // derivatives of Keplerian/equinoctial elements with respect to velocity increment
    final double x = inertialDV.getX();
    final double y = inertialDV.getY();
    final double z = inertialDV.getZ();
    for (int i = 0; i < 6; ++i) {
        System.arraycopy(j0[i], 0, jacobian[i], 0, 3);
    }
    for (int j = 0; j < 3; ++j) {
        jacobian[5][j] += ksi * dt * j0[0][j];
    }
    // derivatives of Keplerian/equinoctial elements with respect to date
    evaluateJ0Dot();
    for (int i = 0; i < 6; ++i) {
        jacobian[i][3] = j0Dot[i][0] * x + j0Dot[i][1] * y + j0Dot[i][2] * z;
    }
    final double da = j0[0][0] * x + j0[0][1] * y + j0[0][2] * z;
    jacobian[5][3] += ksi * (jacobian[0][3] * dt - da);
    if (orbit1.getType() != type || positionAngle != PositionAngle.MEAN) {
        // convert to derivatives of Cartesian parameters
        final double[][] j2 = new double[6][6];
        final double[][] pvJacobian = new double[6][4];
        final Orbit updated = updateOrbit(orbit1);
        updated.getJacobianWrtParameters(PositionAngle.MEAN, j2);
        for (int i = 0; i < 6; ++i) {
            for (int j = 0; j < 4; ++j) {
                pvJacobian[i][j] = j2[i][0] * jacobian[0][j] + j2[i][1] * jacobian[1][j] + j2[i][2] * jacobian[2][j] + j2[i][3] * jacobian[3][j] + j2[i][4] * jacobian[4][j] + j2[i][5] * jacobian[5][j];
            }
        }
        // convert to derivatives of specified parameters
        final double[][] j3 = new double[6][6];
        orbit1.getType().convertType(updated).getJacobianWrtCartesian(positionAngle, j3);
        for (int j = 0; j < 4; ++j) {
            for (int i = 0; i < 6; ++i) {
                jacobian[i][j] = j3[i][0] * pvJacobian[0][j] + j3[i][1] * pvJacobian[1][j] + j3[i][2] * pvJacobian[2][j] + j3[i][3] * pvJacobian[3][j] + j3[i][4] * pvJacobian[4][j] + j3[i][5] * pvJacobian[5][j];
            }
        }
    }
}
Also used : Orbit(org.orekit.orbits.Orbit)

Example 28 with Orbit

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

the class NumericalPropagatorTest method setUp.

@Before
public void setUp() throws OrekitException {
    Utils.setDataRoot("regular-data:potential/shm-format");
    GravityFieldFactory.addPotentialCoefficientsReader(new SHMFormatReader("^eigen_cg03c_coef$", false));
    mu = GravityFieldFactory.getUnnormalizedProvider(0, 0).getMu();
    final Vector3D position = new Vector3D(7.0e6, 1.0e6, 4.0e6);
    final Vector3D velocity = new Vector3D(-500.0, 8000.0, 1000.0);
    initDate = AbsoluteDate.J2000_EPOCH;
    final Orbit orbit = new EquinoctialOrbit(new PVCoordinates(position, velocity), FramesFactory.getEME2000(), initDate, mu);
    initialState = new SpacecraftState(orbit);
    double[][] tolerance = NumericalPropagator.tolerances(0.001, orbit, OrbitType.EQUINOCTIAL);
    AdaptiveStepsizeIntegrator integrator = new DormandPrince853Integrator(0.001, 200, tolerance[0], tolerance[1]);
    integrator.setInitialStepSize(60);
    propagator = new NumericalPropagator(integrator);
    propagator.setInitialState(initialState);
}
Also used : SpacecraftState(org.orekit.propagation.SpacecraftState) FieldSpacecraftState(org.orekit.propagation.FieldSpacecraftState) SHMFormatReader(org.orekit.forces.gravity.potential.SHMFormatReader) EquinoctialOrbit(org.orekit.orbits.EquinoctialOrbit) CartesianOrbit(org.orekit.orbits.CartesianOrbit) KeplerianOrbit(org.orekit.orbits.KeplerianOrbit) Orbit(org.orekit.orbits.Orbit) FieldVector3D(org.hipparchus.geometry.euclidean.threed.FieldVector3D) Vector3D(org.hipparchus.geometry.euclidean.threed.Vector3D) EquinoctialOrbit(org.orekit.orbits.EquinoctialOrbit) AdaptiveStepsizeIntegrator(org.hipparchus.ode.nonstiff.AdaptiveStepsizeIntegrator) TimeStampedPVCoordinates(org.orekit.utils.TimeStampedPVCoordinates) PVCoordinates(org.orekit.utils.PVCoordinates) DormandPrince853Integrator(org.hipparchus.ode.nonstiff.DormandPrince853Integrator) Before(org.junit.Before)

Example 29 with Orbit

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

the class NumericalPropagatorTest method testParallelismIssue258.

@Test
public void testParallelismIssue258() throws OrekitException, InterruptedException, ExecutionException, FileNotFoundException {
    Utils.setDataRoot("regular-data:atmosphere:potential/grgs-format");
    GravityFieldFactory.addPotentialCoefficientsReader(new GRGSFormatReader("grim4s4_gr", true));
    final double mu = GravityFieldFactory.getNormalizedProvider(2, 2).getMu();
    // Geostationary transfer orbit
    // semi major axis in meters
    final double a = 24396159;
    // eccentricity
    final double e = 0.72831215;
    // inclination
    final double i = FastMath.toRadians(7);
    // perigee argument
    final double omega = FastMath.toRadians(180);
    // right ascension of ascending node
    final double raan = FastMath.toRadians(261);
    // mean anomaly
    final double lM = 0;
    final Frame inertialFrame = FramesFactory.getEME2000();
    final TimeScale utc = TimeScalesFactory.getUTC();
    final AbsoluteDate initialDate = new AbsoluteDate(2003, 1, 1, 00, 00, 00.000, utc);
    final Orbit initialOrbit = new CartesianOrbit(new KeplerianOrbit(a, e, i, omega, raan, lM, PositionAngle.MEAN, inertialFrame, initialDate, mu));
    final SpacecraftState initialState = new SpacecraftState(initialOrbit, 1000);
    // initialize the testing points
    final List<SpacecraftState> states = new ArrayList<SpacecraftState>();
    final NumericalPropagator propagator = createPropagator(initialState, OrbitType.CARTESIAN, PositionAngle.TRUE);
    final double samplingStep = 10000.0;
    propagator.setMasterMode(samplingStep, (state, isLast) -> states.add(state));
    propagator.propagate(initialDate.shiftedBy(5 * samplingStep));
    // compute reference errors, using serial computation in a for loop
    final double[][] referenceErrors = new double[states.size() - 1][];
    for (int startIndex = 0; startIndex < states.size() - 1; ++startIndex) {
        referenceErrors[startIndex] = recomputeFollowing(startIndex, states);
    }
    final Consumer<SpacecraftState> checker = point -> {
        try {
            final int startIndex = states.indexOf(point);
            double[] errors = recomputeFollowing(startIndex, states);
            for (int k = 0; k < errors.length; ++k) {
                Assert.assertEquals(startIndex + " to " + (startIndex + k + 1), referenceErrors[startIndex][k], errors[k], 1.0e-9);
            }
        } catch (OrekitException oe) {
            Assert.fail(oe.getLocalizedMessage());
        }
    };
    // serial propagation using Stream
    states.stream().forEach(checker);
    // parallel propagation using parallelStream
    states.parallelStream().forEach(checker);
}
Also used : ParameterDriver(org.orekit.utils.ParameterDriver) CoreMatchers(org.hamcrest.CoreMatchers) ApsideDetector(org.orekit.propagation.events.ApsideDetector) TimeStampedPVCoordinates(org.orekit.utils.TimeStampedPVCoordinates) AdaptiveStepsizeIntegrator(org.hipparchus.ode.nonstiff.AdaptiveStepsizeIntegrator) ForceModel(org.orekit.forces.ForceModel) Frame(org.orekit.frames.Frame) DragForce(org.orekit.forces.drag.DragForce) IERSConventions(org.orekit.utils.IERSConventions) PVCoordinates(org.orekit.utils.PVCoordinates) EquinoctialOrbit(org.orekit.orbits.EquinoctialOrbit) GRGSFormatReader(org.orekit.forces.gravity.potential.GRGSFormatReader) SpacecraftState(org.orekit.propagation.SpacecraftState) FieldEventDetector(org.orekit.propagation.events.FieldEventDetector) After(org.junit.After) StopOnEvent(org.orekit.propagation.events.handlers.StopOnEvent) ThirdBodyAttraction(org.orekit.forces.gravity.ThirdBodyAttraction) PositionAngle(org.orekit.orbits.PositionAngle) DateDetector(org.orekit.propagation.events.DateDetector) ParseException(java.text.ParseException) Utils(org.orekit.Utils) CartesianOrbit(org.orekit.orbits.CartesianOrbit) FramesFactory(org.orekit.frames.FramesFactory) KeplerianOrbit(org.orekit.orbits.KeplerianOrbit) FileNotFoundException(java.io.FileNotFoundException) SHMFormatReader(org.orekit.forces.gravity.potential.SHMFormatReader) List(java.util.List) Stream(java.util.stream.Stream) MatcherAssert(org.hamcrest.MatcherAssert) DataProvidersManager(org.orekit.data.DataProvidersManager) RealFieldElement(org.hipparchus.RealFieldElement) EventDetector(org.orekit.propagation.events.EventDetector) Action(org.orekit.propagation.events.handlers.EventHandler.Action) SolarRadiationPressure(org.orekit.forces.radiation.SolarRadiationPressure) DormandPrince853Integrator(org.hipparchus.ode.nonstiff.DormandPrince853Integrator) ContinueOnEvent(org.orekit.propagation.events.handlers.ContinueOnEvent) OrekitStepHandler(org.orekit.propagation.sampling.OrekitStepHandler) AdditionalStateProvider(org.orekit.propagation.AdditionalStateProvider) AbstractIntegratedPropagator(org.orekit.propagation.integration.AbstractIntegratedPropagator) TimeScale(org.orekit.time.TimeScale) Orbit(org.orekit.orbits.Orbit) FieldSpacecraftState(org.orekit.propagation.FieldSpacecraftState) ArrayList(java.util.ArrayList) NormalizedSphericalHarmonicsProvider(org.orekit.forces.gravity.potential.NormalizedSphericalHarmonicsProvider) IsotropicRadiationSingleCoefficient(org.orekit.forces.radiation.IsotropicRadiationSingleCoefficient) ODEIntegrator(org.hipparchus.ode.ODEIntegrator) OrbitType(org.orekit.orbits.OrbitType) FieldVector3D(org.hipparchus.geometry.euclidean.threed.FieldVector3D) ClassicalRungeKuttaIntegrator(org.hipparchus.ode.nonstiff.ClassicalRungeKuttaIntegrator) OrekitStepInterpolator(org.orekit.propagation.sampling.OrekitStepInterpolator) FastMath(org.hipparchus.util.FastMath) AdditionalEquations(org.orekit.propagation.integration.AdditionalEquations) Before(org.junit.Before) Constants(org.orekit.utils.Constants) DTM2000(org.orekit.forces.drag.atmosphere.DTM2000) BoundedPropagator(org.orekit.propagation.BoundedPropagator) Vector3D(org.hipparchus.geometry.euclidean.threed.Vector3D) OrekitMatchers(org.orekit.OrekitMatchers) IOException(java.io.IOException) Test(org.junit.Test) GravityFieldFactory(org.orekit.forces.gravity.potential.GravityFieldFactory) MarshallSolarActivityFutureEstimation(org.orekit.forces.drag.atmosphere.data.MarshallSolarActivityFutureEstimation) ExecutionException(java.util.concurrent.ExecutionException) Consumer(java.util.function.Consumer) Field(org.hipparchus.Field) OrekitMessages(org.orekit.errors.OrekitMessages) EventHandler(org.orekit.propagation.events.handlers.EventHandler) OneAxisEllipsoid(org.orekit.bodies.OneAxisEllipsoid) OrekitException(org.orekit.errors.OrekitException) CelestialBodyFactory(org.orekit.bodies.CelestialBodyFactory) TimeScalesFactory(org.orekit.time.TimeScalesFactory) IsotropicDrag(org.orekit.forces.drag.IsotropicDrag) LocalizedCoreFormats(org.hipparchus.exception.LocalizedCoreFormats) Assert(org.junit.Assert) AbstractDetector(org.orekit.propagation.events.AbstractDetector) HolmesFeatherstoneAttractionModel(org.orekit.forces.gravity.HolmesFeatherstoneAttractionModel) AbsoluteDate(org.orekit.time.AbsoluteDate) Frame(org.orekit.frames.Frame) CartesianOrbit(org.orekit.orbits.CartesianOrbit) EquinoctialOrbit(org.orekit.orbits.EquinoctialOrbit) CartesianOrbit(org.orekit.orbits.CartesianOrbit) KeplerianOrbit(org.orekit.orbits.KeplerianOrbit) Orbit(org.orekit.orbits.Orbit) ArrayList(java.util.ArrayList) TimeScale(org.orekit.time.TimeScale) AbsoluteDate(org.orekit.time.AbsoluteDate) GRGSFormatReader(org.orekit.forces.gravity.potential.GRGSFormatReader) SpacecraftState(org.orekit.propagation.SpacecraftState) FieldSpacecraftState(org.orekit.propagation.FieldSpacecraftState) KeplerianOrbit(org.orekit.orbits.KeplerianOrbit) OrekitException(org.orekit.errors.OrekitException) Test(org.junit.Test)

Example 30 with Orbit

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

the class NumericalPropagatorTest method testIssue157.

@Test
public void testIssue157() throws OrekitException {
    try {
        Orbit orbit = new KeplerianOrbit(13378000, 0.05, 0, 0, FastMath.PI, 0, PositionAngle.MEAN, FramesFactory.getTOD(false), new AbsoluteDate(2003, 5, 6, TimeScalesFactory.getUTC()), Constants.EIGEN5C_EARTH_MU);
        NumericalPropagator.tolerances(1.0, orbit, OrbitType.KEPLERIAN);
        Assert.fail("an exception should have been thrown");
    } catch (OrekitException pe) {
        Assert.assertEquals(OrekitMessages.SINGULAR_JACOBIAN_FOR_ORBIT_TYPE, pe.getSpecifier());
    }
}
Also used : EquinoctialOrbit(org.orekit.orbits.EquinoctialOrbit) CartesianOrbit(org.orekit.orbits.CartesianOrbit) KeplerianOrbit(org.orekit.orbits.KeplerianOrbit) Orbit(org.orekit.orbits.Orbit) KeplerianOrbit(org.orekit.orbits.KeplerianOrbit) OrekitException(org.orekit.errors.OrekitException) AbsoluteDate(org.orekit.time.AbsoluteDate) 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