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