use of org.hipparchus.util.Decimal64 in project Orekit by CS-SI.
the class TransformTest method testTransPV.
@Test
public void testTransPV() {
RandomGenerator rnd = new Well19937a(0x73d5554d99427af0l);
for (int i = 0; i < 10; ++i) {
// random position, velocity and acceleration
Vector3D pos = randomVector(1.0e3, rnd);
Vector3D vel = randomVector(1.0, rnd);
Vector3D acc = randomVector(1.0e-3, rnd);
PVCoordinates pvOne = new PVCoordinates(pos, vel, acc);
// random transform
Vector3D transPos = randomVector(1.0e3, rnd);
Vector3D transVel = randomVector(1.0, rnd);
Vector3D transAcc = randomVector(1.0e-3, rnd);
Transform tr = new Transform(AbsoluteDate.J2000_EPOCH, transPos, transVel, transAcc);
double dt = 1;
// we should obtain
Vector3D good = tr.transformPosition(pos.add(new Vector3D(dt, vel))).add(new Vector3D(dt, transVel));
// we have
PVCoordinates pvTwo = tr.transformPVCoordinates(pvOne);
Vector3D result = pvTwo.getPosition().add(new Vector3D(dt, pvTwo.getVelocity()));
checkVector(good, result, 1.0e-15);
FieldPVCoordinates<Decimal64> fieldPVOne = new FieldPVCoordinates<Decimal64>(new FieldVector3D<Decimal64>(Decimal64Field.getInstance(), pvOne.getPosition()), new FieldVector3D<Decimal64>(Decimal64Field.getInstance(), pvOne.getVelocity()), new FieldVector3D<Decimal64>(Decimal64Field.getInstance(), pvOne.getAcceleration()));
FieldPVCoordinates<Decimal64> fieldPVTwo = tr.transformPVCoordinates(fieldPVOne);
FieldVector3D<Decimal64> fieldResult = fieldPVTwo.getPosition().add(new FieldVector3D<Decimal64>(dt, fieldPVTwo.getVelocity()));
checkVector(good, fieldResult.toVector3D(), 1.0e-15);
TimeStampedFieldPVCoordinates<Decimal64> fieldTPVOne = new TimeStampedFieldPVCoordinates<Decimal64>(tr.getDate(), new FieldVector3D<Decimal64>(Decimal64Field.getInstance(), pvOne.getPosition()), new FieldVector3D<Decimal64>(Decimal64Field.getInstance(), pvOne.getVelocity()), new FieldVector3D<Decimal64>(Decimal64Field.getInstance(), pvOne.getAcceleration()));
TimeStampedFieldPVCoordinates<Decimal64> fieldTPVTwo = tr.transformPVCoordinates(fieldTPVOne);
FieldVector3D<Decimal64> fieldTResult = fieldTPVTwo.getPosition().add(new FieldVector3D<Decimal64>(dt, fieldTPVTwo.getVelocity()));
checkVector(good, fieldTResult.toVector3D(), 1.0e-15);
// test inverse
Vector3D resultvel = tr.getInverse().transformPVCoordinates(pvTwo).getVelocity();
checkVector(resultvel, vel, 1.0e-15);
}
}
use of org.hipparchus.util.Decimal64 in project Orekit by CS-SI.
the class TransformProviderUtilTest method testCombineField.
@Test
public void testCombineField() throws OrekitException {
RandomGenerator random = new Well19937a(0x1f8bf20bfa4b54eal);
final FieldAbsoluteDate<Decimal64> date = new FieldAbsoluteDate<>(Decimal64Field.getInstance(), AbsoluteDate.J2000_EPOCH);
for (int i = 0; i < 20; ++i) {
TransformProvider first = constantProvider(random);
TransformProvider second = constantProvider(random);
TransformProvider combined = TransformProviderUtils.getCombinedProvider(first, second);
checkNoTransform(new FieldTransform<>(date, new FieldTransform<>(date, first.getTransform(date), second.getTransform(date)).getInverse(), combined.getTransform(date)), random);
}
}
use of org.hipparchus.util.Decimal64 in project Orekit by CS-SI.
the class TransformProviderUtilTest method testIdentityField.
@Test
public void testIdentityField() throws OrekitException {
RandomGenerator random = new Well19937a(0x7086a8e4ad1265b0l);
final FieldAbsoluteDate<Decimal64> date = new FieldAbsoluteDate<>(Decimal64Field.getInstance(), AbsoluteDate.J2000_EPOCH);
checkNoTransform(TransformProviderUtils.IDENTITY_PROVIDER.getTransform(date), random);
}
use of org.hipparchus.util.Decimal64 in project Orekit by CS-SI.
the class EOPHistoryTest method testFieldOutOfRange.
@Test
public void testFieldOutOfRange() throws OrekitException {
EOPHistory history = FramesFactory.getEOPHistory(IERSConventions.IERS_2010, true);
FieldAbsoluteDate<Decimal64> endDate = new FieldAbsoluteDate<>(Decimal64Field.getInstance(), 2006, 3, 5, TimeScalesFactory.getUTC());
for (double t = -1000; t < 1000; t += 3) {
FieldAbsoluteDate<Decimal64> date = endDate.shiftedBy(t);
Decimal64 dt = history.getUT1MinusUTC(date);
if (t <= 0) {
Assert.assertTrue(dt.getReal() < 0.29236);
Assert.assertTrue(dt.getReal() > 0.29233);
} else {
// no more data after end date
Assert.assertEquals(0.0, dt.getReal(), 1.0e-10);
}
}
}
use of org.hipparchus.util.Decimal64 in project Orekit by CS-SI.
the class GTODProviderTest method testAASReferenceGEOField.
@Test
public void testAASReferenceGEOField() throws OrekitException {
// this reference test has been extracted from the following paper:
// Implementation Issues Surrounding the New IAU Reference Systems for Astrodynamics
// David A. Vallado, John H. Seago, P. Kenneth Seidelmann
// http://www.centerforspace.com/downloads/files/pubs/AAS-06-134.pdf
Utils.setLoaders(IERSConventions.IERS_1996, Utils.buildEOPList(IERSConventions.IERS_1996, ITRFVersion.ITRF_2008, new double[][] { { 53153, -0.4709050, 0.0000000, -0.083853, 0.467217, -0.053614, -0.004494, Double.NaN, Double.NaN }, { 53154, -0.4709050, 0.0000000, -0.083853, 0.467217, -0.053614, -0.004494, Double.NaN, Double.NaN }, { 53155, -0.4709050, 0.0000000, -0.083853, 0.467217, -0.053614, -0.004494, Double.NaN, Double.NaN }, { 53156, -0.4709050, 0.0000000, -0.083853, 0.467217, -0.053614, -0.004494, Double.NaN, Double.NaN }, { 53157, -0.4709050, 0.0000000, -0.083853, 0.467217, -0.053614, -0.004494, Double.NaN, Double.NaN }, { 53158, -0.4709050, 0.0000000, -0.083853, 0.467217, -0.053614, -0.004494, Double.NaN, Double.NaN }, { 53159, -0.4709050, 0.0000000, -0.083853, 0.467217, -0.053614, -0.004494, Double.NaN, Double.NaN }, { 53160, -0.4709050, 0.0000000, -0.083853, 0.467217, -0.053614, -0.004494, Double.NaN, Double.NaN } }));
FieldAbsoluteDate<Decimal64> t0 = new FieldAbsoluteDate<>(Decimal64Field.getInstance(), new DateComponents(2004, 06, 01), TimeComponents.H00, TimeScalesFactory.getUTC());
FieldTransform<Decimal64> t = FramesFactory.getTOD(IERSConventions.IERS_1996, true).getTransformTo(FramesFactory.getGTOD(IERSConventions.IERS_1996, true), t0);
// TOD iau76
PVCoordinates pvTOD = new PVCoordinates(new Vector3D(-40577427.7501, -11500096.1306, 10293.2583), new Vector3D(837.552338, -2957.524176, -0.928772));
// PEF iau76
PVCoordinates pvPEF = new PVCoordinates(new Vector3D(24796919.2956, -34115870.9001, 10293.2583), new Vector3D(-0.979178, -1.476540, -0.928772));
// it seems the induced effect of pole nutation correction δΔψ on the equation of the equinoxes
// was not taken into account in the reference paper, so we fix it here for the test
final Decimal64 dDeltaPsi = FramesFactory.getEOPHistory(IERSConventions.IERS_1996, true).getEquinoxNutationCorrection(t0)[0];
final Decimal64 epsilonA = IERSConventions.IERS_1996.getMeanObliquityFunction().value(t0);
final FieldTransform<Decimal64> fix = new FieldTransform<>(t0, new FieldRotation<>(FieldVector3D.getPlusK(Decimal64Field.getInstance()), dDeltaPsi.multiply(epsilonA.cos()), RotationConvention.FRAME_TRANSFORM));
checkPV(fix.transformPVCoordinates(pvPEF), t.transformPVCoordinates(pvTOD), 0.0503, 3.59e-4);
// if we forget to apply nutation corrections, results are much worse, which is expected
t = FramesFactory.getTOD(false).getTransformTo(FramesFactory.getGTOD(false), t0);
checkPV(fix.transformPVCoordinates(pvPEF), t.transformPVCoordinates(pvTOD), 1458.27, 3.847e-4);
}
Aggregations