1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.orekit.estimation.measurements.modifiers;
18
19 import java.util.ArrayList;
20 import java.util.List;
21
22 import org.hipparchus.Field;
23 import org.hipparchus.analysis.differentiation.Gradient;
24 import org.hipparchus.analysis.differentiation.GradientField;
25 import org.hipparchus.geometry.euclidean.threed.FieldVector3D;
26 import org.hipparchus.geometry.euclidean.threed.Vector3D;
27 import org.orekit.attitudes.AttitudeProvider;
28 import org.orekit.attitudes.FieldAttitude;
29 import org.orekit.models.earth.ionosphere.IonosphericModel;
30 import org.orekit.orbits.FieldCartesianOrbit;
31 import org.orekit.orbits.FieldOrbit;
32 import org.orekit.propagation.FieldSpacecraftState;
33 import org.orekit.propagation.SpacecraftState;
34 import org.orekit.propagation.integration.AbstractGradientConverter;
35 import org.orekit.utils.FieldAngularCoordinates;
36 import org.orekit.utils.FieldPVCoordinates;
37 import org.orekit.utils.ParameterDriver;
38 import org.orekit.utils.TimeStampedFieldAngularCoordinates;
39 import org.orekit.utils.TimeStampedFieldPVCoordinates;
40
41
42
43
44
45
46 public class IonosphericGradientConverter extends AbstractGradientConverter {
47
48
49 private final int freeStateParameters;
50
51
52 private final List<FieldSpacecraftState<Gradient>> gStates;
53
54
55
56
57
58
59
60 public IonosphericGradientConverter(final SpacecraftState state, final int freeStateParameters,
61 final AttitudeProvider provider) {
62
63 super(freeStateParameters);
64 this.freeStateParameters = freeStateParameters;
65
66
67 final Field<Gradient> field = GradientField.getField(freeStateParameters);
68
69
70 final Vector3D pos = state.getPVCoordinates().getPosition();
71 final FieldVector3D<Gradient> posG = new FieldVector3D<>(Gradient.variable(freeStateParameters, 0, pos.getX()),
72 Gradient.variable(freeStateParameters, 1, pos.getY()),
73 Gradient.variable(freeStateParameters, 2, pos.getZ()));
74
75
76 final Vector3D vel = state.getPVCoordinates().getVelocity();
77 final FieldVector3D<Gradient> velG;
78 if (freeStateParameters > 3) {
79 velG = new FieldVector3D<>(Gradient.variable(freeStateParameters, 3, vel.getX()),
80 Gradient.variable(freeStateParameters, 4, vel.getY()),
81 Gradient.variable(freeStateParameters, 5, vel.getZ()));
82 } else {
83 velG = new FieldVector3D<>(Gradient.constant(freeStateParameters, vel.getX()),
84 Gradient.constant(freeStateParameters, vel.getY()),
85 Gradient.constant(freeStateParameters, vel.getZ()));
86 }
87
88
89 final Vector3D acc = state.getPVCoordinates().getAcceleration();
90 final FieldVector3D<Gradient> accG = new FieldVector3D<>(Gradient.constant(freeStateParameters, acc.getX()),
91 Gradient.constant(freeStateParameters, acc.getY()),
92 Gradient.constant(freeStateParameters, acc.getZ()));
93
94
95 final Gradient gM = Gradient.constant(freeStateParameters, state.getMass());
96
97 final FieldOrbit<Gradient> gOrbit =
98 new FieldCartesianOrbit<>(new TimeStampedFieldPVCoordinates<>(state.getDate(), posG, velG, accG),
99 state.getFrame(),
100 field.getZero().add(state.getMu()));
101
102 final FieldAttitude<Gradient> gAttitude;
103 if (freeStateParameters > 3) {
104
105 gAttitude = provider.getAttitude(gOrbit, gOrbit.getDate(), gOrbit.getFrame());
106 } else {
107
108 gAttitude = new FieldAttitude<>(field, state.getAttitude());
109 }
110
111
112 gStates = new ArrayList<>();
113 gStates.add(new FieldSpacecraftState<>(gOrbit, gAttitude, gM));
114
115 }
116
117
118
119
120
121 public int getFreeStateParameters() {
122 return freeStateParameters;
123 }
124
125
126
127
128
129
130 public FieldSpacecraftState<Gradient> getState(final IonosphericModel ionoModel) {
131
132
133 int nbParams = 0;
134 for (final ParameterDriver driver : ionoModel.getParametersDrivers()) {
135 if (driver.isSelected()) {
136 ++nbParams;
137 }
138 }
139
140
141 while (gStates.size() < nbParams + 1) {
142 gStates.add(null);
143 }
144
145 if (gStates.get(nbParams) == null) {
146
147
148 final int freeParameters = freeStateParameters + nbParams;
149 final FieldSpacecraftState<Gradient> s0 = gStates.get(0);
150
151
152 final FieldPVCoordinates<Gradient> pv0 = s0.getPVCoordinates();
153 final FieldOrbit<Gradient> gOrbit =
154 new FieldCartesianOrbit<>(new TimeStampedFieldPVCoordinates<>(s0.getDate().toAbsoluteDate(),
155 extend(pv0.getPosition(), freeParameters),
156 extend(pv0.getVelocity(), freeParameters),
157 extend(pv0.getAcceleration(), freeParameters)),
158 s0.getFrame(), extend(s0.getMu(), freeParameters));
159
160
161 final FieldAngularCoordinates<Gradient> ac0 = s0.getAttitude().getOrientation();
162 final FieldAttitude<Gradient> gAttitude =
163 new FieldAttitude<>(s0.getAttitude().getReferenceFrame(),
164 new TimeStampedFieldAngularCoordinates<>(gOrbit.getDate(),
165 extend(ac0.getRotation(), freeParameters),
166 extend(ac0.getRotationRate(), freeParameters),
167 extend(ac0.getRotationAcceleration(), freeParameters)));
168
169
170 final Gradient gM = extend(s0.getMass(), freeParameters);
171
172 gStates.set(nbParams, new FieldSpacecraftState<>(gOrbit, gAttitude, gM));
173
174 }
175
176 return gStates.get(nbParams);
177
178 }
179
180
181
182
183
184
185
186 public Gradient[] getParameters(final FieldSpacecraftState<Gradient> state,
187 final IonosphericModel ionoModel) {
188 final int freeParameters = state.getMass().getFreeParameters();
189 final List<ParameterDriver> drivers = ionoModel.getParametersDrivers();
190 final Gradient[] parameters = new Gradient[drivers.size()];
191 int index = freeStateParameters;
192 for (int i = 0; i < drivers.size(); ++i) {
193 parameters[i] = drivers.get(i).isSelected() ?
194 Gradient.variable(freeParameters, index++, drivers.get(i).getValue()) :
195 Gradient.constant(freeParameters, drivers.get(i).getValue());
196 }
197 return parameters;
198 }
199
200 }