1   /* Copyright 2002-2025 CS GROUP
2    * Licensed to CS GROUP (CS) under one or more
3    * contributor license agreements.  See the NOTICE file distributed with
4    * this work for additional information regarding copyright ownership.
5    * CS licenses this file to You under the Apache License, Version 2.0
6    * (the "License"); you may not use this file except in compliance with
7    * the License.  You may obtain a copy of the License at
8    *
9    *   http://www.apache.org/licenses/LICENSE-2.0
10   *
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
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          // before 2018-03-23, bulletin-A EOP were referenced to ITRF-2008
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          // after 2018-03-23, bulletin-A EOP were referenced to ITRF-2014
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          // regular transform
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          // non-interpolating transform
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          // field transform
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 }