1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.orekit.propagation.conversion;
18
19 import org.orekit.attitudes.Attitude;
20 import org.orekit.attitudes.AttitudeProvider;
21 import org.orekit.attitudes.FrameAlignedProvider;
22 import org.orekit.estimation.leastsquares.DSSTBatchLSModel;
23 import org.orekit.estimation.leastsquares.ModelObserver;
24 import org.orekit.estimation.measurements.ObservedMeasurement;
25 import org.orekit.orbits.EquinoctialOrbit;
26 import org.orekit.orbits.EquinoctialOrbitFactory;
27 import org.orekit.orbits.Orbit;
28 import org.orekit.orbits.OrbitType;
29 import org.orekit.orbits.PositionAngleType;
30 import org.orekit.propagation.PropagationType;
31 import org.orekit.propagation.Propagator;
32 import org.orekit.propagation.SpacecraftState;
33 import org.orekit.propagation.integration.AdditionalDerivativesProvider;
34 import org.orekit.propagation.semianalytical.dsst.DSSTPropagator;
35 import org.orekit.propagation.semianalytical.dsst.forces.DSSTForceModel;
36 import org.orekit.propagation.semianalytical.dsst.forces.DSSTNewtonianAttraction;
37 import org.orekit.utils.ParameterDriversList;
38
39 import java.util.ArrayList;
40 import java.util.Collections;
41 import java.util.List;
42
43
44
45
46
47 public class DSSTPropagatorBuilder
48 extends AbstractIntegratedPropagatorBuilder<DSSTPropagator, EquinoctialOrbit, EquinoctialOrbitFactory> {
49
50
51 private final List<DSSTForceModel> forceModels;
52
53
54 private PropagationType stateType;
55
56
57
58
59
60
61
62
63
64
65 public DSSTPropagatorBuilder(final EquinoctialOrbitFactory factory,
66 final ODEIntegratorBuilder builder,
67 final PropagationType propagationType,
68 final PropagationType stateType) {
69 this(factory, builder, propagationType, stateType,
70 FrameAlignedProvider.of(factory.getFrame()));
71 }
72
73
74
75
76
77
78
79
80
81 public DSSTPropagatorBuilder(final EquinoctialOrbitFactory factory,
82 final ODEIntegratorBuilder builder,
83 final PropagationType propagationType,
84 final PropagationType stateType,
85 final AttitudeProvider attitudeProvider) {
86 super(factory, builder, propagationType, attitudeProvider, Propagator.DEFAULT_MASS);
87 this.forceModels = new ArrayList<>();
88 this.stateType = stateType;
89 }
90
91
92 @Override
93 public DSSTPropagatorBuilder clone() {
94
95 final DSSTPropagatorBuilder clonedBuilder = (DSSTPropagatorBuilder) super.clone();
96
97
98 final DSSTPropagatorBuilder copyBuilder =
99 new DSSTPropagatorBuilder((EquinoctialOrbitFactory) clonedBuilder.getOrbitalParameterFactory().clone(),
100 clonedBuilder.getIntegratorBuilder(),
101 clonedBuilder.getPropagationType(),
102 clonedBuilder.getStateType(),
103 clonedBuilder.getAttitudeProvider());
104
105
106 copyBuilder.setMass(getMass());
107 for (DSSTForceModel model : forceModels) {
108 copyBuilder.addForceModel(model);
109 }
110 return copyBuilder;
111
112 }
113
114
115
116
117 public PropagationType getStateType() {
118 return stateType;
119 }
120
121
122
123
124 public List<DSSTForceModel> getAllForceModels()
125 {
126 return Collections.unmodifiableList(forceModels);
127 }
128
129
130
131
132
133
134 public void addForceModel(final DSSTForceModel model) {
135 if (model instanceof DSSTNewtonianAttraction) {
136
137 if (hasNewtonianAttraction()) {
138
139 forceModels.set(forceModels.size() - 1, model);
140 } else {
141
142 forceModels.add(model);
143 }
144 } else {
145
146 if (hasNewtonianAttraction()) {
147
148
149 forceModels.add(forceModels.size() - 1, model);
150 } else {
151
152 forceModels.add(model);
153 }
154 }
155
156 addPropagationParameters(model.getParametersDrivers());
157 }
158
159
160
161
162
163 public void resetOrbit(final Orbit newOrbit, final PropagationType orbitType) {
164 this.stateType = orbitType;
165 super.resetOrbit(newOrbit);
166 }
167
168
169 public DSSTPropagator buildPropagator(final double[] normalizedParameters) {
170
171 setParameters(normalizedParameters);
172 final EquinoctialOrbit orbit = getOrbitalParameterFactory().createFromDrivers();
173 final Attitude attitude = getAttitudeProvider().getAttitude(orbit, orbit.getDate(), orbit.getFrame());
174 final SpacecraftState state = new SpacecraftState(orbit, attitude).withMass(getMass());
175
176 final DSSTPropagator propagator = new DSSTPropagator(
177 getIntegratorBuilder().buildIntegrator(orbit, OrbitType.EQUINOCTIAL, PositionAngleType.MEAN),
178 getPropagationType(), getAttitudeProvider());
179
180
181 if (!hasNewtonianAttraction()) {
182
183 addForceModel(new DSSTNewtonianAttraction(orbit.getMu()));
184 }
185 for (DSSTForceModel model : forceModels) {
186 propagator.addForceModel(model);
187 }
188
189 propagator.setInitialState(state, stateType);
190
191
192 for (AdditionalDerivativesProvider provider: getAdditionalDerivativesProviders()) {
193 propagator.addAdditionalDerivativesProvider(provider);
194 }
195
196 return propagator;
197
198 }
199
200
201 @Override
202 public DSSTBatchLSModel buildLeastSquaresModel(final PropagatorBuilder[] builders,
203 final List<ObservedMeasurement<?>> measurements,
204 final ParameterDriversList estimatedMeasurementsParameters,
205 final ModelObserver observer) {
206 return new DSSTBatchLSModel(builders,
207 measurements,
208 estimatedMeasurementsParameters,
209 observer,
210 getPropagationType());
211 }
212
213
214
215
216
217
218
219 private boolean hasNewtonianAttraction() {
220 final int last = forceModels.size() - 1;
221 return last >= 0 && forceModels.get(last) instanceof DSSTNewtonianAttraction;
222 }
223
224 }