1   /* Copyright 2002-2022 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  
20  import org.hipparchus.util.Decimal64;
21  import org.hipparchus.util.Decimal64Field;
22  import org.junit.Assert;
23  import org.junit.Before;
24  import org.junit.Test;
25  import org.orekit.Utils;
26  import org.orekit.errors.OrekitException;
27  import org.orekit.errors.OrekitMessages;
28  import org.orekit.time.AbsoluteDate;
29  import org.orekit.time.FieldAbsoluteDate;
30  import org.orekit.time.TimeScalesFactory;
31  import org.orekit.utils.IERSConventions;
32  
33  public class ITRFVersionTest {
34  
35      @Test
36      public void testYears() {
37          Assert.assertEquals(2014, ITRFVersion.ITRF_2014.getYear());
38          Assert.assertEquals(2008, ITRFVersion.ITRF_2008.getYear());
39          Assert.assertEquals(2005, ITRFVersion.ITRF_2005.getYear());
40          Assert.assertEquals(2000, ITRFVersion.ITRF_2000.getYear());
41          Assert.assertEquals(1997, ITRFVersion.ITRF_1997.getYear());
42          Assert.assertEquals(1996, ITRFVersion.ITRF_1996.getYear());
43          Assert.assertEquals(1994, ITRFVersion.ITRF_1994.getYear());
44          Assert.assertEquals(1993, ITRFVersion.ITRF_1993.getYear());
45          Assert.assertEquals(1992, ITRFVersion.ITRF_1992.getYear());
46          Assert.assertEquals(1991, ITRFVersion.ITRF_1991.getYear());
47          Assert.assertEquals(1990, ITRFVersion.ITRF_1990.getYear());
48          Assert.assertEquals(1989, ITRFVersion.ITRF_1989.getYear());
49          Assert.assertEquals(1988, ITRFVersion.ITRF_1988.getYear());
50      }
51  
52      @Test
53      public void testNames() {
54          Assert.assertEquals("ITRF-2014", ITRFVersion.ITRF_2014.getName());
55          Assert.assertEquals("ITRF-2008", ITRFVersion.ITRF_2008.getName());
56          Assert.assertEquals("ITRF-2005", ITRFVersion.ITRF_2005.getName());
57          Assert.assertEquals("ITRF-2000", ITRFVersion.ITRF_2000.getName());
58          Assert.assertEquals("ITRF-1997", ITRFVersion.ITRF_1997.getName());
59          Assert.assertEquals("ITRF-1996", ITRFVersion.ITRF_1996.getName());
60          Assert.assertEquals("ITRF-1994", ITRFVersion.ITRF_1994.getName());
61          Assert.assertEquals("ITRF-1993", ITRFVersion.ITRF_1993.getName());
62          Assert.assertEquals("ITRF-1992", ITRFVersion.ITRF_1992.getName());
63          Assert.assertEquals("ITRF-1991", ITRFVersion.ITRF_1991.getName());
64          Assert.assertEquals("ITRF-1990", ITRFVersion.ITRF_1990.getName());
65          Assert.assertEquals("ITRF-1989", ITRFVersion.ITRF_1989.getName());
66          Assert.assertEquals("ITRF-1988", ITRFVersion.ITRF_1988.getName());
67      }
68  
69      @Test
70      public void testBuildFromYear() {
71          Assert.assertEquals(ITRFVersion.ITRF_2014, ITRFVersion.getITRFVersion(2014));
72          Assert.assertEquals(ITRFVersion.ITRF_2008, ITRFVersion.getITRFVersion(2008));
73          Assert.assertEquals(ITRFVersion.ITRF_2005, ITRFVersion.getITRFVersion(2005));
74          Assert.assertEquals(ITRFVersion.ITRF_2000, ITRFVersion.getITRFVersion(2000));
75          Assert.assertEquals(ITRFVersion.ITRF_1997, ITRFVersion.getITRFVersion(1997));
76          Assert.assertEquals(ITRFVersion.ITRF_1996, ITRFVersion.getITRFVersion(1996));
77          Assert.assertEquals(ITRFVersion.ITRF_1994, ITRFVersion.getITRFVersion(1994));
78          Assert.assertEquals(ITRFVersion.ITRF_1993, ITRFVersion.getITRFVersion(1993));
79          Assert.assertEquals(ITRFVersion.ITRF_1992, ITRFVersion.getITRFVersion(1992));
80          Assert.assertEquals(ITRFVersion.ITRF_1991, ITRFVersion.getITRFVersion(1991));
81          Assert.assertEquals(ITRFVersion.ITRF_1990, ITRFVersion.getITRFVersion(1990));
82          Assert.assertEquals(ITRFVersion.ITRF_1989, ITRFVersion.getITRFVersion(1989));
83          Assert.assertEquals(ITRFVersion.ITRF_1988, ITRFVersion.getITRFVersion(1988));
84          Assert.assertEquals(ITRFVersion.ITRF_1997, ITRFVersion.getITRFVersion(  97));
85          Assert.assertEquals(ITRFVersion.ITRF_1996, ITRFVersion.getITRFVersion(  96));
86          Assert.assertEquals(ITRFVersion.ITRF_1994, ITRFVersion.getITRFVersion(  94));
87          Assert.assertEquals(ITRFVersion.ITRF_1993, ITRFVersion.getITRFVersion(  93));
88          Assert.assertEquals(ITRFVersion.ITRF_1992, ITRFVersion.getITRFVersion(  92));
89          Assert.assertEquals(ITRFVersion.ITRF_1991, ITRFVersion.getITRFVersion(  91));
90          Assert.assertEquals(ITRFVersion.ITRF_1990, ITRFVersion.getITRFVersion(  90));
91          Assert.assertEquals(ITRFVersion.ITRF_1989, ITRFVersion.getITRFVersion(  89));
92          Assert.assertEquals(ITRFVersion.ITRF_1988, ITRFVersion.getITRFVersion(  88));
93      }
94  
95      @Test
96      public void testInexistantYear() {
97          try {
98              ITRFVersion.getITRFVersion(1999);
99              Assert.fail("an exception should have been thrown");
100         } catch (OrekitException oe) {
101             Assert.assertEquals(OrekitMessages.NO_SUCH_ITRF_FRAME, oe.getSpecifier());
102             Assert.assertEquals(1999, ((Integer) oe.getParts()[0]).intValue());
103         }
104     }
105 
106     @Test
107     public void testBuildFromName() {
108         Assert.assertEquals(ITRFVersion.ITRF_2014, ITRFVersion.getITRFVersion("ITRF-2014"));
109         Assert.assertEquals(ITRFVersion.ITRF_2008, ITRFVersion.getITRFVersion("ItRf-2008"));
110         Assert.assertEquals(ITRFVersion.ITRF_2005, ITRFVersion.getITRFVersion("iTrF-2005"));
111         Assert.assertEquals(ITRFVersion.ITRF_2000, ITRFVersion.getITRFVersion("itrf_2000"));
112         Assert.assertEquals(ITRFVersion.ITRF_1997, ITRFVersion.getITRFVersion("itrf 1997"));
113         Assert.assertEquals(ITRFVersion.ITRF_1996, ITRFVersion.getITRFVersion("itrf1996"));
114         Assert.assertEquals(ITRFVersion.ITRF_1994, ITRFVersion.getITRFVersion("itrf-1994"));
115         Assert.assertEquals(ITRFVersion.ITRF_1993, ITRFVersion.getITRFVersion("itrf-1993"));
116         Assert.assertEquals(ITRFVersion.ITRF_1992, ITRFVersion.getITRFVersion("itrf-1992"));
117         Assert.assertEquals(ITRFVersion.ITRF_1991, ITRFVersion.getITRFVersion("itrf-1991"));
118         Assert.assertEquals(ITRFVersion.ITRF_1990, ITRFVersion.getITRFVersion("itrf-1990"));
119         Assert.assertEquals(ITRFVersion.ITRF_1989, ITRFVersion.getITRFVersion("itrf-1989"));
120         Assert.assertEquals(ITRFVersion.ITRF_1988, ITRFVersion.getITRFVersion("itrf-1988"));
121         Assert.assertEquals(ITRFVersion.ITRF_1997, ITRFVersion.getITRFVersion("ITRF97"));
122         Assert.assertEquals(ITRFVersion.ITRF_1996, ITRFVersion.getITRFVersion("itrf-96"));
123         Assert.assertEquals(ITRFVersion.ITRF_1994, ITRFVersion.getITRFVersion("itrf-94"));
124         Assert.assertEquals(ITRFVersion.ITRF_1993, ITRFVersion.getITRFVersion("itrf-93"));
125         Assert.assertEquals(ITRFVersion.ITRF_1992, ITRFVersion.getITRFVersion("itrf-92"));
126         Assert.assertEquals(ITRFVersion.ITRF_1991, ITRFVersion.getITRFVersion("itrf-91"));
127         Assert.assertEquals(ITRFVersion.ITRF_1990, ITRFVersion.getITRFVersion("itrf-90"));
128         Assert.assertEquals(ITRFVersion.ITRF_1989, ITRFVersion.getITRFVersion("itrf-89"));
129         Assert.assertEquals(ITRFVersion.ITRF_1988, ITRFVersion.getITRFVersion("itrf-88"));
130     }
131 
132     @Test
133     public void testInexistantName() {
134         try {
135             ITRFVersion.getITRFVersion("itrf-99");
136             Assert.fail("an exception should have been thrown");
137         } catch (OrekitException oe) {
138             Assert.assertEquals(OrekitMessages.NO_SUCH_ITRF_FRAME, oe.getSpecifier());
139             Assert.assertEquals("itrf-99", oe.getParts()[0]);
140         }
141     }
142 
143     @Test
144     public void testMalformedName() {
145         try {
146             ITRFVersion.getITRFVersion("YTRF-2014");
147             Assert.fail("an exception should have been thrown");
148         } catch (OrekitException oe) {
149             Assert.assertEquals(OrekitMessages.NO_SUCH_ITRF_FRAME, oe.getSpecifier());
150             Assert.assertEquals("YTRF-2014", oe.getParts()[0]);
151         }
152     }
153 
154     @Test
155     public void testAllConverters() {
156 
157         // for this test, we arbitrarily assume FramesFactory provides an ITRF 2014
158         Frame itrf2014 = FramesFactory.getITRF(IERSConventions.IERS_2010, true);
159 
160         for (final ITRFVersion origin : ITRFVersion.values()) {
161             for (final ITRFVersion destination : ITRFVersion.values()) {
162                 ITRFVersion.Converter converter = ITRFVersion.getConverter(origin, destination);
163                 Assert.assertEquals(origin,      converter.getOrigin());
164                 Assert.assertEquals(destination, converter.getDestination());
165                 Frame originFrame      = origin == ITRFVersion.ITRF_2014 ?
166                                          itrf2014 :
167                                          from2014(origin.getYear()).createTransformedITRF(itrf2014, origin.toString());
168                 Frame destinationFrame = destination == ITRFVersion.ITRF_2014 ?
169                                          itrf2014 :
170                                          from2014(destination.getYear()).createTransformedITRF(itrf2014, destination.toString());
171                 for (int year = 2000; year < 2007; ++year) {
172 
173                     AbsoluteDate date = new AbsoluteDate(year, 4, 17, 12, 0, 0, TimeScalesFactory.getTT());
174                     Transform looped =
175                            new Transform(date,
176                                          converter.getTransform(date),
177                                          destinationFrame.getTransformTo(originFrame, date));
178                     if (origin == ITRFVersion.ITRF_2008 || destination == ITRFVersion.ITRF_2008) {
179                         // if we use ITRF 2008, as internally the pivot frame is ITRF 2014
180                         // on side of the transform is computed as f -> 2008 -> 2014, and on
181                         // the other side as f -> 2014 and we get some inversion in between.
182                         // the errors are not strictly zero (but they are very small) because
183                         // Helmert transformations are a translation plus a rotation. If we do
184                         // t1 -> r1 -> t2 -> r2, it is not the same as t1 -> t2 -> r1 -> r2
185                         // which would correspond to simply add the offsets, velocities, rotations and rate,
186                         // which is what is done in the reference documents.
187                         // Anyway, the non-commutativity errors are well below models accuracy
188                         Assert.assertEquals(0, looped.getTranslation().getNorm(),  6.0e-06);
189                         Assert.assertEquals(0, looped.getVelocity().getNorm(),     2.0e-22);
190                         Assert.assertEquals(0, looped.getRotation().getAngle(),    2.0e-12);
191                         Assert.assertEquals(0, looped.getRotationRate().getNorm(), 2.0e-32);
192                     } else {
193                         // if we always stay in the ITRF 2014 branch, we do the right conversions
194                         // and errors are at numerical noise level
195                         Assert.assertEquals(0, looped.getTranslation().getNorm(),  6.0e-17);
196                         Assert.assertEquals(0, looped.getVelocity().getNorm(),     4.0e-26);
197                         Assert.assertEquals(0, looped.getRotation().getAngle(),    1.0e-40);
198                         Assert.assertEquals(0, looped.getRotationRate().getNorm(), 2.0e-32);
199                     }
200 
201                     FieldAbsoluteDate<Decimal64> date64 = new FieldAbsoluteDate<>(Decimal64Field.getInstance(), date);
202                     FieldTransform<Decimal64> looped64 =
203                                     new FieldTransform<>(date64,
204                                                          converter.getTransform(date64),
205                                                          destinationFrame.getTransformTo(originFrame, date64));
206                              if (origin == ITRFVersion.ITRF_2008 || destination == ITRFVersion.ITRF_2008) {
207                                  // if we use ITRF 2008, as internally the pivot frame is ITRF 2014
208                                  // on side of the transform is computed as f -> 2008 -> 2014, and on
209                                  // the other side as f -> 2014 and we get some inversion in between.
210                                  // the errors are not strictly zero (but they are very small) because
211                                  // Helmert transformations are a translation plus a rotation. If we do
212                                  // t1 -> r1 -> t2 -> r2, it is not the same as t1 -> t2 -> r1 -> r2
213                                  // which would correspond to simply add the offsets, velocities, rotations and rate,
214                                  // which is what is done in the reference documents.
215                                  // Anyway, the non-commutativity errors are well below models accuracy
216                                  Assert.assertEquals(0, looped64.getTranslation().getNorm().getReal(),  6.0e-06);
217                                  Assert.assertEquals(0, looped64.getVelocity().getNorm().getReal(),     2.0e-22);
218                                  Assert.assertEquals(0, looped64.getRotation().getAngle().getReal(),    2.0e-12);
219                                  Assert.assertEquals(0, looped64.getRotationRate().getNorm().getReal(), 2.0e-32);
220                              } else {
221                                  // if we always stay in the ITRF 2014 branch, we do the right conversions
222                                  // and errors are at numerical noise level
223                                  Assert.assertEquals(0, looped64.getTranslation().getNorm().getReal(),  6.0e-17);
224                                  Assert.assertEquals(0, looped64.getVelocity().getNorm().getReal(),     4.0e-26);
225                                  Assert.assertEquals(0, looped64.getRotation().getAngle().getReal(),    1.0e-40);
226                                  Assert.assertEquals(0, looped64.getRotationRate().getNorm().getReal(), 2.0e-32);
227                              }
228                 }
229             }
230         }
231     }
232 
233     private HelmertTransformation.Predefined from2014(final int year) {
234         switch (year) {
235             case 1988 : return HelmertTransformation.Predefined.ITRF_2014_TO_ITRF_1988;
236             case 1989 : return HelmertTransformation.Predefined.ITRF_2014_TO_ITRF_1989;
237             case 1990 : return HelmertTransformation.Predefined.ITRF_2014_TO_ITRF_1990;
238             case 1991 : return HelmertTransformation.Predefined.ITRF_2014_TO_ITRF_1991;
239             case 1992 : return HelmertTransformation.Predefined.ITRF_2014_TO_ITRF_1992;
240             case 1993 : return HelmertTransformation.Predefined.ITRF_2014_TO_ITRF_1993;
241             case 1994 : return HelmertTransformation.Predefined.ITRF_2014_TO_ITRF_1994;
242             case 1996 : return HelmertTransformation.Predefined.ITRF_2014_TO_ITRF_1996;
243             case 1997 : return HelmertTransformation.Predefined.ITRF_2014_TO_ITRF_1997;
244             case 2000 : return HelmertTransformation.Predefined.ITRF_2014_TO_ITRF_2000;
245             case 2005 : return HelmertTransformation.Predefined.ITRF_2014_TO_ITRF_2005;
246             case 2008 : return HelmertTransformation.Predefined.ITRF_2014_TO_ITRF_2008;
247             default : return null;
248         }
249     }
250 
251     @Before
252     public void setUp() {
253         Utils.setDataRoot("compressed-data");
254     }
255 
256 }