/* Copyright 2002-2017 CS Systèmes d'Information
* Licensed to CS Systèmes d'Information (CS) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* CS licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.orekit.propagation.analytical;
import java.io.IOException;
import org.hipparchus.Field;
import org.hipparchus.RealFieldElement;
import org.hipparchus.exception.DummyLocalizable;
import org.hipparchus.exception.LocalizedCoreFormats;
import org.hipparchus.geometry.euclidean.threed.FieldVector3D;
import org.hipparchus.util.Decimal64Field;
import org.hipparchus.util.FastMath;
import org.hipparchus.util.MathUtils;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.orekit.Utils;
import org.orekit.attitudes.FieldAttitude;
import org.orekit.attitudes.FieldAttitudeProvider;
import org.orekit.bodies.BodyShape;
import org.orekit.bodies.FieldGeodeticPoint;
import org.orekit.bodies.GeodeticPoint;
import org.orekit.bodies.OneAxisEllipsoid;
import org.orekit.errors.OrekitException;
import org.orekit.frames.Frame;
import org.orekit.frames.FramesFactory;
import org.orekit.frames.TopocentricFrame;
import org.orekit.orbits.FieldCircularOrbit;
import org.orekit.orbits.FieldEquinoctialOrbit;
import org.orekit.orbits.FieldKeplerianOrbit;
import org.orekit.orbits.FieldOrbit;
import org.orekit.orbits.PositionAngle;
import org.orekit.propagation.FieldBoundedPropagator;
import org.orekit.propagation.FieldPropagator;
import org.orekit.propagation.FieldSpacecraftState;
import org.orekit.propagation.events.FieldAbstractDetector;
import org.orekit.propagation.events.FieldAltitudeDetector;
import org.orekit.propagation.events.FieldApsideDetector;
import org.orekit.propagation.events.FieldDateDetector;
import org.orekit.propagation.events.FieldElevationDetector;
//import org.orekit.propagation.events.AltitudeDetector;
//import org.orekit.propagation.events.ApsideDetector;
//import org.orekit.propagation.events.DateDetector;
//import org.orekit.propagation.events.ElevationDetector;
import org.orekit.propagation.events.FieldNodeDetector;
import org.orekit.propagation.events.handlers.FieldContinueOnEvent;
import org.orekit.propagation.sampling.FieldOrekitFixedStepHandler;
import org.orekit.propagation.sampling.FieldOrekitStepHandler;
import org.orekit.propagation.sampling.FieldOrekitStepHandlerMultiplexer;
import org.orekit.propagation.sampling.FieldOrekitStepInterpolator;
import org.orekit.time.FieldAbsoluteDate;
import org.orekit.time.TimeScale;
import org.orekit.time.TimeScalesFactory;
import org.orekit.utils.Constants;
import org.orekit.utils.FieldPVCoordinates;
import org.orekit.utils.FieldPVCoordinatesProvider;
import org.orekit.utils.IERSConventions;
public class FieldKeplerianPropagatorTest {
// Body mu
private double mu;
@Test
public void testSameDateCartesian() throws OrekitException, ClassNotFoundException, IOException{
doTestSameDateCartesian(Decimal64Field.getInstance());
}
@Test
public void testSameDateKeplerian() throws OrekitException, ClassNotFoundException, IOException{
doTestSameDateKeplerian(Decimal64Field.getInstance());
}
@Test
public void testPropagatedCartesian() throws OrekitException, ClassNotFoundException, IOException{
doTestPropagatedCartesian(Decimal64Field.getInstance());
}
@Test
public void testPropagatedKeplerian() throws OrekitException, ClassNotFoundException, IOException{
doTestPropagatedKeplerian(Decimal64Field.getInstance());
}
@Test
public void testAscendingNode() throws OrekitException, ClassNotFoundException, IOException{
doTestAscendingNode(Decimal64Field.getInstance());
}
@Test
public void testStopAtTargetDate() throws OrekitException, ClassNotFoundException, IOException{
doTestStopAtTargetDate(Decimal64Field.getInstance());
}
@Test
public void testFixedStep() throws OrekitException, ClassNotFoundException, IOException{
doTestFixedStep(Decimal64Field.getInstance());
}
@Test
public void testVariableStep() throws OrekitException, ClassNotFoundException, IOException{
doTestVariableStep(Decimal64Field.getInstance());
}
@Test
public void testEphemeris() throws OrekitException, ClassNotFoundException, IOException{
doTestEphemeris(Decimal64Field.getInstance());}
@Test
public void testIssue14() throws OrekitException, ClassNotFoundException, IOException{
doTestIssue14(Decimal64Field.getInstance());
}
@Test
public void testIssue107() throws OrekitException, ClassNotFoundException, IOException{
doTestIssue107(Decimal64Field.getInstance());
}
@Test
public void testMu() throws OrekitException, ClassNotFoundException, IOException{
doTestMu(Decimal64Field.getInstance());
}
@Test(expected = OrekitException.class)
public void testWrongAttitude() throws OrekitException{
doTestWrongAttitude(Decimal64Field.getInstance());
}
@Test(expected = OrekitException.class)
public void testStepException() throws OrekitException{
doTestStepException(Decimal64Field.getInstance());
}
@Test(expected = OrekitException.class)
public void testWrappedAttitudeException() throws OrekitException{
doTestWrappedAttitudeException(Decimal64Field.getInstance());
}
@Test
public void testPerigee() throws OrekitException{
doTestPerigee(Decimal64Field.getInstance());
}
@Test
public void testAltitude() throws OrekitException{
doTestAltitude(Decimal64Field.getInstance());
}
@Test
public void testDate() throws OrekitException{
doTestDate(Decimal64Field.getInstance());
}
@Test
public void testSetting() throws OrekitException{
doTestSetting(Decimal64Field.getInstance());
}
private <T extends RealFieldElement<T>> void doTestSameDateCartesian(Field<T> field) throws OrekitException {
T zero = field.getZero();
// Definition of initial conditions with position and velocity
//------------------------------------------------------------
FieldVector3D<T> position = new FieldVector3D<T>(zero.add(7.0e6), zero.add(1.0e6), zero.add(4.0e6));
FieldVector3D<T> velocity = new FieldVector3D<T>(zero.add(-500.0), zero.add(8000.0), zero.add(1000.0));
FieldAbsoluteDate<T> initDate = new FieldAbsoluteDate<T>(field).shiftedBy(584.);
FieldOrbit<T> initialOrbit = new FieldEquinoctialOrbit<T>(new FieldPVCoordinates<T>(position, velocity),
FramesFactory.getEME2000(), initDate, mu);
// Extrapolator definition
// -----------------------
FieldKeplerianPropagator<T> extrapolator = new FieldKeplerianPropagator<T>(initialOrbit);
// Extrapolation at the initial date
// ---------------------------------
T delta_t = zero; // extrapolation duration in seconds
FieldAbsoluteDate<T> extrapDate = initDate.shiftedBy(delta_t);
FieldSpacecraftState<T> finalOrbit = extrapolator.propagate(extrapDate);
T a = finalOrbit.getA();
// another way to compute n
T n = a.pow(3).reciprocal().multiply(finalOrbit.getMu()).sqrt();
Assert.assertEquals(n.getReal()*delta_t.getReal(),
finalOrbit.getLM().getReal() - initialOrbit.getLM().getReal(),
Utils.epsilonTest * FastMath.abs(n.getReal()*delta_t.getReal()));
Assert.assertEquals(MathUtils.normalizeAngle(finalOrbit.getLM().getReal(),initialOrbit.getLM().getReal()), initialOrbit.getLM().getReal(),
Utils.epsilonAngle * FastMath.abs(initialOrbit.getLM().getReal()));
Assert.assertEquals(finalOrbit.getA().getReal(), initialOrbit.getA().getReal(),
Utils.epsilonTest * initialOrbit.getA().getReal());
Assert.assertEquals(finalOrbit.getE().getReal(), initialOrbit.getE().getReal(),
Utils.epsilonE * initialOrbit.getE().getReal());
Assert.assertEquals(MathUtils.normalizeAngle(finalOrbit.getI().getReal(), initialOrbit.getI().getReal()),
initialOrbit.getI().getReal(), Utils.epsilonAngle * FastMath.abs(initialOrbit.getI().getReal()));
}
private <T extends RealFieldElement<T>> void doTestSameDateKeplerian(Field<T> field) throws OrekitException {
T zero = field.getZero();
// Definition of initial conditions with keplerian parameters
//-----------------------------------------------------------
FieldAbsoluteDate<T> initDate = new FieldAbsoluteDate<T>(field).shiftedBy(584.);
FieldOrbit<T> initialOrbit = new FieldKeplerianOrbit<T>(zero.add(7209668.0), zero.add(0.5e-4), zero.add(1.7), zero.add(2.1), zero.add(2.9),
zero.add(6.2), PositionAngle.TRUE,
FramesFactory.getEME2000(), initDate, mu);
// Extrapolator definition
// -----------------------
FieldKeplerianPropagator<T> extrapolator = new FieldKeplerianPropagator<T>(initialOrbit);
// Extrapolation at the initial date
// ---------------------------------
T delta_t = zero; // extrapolation duration in seconds
FieldAbsoluteDate<T> extrapDate = initDate.shiftedBy(delta_t);
FieldSpacecraftState<T> finalOrbit = extrapolator.propagate(extrapDate);
T a = finalOrbit.getA();
// another way to compute n
T n = a.pow(3).reciprocal().multiply(finalOrbit.getMu()).sqrt();
Assert.assertEquals(n.getReal()*delta_t.getReal(),
finalOrbit.getLM().getReal() - initialOrbit.getLM().getReal(),
Utils.epsilonTest * FastMath.max(100.,FastMath.abs(n.getReal()*delta_t.getReal())));
Assert.assertEquals(MathUtils.normalizeAngle(finalOrbit.getLM().getReal(),initialOrbit.getLM().getReal()),
initialOrbit.getLM().getReal(), Utils.epsilonAngle * FastMath.abs(initialOrbit.getLM().getReal()));
Assert.assertEquals(finalOrbit.getA().getReal(), initialOrbit.getA().getReal(),
Utils.epsilonTest * initialOrbit.getA().getReal());
Assert.assertEquals(finalOrbit.getE().getReal(), initialOrbit.getE().getReal(),
Utils.epsilonE * initialOrbit.getE().getReal());
Assert.assertEquals(MathUtils.normalizeAngle(finalOrbit.getI().getReal(),initialOrbit.getI().getReal()),
initialOrbit.getI().getReal(),
Utils.epsilonAngle * FastMath.abs(initialOrbit.getI().getReal()));
}
private <T extends RealFieldElement<T>> void doTestPropagatedCartesian(Field<T> field) throws OrekitException {
T zero = field.getZero();
// Definition of initial conditions with position and velocity
//------------------------------------------------------------
FieldVector3D<T> position = new FieldVector3D<T>(zero.add(7.0e6), zero.add(1.0e6), zero.add(4.0e6));
FieldVector3D<T> velocity = new FieldVector3D<T>(zero.add(-500.0), zero.add(8000.0), zero.add(1000.0));
double mu = 3.9860047e14;
FieldAbsoluteDate<T> initDate = new FieldAbsoluteDate<T>(field).shiftedBy(584.);
FieldOrbit<T> initialOrbit = new FieldEquinoctialOrbit<T>(new FieldPVCoordinates<T>(position, velocity),
FramesFactory.getEME2000(), initDate, mu);
// Extrapolator definition
// -----------------------
FieldKeplerianPropagator<T> extrapolator = new FieldKeplerianPropagator<T>(initialOrbit);
// Extrapolation at a final date different from initial date
// ---------------------------------------------------------
T delta_t = zero.add(100000.0); // extrapolation duration in seconds
FieldAbsoluteDate<T> extrapDate = initDate.shiftedBy(delta_t);
FieldSpacecraftState<T> finalOrbit = extrapolator.propagate(extrapDate);
// computation of (M final - M initial) with another method
T a = finalOrbit.getA();
// another way to compute n
T n = a.pow(3).reciprocal().multiply(finalOrbit.getMu()).sqrt();
Assert.assertEquals(n.getReal() * delta_t.getReal(),
finalOrbit.getLM().getReal() - initialOrbit.getLM().getReal(),
Utils.epsilonAngle);
// computation of M final orbit
T LM = finalOrbit.getLE().subtract(
finalOrbit.getEquinoctialEx().multiply(finalOrbit.getLE().sin())).add(
finalOrbit.getEquinoctialEy().multiply(finalOrbit.getLE().cos()));
Assert.assertEquals(LM.getReal() , finalOrbit.getLM().getReal() , Utils.epsilonAngle);
// test of tan ((LE - Lv)/2) :
Assert.assertEquals(FastMath.tan((finalOrbit.getLE().getReal() - finalOrbit.getLv().getReal())/2.),
tangLEmLv(finalOrbit.getLv(),finalOrbit.getEquinoctialEx(),finalOrbit.getEquinoctialEy()).getReal(),
Utils.epsilonAngle);
// test of evolution of M vs E: LM = LE - ex*sin(LE) + ey*cos(LE)
// with ex and ey the same for initial and final orbit
T deltaM = finalOrbit.getLM().subtract(initialOrbit.getLM());
T deltaE = finalOrbit.getLE().subtract(initialOrbit.getLE());
T delta = finalOrbit.getEquinoctialEx().multiply(finalOrbit.getLE().sin().subtract(initialOrbit.getLE().sin())).subtract(
finalOrbit.getEquinoctialEy().multiply(finalOrbit.getLE().cos().subtract(initialOrbit.getLE().cos())));
Assert.assertEquals(deltaM.getReal(), deltaE.getReal() - delta.getReal(), Utils.epsilonAngle);
// the orbital elements except for Mean/True/Eccentric latitude arguments are the same
Assert.assertEquals(finalOrbit.getA().getReal(), initialOrbit.getA().getReal(), Utils.epsilonTest * initialOrbit.getA().getReal());
Assert.assertEquals(finalOrbit.getEquinoctialEx().getReal(), initialOrbit.getEquinoctialEx().getReal(), Utils.epsilonE);
Assert.assertEquals(finalOrbit.getEquinoctialEy().getReal(), initialOrbit.getEquinoctialEy().getReal(), Utils.epsilonE);
Assert.assertEquals(finalOrbit.getHx().getReal(), initialOrbit.getHx().getReal(), Utils.epsilonAngle);
Assert.assertEquals(finalOrbit.getHy().getReal(), initialOrbit.getHy().getReal(), Utils.epsilonAngle);
// for final orbit
T ex = finalOrbit.getEquinoctialEx();
T ey = finalOrbit.getEquinoctialEy();
T hx = finalOrbit.getHx();
T hy = finalOrbit.getHy();
T LE = finalOrbit.getLE();
T ex2 = ex.multiply(ex);
T ey2 = ey.multiply(ey);
T hx2 = hx.multiply(hx);
T hy2 = hy.multiply(hy);
T h2p1 = hx2.add(1.).add(hy2);
T beta = ex2.negate().add(1.).subtract(ey2).sqrt().add(1.).reciprocal();
T x3 = ex.negate().add(beta.negate().multiply(ey2).add(1.).multiply(LE.cos())).add(beta.multiply(ex).multiply(ey).multiply(LE.sin()));
T y3 = ey.negate().add(beta.negate().multiply(ex2).add(1.).multiply(LE.sin())).add(beta.multiply(ex).multiply(ey).multiply(LE.cos()));
// ey.negate.add(beta.negate().multiply(ex2).add(1.).multiply(LE.sin())).add(beta.multiply(ex).multiply(ey).multiply(LE.cos()));
FieldVector3D<T> U = new FieldVector3D<T>(hx2.add(1.).subtract(hy2).divide(h2p1),
hx.multiply(2.).multiply(hy).divide(h2p1),
hy.multiply(-2.).divide(h2p1));
FieldVector3D<T> V = new FieldVector3D<T>(hx.multiply(2.).multiply(hy).divide(h2p1),
hy2.subtract(hx2).add(1).divide(h2p1),
hx.multiply(2.).divide(h2p1));
FieldVector3D<T> r = new FieldVector3D<T>(finalOrbit.getA(),(new FieldVector3D<T>(x3,U,y3,V)));
Assert.assertEquals(finalOrbit.getPVCoordinates().getPosition().getNorm().getReal(), r.getNorm().getReal(), Utils.epsilonTest * r.getNorm().getReal());
}
private <T extends RealFieldElement<T>> void doTestPropagatedKeplerian(Field<T> field) throws OrekitException {
T zero = field.getZero();
// Definition of initial conditions with keplerian parameters
//-----------------------------------------------------------
FieldAbsoluteDate<T> initDate = new FieldAbsoluteDate<T>(field).shiftedBy(584.);
FieldOrbit<T> initialOrbit = new FieldKeplerianOrbit<T>(zero.add(7209668.0), zero.add(0.5e-4), zero.add(1.7), zero.add(2.1), zero.add(2.9),
zero.add(6.2), PositionAngle.TRUE,
FramesFactory.getEME2000(), initDate, mu);
// Extrapolator definition
// -----------------------
FieldKeplerianPropagator<T> extrapolator = new FieldKeplerianPropagator<T>(initialOrbit);
// Extrapolation at a final date different from initial date
// ---------------------------------------------------------
T delta_t = zero.add(100000.0); // extrapolation duration in seconds
FieldAbsoluteDate<T> extrapDate = initDate.shiftedBy(delta_t);
FieldSpacecraftState<T> finalOrbit = extrapolator.propagate(extrapDate);
Assert.assertEquals(6092.3362422560844633, finalOrbit.getKeplerianPeriod().getReal(), 1.0e-12);
Assert.assertEquals(0.001031326088602888358, finalOrbit.getKeplerianMeanMotion().getReal(), 1.0e-16);
// computation of (M final - M initial) with another method
T a = finalOrbit.getA();
// another way to compute n
T n = a.pow(3).reciprocal().multiply(finalOrbit.getMu()).sqrt();
Assert.assertEquals(n.getReal() * delta_t.getReal(),
finalOrbit.getLM().getReal() - initialOrbit.getLM().getReal(),
Utils.epsilonAngle);
// computation of M final orbit
T LM = finalOrbit.getLE().subtract(
finalOrbit.getEquinoctialEx().multiply(finalOrbit.getLE().sin())).add(
finalOrbit.getEquinoctialEy().multiply(finalOrbit.getLE().cos()));
Assert.assertEquals(LM.getReal() , finalOrbit.getLM().getReal() , Utils.epsilonAngle);
// test of tan ((LE - Lv)/2) :
Assert.assertEquals(FastMath.tan((finalOrbit.getLE().getReal() - finalOrbit.getLv().getReal())/2.),
tangLEmLv(finalOrbit.getLv(),finalOrbit.getEquinoctialEx(),finalOrbit.getEquinoctialEy()).getReal(),
Utils.epsilonAngle);
// test of evolution of M vs E: LM = LE - ex*sin(LE) + ey*cos(LE)
// with ex and ey the same for initial and final orbit
T deltaM = finalOrbit.getLM().subtract(initialOrbit.getLM());
T deltaE = finalOrbit.getLE().subtract(initialOrbit.getLE());
T delta = finalOrbit.getEquinoctialEx().multiply(finalOrbit.getLE().sin().subtract(initialOrbit.getLE().sin())).subtract(
finalOrbit.getEquinoctialEy().multiply(finalOrbit.getLE().cos().subtract(initialOrbit.getLE().cos())));
Assert.assertEquals(deltaM.getReal(), deltaE.getReal() - delta.getReal(), Utils.epsilonAngle);
// the orbital elements except for Mean/True/Eccentric latitude arguments are the same
Assert.assertEquals(finalOrbit.getA().getReal(), initialOrbit.getA().getReal(), Utils.epsilonTest * initialOrbit.getA().getReal());
Assert.assertEquals(finalOrbit.getEquinoctialEx().getReal(), initialOrbit.getEquinoctialEx().getReal(), Utils.epsilonE);
Assert.assertEquals(finalOrbit.getEquinoctialEy().getReal(), initialOrbit.getEquinoctialEy().getReal(), Utils.epsilonE);
Assert.assertEquals(finalOrbit.getHx().getReal(), initialOrbit.getHx().getReal(), Utils.epsilonAngle);
Assert.assertEquals(finalOrbit.getHy().getReal(), initialOrbit.getHy().getReal(), Utils.epsilonAngle);
// for final orbit
T ex = finalOrbit.getEquinoctialEx();
T ey = finalOrbit.getEquinoctialEy();
T hx = finalOrbit.getHx();
T hy = finalOrbit.getHy();
T LE = finalOrbit.getLE();
T ex2 = ex.multiply(ex);
T ey2 = ey.multiply(ey);
T hx2 = hx.multiply(hx);
T hy2 = hy.multiply(hy);
T h2p1 = hx2.add(hy2).add(1.);
T beta = ex2.negate().add(1.).subtract(ey2).sqrt().add(1.).reciprocal();
T x3 = ex.negate().add(beta.negate().multiply(ey2).add(1.).multiply(LE.cos())).add(beta.multiply(ex).multiply(ey).multiply(LE.sin()));
T y3 = ey.negate().add(beta.negate().multiply(ex2).add(1.).multiply(LE.sin())).add(beta.multiply(ex).multiply(ey).multiply(LE.cos()));
FieldVector3D<T> U = new FieldVector3D<T>(hx2.add(1.).subtract(hy2).divide(h2p1),
hx.multiply(2.).multiply(hy).divide(h2p1),
hy.multiply(-2).divide(h2p1));
FieldVector3D<T> V = new FieldVector3D<T>(hx.multiply(2).multiply(hy).divide(h2p1),
hy2.subtract(hx2).add(1.).divide(h2p1),
hx.multiply(2).divide(h2p1));
FieldVector3D<T> r = new FieldVector3D<T>(finalOrbit.getA(),(new FieldVector3D<T>(x3,U,y3,V)));
Assert.assertEquals(finalOrbit.getPVCoordinates().getPosition().getNorm().getReal(), r.getNorm().getReal(), Utils.epsilonTest * r.getNorm().getReal());
}
private <T extends RealFieldElement<T>> void doTestWrongAttitude(Field<T> field) throws OrekitException {
T zero = field.getZero();
FieldKeplerianOrbit<T> orbit =
new FieldKeplerianOrbit<T>(zero.add(1.0e10), zero.add(1.0e-4), zero.add(1.0e-2), zero, zero, zero, PositionAngle.TRUE,
FramesFactory.getEME2000(), new FieldAbsoluteDate<T>(field), 3.986004415e14);
FieldAttitudeProvider<T> wrongLaw = new FieldAttitudeProvider<T>() {
@Override
public FieldAttitude<T> getAttitude(FieldPVCoordinatesProvider<T> pvProv, FieldAbsoluteDate<T> date, Frame frame) throws OrekitException {
throw new OrekitException(new DummyLocalizable("gasp"), new RuntimeException());
}
};
FieldKeplerianPropagator<T> propagator = new FieldKeplerianPropagator<T>(orbit, wrongLaw);
propagator.propagate(new FieldAbsoluteDate<T>(field).shiftedBy(10.0));
}
private <T extends RealFieldElement<T>> void doTestStepException(Field<T> field) throws OrekitException {
T zero = field.getZero();
final FieldKeplerianOrbit<T> orbit =
new FieldKeplerianOrbit<T>(zero.add(7.8e6), zero.add(0.032), zero.add(0.4), zero.add(0.1), zero.add(0.2), zero.add(0.3), PositionAngle.TRUE,
FramesFactory.getEME2000(), new FieldAbsoluteDate<T>(field), 3.986004415e14);
FieldKeplerianPropagator<T> propagator = new FieldKeplerianPropagator<T>(orbit);
FieldOrekitStepHandlerMultiplexer<T> multiplexer = new FieldOrekitStepHandlerMultiplexer<T>();
propagator.setMasterMode(multiplexer);
multiplexer.add(new FieldOrekitStepHandler<T>() {
public void init(FieldSpacecraftState<T> s0, FieldAbsoluteDate<T> t) {
}
public void handleStep(FieldOrekitStepInterpolator<T> interpolator,
boolean isLast) throws OrekitException {
if (isLast) {
throw new OrekitException((Throwable) null, new DummyLocalizable("dummy error"));
}
}
});
propagator.propagate(orbit.getDate().shiftedBy(-3600));
}
private <T extends RealFieldElement<T>> void doTestWrappedAttitudeException(Field<T> field) throws OrekitException {
T zero = field.getZero();
final FieldKeplerianOrbit<T> orbit =
new FieldKeplerianOrbit<T>(zero.add(7.8e6), zero.add(0.032), zero.add(0.4), zero.add(0.1), zero.add(0.2), zero.add(0.3), PositionAngle.TRUE,
FramesFactory.getEME2000(), new FieldAbsoluteDate<T>(field), 3.986004415e14);
FieldKeplerianPropagator<T> propagator = new FieldKeplerianPropagator<T>(orbit,
new FieldAttitudeProvider<T>() {
public FieldAttitude<T> getAttitude(FieldPVCoordinatesProvider<T> pvProv, FieldAbsoluteDate<T> date,
Frame frame)
throws OrekitException {
throw new OrekitException((Throwable) null,
new DummyLocalizable("dummy error"));
}
});
propagator.propagate(orbit.getDate().shiftedBy(10.09));
}
private <T extends RealFieldElement<T>> void doTestAscendingNode(Field<T> field) throws OrekitException {
T zero = field.getZero();
final FieldKeplerianOrbit<T> orbit =
new FieldKeplerianOrbit<T>(zero.add(7.8e6), zero.add(0.032), zero.add(0.4), zero.add(0.1), zero.add(0.2), zero.add(0.3), PositionAngle.TRUE,
FramesFactory.getEME2000(), new FieldAbsoluteDate<T>(field), 3.986004415e14);
FieldKeplerianPropagator<T> propagator = new FieldKeplerianPropagator<T>(orbit);
propagator.addEventDetector(new FieldNodeDetector<T>(orbit, FramesFactory.getITRF(IERSConventions.IERS_2010, true)));
FieldAbsoluteDate<T> farTarget = new FieldAbsoluteDate<T>(field).shiftedBy(10000.0);
FieldSpacecraftState<T> propagated = propagator.propagate(farTarget);
FieldPVCoordinates<T> pv = propagated.getPVCoordinates(FramesFactory.getITRF(IERSConventions.IERS_2010, true));
Assert.assertTrue(farTarget.durationFrom(propagated.getDate()).getReal() > 3500.0);
Assert.assertTrue(farTarget.durationFrom(propagated.getDate()).getReal() < 4000.0);
Assert.assertEquals(0, pv.getPosition().getZ().getReal(), 2.0e-6);
Assert.assertTrue(pv.getVelocity().getZ().getReal() > 0);
}
private <T extends RealFieldElement<T>> void doTestStopAtTargetDate(Field<T> field) throws OrekitException {
T zero = field.getZero();
final FieldKeplerianOrbit<T> orbit =
new FieldKeplerianOrbit<T>(zero.add(7.8e6), zero.add(0.032), zero.add(0.4), zero.add(0.1), zero.add(0.2), zero.add(0.3), PositionAngle.TRUE,
FramesFactory.getEME2000(), new FieldAbsoluteDate<T>(field), 3.986004415e14);
FieldKeplerianPropagator<T> propagator = new FieldKeplerianPropagator<T>(orbit);
Frame itrf = FramesFactory.getITRF(IERSConventions.IERS_2010, true);
propagator.addEventDetector(new FieldNodeDetector<T>(orbit, itrf).withHandler(new FieldContinueOnEvent<FieldNodeDetector<T>, T>()));
FieldAbsoluteDate<T> farTarget = orbit.getDate().shiftedBy(10000.0);
FieldSpacecraftState<T> propagated = propagator.propagate(farTarget);
Assert.assertEquals(0.0, FastMath.abs(farTarget.durationFrom(propagated.getDate()).getReal()), 1.0e-3);
}
private <T extends RealFieldElement<T>> void doTestPerigee(Field<T> field) throws OrekitException {
T zero = field.getZero();
final FieldKeplerianOrbit<T> orbit =
new FieldKeplerianOrbit<T>(zero.add(7.8e6), zero.add(0.032), zero.add(0.4), zero.add(0.1), zero.add(0.2), zero.add(0.3), PositionAngle.TRUE,
FramesFactory.getEME2000(), new FieldAbsoluteDate<T>(field), 3.986004415e14);
FieldKeplerianPropagator<T> propagator = new FieldKeplerianPropagator<T>(orbit);
propagator.addEventDetector(new FieldApsideDetector<>(orbit));
FieldAbsoluteDate<T> farTarget = new FieldAbsoluteDate<T>(field).shiftedBy(10000.0);
FieldSpacecraftState<T> propagated = propagator.propagate(farTarget);
FieldPVCoordinates<T> pv = propagated.getPVCoordinates(FramesFactory.getITRF(IERSConventions.IERS_2010, true));
Assert.assertTrue(farTarget.durationFrom(propagated.getDate()).getReal() > 3000.0);
Assert.assertTrue(farTarget.durationFrom(propagated.getDate()).getReal() < 3500.0);
Assert.assertEquals(orbit.getA().getReal() * (1.0 - orbit.getE().getReal()), pv.getPosition().getNorm().getReal(), 1.0e-6);
}
private <T extends RealFieldElement<T>> void doTestAltitude(Field<T> field) throws OrekitException {
T zero = field.getZero();
final FieldKeplerianOrbit<T> orbit =
new FieldKeplerianOrbit<T>(zero.add(7.8e6), zero.add(0.032), zero.add(0.4), zero.add(0.1), zero.add(0.2), zero.add(0.3), PositionAngle.TRUE,
FramesFactory.getEME2000(), new FieldAbsoluteDate<T>(field), 3.986004415e14);
FieldKeplerianPropagator<T> propagator = new FieldKeplerianPropagator<T>(orbit);
BodyShape bodyShape =
new OneAxisEllipsoid(6378137.0, 1.0 / 298.257222101, FramesFactory.getITRF(IERSConventions.IERS_2010, true));
FieldAltitudeDetector<T> detector =
new FieldAltitudeDetector<>(orbit.getKeplerianPeriod().multiply(0.05),
zero.add(1500000), bodyShape);
Assert.assertEquals(1500000, detector.getAltitude().getReal(), 1.0e-12);
propagator.addEventDetector(detector);
FieldAbsoluteDate<T> farTarget = new FieldAbsoluteDate<T>(field).shiftedBy(10000.0);
FieldSpacecraftState<T> propagated = propagator.propagate(farTarget);
Assert.assertTrue(farTarget.durationFrom(propagated.getDate()).getReal() > 5400.0);
Assert.assertTrue(farTarget.durationFrom(propagated.getDate()).getReal() < 5500.0);
FieldGeodeticPoint<T> gp = bodyShape.transform(propagated.getPVCoordinates().getPosition(),
propagated.getFrame(), propagated.getDate());
Assert.assertEquals(1500000, gp.getAltitude().getReal(), 0.1);
}
private <T extends RealFieldElement<T>> void doTestDate(Field<T> field) throws OrekitException {
T zero = field.getZero();
final FieldKeplerianOrbit<T> orbit =
new FieldKeplerianOrbit<T>(zero.add(7.8e6), zero.add(0.032), zero.add(0.4), zero.add(0.1), zero.add(0.2), zero.add(0.3), PositionAngle.TRUE,
FramesFactory.getEME2000(), new FieldAbsoluteDate<T>(field), 3.986004415e14);
FieldKeplerianPropagator<T> propagator = new FieldKeplerianPropagator<T>(orbit);
final FieldAbsoluteDate<T> stopDate = new FieldAbsoluteDate<T>(field).shiftedBy(500.0);
propagator.addEventDetector(new FieldDateDetector<>(stopDate));
FieldAbsoluteDate<T> farTarget = new FieldAbsoluteDate<T>(field).shiftedBy(10000.0);
FieldSpacecraftState<T> propagated = propagator.propagate(farTarget);
Assert.assertEquals(0, stopDate.durationFrom(propagated.getDate()).getReal(), 1.0e-10);
}
private <T extends RealFieldElement<T>> void doTestSetting(Field<T> field) throws OrekitException {
T zero = field.getZero();
final FieldKeplerianOrbit<T> orbit =
new FieldKeplerianOrbit<T>(zero.add(7.8e6), zero.add(0.032), zero.add(0.4), zero.add(0.1), zero.add(0.2), zero.add(0.3), PositionAngle.TRUE,
FramesFactory.getEME2000(), new FieldAbsoluteDate<T>(field), 3.986004415e14);
FieldKeplerianPropagator<T> propagator = new FieldKeplerianPropagator<T>(orbit);
final OneAxisEllipsoid earthShape =
new OneAxisEllipsoid(6378136.460, 1 / 298.257222101, FramesFactory.getITRF(IERSConventions.IERS_2010, true));
final TopocentricFrame topo =
new TopocentricFrame(earthShape, new GeodeticPoint(0.389, -2.962, 0), null);
propagator.addEventDetector(new FieldElevationDetector<>(zero.add(60),
zero.add(FieldAbstractDetector.DEFAULT_THRESHOLD),
topo).withConstantElevation(0.09));
FieldAbsoluteDate<T> farTarget = new FieldAbsoluteDate<T>(field).shiftedBy(10000.0);
FieldSpacecraftState<T> propagated = propagator.propagate(farTarget);
final double elevation = topo.getElevation(propagated.getPVCoordinates().getPosition().toVector3D(),
propagated.getFrame(),
propagated.getDate().toAbsoluteDate());
final T zVelocity = propagated.getPVCoordinates(topo).getVelocity().getZ();
Assert.assertTrue(farTarget.durationFrom(propagated.getDate()).getReal() > 7800.0);
Assert.assertTrue(farTarget.durationFrom(propagated.getDate()).getReal() < 7900.0);
Assert.assertEquals(0.09, elevation, 1.0e-9);
Assert.assertTrue(zVelocity.getReal() < 0);
}
private <T extends RealFieldElement<T>> void doTestFixedStep(Field<T> field) throws OrekitException {
T zero = field.getZero();
final FieldKeplerianOrbit<T> orbit =
new FieldKeplerianOrbit<T>(zero.add(7.8e6), zero.add(0.032), zero.add(0.4), zero.add(0.1), zero.add(0.2), zero.add(0.3), PositionAngle.TRUE,
FramesFactory.getEME2000(), new FieldAbsoluteDate<T>(field), 3.986004415e14);
FieldKeplerianPropagator<T> propagator = new FieldKeplerianPropagator<T>(orbit);
final T step = zero.add(100.0);
propagator.setMasterMode(step, new FieldOrekitFixedStepHandler<T>() {
private FieldAbsoluteDate<T> previous;
public void handleStep(FieldSpacecraftState<T> currentState, boolean isLast)
throws OrekitException {
if (previous != null) {
Assert.assertEquals(step.getReal(), currentState.getDate().durationFrom(previous).getReal(), 1.0e-10);
}
previous = currentState.getDate();
}
});
FieldAbsoluteDate<T> farTarget = new FieldAbsoluteDate<T>(field).shiftedBy(10000.0);
propagator.propagate(farTarget);
}
private <T extends RealFieldElement<T>> void doTestVariableStep(Field<T> field) throws OrekitException {
T zero = field.getZero();
final FieldKeplerianOrbit<T> orbit =
new FieldKeplerianOrbit<T>(zero.add(7.8e6), zero.add(0.032), zero.add(0.4), zero.add(0.1), zero.add(0.2), zero.add(0.3), PositionAngle.TRUE,
FramesFactory.getEME2000(), new FieldAbsoluteDate<T>(field), 3.986004415e14);
FieldKeplerianPropagator<T> propagator = new FieldKeplerianPropagator<T>(orbit);
final T step = orbit.getKeplerianPeriod().divide(100);
propagator.setMasterMode(new FieldOrekitStepHandler<T>() {
private FieldAbsoluteDate<T> previous;
public void init(FieldSpacecraftState<T> s0, FieldAbsoluteDate<T> t) {
}
public void handleStep(FieldOrekitStepInterpolator<T> interpolator,
boolean isLast) throws OrekitException {
if ((previous != null) && !isLast) {
Assert.assertEquals(step.getReal(), interpolator.getCurrentState().getDate().durationFrom(previous).getReal(), 1.0e-10);
}
previous = interpolator.getCurrentState().getDate();
}
});
FieldAbsoluteDate<T> farTarget = new FieldAbsoluteDate<T>(field).shiftedBy(10000.0);
propagator.propagate(farTarget);
}
private <T extends RealFieldElement<T>> void doTestEphemeris(Field<T> field) throws OrekitException {
T zero = field.getZero();
final FieldKeplerianOrbit<T> orbit =
new FieldKeplerianOrbit<T>(zero.add(7.8e6), zero.add(0.032), zero.add(0.4), zero.add(0.1), zero.add(0.2), zero.add(0.3), PositionAngle.TRUE,
FramesFactory.getEME2000(), new FieldAbsoluteDate<T>(field), 3.986004415e14);
FieldKeplerianPropagator<T> propagator = new FieldKeplerianPropagator<T>(orbit);
propagator.setEphemerisMode();
FieldAbsoluteDate<T> farTarget = new FieldAbsoluteDate<T>(field).shiftedBy(10000.0);
propagator.setEphemerisMode();
propagator.propagate(farTarget);
FieldBoundedPropagator<T> ephemeris = propagator.getGeneratedEphemeris();
Assert.assertEquals(0.0, ephemeris.getMinDate().durationFrom(orbit.getDate()).getReal(), 1.0e-10);
Assert.assertEquals(0.0, ephemeris.getMaxDate().durationFrom(farTarget).getReal(), 1.0e-10);
}
private <T extends RealFieldElement<T>> void doTestIssue14(Field<T> field) throws OrekitException {
T zero = field.getZero();
FieldAbsoluteDate<T> initialDate = new FieldAbsoluteDate<T>(field);
final FieldKeplerianOrbit<T> initialOrbit =
new FieldKeplerianOrbit<T>(zero.add(7.8e6), zero.add(0.032), zero.add(0.4), zero.add(0.1), zero.add(0.2), zero.add(0.3), PositionAngle.TRUE,
FramesFactory.getEME2000(), initialDate, 3.986004415e14);
FieldKeplerianPropagator<T> propagator = new FieldKeplerianPropagator<T>(initialOrbit);
propagator.setEphemerisMode();
propagator.propagate(initialDate.shiftedBy(initialOrbit.getKeplerianPeriod()));
FieldPVCoordinates<T> pv1 = propagator.getPVCoordinates(initialDate, FramesFactory.getEME2000());
propagator.setEphemerisMode();
propagator.propagate(initialDate.shiftedBy(initialOrbit.getKeplerianPeriod()));
FieldPVCoordinates<T> pv2 = propagator.getGeneratedEphemeris().getPVCoordinates(initialDate, FramesFactory.getEME2000());
Assert.assertEquals(0.0, pv1.getPosition().subtract(pv2.getPosition()).getNorm().getReal(), 1.0e-15);
Assert.assertEquals(0.0, pv1.getVelocity().subtract(pv2.getVelocity()).getNorm().getReal(), 1.0e-15);
}
private <T extends RealFieldElement<T>> void doTestIssue107(Field<T> field) throws OrekitException {
T zero = field.getZero();
final TimeScale utc = TimeScalesFactory.getUTC();
final FieldVector3D<T> position = new FieldVector3D<T>(zero.add(-6142438.668), zero.add(3492467.56), zero.add(-25767.257));
final FieldVector3D<T> velocity = new FieldVector3D<T>(zero.add(505.848),zero.add( 942.781), zero.add(7435.922));
final FieldAbsoluteDate<T> date = new FieldAbsoluteDate<T>(field, 2003, 9, 16, utc);
final FieldOrbit<T> orbit = new FieldCircularOrbit<T>(new FieldPVCoordinates<T>(position, velocity),
FramesFactory.getEME2000(), date, mu);
FieldPropagator<T> propagator = new FieldKeplerianPropagator<T>(orbit) {
FieldAbsoluteDate<T> lastDate = FieldAbsoluteDate.getPastInfinity(field);
protected FieldSpacecraftState<T> basicPropagate(final FieldAbsoluteDate<T> date) throws OrekitException {
if (date.compareTo(lastDate) < 0) {
throw new OrekitException(LocalizedCoreFormats.SIMPLE_MESSAGE,
"no backward propagation allowed");
}
lastDate = date;
return super.basicPropagate(date);
}
};
FieldSpacecraftState<T> finalState = propagator.propagate(date.shiftedBy(3600.0));
Assert.assertEquals(3600.0, finalState.getDate().durationFrom(date).getReal(), 1.0e-15);
}
private <T extends RealFieldElement<T>> void doTestMu(Field<T> field) throws OrekitException {
T zero = field.getZero();
final FieldKeplerianOrbit<T> orbit1 =
new FieldKeplerianOrbit<T>(zero.add(7.8e6), zero.add(0.032), zero.add(0.4), zero.add(0.1), zero.add(0.2), zero.add(0.3), PositionAngle.TRUE,
FramesFactory.getEME2000(), new FieldAbsoluteDate<T>(field),
Constants.WGS84_EARTH_MU);
final FieldKeplerianOrbit<T> orbit2 =
new FieldKeplerianOrbit<T>(zero.add(7.8e6), zero.add(0.032), zero.add(0.4), zero.add(0.1), zero.add(0.2), zero.add(0.3), PositionAngle.TRUE,
FramesFactory.getEME2000(), new FieldAbsoluteDate<T>(field),
Constants.EIGEN5C_EARTH_MU);
final FieldAbsoluteDate<T> target = orbit1.getDate().shiftedBy(10000.0);
FieldPVCoordinates<T> pv1 = new FieldKeplerianPropagator<T>(orbit1).propagate(target).getPVCoordinates();
FieldPVCoordinates<T> pv2 = new FieldKeplerianPropagator<T>(orbit2).propagate(target).getPVCoordinates();
FieldPVCoordinates<T> pvWithMu1 = new FieldKeplerianPropagator<T>(orbit2, orbit1.getMu()).propagate(target).getPVCoordinates();
Assert.assertEquals(0.026054, FieldVector3D.distance(pv1.getPosition(), pv2.getPosition()).getReal(), 1.0e-6);
Assert.assertEquals(0.0, FieldVector3D.distance(pv1.getPosition(), pvWithMu1.getPosition()).getReal(), 1.0e-15);
}
private <T extends RealFieldElement<T>> T tangLEmLv(T Lv,T ex,T ey){
// tan ((LE - Lv) /2)) =
return ey.multiply(Lv.cos()).subtract(ex.multiply(Lv.sin())).divide(
ex.multiply(Lv.cos()).add(1.).add(ey.multiply(Lv.sin())).add( ex.multiply(ex).negate().add(1.).subtract(ey.multiply(ey)).sqrt()));
}
@Before
public void setUp() {
Utils.setDataRoot("regular-data");
mu = 3.9860047e14;
}
@After
public void tearDown() {
mu = Double.NaN;
}
}