1   /* Copyright 2002-2020 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.weather;
18  
19  import org.hipparchus.util.FastMath;
20  import org.junit.Assert;
21  import org.junit.Test;
22  import org.orekit.Utils;
23  import org.orekit.errors.OrekitException;
24  import org.orekit.errors.OrekitMessages;
25  import org.orekit.forces.gravity.potential.GRGSFormatReader;
26  import org.orekit.forces.gravity.potential.GravityFieldFactory;
27  import org.orekit.frames.FramesFactory;
28  import org.orekit.models.earth.Geoid;
29  import org.orekit.models.earth.ReferenceEllipsoid;
30  import org.orekit.time.AbsoluteDate;
31  import org.orekit.time.TimeScalesFactory;
32  import org.orekit.utils.IERSConventions;
33  
34  public class GlobalPressureTemperature2ModelTest {
35  
36      private static double epsilon = 1.0e-12;
37  
38      @Test
39      public void testWeatherParameters() {
40  
41          Utils.setDataRoot("regular-data:potential:gpt2-grid");
42          GravityFieldFactory.addPotentialCoefficientsReader(new GRGSFormatReader("grim4s4_gr", true));
43  
44          // Site Vienna: latitude:  48.20°N
45          //              longitude: 16.37°E
46          //              height:    156 m
47          //
48          // Date: 2 August 2012
49          //
50          // Expected outputs are given by the Department of Geodesy and Geoinformation of the Vienna University.
51          // Expected parameters : temperature -> 22.12 °C
52          //                       pressure    -> 1002.56 hPa
53          //                       e           -> 15.63 hPa
54          //                       ah          -> 0.0012647
55          //                       aw          -> 0.0005726
56          //
57          // We test the fiability of our implementation by comparing our output values with
58          // the ones obtained by the Vienna University.
59  
60          final double latitude  = FastMath.toRadians(48.20);
61          final double longitude = FastMath.toRadians(16.37);
62          final double height    = 156.0;
63          final AbsoluteDate date = AbsoluteDate.createMJDDate(56141, 0.0, TimeScalesFactory.getUTC());
64          final Geoid geoid = new Geoid(GravityFieldFactory.getNormalizedProvider(12, 12),
65                                        ReferenceEllipsoid.getWgs84(FramesFactory.getITRF(IERSConventions.IERS_2010, true)));
66          final GlobalPressureTemperature2Model model =
67                          new GlobalPressureTemperature2Model("gpt2_5_extract.grd", latitude, longitude, geoid);
68  
69          model.weatherParameters(height, date);
70          
71          final double a[]         = model.getA();
72          final double temperature = model.getTemperature() - 273.15;
73          final double pressure    = model.getPressure();
74          final double e           = model.getWaterVaporPressure();
75          
76          Assert.assertEquals(22.12,     temperature, 2.3e-1);
77          Assert.assertEquals(1002.56,   pressure,    5.1e-1);
78          Assert.assertEquals(0.0012647, a[0],        1.1e-7);
79          Assert.assertEquals(0.0005726, a[1],        8.6e-8);
80          Assert.assertEquals(15.63,     e,           5.0e-2);
81  
82      }
83  
84      @Test
85      public void testEquality() {
86  
87          Utils.setDataRoot("regular-data:potential:gpt2-grid");
88          GravityFieldFactory.addPotentialCoefficientsReader(new GRGSFormatReader("grim4s4_gr", true));
89  
90          // Commons parameters
91          final Geoid geoid = new Geoid(GravityFieldFactory.getNormalizedProvider(12, 12),
92                                        ReferenceEllipsoid.getWgs84(FramesFactory.getITRF(IERSConventions.IERS_2010, true)));
93  
94          final AbsoluteDate date = AbsoluteDate.createMJDDate(56141, 0.0, TimeScalesFactory.getUTC());
95          final double latitude   = FastMath.toRadians(45.0);
96          final double height     = 0.0;
97          
98          double longitude1;
99          GlobalPressureTemperature2Model model1;
100 
101         double longitude2;
102         GlobalPressureTemperature2Model model2;
103 
104         // Test longitude = 181° and longitude = -179°
105         longitude1 = FastMath.toRadians(181.0);
106         longitude2 = FastMath.toRadians(-179.0);
107 
108         model1 = new GlobalPressureTemperature2Model(latitude, longitude1, geoid);
109         model2 = new GlobalPressureTemperature2Model(latitude, longitude2, geoid);
110 
111         model1.weatherParameters(height, date);
112         model2.weatherParameters(height, date);
113 
114         Assert.assertEquals(model1.getTemperature(),        model2.getTemperature(),        epsilon);
115         Assert.assertEquals(model1.getPressure(),           model2.getPressure(),           epsilon);
116         Assert.assertEquals(model1.getWaterVaporPressure(), model2.getWaterVaporPressure(), epsilon);
117         Assert.assertEquals(model1.getA()[0],               model2.getA()[0],               epsilon);
118         Assert.assertEquals(model1.getA()[1],               model2.getA()[1],               epsilon);
119 
120         // Test longitude = 180° and longitude = -180°
121         longitude1 = FastMath.toRadians(180.0);
122         longitude2 = FastMath.toRadians(-180.0);
123 
124         model1 = new GlobalPressureTemperature2Model(latitude, longitude1, geoid);
125         model2 = new GlobalPressureTemperature2Model(latitude, longitude2, geoid);
126 
127         model1.weatherParameters(height, date);
128         model2.weatherParameters(height, date);
129 
130         Assert.assertEquals(model1.getTemperature(),        model2.getTemperature(),        epsilon);
131         Assert.assertEquals(model1.getPressure(),           model2.getPressure(),           epsilon);
132         Assert.assertEquals(model1.getWaterVaporPressure(), model2.getWaterVaporPressure(), epsilon);
133         Assert.assertEquals(model1.getA()[0],               model2.getA()[0],               epsilon);
134         Assert.assertEquals(model1.getA()[1],               model2.getA()[1],               epsilon);
135 
136         // Test longitude = 0° and longitude = 360°
137         longitude1 = FastMath.toRadians(0.0);
138         longitude2 = FastMath.toRadians(360.0);
139 
140         model1 = new GlobalPressureTemperature2Model(latitude, longitude1, geoid);
141         model2 = new GlobalPressureTemperature2Model(latitude, longitude2, geoid);
142 
143         model1.weatherParameters(height, date);
144         model2.weatherParameters(height, date);
145 
146         Assert.assertEquals(model1.getTemperature(),        model2.getTemperature(),        epsilon);
147         Assert.assertEquals(model1.getPressure(),           model2.getPressure(),           epsilon);
148         Assert.assertEquals(model1.getWaterVaporPressure(), model2.getWaterVaporPressure(), epsilon);
149         Assert.assertEquals(model1.getA()[0],               model2.getA()[0],               epsilon);
150         Assert.assertEquals(model1.getA()[1],               model2.getA()[1],               epsilon);
151 
152     }
153 
154     @Test
155     public void testCorruptedFileBadData() {
156         
157         Utils.setDataRoot("regular-data:potential:gpt2-grid");
158         GravityFieldFactory.addPotentialCoefficientsReader(new GRGSFormatReader("grim4s4_gr", true));
159 
160         final double latitude  = FastMath.toRadians(14.0);
161         final double longitude = FastMath.toRadians(67.5);
162 
163         // Date is not used here
164         final Geoid geoid = new Geoid(GravityFieldFactory.getNormalizedProvider(12, 12),
165                                       ReferenceEllipsoid.getWgs84(FramesFactory.getITRF(IERSConventions.IERS_2010, true)));
166 
167         final String fileName = "corrupted-bad-data-gpt2_5.grd";
168         try {
169         new GlobalPressureTemperature2Model(fileName, latitude, longitude, geoid);
170             Assert.fail("An exception should have been thrown");
171         } catch (OrekitException oe) {
172             Assert.assertEquals(OrekitMessages.UNABLE_TO_PARSE_LINE_IN_FILE, oe.getSpecifier());
173             Assert.assertEquals(6, ((Integer) oe.getParts()[0]).intValue());
174             Assert.assertTrue(((String) oe.getParts()[1]).endsWith(fileName));
175         }
176 
177     }
178 
179     @Test
180     public void testCorruptedIrregularGrid() {
181         
182         Utils.setDataRoot("regular-data:potential:gpt2-grid");
183         GravityFieldFactory.addPotentialCoefficientsReader(new GRGSFormatReader("grim4s4_gr", true));
184 
185         final double latitude  = FastMath.toRadians(14.0);
186         final double longitude = FastMath.toRadians(68.5);
187 
188         // Date is not used here
189         final Geoid geoid = new Geoid(GravityFieldFactory.getNormalizedProvider(12, 12),
190                                       ReferenceEllipsoid.getWgs84(FramesFactory.getITRF(IERSConventions.IERS_2010, true)));
191 
192         final String fileName = "corrupted-irregular-grid-gpt2_5.grd";
193         try {
194         new GlobalPressureTemperature2Model(fileName, latitude, longitude, geoid);
195             Assert.fail("An exception should have been thrown");
196         } catch (OrekitException oe) {
197             Assert.assertEquals(OrekitMessages.IRREGULAR_OR_INCOMPLETE_GRID, oe.getSpecifier());
198             Assert.assertTrue(((String) oe.getParts()[0]).endsWith(fileName));
199         }
200 
201     }
202 
203 }