1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.orekit.propagation.numerical.cr3bp;
18
19 import java.util.List;
20 import java.util.Map;
21
22 import org.orekit.errors.OrekitException;
23 import org.orekit.errors.OrekitMessages;
24 import org.orekit.propagation.SpacecraftState;
25 import org.orekit.propagation.numerical.NumericalPropagator;
26 import org.orekit.utils.AbsolutePVCoordinates;
27 import org.orekit.utils.AbstractMultipleShooting;
28
29
30
31
32
33
34
35 public class CR3BPMultipleShooter extends AbstractMultipleShooting {
36
37
38 private static final String STM = "stmEquations";
39
40
41
42
43 private final List<STMEquations> stmEquations;
44
45
46 private boolean isClosedOrbit;
47
48
49
50
51
52
53
54
55
56 public CR3BPMultipleShooter(final List<SpacecraftState> initialGuessList,
57 final List<NumericalPropagator> propagatorList,
58 final List<STMEquations> stmEquations,
59 final double tolerance, final int maxIter) {
60 super(initialGuessList, propagatorList, tolerance, maxIter, true, STM);
61 this.stmEquations = stmEquations;
62 }
63
64
65 protected SpacecraftState getAugmentedInitialState(final int i) {
66 return stmEquations.get(i).setInitialPhi(getPatchPoint(i));
67 }
68
69
70 @Override
71 public void setEpochFreedom(final int patchIndex, final boolean isFree) {
72 throw new OrekitException(OrekitMessages.FUNCTION_NOT_IMPLEMENTED);
73 }
74
75
76 @Override
77 public void setScaleLength(final double scaleLength) {
78 throw new OrekitException(OrekitMessages.FUNCTION_NOT_IMPLEMENTED);
79 }
80
81
82 @Override
83 public void setScaleTime(final double scaleTime) {
84 throw new OrekitException(OrekitMessages.FUNCTION_NOT_IMPLEMENTED);
85 }
86
87
88
89
90 public void setClosedOrbitConstraint(final boolean isClosed) {
91 this.isClosedOrbit = isClosed;
92 }
93
94
95 @Override
96 protected double[][] computeAdditionalJacobianMatrix(final List<SpacecraftState> propagatedSP) {
97
98 final Map<Integer, Double> mapConstraints = getConstraintsMap();
99 final boolean[] freeCompsMap = getFreeCompsMap();
100
101
102 final int nRows = mapConstraints.size() + (isClosedOrbit ? 6 : 0);
103 final int nCols = getNumberOfFreeComponents();
104
105 final double[][] M = new double[nRows][nCols];
106
107 int j = 0;
108 if (isClosedOrbit) {
109
110
111
112
113
114
115
116
117
118 int index = 0;
119 for (int i = 0; i < 6; i++) {
120 if (freeCompsMap[i]) {
121 M[i][index] = -1.0;
122 index++;
123 }
124 }
125 index = nCols - 6;
126 for (int i = 0; i < 6; i++) {
127 if (freeCompsMap[nCols - 6 + i]) {
128 M[i][index] = 1.0;
129 index++;
130 }
131 }
132 j = 6;
133 }
134
135 for (int k : mapConstraints.keySet()) {
136 M[j][k] = 1.0;
137 j++;
138 }
139
140 return M;
141 }
142
143
144 @Override
145 protected double[] computeAdditionalConstraints(final List<SpacecraftState> propagatedSP) {
146
147
148
149
150
151
152
153
154
155
156
157
158
159 final Map<Integer, Double> mapConstraints = getConstraintsMap();
160 final List<SpacecraftState> patchedSpacecraftStates = getPatchedSpacecraftState();
161
162 final double[] fxAdditional = new double[mapConstraints.size() + (isClosedOrbit ? 6 : 0)];
163 int i = 0;
164
165 if (isClosedOrbit) {
166
167 final AbsolutePVCoordinates apv1i = patchedSpacecraftStates.get(0).getAbsPVA();
168 final AbsolutePVCoordinates apvni = patchedSpacecraftStates.get(patchedSpacecraftStates.size() - 1).getAbsPVA();
169
170 fxAdditional[0] = apvni.getPosition().getX() - apv1i.getPosition().getX();
171 fxAdditional[1] = apvni.getPosition().getY() - apv1i.getPosition().getY();
172 fxAdditional[2] = apvni.getPosition().getZ() - apv1i.getPosition().getZ();
173 fxAdditional[3] = apvni.getVelocity().getX() - apv1i.getVelocity().getX();
174 fxAdditional[4] = apvni.getVelocity().getY() - apv1i.getVelocity().getY();
175 fxAdditional[5] = apvni.getVelocity().getZ() - apv1i.getVelocity().getZ();
176
177 i = 6;
178 }
179
180
181 updateAdditionalConstraints(i, fxAdditional);
182 return fxAdditional;
183 }
184
185
186 @Override
187 protected int getNumberOfConstraints() {
188 return super.getNumberOfConstraints() + (isClosedOrbit ? 6 : 0);
189 }
190
191 }