1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.orekit.propagation.analytical.tle;
18
19 import org.hipparchus.CalculusFieldElement;
20 import org.hipparchus.util.FastMath;
21 import org.hipparchus.util.FieldSinCos;
22 import org.orekit.annotation.DefaultDataContext;
23 import org.orekit.attitudes.AttitudeProvider;
24 import org.orekit.data.DataContext;
25 import org.orekit.frames.Frame;
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42 public class FieldSGP4<T extends CalculusFieldElement<T>> extends FieldTLEPropagator<T> {
43
44
45 private boolean lessThan220;
46
47
48 private T delM0;
49
50
51 private T d2;
52 private T d3;
53 private T d4;
54 private T t3cof;
55 private T t4cof;
56 private T t5cof;
57 private T sinM0;
58 private T omgcof;
59 private T xmcof;
60 private T c5;
61
62
63
64
65
66
67
68
69
70
71
72
73 @DefaultDataContext
74 public FieldSGP4(final FieldTLE<T> initialTLE, final AttitudeProvider attitudeProvider,
75 final T mass, final T[] parameters) {
76 this(initialTLE, attitudeProvider, mass,
77 DataContext.getDefault().getFrames().getTEME(), parameters);
78 }
79
80
81
82
83
84
85
86
87 public FieldSGP4(final FieldTLE<T> initialTLE,
88 final AttitudeProvider attitudeProvider,
89 final T mass,
90 final Frame teme,
91 final T[] parameters) {
92 super(initialTLE, attitudeProvider, mass, teme, parameters);
93 }
94
95
96
97
98 protected void sxpInitialize(final T[] parameters) {
99
100 final T bStar = parameters[0];
101
102
103
104 lessThan220 = perige.getReal() < 220;
105 if (!lessThan220) {
106 final FieldSinCos<T> scM0 = FastMath.sinCos(tle.getMeanAnomaly());
107 final T c1sq = c1.square();
108 delM0 = eta.multiply(scM0.cos()).add(1.0);
109 delM0 = delM0.multiply(delM0).multiply(delM0);
110 d2 = a0dp.multiply(tsi).multiply(c1sq).multiply(4.0);
111 final T temp = d2.multiply(tsi).multiply(c1).divide(3.0);
112 d3 = a0dp.multiply(17.0).add(s4).multiply(temp);
113 d4 = temp.multiply(0.5).multiply(a0dp).multiply(tsi).multiply(a0dp.multiply(221.0).add(s4.multiply(31.0))).multiply(c1);
114 t3cof = d2.add(c1sq.multiply(2));
115 t4cof = d3.multiply(3.0).add(c1.multiply(d2.multiply(12.0).add(c1sq.multiply(10)))).multiply(0.25);
116 t5cof = d4.multiply(3.0).add(c1.multiply(12.0).multiply(d3)).add(
117 d2.multiply(d2).multiply(6.0)).add(c1sq.multiply(15.0).multiply(d2.multiply(2).add(c1sq))).multiply(0.2);
118 sinM0 = scM0.sin();
119 if (tle.getE().getReal() < 1e-4) {
120 omgcof = c1sq.getField().getZero();
121 xmcof = c1sq.getField().getZero();
122 } else {
123 final T c3 = coef.multiply(tsi).multiply(xn0dp).multiply(TLEConstants.A3OVK2 * TLEConstants.NORMALIZED_EQUATORIAL_RADIUS).multiply(sini0.divide(tle.getE()));
124 xmcof = coef.multiply(bStar).divide(eeta).multiply(-TLEConstants.TWO_THIRD * TLEConstants.NORMALIZED_EQUATORIAL_RADIUS);
125 omgcof = bStar.multiply(c3).multiply(FastMath.cos(tle.getPerigeeArgument()));
126 }
127 }
128
129 c5 = coef1.multiply(2).multiply(a0dp).multiply(beta02).multiply(etasq.add(eeta).multiply(2.75).add(eeta.multiply(etasq)).add(1));
130
131 }
132
133
134
135
136
137 protected void sxpPropagate(final T tSince, final T[] parameters) {
138
139
140 final T bStar = parameters[0];
141 final T xmdf = tle.getMeanAnomaly().add(xmdot.multiply(tSince));
142 final T omgadf = tle.getPerigeeArgument().add(omgdot.multiply(tSince));
143 final T xn0ddf = tle.getRaan().add(xnodot.multiply(tSince));
144 omega = omgadf;
145 T xmp = xmdf;
146 final T tsq = tSince.square();
147 xnode = xn0ddf.add(xnodcf.multiply(tsq));
148 T tempa = c1.multiply(tSince).negate().add(1.0);
149 T tempe = bStar.multiply(c4).multiply(tSince);
150 T templ = t2cof.multiply(tsq);
151
152 if (!lessThan220) {
153 final T delomg = omgcof.multiply(tSince);
154 T delm = eta.multiply(FastMath.cos(xmdf)).add(1.0);
155 delm = xmcof.multiply(delm.square().multiply(delm).subtract(delM0));
156 final T temp = delomg.add(delm);
157 xmp = xmdf.add(temp);
158 omega = omgadf.subtract(temp);
159 final T tcube = tsq.multiply(tSince);
160 final T tfour = tSince.multiply(tcube);
161 tempa = tempa.subtract(d2.multiply(tsq)).subtract(d3.multiply(tcube)).subtract(d4.multiply(tfour));
162 tempe = tempe.add(bStar.multiply(c5).multiply(FastMath.sin(xmp).subtract(sinM0)));
163 templ = templ.add(t3cof.multiply(tcube)).add(tfour.multiply(t4cof.add(tSince.multiply(t5cof))));
164 }
165
166 a = a0dp.multiply(tempa).multiply(tempa);
167 e = tle.getE().subtract(tempe);
168
169
170 if (e.getReal() < 1e-6) {
171 e = e.getField().getZero().newInstance(1e-6);
172 }
173
174 xl = xmp.add(omega).add(xnode).add(xn0dp.multiply(templ));
175
176 i = tle.getI();
177
178 }
179
180 }