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 java.io.ByteArrayInputStream;
21  import java.io.ByteArrayOutputStream;
22  import java.io.IOException;
23  import java.io.ObjectInputStream;
24  import java.io.ObjectOutputStream;
25  
26  import org.hipparchus.geometry.euclidean.threed.FieldVector3D;
27  import org.hipparchus.geometry.euclidean.threed.Vector3D;
28  import org.hipparchus.util.Decimal64;
29  import org.hipparchus.util.Decimal64Field;
30  import org.hipparchus.util.FastMath;
31  import org.junit.Assert;
32  import org.junit.Before;
33  import org.junit.Test;
34  import org.orekit.Utils;
35  import org.orekit.bodies.GeodeticPoint;
36  import org.orekit.bodies.OneAxisEllipsoid;
37  import org.orekit.time.AbsoluteDate;
38  import org.orekit.time.FieldAbsoluteDate;
39  import org.orekit.time.TimeScalesFactory;
40  import org.orekit.utils.Constants;
41  import org.orekit.utils.IERSConventions;
42  
43  public class VersionedITRFFrameTest {
44  
45      @Test
46      public void testBulletinABefore2018Jump() {
47          // before 2018-03-23, bulletin-A EOP were referenced to ITRF-2008
48          doTestBulletinA2018Jump(new AbsoluteDate(2018, 3, 20, 12, 34, 56.7,
49                                                   TimeScalesFactory.getUTC()),
50                                  0.0, 2.943e-3, 1.0e-6);
51      }
52  
53      @Test
54      public void testBulletinAAfter2018Jump() {
55          // after 2018-03-23, bulletin-A EOP were referenced to ITRF-2014
56          doTestBulletinA2018Jump(new AbsoluteDate(2018, 3, 26, 12, 34, 56.7,
57                                                   TimeScalesFactory.getUTC()),
58                                  2.942e-3, 0.0, 1.0e-6);
59      }
60  
61      private void doTestBulletinA2018Jump(AbsoluteDate date,
62                                           double expectedDistance2008,
63                                           double expectedDistance2014,
64                                           double tolerance)
65          {
66          Frame eme2000          = FramesFactory.getEME2000();
67          Frame unspecifiedITRF  = FramesFactory.getITRF(IERSConventions.IERS_2010, false);
68          VersionedITRF itrf2008 = FramesFactory.getITRF(ITRFVersion.ITRF_2008,
69                                                         IERSConventions.IERS_2010, false);
70          VersionedITRF itrf2014 = FramesFactory.getITRF(ITRFVersion.ITRF_2014,
71                                                         IERSConventions.IERS_2010, false);
72          Assert.assertEquals(ITRFVersion.ITRF_2008, itrf2008.getITRFVersion());
73          Assert.assertEquals(ITRFVersion.ITRF_2014, itrf2014.getITRFVersion());
74  
75          GeodeticPoint laPaz = new GeodeticPoint(FastMath.toRadians(-16.50),
76                                                  FastMath.toRadians(-68.15),
77                                                  3640.0);
78          OneAxisEllipsoid earth = new OneAxisEllipsoid(Constants.WGS84_EARTH_EQUATORIAL_RADIUS,
79                                                        Constants.WGS84_EARTH_FLATTENING,
80                                                        unspecifiedITRF);
81          Vector3D p = earth.transform(laPaz);
82  
83          // regular transform
84          Vector3D pUnspecified = unspecifiedITRF.getTransformTo(eme2000, date).transformPosition(p);
85          Vector3D p2008        = itrf2008.getTransformTo(eme2000, date).transformPosition(p);
86          Vector3D p2014        = itrf2014.getTransformTo(eme2000, date).transformPosition(p);
87          Assert.assertEquals(expectedDistance2008, Vector3D.distance(pUnspecified, p2008), tolerance);
88          Assert.assertEquals(expectedDistance2014, Vector3D.distance(pUnspecified, p2014), tolerance);
89  
90          // non-interpolating transform
91          Vector3D pUnspecifiedNI = FramesFactory.getNonInterpolatingTransform(unspecifiedITRF,
92                                                                               eme2000,
93                                                                               date).transformPosition(p);
94          Vector3D p2008NI        = FramesFactory.getNonInterpolatingTransform(itrf2008, eme2000, date).transformPosition(p);
95          Vector3D p2014NI        = FramesFactory.getNonInterpolatingTransform(itrf2014, eme2000, date).transformPosition(p);
96          Assert.assertEquals(expectedDistance2008, Vector3D.distance(pUnspecifiedNI, p2008NI), tolerance);
97          Assert.assertEquals(expectedDistance2014, Vector3D.distance(pUnspecifiedNI, p2014NI), tolerance);
98  
99          // field transform
100         FieldAbsoluteDate<Decimal64> dateField     = new FieldAbsoluteDate<>(Decimal64Field.getInstance(), date);
101         FieldVector3D<Decimal64> pUnspecifiedField = unspecifiedITRF.getTransformTo(eme2000, dateField).transformPosition(p);
102         FieldVector3D<Decimal64> p2008Field        = itrf2008.getTransformTo(eme2000, dateField).transformPosition(p);
103         FieldVector3D<Decimal64> p2014Field        = itrf2014.getTransformTo(eme2000, dateField).transformPosition(p);
104         Assert.assertEquals(expectedDistance2008, FieldVector3D.distance(pUnspecifiedField, p2008Field).getReal(), tolerance);
105         Assert.assertEquals(expectedDistance2014, FieldVector3D.distance(pUnspecifiedField, p2014Field).getReal(), tolerance);
106         
107     }
108 
109     @Test
110     public void testSerialization() throws IOException, ClassNotFoundException {
111         VersionedITRF itrf2008 = FramesFactory.getITRF(ITRFVersion.ITRF_2008,
112                                                        IERSConventions.IERS_2010, false);
113         ByteArrayOutputStream bos = new ByteArrayOutputStream();
114         ObjectOutputStream    oos = new ObjectOutputStream(bos);
115         oos.writeObject(itrf2008);
116 
117         Assert.assertTrue(bos.size() > 40000);
118         Assert.assertTrue(bos.size() < 45000);
119 
120         ByteArrayInputStream  bis = new ByteArrayInputStream(bos.toByteArray());
121         ObjectInputStream     ois = new ObjectInputStream(bis);
122         VersionedITRF deserialized  = (VersionedITRF) ois.readObject();
123         Assert.assertEquals(ITRFVersion.ITRF_2008, deserialized.getITRFVersion());
124 
125     }
126 
127     @Before
128     public void setUp() {
129         Utils.setDataRoot("itrf-jump");
130     }
131 
132 }