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.estimation.measurements.modifiers;
18
19 import java.util.List;
20
21 import org.hipparchus.CalculusFieldElement;
22 import org.orekit.estimation.measurements.GroundStation;
23 import org.orekit.frames.TopocentricFrame;
24 import org.orekit.models.earth.ionosphere.IonosphericModel;
25 import org.orekit.propagation.FieldSpacecraftState;
26 import org.orekit.propagation.SpacecraftState;
27 import org.orekit.utils.ParameterDriver;
28
29 /** Base class modifying theoretical range measurement with ionospheric delay.
30 * The effect of ionospheric correction on the range is directly computed
31 * through the computation of the ionospheric delay.
32 *
33 * The ionospheric delay depends on the frequency of the signal (GNSS, VLBI, ...).
34 * For optical measurements (e.g. SLR), the ray is not affected by ionosphere charged particles.
35 * <p>
36 * Since 10.0, state derivatives and ionospheric parameters derivates are computed
37 * using automatic differentiation.
38 * </p>
39 * @author Joris Olympio
40 * @since 11.2
41 */
42 public abstract class BaseRangeIonosphericDelayModifier {
43
44 /** Ionospheric delay model. */
45 private final IonosphericModel ionoModel;
46
47 /** Frequency [Hz]. */
48 private final double frequency;
49
50 /** Constructor.
51 *
52 * @param model Ionospheric delay model appropriate for the current range-rate measurement method.
53 * @param freq frequency of the signal in Hz
54 */
55 protected BaseRangeIonosphericDelayModifier(final IonosphericModel model, final double freq) {
56 this.ionoModel = model;
57 this.frequency = freq;
58 }
59
60 /** Get the name of the effect modifying the measurement.
61 * @return name of the effect modifying the measurement
62 * @since 13.0
63 */
64 public String getEffectName() {
65 return "ionosphere";
66 }
67
68 /** Get the ionospheric delay model.
69 * @return ionospheric delay model
70 */
71 protected IonosphericModel getIonoModel() {
72 return ionoModel;
73 }
74
75 /** Compute the measurement error due to Ionosphere.
76 * @param station station
77 * @param state spacecraft state
78 * @return the measurement error due to Ionosphere
79 */
80 protected double rangeErrorIonosphericModel(final GroundStation station, final SpacecraftState state) {
81 // Base frame associated with the station
82 final TopocentricFrame baseFrame = station.getBaseFrame();
83 // delay in meters
84 final double delay = ionoModel.pathDelay(state, baseFrame, frequency, ionoModel.getParameters());
85 return delay;
86 }
87
88 /** Compute the measurement error due to Ionosphere.
89 * @param <T> type of the elements
90 * @param station station
91 * @param state spacecraft state
92 * @param parameters ionospheric model parameters
93 * @return the measurement error due to Ionosphere
94 */
95 protected <T extends CalculusFieldElement<T>> T rangeErrorIonosphericModel(final GroundStation station,
96 final FieldSpacecraftState<T> state,
97 final T[] parameters) {
98 // Base frame associated with the station
99 final TopocentricFrame baseFrame = station.getBaseFrame();
100 // delay in meters
101 final T delay = ionoModel.pathDelay(state, baseFrame, frequency, parameters);
102 return delay;
103 }
104
105 /** Get the drivers for this modifier parameters.
106 * @return drivers for this modifier parameters
107 */
108 public List<ParameterDriver> getParametersDrivers() {
109 return ionoModel.getParametersDrivers();
110 }
111
112 }