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.forces.gravity.potential;
18  
19  
20  import org.hipparchus.util.FastMath;
21  import org.hipparchus.util.Precision;
22  import org.junit.Assert;
23  import org.junit.Test;
24  import org.orekit.Utils;
25  import org.orekit.errors.OrekitException;
26  import org.orekit.forces.gravity.potential.NormalizedSphericalHarmonicsProvider.NormalizedSphericalHarmonics;
27  import org.orekit.forces.gravity.potential.UnnormalizedSphericalHarmonicsProvider.UnnormalizedSphericalHarmonics;
28  import org.orekit.time.AbsoluteDate;
29  import org.orekit.time.TimeScalesFactory;
30  import org.orekit.utils.Constants;
31  
32  public class SHMFormatReaderTest {
33  
34      @Test
35      public void testReadLimits() {
36          Utils.setDataRoot("potential");
37          GravityFieldFactory.addPotentialCoefficientsReader(new SHMFormatReader("eigen_cg03c_coef", false));
38          UnnormalizedSphericalHarmonicsProvider provider = GravityFieldFactory.getUnnormalizedProvider(3, 2);
39          UnnormalizedSphericalHarmonics harmonics = provider.onDate(new AbsoluteDate(1997, 1, 1, 12, 0, 0.0, TimeScalesFactory.getTT()));
40          try {
41              harmonics.getUnnormalizedCnm(3, 3);
42              Assert.fail("an exception should have been thrown");
43          } catch (OrekitException oe) {
44              // expected
45          } catch (Exception e) {
46              Assert.fail("wrong exception caught: " + e.getLocalizedMessage());
47          }
48          try {
49              harmonics.getUnnormalizedCnm(4, 2);
50              Assert.fail("an exception should have been thrown");
51          } catch (OrekitException oe) {
52              // expected
53          } catch (Exception e) {
54              Assert.fail("wrong exception caught: " + e.getLocalizedMessage());
55          }
56          harmonics.getUnnormalizedCnm(3, 2);
57          Assert.assertEquals(3, provider.getMaxDegree());
58          Assert.assertEquals(2, provider.getMaxOrder());
59      }
60  
61      @Deprecated
62      @Test
63      public void testDeprecated() throws OrekitException {
64          Utils.setDataRoot("potential");
65          GravityFieldFactory.addPotentialCoefficientsReader(new SHMFormatReader("eigen_cg03c_coef", false));
66          NormalizedSphericalHarmonicsProvider provider = GravityFieldFactory.getNormalizedProvider(5, 5);
67          AbsoluteDate refDate = new AbsoluteDate("1997-01-01T12:00:00", TimeScalesFactory.getTT());
68          Assert.assertEquals(refDate, provider.getReferenceDate());
69          AbsoluteDate date = new AbsoluteDate("2011-05-01T01:02:03", TimeScalesFactory.getTT());
70          Assert.assertEquals(date.durationFrom(refDate), provider.getOffset(date), Precision.SAFE_MIN);
71      }
72  
73      @Test
74      public void testRegular03cNormalized() {
75          Utils.setDataRoot("potential");
76          GravityFieldFactory.addPotentialCoefficientsReader(new SHMFormatReader("eigen_cg03c_coef", false));
77          NormalizedSphericalHarmonicsProvider provider = GravityFieldFactory.getNormalizedProvider(5, 5);
78          Assert.assertEquals(TideSystem.TIDE_FREE, provider.getTideSystem());
79  
80          AbsoluteDate refDate = new AbsoluteDate("1997-01-01T12:00:00", TimeScalesFactory.getTT());
81          AbsoluteDate date = new AbsoluteDate("2011-05-01T01:02:03", TimeScalesFactory.getTT());
82  
83          NormalizedSphericalHarmonics harmonics = provider.onDate(date);
84          double offset     = date.durationFrom(refDate);
85          double offsetYear = offset / Constants.JULIAN_YEAR;
86          Assert.assertEquals(0.957201462136e-06 + offsetYear * 0.490000000000e-11,
87                              harmonics.getNormalizedCnm(3, 0), 1.0e-15);
88          Assert.assertEquals( 0.174786174485e-06, harmonics.getNormalizedCnm(5, 5), 1.0e-15);
89          Assert.assertEquals( 0.0,                harmonics.getNormalizedSnm(4, 0), 1.0e-15);
90          Assert.assertEquals( 0.308834784975e-06, harmonics.getNormalizedSnm(4, 4), 1.0e-15);
91          Assert.assertEquals(0.3986004415E+15 , provider.getMu(),  0);
92          Assert.assertEquals(0.6378136460E+07 , provider.getAe(),  0);
93  
94      }
95  
96      @Test
97      public void testRegular03cUnnormalized() {
98          Utils.setDataRoot("potential");
99          GravityFieldFactory.addPotentialCoefficientsReader(new SHMFormatReader("eigen_cg03c_coef", false));
100         UnnormalizedSphericalHarmonicsProvider provider = GravityFieldFactory.getUnnormalizedProvider(5, 5);
101         Assert.assertEquals(TideSystem.TIDE_FREE, provider.getTideSystem());
102 
103         AbsoluteDate date = new AbsoluteDate("2011-05-01T01:02:03", TimeScalesFactory.getTT());
104 
105         UnnormalizedSphericalHarmonics harmonics = provider.onDate(date);
106         int maxUlps = 2;
107         checkValue(harmonics.getUnnormalizedCnm(3, 0), date, 3, 0,
108                    1997, 1, 1, 0.957201462136e-06, 0.490000000000e-11, maxUlps);
109         checkValue(harmonics.getUnnormalizedCnm(5, 5), date, 5, 5,
110                    1997, 1, 1, 0.174786174485e-06, 0.0, maxUlps);
111         checkValue(harmonics.getUnnormalizedSnm(4, 0), date, 4, 0,
112                    1997, 1, 1, 0, 0, maxUlps);
113         checkValue(harmonics.getUnnormalizedSnm(4, 4), date, 4, 4,
114                    1997, 1, 1, 0.308834784975e-06, 0, maxUlps);
115         Assert.assertEquals(0.3986004415E+15 , provider.getMu(),  0);
116         Assert.assertEquals(0.6378136460E+07 , provider.getAe(),  0);
117 
118     }
119 
120     @Test
121     public void testReadCompressed01c() {
122         Utils.setDataRoot("potential");
123         GravityFieldFactory.addPotentialCoefficientsReader(new SHMFormatReader("compressed-eigen-cg01c_coef", false));
124         UnnormalizedSphericalHarmonicsProvider provider = GravityFieldFactory.getUnnormalizedProvider(5, 5);
125         Assert.assertEquals(TideSystem.TIDE_FREE, provider.getTideSystem());
126 
127         AbsoluteDate date = new AbsoluteDate("2011-05-01T01:02:03", TimeScalesFactory.getTT());
128 
129         UnnormalizedSphericalHarmonics harmonics = provider.onDate(date);
130         int maxUlps = 2;
131         checkValue(harmonics.getUnnormalizedCnm(3, 0), date, 3, 0,
132                    1997, 1, 1, 0.957187536534E-06, 0.490000000000E-11, maxUlps);
133         checkValue(harmonics.getUnnormalizedCnm(5, 5), date, 5, 5,
134                    1997, 1, 1, 0.174787189024E-06, 0.0, maxUlps);
135         checkValue(harmonics.getUnnormalizedSnm(4, 0), date, 4, 0,
136                    1997, 1, 1, 0, 0, maxUlps);
137         checkValue(harmonics.getUnnormalizedSnm(4, 4), date, 4, 4,
138                    1997, 1, 1, 0.308834848269E-06, 0, maxUlps);
139         Assert.assertEquals(0.3986004415E+15 , provider.getMu(),  0);
140         Assert.assertEquals(0.6378136460E+07 , provider.getAe(),  0);
141 
142     }
143 
144     @Test(expected=OrekitException.class)
145     public void testCorruptedFile1() {
146         Utils.setDataRoot("potential");
147         GravityFieldFactory.addPotentialCoefficientsReader(new SHMFormatReader("corrupted-1-eigen_coef", false));
148         GravityFieldFactory.getUnnormalizedProvider(5, 5);
149     }
150 
151     @Test(expected=OrekitException.class)
152     public void testCorruptedFile2() {
153         Utils.setDataRoot("potential");
154         GravityFieldFactory.addPotentialCoefficientsReader(new SHMFormatReader("corrupted-2-eigen_coef", false));
155         GravityFieldFactory.getUnnormalizedProvider(5, 5);
156     }
157 
158     @Test(expected=OrekitException.class)
159     public void testCorruptedFile3() {
160         Utils.setDataRoot("potential");
161         GravityFieldFactory.addPotentialCoefficientsReader(new SHMFormatReader("corrupted-3-eigen_coef", false));
162         GravityFieldFactory.getUnnormalizedProvider(5, 5);
163     }
164 
165     @Test(expected=OrekitException.class)
166     public void testCorruptedFile4() {
167         Utils.setDataRoot("potential");
168         GravityFieldFactory.addPotentialCoefficientsReader(new SHMFormatReader("corrupted-4-eigen_coef", false));
169         GravityFieldFactory.getUnnormalizedProvider(5, 5);
170     }
171 
172     @Test
173     public void testZeroTide() {
174         Utils.setDataRoot("potential");
175         GravityFieldFactory.addPotentialCoefficientsReader(new SHMFormatReader("dummy_unknown_tide_shm", false));
176         Assert.assertEquals(TideSystem.UNKNOWN,
177                             GravityFieldFactory.getUnnormalizedProvider(5, 5).getTideSystem());
178     }
179 
180     private void checkValue(final double value,
181                             final AbsoluteDate date, final int n, final int m,
182                             final int refYear, final int refMonth, final int refDay,
183                             final double constant, final double trend,
184                             final int maxUlps)
185         {
186         double factor = GravityFieldFactory.getUnnormalizationFactors(n, m)[n][m];
187         AbsoluteDate refDate = new AbsoluteDate(refYear, refMonth, refDay, 12, 0, 0, TimeScalesFactory.getTT());
188         double dtYear = date.durationFrom(refDate) / Constants.JULIAN_YEAR;
189         double normalized = factor * (constant + trend * dtYear);
190         double epsilon = maxUlps * FastMath.ulp(normalized);
191         Assert.assertEquals(normalized, value, epsilon);
192     }
193 
194 }