Search in sources :

Example 6 with FundamentalNutationArguments

use of org.orekit.data.FundamentalNutationArguments in project Orekit by CS-SI.

the class TideTest method doTestTable.

private void doTestTable(final double[][] table) throws OrekitException {
    TimeScale ut1 = TimeScalesFactory.getUT1(IERSConventions.IERS_2010, true);
    FundamentalNutationArguments fna = IERSConventions.IERS_2010.getNutationArguments(ut1);
    BodiesElements elements = fna.evaluateAll(AbsoluteDate.J2000_EPOCH);
    for (double[] r : table) {
        int doodsonNumber = (int) r[1];
        int[] dooodsonMultipliers = new int[] { (int) r[2], (int) r[3], (int) r[4], (int) r[5], (int) r[6], (int) r[7] };
        int[] delaunayMultipliers = new int[] { (int) r[8], (int) r[9], (int) r[10], (int) r[11], (int) r[12] };
        final Tide tdN = new Tide(doodsonNumber);
        final Tide tdM = new Tide((int) r[2], (int) r[3], (int) r[4], (int) r[5], (int) r[6], (int) r[7]);
        Assert.assertEquals(r[0], FastMath.toDegrees(tdN.getRate(elements)) * 3600, 7.2e-5);
        Assert.assertEquals(doodsonNumber, tdM.getDoodsonNumber());
        Assert.assertArrayEquals(dooodsonMultipliers, tdN.getDoodsonMultipliers());
        Assert.assertArrayEquals(delaunayMultipliers, tdN.getDelaunayMultipliers());
        Assert.assertArrayEquals(delaunayMultipliers, tdM.getDelaunayMultipliers());
    }
}
Also used : FundamentalNutationArguments(org.orekit.data.FundamentalNutationArguments) BodiesElements(org.orekit.data.BodiesElements) TimeScale(org.orekit.time.TimeScale)

Example 7 with FundamentalNutationArguments

use of org.orekit.data.FundamentalNutationArguments in project Orekit by CS-SI.

the class TideTest method doTestTDFRPH.

private void doTestTDFRPH(boolean patchEarthRotation, int year, int month, int day, int hour, int minute, double second, Tide tide, double refRate, double refPhase, double toleranceRate, double tolerancePhase) throws OrekitException {
    TimeScale ut1 = TimeScalesFactory.getUT1(IERSConventions.IERS_2010, true);
    FundamentalNutationArguments fna = IERSConventions.IERS_2010.getNutationArguments(ut1);
    if (patchEarthRotation) {
        patchEarthRotationModel(fna, ut1);
    }
    AbsoluteDate date = new AbsoluteDate(year, month, day, hour, minute, second, ut1);
    BodiesElements elements = fna.evaluateAll(date);
    Assert.assertEquals(refRate, tide.getRate(elements) * Constants.JULIAN_DAY / (2 * FastMath.PI), toleranceRate);
    Assert.assertEquals(refPhase, FastMath.toDegrees(MathUtils.normalizeAngle(tide.getPhase(elements), FastMath.PI)), tolerancePhase);
}
Also used : FundamentalNutationArguments(org.orekit.data.FundamentalNutationArguments) BodiesElements(org.orekit.data.BodiesElements) TimeScale(org.orekit.time.TimeScale) FieldAbsoluteDate(org.orekit.time.FieldAbsoluteDate) AbsoluteDate(org.orekit.time.AbsoluteDate)

Example 8 with FundamentalNutationArguments

use of org.orekit.data.FundamentalNutationArguments in project Orekit by CS-SI.

the class TideTest method testPhase.

@Test
public void testPhase() throws OrekitException {
    TimeScale ut1 = TimeScalesFactory.getUT1(IERSConventions.IERS_2010, true);
    FundamentalNutationArguments fna = IERSConventions.IERS_2010.getNutationArguments(ut1);
    BodiesElements elements = fna.evaluateAll(new AbsoluteDate("2003-05-17T13:41:54", TimeScalesFactory.getUTC()));
    Assert.assertEquals(-514.950946, Tide.M2.getPhase(elements), 1.0e-6);
    Assert.assertEquals(19.738518, Tide.S2.getPhase(elements), 1.0e-6);
    Assert.assertEquals(-798.252248, Tide.N2.getPhase(elements), 1.0e-6);
    Assert.assertEquals(59.352413, Tide.K2.getPhase(elements), 1.0e-6);
    Assert.assertEquals(29.676206, Tide.K1.getPhase(elements), 1.0e-6);
    Assert.assertEquals(-544.627152, Tide.O1.getPhase(elements), 1.0e-6);
    Assert.assertEquals(-9.937688, Tide.P1.getPhase(elements), 1.0e-6);
    Assert.assertEquals(-827.928455, Tide.Q1.getPhase(elements), 1.0e-6);
    Assert.assertEquals(574.303358, Tide.MF.getPhase(elements), 1.0e-6);
    Assert.assertEquals(283.301303, Tide.MM.getPhase(elements), 1.0e-6);
    Assert.assertEquals(39.613894, Tide.SSA.getPhase(elements), 1.0e-6);
}
Also used : FundamentalNutationArguments(org.orekit.data.FundamentalNutationArguments) BodiesElements(org.orekit.data.BodiesElements) TimeScale(org.orekit.time.TimeScale) FieldAbsoluteDate(org.orekit.time.FieldAbsoluteDate) AbsoluteDate(org.orekit.time.AbsoluteDate) Test(org.junit.Test)

Example 9 with FundamentalNutationArguments

use of org.orekit.data.FundamentalNutationArguments in project Orekit by CS-SI.

the class TideTest method doTestSort.

private void doTestSort(int tauMultiplier, Tide... tides) throws OrekitException {
    // this test checks that tides sort order is date-independent for a large time range
    // (almost 180000 years long)
    // tides sort-order is based on rate, but the rates varies slightly with dates
    // (because Delaunay nutation arguments are polynomials)
    // The variations are however small and we want to make sure
    // that if rate(tideA) < rate(tideB) at time t0, this order remains
    // the same for t1 a few millenia around t0
    TimeScale ut1 = TimeScalesFactory.getUT1(IERSConventions.IERS_2010, true);
    FundamentalNutationArguments fna = IERSConventions.IERS_2010.getNutationArguments(ut1);
    for (double dt = -122000; dt < 54000; dt += 100) {
        final AbsoluteDate date = AbsoluteDate.J2000_EPOCH.shiftedBy(dt * Constants.JULIAN_YEAR);
        final BodiesElements el = fna.evaluateAll(date);
        for (int i = 1; i < tides.length; ++i) {
            Assert.assertTrue(tides[i - 1].getRate(el) < tides[i].getRate(el));
        }
    }
    // check we are in the expected species
    for (final Tide tide : tides) {
        Assert.assertEquals(tauMultiplier, tide.getTauMultiplier());
    }
}
Also used : FundamentalNutationArguments(org.orekit.data.FundamentalNutationArguments) BodiesElements(org.orekit.data.BodiesElements) TimeScale(org.orekit.time.TimeScale) FieldAbsoluteDate(org.orekit.time.FieldAbsoluteDate) AbsoluteDate(org.orekit.time.AbsoluteDate)

Example 10 with FundamentalNutationArguments

use of org.orekit.data.FundamentalNutationArguments in project Orekit by CS-SI.

the class TidalDisplacementTest method doTestDehant.

private void doTestDehant(final IERSConventions conventions, final boolean removePermanentDeformation, final boolean replaceModels, final double expectedDx, final double expectedDy, final double expectedDz, final double tolerance) throws OrekitException {
    Frame itrf = FramesFactory.getITRF(conventions, false);
    TimeScale ut1 = TimeScalesFactory.getUT1(conventions, false);
    final double re;
    final double sunEarthSystemMassRatio;
    final double earthMoonMassRatio;
    if (replaceModels) {
        // constants consistent with DEHANTTIDEINEL.F reference program
        // available at <ftp://tai.bipm.org/iers/conv2010/chapter7/dehanttideinel/>
        // and Copyright (C) 2008 IERS Conventions Center
        re = 6378136.6;
        final double massRatioSun = 332946.0482;
        final double massRatioMoon = 0.0123000371;
        sunEarthSystemMassRatio = massRatioSun * (1.0 / (1.0 + massRatioMoon));
        earthMoonMassRatio = 1.0 / massRatioMoon;
    } else {
        // constants consistent with IERS and JPL
        re = Constants.EIGEN5C_EARTH_EQUATORIAL_RADIUS;
        sunEarthSystemMassRatio = Constants.JPL_SSD_SUN_EARTH_PLUS_MOON_MASS_RATIO;
        earthMoonMassRatio = Constants.JPL_SSD_EARTH_MOON_MASS_RATIO;
    }
    // fake providers generating only the positions from the reference program test
    PVCoordinatesProvider fakeSun = (date, frame) -> new TimeStampedPVCoordinates(date, new Vector3D(137859926952.015, 54228127881.435, 23509422341.6960), Vector3D.ZERO, Vector3D.ZERO);
    PVCoordinatesProvider fakeMoon = (date, frame) -> new TimeStampedPVCoordinates(date, new Vector3D(-179996231.920342, -312468450.131567, -169288918.592160), Vector3D.ZERO, Vector3D.ZERO);
    TidalDisplacement td = new TidalDisplacement(re, sunEarthSystemMassRatio, earthMoonMassRatio, fakeSun, fakeMoon, conventions, removePermanentDeformation);
    FundamentalNutationArguments arguments = null;
    if (replaceModels) {
        try {
            // we override the official IERS conventions 2010 arguments with fake arguments matching DEHANTTIDEINEL.F code
            String regularArguments = "/assets/org/orekit/IERS-conventions/2010/nutation-arguments.txt";
            arguments = new FundamentalNutationArguments(conventions, ut1, IERSConventions.class.getResourceAsStream(regularArguments), regularArguments) {

                private static final long serialVersionUID = 20170913L;

                @Override
                public BodiesElements evaluateAll(final AbsoluteDate date) {
                    BodiesElements base = super.evaluateAll(date);
                    double fhr = date.getComponents(ut1).getTime().getSecondsInUTCDay() / 3600.0;
                    double t = base.getTC();
                    // Doodson fundamental arguments as per DEHANTTIDEINEL.F code
                    double s = 218.31664563 + (481267.88194 + (-0.0014663889 + (0.00000185139) * t) * t) * t;
                    double tau = fhr * 15 + 280.4606184 + (36000.7700536 + (0.00038793 + (-0.0000000258) * t) * t) * t - s;
                    double pr = (1.396971278 + (0.000308889 + (0.000000021 + (0.000000007) * t) * t) * t) * t;
                    double h = 280.46645 + (36000.7697489 + (0.00030322222 + (0.000000020 + (-0.00000000654) * t) * t) * t) * t;
                    double p = 83.35324312 + (4069.01363525 + (-0.01032172222 + (-0.0000124991 + (0.00000005263) * t) * t) * t) * t;
                    double zns = 234.95544499 + (1934.13626197 + (-0.00207561111 + (-0.00000213944 + (0.00000001650) * t) * t) * t) * t;
                    double ps = 282.93734098 + (1.71945766667 + (0.00045688889 + (-0.00000001778 + (-0.00000000334) * t) * t) * t) * t;
                    s += pr;
                    // rebuild Delaunay arguments from Doodson arguments, ignoring derivatives
                    return new BodiesElements(date, base.getTC(), FastMath.toRadians(s + tau), 0.0, FastMath.toRadians(s - p), 0.0, FastMath.toRadians(h - ps), 0.0, FastMath.toRadians(s + zns), 0.0, FastMath.toRadians(s - h), 0.0, FastMath.toRadians(-zns), 0.0, base.getLMe(), 0.0, base.getLVe(), 0.0, base.getLE(), 0.0, base.getLMa(), 0.0, base.getLJu(), 0.0, base.getLSa(), 0.0, base.getLUr(), 0.0, base.getLNe(), 0.0, base.getPa(), 0.0);
                }
            };
            // we override the official IERS conventions 2010 tides displacements with tides displacements matching DEHANTTIDEINEL.F code
            String table73a = "/tides/tab7.3a-Dehant.txt";
            Field diurnalCorrectionField = td.getClass().getDeclaredField("frequencyCorrectionDiurnal");
            diurnalCorrectionField.setAccessible(true);
            Method diurnalCorrectionGetter = IERSConventions.class.getDeclaredMethod("getTidalDisplacementFrequencyCorrectionDiurnal", String.class, Integer.TYPE, Integer.TYPE, Integer.TYPE, Integer.TYPE, Integer.TYPE);
            diurnalCorrectionGetter.setAccessible(true);
            diurnalCorrectionField.set(td, diurnalCorrectionGetter.invoke(null, table73a, 18, 15, 16, 17, 18));
        } catch (SecurityException | NoSuchMethodException | NoSuchFieldException | InvocationTargetException | IllegalArgumentException | IllegalAccessException e) {
            Assert.fail(e.getLocalizedMessage());
        }
    } else {
        arguments = conventions.getNutationArguments(ut1);
    }
    Vector3D fundamentalStationWettzell = new Vector3D(4075578.385, 931852.890, 4801570.154);
    AbsoluteDate date = new AbsoluteDate(2009, 4, 13, 0, 0, 0.0, ut1);
    Vector3D displacement = td.displacement(arguments.evaluateAll(date), itrf, fundamentalStationWettzell);
    Assert.assertEquals(expectedDx, displacement.getX(), tolerance);
    Assert.assertEquals(expectedDy, displacement.getY(), tolerance);
    Assert.assertEquals(expectedDz, displacement.getZ(), tolerance);
}
Also used : Constants(org.orekit.utils.Constants) TimeStampedPVCoordinates(org.orekit.utils.TimeStampedPVCoordinates) Vector3D(org.hipparchus.geometry.euclidean.threed.Vector3D) FramesFactory(org.orekit.frames.FramesFactory) PVCoordinatesProvider(org.orekit.utils.PVCoordinatesProvider) Frame(org.orekit.frames.Frame) TimeScale(org.orekit.time.TimeScale) Test(org.junit.Test) IERSConventions(org.orekit.utils.IERSConventions) Field(java.lang.reflect.Field) InvocationTargetException(java.lang.reflect.InvocationTargetException) TidalDisplacement(org.orekit.models.earth.displacement.TidalDisplacement) OrekitException(org.orekit.errors.OrekitException) TimeScalesFactory(org.orekit.time.TimeScalesFactory) BodiesElements(org.orekit.data.BodiesElements) FastMath(org.hipparchus.util.FastMath) Assert(org.junit.Assert) Method(java.lang.reflect.Method) FundamentalNutationArguments(org.orekit.data.FundamentalNutationArguments) Utils(org.orekit.Utils) Before(org.junit.Before) AbsoluteDate(org.orekit.time.AbsoluteDate) FundamentalNutationArguments(org.orekit.data.FundamentalNutationArguments) Frame(org.orekit.frames.Frame) Method(java.lang.reflect.Method) TimeStampedPVCoordinates(org.orekit.utils.TimeStampedPVCoordinates) TimeScale(org.orekit.time.TimeScale) AbsoluteDate(org.orekit.time.AbsoluteDate) InvocationTargetException(java.lang.reflect.InvocationTargetException) Field(java.lang.reflect.Field) Vector3D(org.hipparchus.geometry.euclidean.threed.Vector3D) BodiesElements(org.orekit.data.BodiesElements) PVCoordinatesProvider(org.orekit.utils.PVCoordinatesProvider) TidalDisplacement(org.orekit.models.earth.displacement.TidalDisplacement)

Aggregations

BodiesElements (org.orekit.data.BodiesElements)15 FundamentalNutationArguments (org.orekit.data.FundamentalNutationArguments)15 TimeScale (org.orekit.time.TimeScale)14 AbsoluteDate (org.orekit.time.AbsoluteDate)13 Test (org.junit.Test)10 FieldAbsoluteDate (org.orekit.time.FieldAbsoluteDate)4 Vector3D (org.hipparchus.geometry.euclidean.threed.Vector3D)3 Method (java.lang.reflect.Method)2 Field (java.lang.reflect.Field)1 InvocationTargetException (java.lang.reflect.InvocationTargetException)1 RealFieldElement (org.hipparchus.RealFieldElement)1 FastMath (org.hipparchus.util.FastMath)1 Assert (org.junit.Assert)1 Before (org.junit.Before)1 Utils (org.orekit.Utils)1 PoissonSeries (org.orekit.data.PoissonSeries)1 PoissonSeriesParser (org.orekit.data.PoissonSeriesParser)1 OrekitException (org.orekit.errors.OrekitException)1 OrekitInternalError (org.orekit.errors.OrekitInternalError)1 Frame (org.orekit.frames.Frame)1