1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.orekit.propagation.semianalytical.dsst.forces;
18
19 import java.util.Collections;
20 import java.util.List;
21
22 import org.hipparchus.CalculusFieldElement;
23 import org.hipparchus.Field;
24 import org.hipparchus.util.FastMath;
25 import org.hipparchus.util.MathArrays;
26 import org.orekit.attitudes.AttitudeProvider;
27 import org.orekit.orbits.EquinoctialOrbit;
28 import org.orekit.orbits.FieldEquinoctialOrbit;
29 import org.orekit.orbits.OrbitType;
30 import org.orekit.orbits.PositionAngleType;
31 import org.orekit.propagation.FieldSpacecraftState;
32 import org.orekit.propagation.PropagationType;
33 import org.orekit.propagation.SpacecraftState;
34 import org.orekit.propagation.semianalytical.dsst.DSSTPropagator;
35 import org.orekit.propagation.semianalytical.dsst.utilities.AuxiliaryElements;
36 import org.orekit.propagation.semianalytical.dsst.utilities.FieldAuxiliaryElements;
37 import org.orekit.time.AbsoluteDate;
38 import org.orekit.utils.ParameterDriver;
39
40
41
42
43
44
45 public class DSSTNewtonianAttraction implements DSSTForceModel {
46
47
48 public static final String CENTRAL_ATTRACTION_COEFFICIENT = "central attraction coefficient";
49
50
51
52
53
54
55
56 private static final double MU_SCALE = FastMath.scalb(1.0, 32);
57
58
59 private final ParameterDriver gmParameterDriver;
60
61
62
63
64 public DSSTNewtonianAttraction(final double mu) {
65 gmParameterDriver = new ParameterDriver(DSSTNewtonianAttraction.CENTRAL_ATTRACTION_COEFFICIENT,
66 mu, MU_SCALE,
67 0.0, Double.POSITIVE_INFINITY);
68 }
69
70
71
72
73
74 public double getMu(final AbsoluteDate date) {
75 return gmParameterDriver.getValue(date);
76 }
77
78
79 @Override
80 public List<ShortPeriodTerms> initializeShortPeriodTerms(final AuxiliaryElements auxiliaryElements,
81 final PropagationType type,
82 final double[] parameters) {
83 return Collections.emptyList();
84 }
85
86
87 @Override
88 public <T extends CalculusFieldElement<T>> List<FieldShortPeriodTerms<T>> initializeShortPeriodTerms(final FieldAuxiliaryElements<T> auxiliaryElements,
89 final PropagationType type,
90 final T[] parameters) {
91 return Collections.emptyList();
92 }
93
94
95
96
97
98
99
100
101
102 private DSSTNewtonianAttractionContext initializeStep(final AuxiliaryElements auxiliaryElements, final double[] parameters) {
103 return new DSSTNewtonianAttractionContext(auxiliaryElements, parameters);
104 }
105
106
107
108
109
110
111
112
113
114
115 private <T extends CalculusFieldElement<T>> FieldDSSTNewtonianAttractionContext<T> initializeStep(final FieldAuxiliaryElements<T> auxiliaryElements,
116 final T[] parameters) {
117 return new FieldDSSTNewtonianAttractionContext<>(auxiliaryElements, parameters);
118 }
119
120
121 @Override
122 public double[] getMeanElementRate(final SpacecraftState state,
123 final AuxiliaryElements auxiliaryElements,
124 final double[] parameters) {
125
126
127 final DSSTNewtonianAttractionContext context = initializeStep(auxiliaryElements, parameters);
128
129 final double[] yDot = new double[7];
130 final EquinoctialOrbit orbit = (EquinoctialOrbit) OrbitType.EQUINOCTIAL.convertType(state.getOrbit());
131 orbit.addKeplerContribution(PositionAngleType.MEAN, context.getGM(), yDot);
132
133 return yDot;
134
135 }
136
137
138 @Override
139 public <T extends CalculusFieldElement<T>> T[] getMeanElementRate(final FieldSpacecraftState<T> state,
140 final FieldAuxiliaryElements<T> auxiliaryElements,
141 final T[] parameters) {
142
143
144 final Field<T> field = state.getMass().getField();
145
146 final FieldDSSTNewtonianAttractionContext<T> context = initializeStep(auxiliaryElements, parameters);
147
148 final T[] yDot = MathArrays.buildArray(field, 7);
149 final FieldEquinoctialOrbit<T> orbit = (FieldEquinoctialOrbit<T>) OrbitType.EQUINOCTIAL.convertType(state.getOrbit());
150 orbit.addKeplerContribution(PositionAngleType.MEAN, context.getGM(), yDot);
151
152 return yDot;
153 }
154
155
156 @Override
157 public void registerAttitudeProvider(final AttitudeProvider provider) {
158
159 }
160
161
162 @Override
163 public void updateShortPeriodTerms(final double[] parameters,
164 final SpacecraftState... meanStates) {
165 }
166
167
168 @Override
169 @SuppressWarnings("unchecked")
170 public <T extends CalculusFieldElement<T>> void updateShortPeriodTerms(final T[] parameters,
171 final FieldSpacecraftState<T>... meanStates) {
172 }
173
174
175 @Override
176 public List<ParameterDriver> getParametersDrivers() {
177 return Collections.singletonList(gmParameterDriver);
178 }
179
180 }