1   /* Copyright 2022-2025 Thales Alenia Space
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.water;
18  
19  import org.hipparchus.CalculusFieldElement;
20  import org.hipparchus.Field;
21  import org.hipparchus.util.Binary64Field;
22  import org.junit.jupiter.api.Assertions;
23  import org.junit.jupiter.api.Test;
24  import org.orekit.models.earth.troposphere.TroposphericModelUtils;
25  
26  public abstract class AbstractWaterVaporPressureProviderTest {
27  
28      protected abstract WaterVaporPressureProvider buildProvider();
29  
30      @Test
31      public abstract void testReferenceWaterVaporPressure();
32  
33      protected void doTestReferenceWaterVaporPressure(final double tolerance) {
34          // the reference value is from NBS/NRC steam table
35          final WaterVaporPressureProvider provider = buildProvider();
36          Assertions.assertEquals(TroposphericModelUtils.HECTO_PASCAL.toSI(10.55154),
37                                  provider.waterVaporPressure(TroposphericModelUtils.HECTO_PASCAL.toSI(1013.25), 273.5 + 18, 0.5),
38                                  tolerance);
39      }
40  
41      @Test
42      public abstract void testReferenceWaterVaporPressureField();
43  
44      protected <T extends CalculusFieldElement<T>> void doTestReferenceWaterVaporPressureField(final Field<T> field,
45                                                                                                final double tolerance) {
46          // the reference value is from NBS/NRC steam table
47          final WaterVaporPressureProvider provider = buildProvider();
48          Assertions.assertEquals(TroposphericModelUtils.HECTO_PASCAL.toSI(10.55154),
49                                  provider.waterVaporPressure(TroposphericModelUtils.HECTO_PASCAL.toSI(field.getZero().newInstance(1013.25)),
50                                                              field.getZero().newInstance(273.5 + 18),
51                                                              field.getZero().newInstance(0.5)).getReal(),
52                                  tolerance);
53      }
54  
55      @Test
56      public void testRelativeHumidity() {
57          final WaterVaporPressureProvider provider = buildProvider();
58          for (double pPa = 700; pPa < 1100; pPa += 0.5) {
59              final double p = TroposphericModelUtils.HECTO_PASCAL.toSI(pPa);
60              for (double tC = 0.01; tC < 99; tC += 0.25) {
61                  final double t = 273.15 + tC;
62                  for (double rH = 0.0; rH < 1.0; rH += 0.02) {
63                      final double e = provider.waterVaporPressure(p, t, rH);
64                      Assertions.assertEquals(rH, provider.relativeHumidity(p, t, e), 1.0e-10);
65                  }
66              }
67          }
68      }
69  
70      @Test
71      public void testRelativeHumidityField() {
72          doTestRelativeHumidityField(Binary64Field.getInstance());
73      }
74  
75      private <T extends CalculusFieldElement<T>> void doTestRelativeHumidityField(final Field<T> field) {
76          final WaterVaporPressureProvider provider = buildProvider();
77          for (double pPa = 700; pPa < 1100; pPa += 0.5) {
78              final T p = TroposphericModelUtils.HECTO_PASCAL.toSI(field.getZero().newInstance(pPa));
79              for (double tC = 0.01; tC < 99; tC += 0.25) {
80                  final T t = field.getZero().newInstance(273.15 + tC);
81                  for (double rH = 0.0; rH < 1.0; rH += 0.02) {
82                      final T e = provider.waterVaporPressure(p, t, field.getZero().newInstance(rH));
83                      Assertions.assertEquals(rH, provider.relativeHumidity(p, t, e).getReal(), 1.0e-10);
84                  }
85              }
86          }
87      }
88  
89  }