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.models.earth.troposphere;
18  
19  import org.hipparchus.util.FastMath;
20  import org.junit.jupiter.api.Assertions;
21  import org.junit.jupiter.api.Test;
22  import org.orekit.Utils;
23  import org.orekit.errors.OrekitException;
24  import org.orekit.errors.OrekitMessages;
25  import org.orekit.time.DateTimeComponents;
26  
27  public class ViennaModelCoefficientsLoaderTest {
28  
29      private static double epsilon = 5.0e-16;
30  
31      @Test
32      /**
33       * Regular test for 19th of November 2018 with Vienna 1 model
34       * @throws OrekitException if file does not exist or data cannot be read properly
35       */
36      public void testRegularFileVienna1() {
37  
38          Utils.setDataRoot("vmf1-tropospheric-coefficients");
39  
40          final double latitude  = FastMath.toRadians(14.0);
41          final double longitude = FastMath.toRadians(67.5);
42          ViennaModelCoefficientsLoader tropoLoader = new ViennaModelCoefficientsLoader(latitude, longitude, ViennaModelType.VIENNA_ONE);
43          DateTimeComponents dateTimeComponents = new DateTimeComponents(2018, 11, 19, 18, 0, 0.0);
44          tropoLoader.loadViennaCoefficients(dateTimeComponents);
45  
46          final double a[]       = tropoLoader.getA();
47          final double delays[]  = tropoLoader.getZenithDelay();
48  
49          Assertions.assertEquals(0.00127935, a[0], epsilon);
50          Assertions.assertEquals(0.00064084, a[1], epsilon);
51  
52          Assertions.assertEquals(2.3131, delays[0], epsilon);
53          Assertions.assertEquals(0.3086, delays[1], epsilon);
54  
55          Assertions.assertEquals("VMFG_20181119.H18", tropoLoader.getSupportedNames());
56      }
57  
58      @Test
59      /**
60       * Regular test for 25th of November 2018 with Vienna 3 model
61       * @throws OrekitException if file does not exist or data cannot be read properly
62       */
63      public void testRegularFile5x5Vienna3() {
64  
65          Utils.setDataRoot("vmf3-5x5-tropospheric-coefficients");
66  
67          final double latitude  = FastMath.toRadians(77.5);
68          final double longitude = FastMath.toRadians(2.5);
69          ViennaModelCoefficientsLoader tropoLoader = new ViennaModelCoefficientsLoader(latitude, longitude, ViennaModelType.VIENNA_THREE);
70          DateTimeComponents dateTimeComponents = new DateTimeComponents(2018, 11, 25, 0, 0, 0.0);
71          tropoLoader.loadViennaCoefficients(dateTimeComponents);
72  
73          final double a[]       = tropoLoader.getA();
74          final double delays[]  = tropoLoader.getZenithDelay();
75  
76          Assertions.assertEquals(0.00117002, a[0], epsilon);
77          Assertions.assertEquals(0.00045484, a[1], epsilon);
78  
79          Assertions.assertEquals(2.3203, delays[0], epsilon);
80          Assertions.assertEquals(0.0191, delays[1], epsilon);
81  
82          Assertions.assertEquals("VMF3_20181125.H00", tropoLoader.getSupportedNames());
83      }
84  
85      @Test
86      /**
87       * Regular test for 25th of November 2018 with Vienna 3 model
88       * @throws OrekitException if file does not exist or data cannot be read properly
89       */
90      public void testRegularFile1x1Vienna3() {
91  
92          Utils.setDataRoot("vmf3-1x1-tropospheric-coefficients");
93  
94          final double latitude  = FastMath.toRadians(19.5);
95          final double longitude = FastMath.toRadians(276.5);
96          ViennaModelCoefficientsLoader tropoLoader = new ViennaModelCoefficientsLoader(latitude, longitude, ViennaModelType.VIENNA_THREE);
97          DateTimeComponents dateTimeComponents = new DateTimeComponents(2018, 11, 25, 0, 0, 0.0);
98          tropoLoader.loadViennaCoefficients(dateTimeComponents);
99  
100         final double a[]       = tropoLoader.getA();
101         final double delays[]  = tropoLoader.getZenithDelay();
102 
103         Assertions.assertEquals(0.00127606, a[0], epsilon);
104         Assertions.assertEquals(0.00056388, a[1], epsilon);
105 
106         Assertions.assertEquals(2.3117, delays[0], epsilon);
107         Assertions.assertEquals(0.2239, delays[1], epsilon);
108 
109         Assertions.assertEquals("VMF3_20181125.H00", tropoLoader.getSupportedNames());
110     }
111 
112     @Test
113     public void testEquality() {
114 
115         // Commons parameters
116         Utils.setDataRoot("vmf3-1x1-tropospheric-coefficients");
117         DateTimeComponents dateTimeComponents = new DateTimeComponents(2018, 11, 25, 0, 0, 0.0);
118 
119         final double latitude   = FastMath.toRadians(45.0);
120 
121         double longitude1;
122         ViennaModelCoefficientsLoader model1;
123 
124         double longitude2;
125         ViennaModelCoefficientsLoader model2;
126 
127         // Test longitude = 181° and longitude = -179°
128         longitude1 = FastMath.toRadians(181.0);
129         longitude2 = FastMath.toRadians(-179.0);
130 
131         model1 = new ViennaModelCoefficientsLoader(latitude, longitude1, ViennaModelType.VIENNA_THREE);
132         model2 = new ViennaModelCoefficientsLoader(latitude, longitude2, ViennaModelType.VIENNA_THREE);
133 
134         model1.loadViennaCoefficients(dateTimeComponents);
135         model2.loadViennaCoefficients(dateTimeComponents);
136 
137         Assertions.assertEquals(model1.getA()[0],           model2.getA()[0],           epsilon);
138         Assertions.assertEquals(model1.getA()[1],           model2.getA()[1],           epsilon);
139         Assertions.assertEquals(model1.getZenithDelay()[0], model2.getZenithDelay()[0], epsilon);
140         Assertions.assertEquals(model1.getZenithDelay()[1], model2.getZenithDelay()[1], epsilon);
141 
142         // Test longitude = 180° and longitude = -180°
143         longitude1 = FastMath.toRadians(180.0);
144         longitude2 = FastMath.toRadians(-180.0);
145 
146         model1 = new ViennaModelCoefficientsLoader(latitude, longitude1, ViennaModelType.VIENNA_THREE);
147         model2 = new ViennaModelCoefficientsLoader(latitude, longitude2, ViennaModelType.VIENNA_THREE);
148 
149         model1.loadViennaCoefficients(dateTimeComponents);
150         model2.loadViennaCoefficients(dateTimeComponents);
151 
152         Assertions.assertEquals(model1.getA()[0],           model2.getA()[0],           epsilon);
153         Assertions.assertEquals(model1.getA()[1],           model2.getA()[1],           epsilon);
154         Assertions.assertEquals(model1.getZenithDelay()[0], model2.getZenithDelay()[0], epsilon);
155         Assertions.assertEquals(model1.getZenithDelay()[1], model2.getZenithDelay()[1], epsilon);
156 
157         // Test longitude = 0° and longitude = 360°
158         longitude1 = FastMath.toRadians(0.0);
159         longitude2 = FastMath.toRadians(360.0);
160 
161         model1 = new ViennaModelCoefficientsLoader(latitude, longitude1, ViennaModelType.VIENNA_THREE);
162         model2 = new ViennaModelCoefficientsLoader(latitude, longitude2, ViennaModelType.VIENNA_THREE);
163 
164         model1.loadViennaCoefficients(dateTimeComponents);
165         model2.loadViennaCoefficients(dateTimeComponents);
166 
167         Assertions.assertEquals(model1.getA()[0],           model2.getA()[0],           epsilon);
168         Assertions.assertEquals(model1.getA()[1],           model2.getA()[1],           epsilon);
169         Assertions.assertEquals(model1.getZenithDelay()[0], model2.getZenithDelay()[0], epsilon);
170         Assertions.assertEquals(model1.getZenithDelay()[1], model2.getZenithDelay()[1], epsilon);
171 
172     }
173 
174     @Test
175     /**
176      * Test of a corrupted file with improper data.
177      */
178     public void testCorruptedFileBadData() {
179 
180         final double latitude  = FastMath.toRadians(14.0);
181         final double longitude = FastMath.toRadians(67.5);
182 
183         Utils.setDataRoot("vmf1-tropospheric-coefficients");
184         final String fileName = "corrupted-bad-data-VMFG_20181119.H18";
185         ViennaModelCoefficientsLoader tropoLoader =
186                         new ViennaModelCoefficientsLoader(fileName, latitude, longitude, ViennaModelType.VIENNA_ONE);
187 
188         try {
189             tropoLoader.loadViennaCoefficients();
190             Assertions.fail("An exception should have been thrown");
191 
192         } catch (OrekitException oe) {
193             Assertions.assertEquals(OrekitMessages.UNABLE_TO_PARSE_LINE_IN_FILE, oe.getSpecifier());
194         }
195     }
196 
197     @Test
198     /**
199      * Test for a file that cannot be found
200      */
201     public void testAbsentFile() {
202 
203         Utils.setDataRoot("vmf1-tropospheric-coefficients");
204         final double latitude  = FastMath.toRadians(14.0);
205         final double longitude = FastMath.toRadians(67.5);
206         ViennaModelCoefficientsLoader tropoLoader = new ViennaModelCoefficientsLoader(latitude, longitude, ViennaModelType.VIENNA_ONE);
207         DateTimeComponents dateTimeComponents = new DateTimeComponents(2018, 11, 19, 1, 0, 0);
208 
209         try {
210             tropoLoader.loadViennaCoefficients(dateTimeComponents);
211             Assertions.fail("An exception should have been thrown");
212 
213         } catch (OrekitException oe) {
214             Assertions.assertEquals(OrekitMessages.VIENNA_ACOEF_OR_ZENITH_DELAY_NOT_AVAILABLE_FOR_DATE,
215                                 oe.getSpecifier());
216             Assertions.assertEquals(dateTimeComponents.toString(),
217                                 (String) oe.getParts()[0]);
218         }
219     }
220 
221 }