1 /* Copyright 2011-2012 Space Applications Services 2 * Licensed to CS Communication & Systèmes (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; 18 19 import java.util.Collections; 20 import java.util.List; 21 22 import org.hipparchus.Field; 23 import org.hipparchus.RealFieldElement; 24 import org.hipparchus.util.FastMath; 25 import org.hipparchus.util.MathArrays; 26 import org.orekit.time.AbsoluteDate; 27 import org.orekit.time.FieldAbsoluteDate; 28 import org.orekit.utils.ParameterDriver; 29 30 /** Defines a tropospheric model, used to calculate the path delay imposed to 31 * electro-magnetic signals between an orbital satellite and a ground station. 32 * <p> 33 * Models that implement this interface don't split the delay into hydrostatic 34 * and non-hydrostatic part. 35 * </p> 36 * @author Thomas Neidhart 37 * @since 7.1 38 */ 39 public interface TroposphericModel extends DiscreteTroposphericModel { 40 41 /** Calculates the tropospheric path delay for the signal path from a ground 42 * station to a satellite. 43 * 44 * @param elevation the elevation of the satellite, in radians 45 * @param height the height of the station in m above sea level 46 * @return the path delay due to the troposphere in m 47 */ 48 double pathDelay(double elevation, double height); 49 50 /** Calculates the tropospheric path delay for the signal path from a ground 51 * station to a satellite. 52 * <p> 53 * It is discourage to use this method. It has been developed to respect the 54 * current architecture of the tropospheric models. 55 * </p> 56 * @param <T> type of the elements 57 * @param elevation the elevation of the satellite, in radians 58 * @param height the height of the station in m above sea level 59 * @return the path delay due to the troposphere in m 60 */ 61 default <T extends RealFieldElement<T>> T pathDelay(T elevation, T height) { 62 final T zero = height.getField().getZero(); 63 return zero.add(pathDelay(elevation.getReal(), height.getReal())); 64 } 65 66 /** Calculates the tropospheric path delay for the signal path from a ground 67 * station to a satellite. 68 * 69 * @param elevation the elevation of the satellite, in radians 70 * @param height the height of the station in m above sea level 71 * @param parameters tropospheric model parameters. 72 * @param date current date 73 * @return the path delay due to the troposphere in m 74 */ 75 default double pathDelay(double elevation, double height, double[] parameters, AbsoluteDate date) { 76 return pathDelay(elevation, height); 77 } 78 79 /** Calculates the tropospheric path delay for the signal path from a ground 80 * station to a satellite. 81 * 82 * @param <T> type of the elements 83 * @param elevation the elevation of the satellite, in radians 84 * @param height the height of the station in m above sea level 85 * @param parameters tropospheric model parameters. 86 * @param date current date 87 * @return the path delay due to the troposphere in m 88 */ 89 default <T extends RealFieldElement<T>> T pathDelay(T elevation, T height, T[] parameters, FieldAbsoluteDate<T> date) { 90 return pathDelay(elevation, height); 91 } 92 93 /** This method allows the computation of the zenith hydrostatic and 94 * zenith wet delay. The resulting element is an array having the following form: 95 * <ul> 96 * <li>double[0] = D<sub>hz</sub> → zenith hydrostatic delay 97 * <li>double[1] = D<sub>wz</sub> → zenith wet delay 98 * </ul> 99 * @param height the height of the station in m above sea level. 100 * @param parameters tropospheric model parameters. 101 * @param date current date 102 * @return a two components array containing the zenith hydrostatic and wet delays. 103 */ 104 default double[] computeZenithDelay(double height, double[] parameters, AbsoluteDate date) { 105 return new double[] { 106 pathDelay(0.5 * FastMath.PI, height), 107 0 108 }; 109 } 110 111 /** This method allows the computation of the zenith hydrostatic and 112 * zenith wet delay. The resulting element is an array having the following form: 113 * <ul> 114 * <li>double[0] = D<sub>hz</sub> → zenith hydrostatic delay 115 * <li>double[1] = D<sub>wz</sub> → zenith wet delay 116 * </ul> 117 * @param <T> type of the elements 118 * @param height the height of the station in m above sea level. 119 * @param parameters tropospheric model parameters. 120 * @param date current date 121 * @return a two components array containing the zenith hydrostatic and wet delays. 122 */ 123 default <T extends RealFieldElement<T>> T[] computeZenithDelay(T height, T[] parameters, FieldAbsoluteDate<T> date) { 124 final Field<T> field = height.getField(); 125 final T zero = field.getZero(); 126 final T[] delay = MathArrays.buildArray(field, 2); 127 delay[0] = pathDelay(zero.add(0.5 * FastMath.PI), height); 128 delay[1] = zero; 129 return delay; 130 } 131 132 /** This method allows the computation of the hydrostatic and 133 * wet mapping functions. The resulting element is an array having the following form: 134 * <ul> 135 * <li>double[0] = m<sub>h</sub>(e) → hydrostatic mapping function 136 * <li>double[1] = m<sub>w</sub>(e) → wet mapping function 137 * </ul> 138 * @param elevation the elevation of the satellite, in radians. 139 * @param height the height of the station in m above sea level. 140 * @param parameters tropospheric model parameters. 141 * @param date current date 142 * @return a two components array containing the hydrostatic and wet mapping functions. 143 */ 144 default double[] mappingFactors(double elevation, double height, double[] parameters, AbsoluteDate date) { 145 return new double[] { 146 1.0, 147 1.0 148 }; 149 } 150 151 /** This method allows the computation of the hydrostatic and 152 * wet mapping functions. The resulting element is an array having the following form: 153 * <ul> 154 * <li>double[0] = m<sub>h</sub>(e) → hydrostatic mapping function 155 * <li>double[1] = m<sub>w</sub>(e) → wet mapping function 156 * </ul> 157 * @param elevation the elevation of the satellite, in radians. 158 * @param height the height of the station in m above sea level. 159 * @param parameters tropospheric model parameters. 160 * @param date current date 161 * @param <T> type of the elements 162 * @return a two components array containing the hydrostatic and wet mapping functions. 163 */ 164 default <T extends RealFieldElement<T>> T[] mappingFactors(T elevation, T height, 165 T[] parameters, FieldAbsoluteDate<T> date) { 166 final Field<T> field = date.getField(); 167 final T one = field.getOne(); 168 final T[] factors = MathArrays.buildArray(field, 2); 169 factors[0] = one; 170 factors[1] = one; 171 return factors; 172 } 173 174 /** Get the drivers for tropospheric model parameters. 175 * @return drivers for tropospheric model parameters 176 */ 177 default List<ParameterDriver> getParametersDrivers() { 178 return Collections.emptyList(); 179 } 180 }