1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.orekit.frames;
18
19 import org.hipparchus.geometry.euclidean.threed.FieldVector3D;
20 import org.hipparchus.geometry.euclidean.threed.Vector3D;
21 import org.hipparchus.util.Binary64;
22 import org.hipparchus.util.Binary64Field;
23 import org.hipparchus.util.FastMath;
24 import org.junit.jupiter.api.Assertions;
25 import org.junit.jupiter.api.BeforeEach;
26 import org.junit.jupiter.api.Test;
27 import org.orekit.Utils;
28 import org.orekit.bodies.GeodeticPoint;
29 import org.orekit.bodies.OneAxisEllipsoid;
30 import org.orekit.time.AbsoluteDate;
31 import org.orekit.time.FieldAbsoluteDate;
32 import org.orekit.time.TimeScalesFactory;
33 import org.orekit.utils.Constants;
34 import org.orekit.utils.IERSConventions;
35
36
37 public class VersionedITRFFrameTest {
38
39 @Test
40 public void testBulletinABefore2018Jump() {
41
42 doTestBulletinA2018Jump(new AbsoluteDate(2018, 3, 20, 12, 34, 56.7,
43 TimeScalesFactory.getUTC()),
44 0.0, 2.943e-3, 1.0e-6);
45 }
46
47 @Test
48 public void testBulletinAAfter2018Jump() {
49
50 doTestBulletinA2018Jump(new AbsoluteDate(2018, 3, 26, 12, 34, 56.7,
51 TimeScalesFactory.getUTC()),
52 2.942e-3, 0.0, 1.0e-6);
53 }
54
55 private void doTestBulletinA2018Jump(AbsoluteDate date,
56 double expectedDistance2008,
57 double expectedDistance2014,
58 double tolerance)
59 {
60 Frame eme2000 = FramesFactory.getEME2000();
61 Frame unspecifiedITRF = FramesFactory.getITRF(IERSConventions.IERS_2010, false);
62 VersionedITRF itrf2008 = FramesFactory.getITRF(ITRFVersion.ITRF_2008,
63 IERSConventions.IERS_2010, false);
64 VersionedITRF itrf2014 = FramesFactory.getITRF(ITRFVersion.ITRF_2014,
65 IERSConventions.IERS_2010, false);
66 Assertions.assertEquals(ITRFVersion.ITRF_2008, itrf2008.getITRFVersion());
67 Assertions.assertEquals(ITRFVersion.ITRF_2014, itrf2014.getITRFVersion());
68
69 GeodeticPoint laPaz = new GeodeticPoint(FastMath.toRadians(-16.50),
70 FastMath.toRadians(-68.15),
71 3640.0);
72 OneAxisEllipsoid earth = new OneAxisEllipsoid(Constants.WGS84_EARTH_EQUATORIAL_RADIUS,
73 Constants.WGS84_EARTH_FLATTENING,
74 unspecifiedITRF);
75 Vector3D p = earth.transform(laPaz);
76
77
78 Vector3D pUnspecified = unspecifiedITRF.getTransformTo(eme2000, date).transformPosition(p);
79 Vector3D p2008 = itrf2008.getTransformTo(eme2000, date).transformPosition(p);
80 Vector3D p2014 = itrf2014.getTransformTo(eme2000, date).transformPosition(p);
81 Assertions.assertEquals(expectedDistance2008, Vector3D.distance(pUnspecified, p2008), tolerance);
82 Assertions.assertEquals(expectedDistance2014, Vector3D.distance(pUnspecified, p2014), tolerance);
83
84
85 Vector3D pUnspecifiedNI = FramesFactory.getNonInterpolatingTransform(unspecifiedITRF,
86 eme2000,
87 date).transformPosition(p);
88 Vector3D p2008NI = FramesFactory.getNonInterpolatingTransform(itrf2008, eme2000, date).transformPosition(p);
89 Vector3D p2014NI = FramesFactory.getNonInterpolatingTransform(itrf2014, eme2000, date).transformPosition(p);
90 Assertions.assertEquals(expectedDistance2008, Vector3D.distance(pUnspecifiedNI, p2008NI), tolerance);
91 Assertions.assertEquals(expectedDistance2014, Vector3D.distance(pUnspecifiedNI, p2014NI), tolerance);
92
93
94 FieldAbsoluteDate<Binary64> dateField = new FieldAbsoluteDate<>(Binary64Field.getInstance(), date);
95 FieldVector3D<Binary64> pUnspecifiedField = unspecifiedITRF.getTransformTo(eme2000, dateField).transformPosition(p);
96 FieldVector3D<Binary64> p2008Field = itrf2008.getTransformTo(eme2000, dateField).transformPosition(p);
97 FieldVector3D<Binary64> p2014Field = itrf2014.getTransformTo(eme2000, dateField).transformPosition(p);
98 Assertions.assertEquals(expectedDistance2008, FieldVector3D.distance(pUnspecifiedField, p2008Field).getReal(), tolerance);
99 Assertions.assertEquals(expectedDistance2014, FieldVector3D.distance(pUnspecifiedField, p2014Field).getReal(), tolerance);
100
101 }
102
103 @BeforeEach
104 public void setUp() {
105 Utils.setDataRoot("itrf-jump");
106 }
107
108 }