1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.orekit.bodies;
18
19
20 import org.hipparchus.CalculusFieldElement;
21 import org.hipparchus.geometry.euclidean.threed.FieldVector3D;
22 import org.hipparchus.geometry.euclidean.threed.Vector3D;
23 import org.orekit.frames.FieldStaticTransform;
24 import org.orekit.frames.FieldTransform;
25 import org.orekit.frames.Frame;
26 import org.orekit.frames.KinematicTransform;
27 import org.orekit.frames.StaticTransform;
28 import org.orekit.frames.Transform;
29 import org.orekit.time.AbsoluteDate;
30 import org.orekit.time.FieldAbsoluteDate;
31 import org.orekit.utils.FieldPVCoordinates;
32 import org.orekit.utils.PVCoordinates;
33 import org.orekit.utils.TimeStampedFieldPVCoordinates;
34 import org.orekit.utils.TimeStampedPVCoordinates;
35
36
37
38
39 class JPLCelestialBody implements CelestialBody {
40
41
42 private final String name;
43
44
45 private final String supportedNames;
46
47
48 private final JPLEphemeridesLoader.EphemerisType generateType;
49
50
51 private final transient JPLEphemeridesLoader.RawPVProvider rawPVProvider;
52
53
54 private final double gm;
55
56
57 private final double scale;
58
59
60 private final IAUPole iauPole;
61
62
63 private final Frame inertialFrame;
64
65
66 private final Frame bodyFrame;
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81 JPLCelestialBody(final String name, final String supportedNames,
82 final JPLEphemeridesLoader.EphemerisType generateType,
83 final JPLEphemeridesLoader.RawPVProvider rawPVProvider,
84 final double gm, final double scale,
85 final IAUPole iauPole, final Frame definingFrameAlignedWithICRF,
86 final String inertialFrameName, final String bodyOrientedFrameName) {
87 this.name = name;
88 this.gm = gm;
89 this.scale = scale;
90 this.supportedNames = supportedNames;
91 this.generateType = generateType;
92 this.rawPVProvider = rawPVProvider;
93 this.iauPole = iauPole;
94 this.inertialFrame = new InertiallyOriented(new JPLInertialTransformProvider(definingFrameAlignedWithICRF, this, iauPole),
95 inertialFrameName);
96 this.bodyFrame = new BodyOriented(bodyOrientedFrameName, new JPLRotatingTransformProvider(iauPole));
97 }
98
99
100 @Override
101 public TimeStampedPVCoordinates getPVCoordinates(final AbsoluteDate date, final Frame frame) {
102
103
104 final PVCoordinates rawPV = rawPVProvider.getRawPV(date);
105 final TimeStampedPVCoordinates scaledPV = new TimeStampedPVCoordinates(date, scale, rawPV);
106
107
108 final Transform transform = getInertiallyOrientedFrame().getParent().getTransformTo(frame, date);
109
110
111 return transform.transformPVCoordinates(scaledPV);
112
113 }
114
115
116
117
118
119
120
121 @Override
122 public <T extends CalculusFieldElement<T>> TimeStampedFieldPVCoordinates<T> getPVCoordinates(final FieldAbsoluteDate<T> date,
123 final Frame frame) {
124
125
126 final FieldPVCoordinates<T> rawPV = rawPVProvider.getRawPV(date);
127 final TimeStampedFieldPVCoordinates<T> scaledPV = new TimeStampedFieldPVCoordinates<>(date, scale, rawPV);
128
129
130 final FieldTransform<T> transform = getInertiallyOrientedFrame().getParent().getTransformTo(frame, date);
131
132
133 return transform.transformPVCoordinates(scaledPV);
134
135 }
136
137
138 @Override
139 public Vector3D getVelocity(final AbsoluteDate date, final Frame frame) {
140
141
142 final PVCoordinates rawPV = rawPVProvider.getRawPV(date);
143 final TimeStampedPVCoordinates scaledPV = new TimeStampedPVCoordinates(date, scale, rawPV);
144
145
146 final KinematicTransform transform = getInertiallyOrientedFrame().getParent().getKinematicTransformTo(frame, date);
147
148
149 return transform.transformOnlyPV(scaledPV).getVelocity();
150
151 }
152
153
154 @Override
155 public Vector3D getPosition(final AbsoluteDate date, final Frame frame) {
156
157
158 final Vector3D rawPosition = rawPVProvider.getRawPosition(date);
159 final Vector3D scaledPosition = rawPosition.scalarMultiply(scale);
160
161
162 final StaticTransform transform = getInertiallyOrientedFrame().getParent().getStaticTransformTo(frame, date);
163
164
165 return transform.transformPosition(scaledPosition);
166 }
167
168
169 @Override
170 public <T extends CalculusFieldElement<T>> FieldVector3D<T> getPosition(final FieldAbsoluteDate<T> date, final Frame frame) {
171
172
173 final FieldVector3D<T> rawPosition = rawPVProvider.getRawPosition(date);
174 final FieldVector3D<T> scaledPosition = rawPosition.scalarMultiply(scale);
175
176
177 final FieldStaticTransform<T> transform = getInertiallyOrientedFrame().getParent().getStaticTransformTo(frame, date);
178
179
180 return transform.transformPosition(scaledPosition);
181 }
182
183
184 public String getName() {
185 return name;
186 }
187
188
189 public double getGM() {
190 return gm;
191 }
192
193
194 public Frame getInertiallyOrientedFrame() {
195 return inertialFrame;
196 }
197
198
199 public Frame getBodyOrientedFrame() {
200 return bodyFrame;
201 }
202
203
204 private class InertiallyOriented extends Frame {
205
206
207 private static final String INERTIAL_FRAME_SUFFIX = "/inertial";
208
209
210
211
212
213 InertiallyOriented(final JPLInertialTransformProvider transformProvider, final String frameName) {
214 super(transformProvider.getDefiningFrame(), transformProvider, frameName == null ? name + INERTIAL_FRAME_SUFFIX : frameName, true);
215 }
216
217 }
218
219
220 private class BodyOriented extends Frame {
221
222
223
224
225 private static final String BODY_FRAME_SUFFIX = "/rotating";
226
227
228
229
230
231
232
233 BodyOriented(final String frameName, final JPLRotatingTransformProvider transformProvider) {
234 super(inertialFrame, transformProvider, frameName == null ? name + BODY_FRAME_SUFFIX : frameName, false);
235 }
236 }
237 }