1 /* Copyright 2002-2024 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 ionospheric delay model.
61 * @return ionospheric delay model
62 */
63 protected IonosphericModel getIonoModel() {
64 return ionoModel;
65 }
66
67 /** Compute the measurement error due to Ionosphere.
68 * @param station station
69 * @param state spacecraft state
70 * @return the measurement error due to Ionosphere
71 */
72 protected double rangeErrorIonosphericModel(final GroundStation station, final SpacecraftState state) {
73 // Base frame associated with the station
74 final TopocentricFrame baseFrame = station.getBaseFrame();
75 // delay in meters
76 final double delay = ionoModel.pathDelay(state, baseFrame, frequency, ionoModel.getParameters());
77 return delay;
78 }
79
80 /** Compute the measurement error due to Ionosphere.
81 * @param <T> type of the elements
82 * @param station station
83 * @param state spacecraft state
84 * @param parameters ionospheric model parameters
85 * @return the measurement error due to Ionosphere
86 */
87 protected <T extends CalculusFieldElement<T>> T rangeErrorIonosphericModel(final GroundStation station,
88 final FieldSpacecraftState<T> state,
89 final T[] parameters) {
90 // Base frame associated with the station
91 final TopocentricFrame baseFrame = station.getBaseFrame();
92 // delay in meters
93 final T delay = ionoModel.pathDelay(state, baseFrame, frequency, parameters);
94 return delay;
95 }
96
97 /** Get the drivers for this modifier parameters.
98 * @return drivers for this modifier parameters
99 */
100 public List<ParameterDriver> getParametersDrivers() {
101 return ionoModel.getParametersDrivers();
102 }
103
104 }