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