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