1   /* Copyright 2002-2025 Mark Rutten
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    * Mark Rutten 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 org.orekit.attitudes.FrameAlignedProvider;
20  import org.orekit.estimation.measurements.BistaticRange;
21  import org.orekit.estimation.measurements.EstimatedMeasurement;
22  import org.orekit.estimation.measurements.EstimatedMeasurementBase;
23  import org.orekit.estimation.measurements.EstimationModifier;
24  import org.orekit.estimation.measurements.GroundStation;
25  import org.orekit.models.earth.ionosphere.IonosphericModel;
26  import org.orekit.propagation.SpacecraftState;
27  
28  /**
29   * Class modifying theoretical bistatic 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   * <p>
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   *
40   * @author Maxime Journot
41   * @author Joris Olympio
42   * @author Mark Rutten
43   * @since 11.2
44   */
45  public class BistaticRangeIonosphericDelayModifier extends BaseRangeIonosphericDelayModifier implements EstimationModifier<BistaticRange> {
46  
47      /**
48       * Constructor.
49       *
50       * @param model Ionospheric delay model appropriate for the current range measurement method.
51       * @param freq  frequency of the signal in Hz
52       */
53      public BistaticRangeIonosphericDelayModifier(final IonosphericModel model,
54                                                   final double freq) {
55          super(model, freq);
56      }
57  
58      /** {@inheritDoc} */
59      @Override
60      public void modifyWithoutDerivatives(final EstimatedMeasurementBase<BistaticRange> estimated) {
61  
62          final BistaticRange measurement = estimated.getObservedMeasurement();
63          final GroundStation emitter     = measurement.getEmitterStation();
64          final GroundStation receiver    = measurement.getReceiverStation();
65  
66          BistaticModifierUtil.modify(estimated, emitter, receiver,
67                                      this::rangeErrorIonosphericModel, this);
68  
69      }
70  
71      /** {@inheritDoc} */
72      @Override
73      public void modify(final EstimatedMeasurement<BistaticRange> estimated) {
74  
75          final BistaticRange measurement = estimated.getObservedMeasurement();
76          final GroundStation emitter     = measurement.getEmitterStation();
77          final GroundStation receiver    = measurement.getReceiverStation();
78          final SpacecraftState state     = estimated.getStates()[0];
79  
80          BistaticModifierUtil.modify(estimated, getIonoModel(),
81                                      new ModifierGradientConverter(state, 6, new FrameAlignedProvider(state.getFrame())),
82                                      emitter, receiver,
83                                      this::rangeErrorIonosphericModel,
84                                      this::rangeErrorIonosphericModel,
85                                      this);
86  
87      }
88  
89  }