1 /* Contributed in the public domain.
2 * Licensed to CS GROUP (CS) under one or more
3 * contributor license agreements. See the NOTICE file distributed with
4 * this work for additional information regarding copyright ownership.
5 * CS licenses this file to You under the Apache License, Version 2.0
6 * (the "License"); you may not use this file except in compliance with
7 * the License. You may obtain a copy of the License at
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17 package org.orekit.frames;
18
19 import java.util.Collection;
20 import java.util.function.BiFunction;
21 import java.util.function.Supplier;
22
23 import org.orekit.bodies.CelestialBodies;
24 import org.orekit.time.TimeScales;
25 import org.orekit.time.UT1Scale;
26 import org.orekit.utils.IERSConventions;
27
28 /**
29 * A collection of commonly used {@link Frame}s. This interface defines methods for
30 * obtaining instances of many commonly used reference frames.
31 *
32 * @author Guylaine Prat
33 * @author Luc Maisonobe
34 * @author Pascal Parraud
35 * @author Evan Ward
36 * @see FramesFactory
37 * @since 10.0
38 */
39 public interface Frames {
40
41 /** Get Earth Orientation Parameters history.
42 * @param conventions conventions for which EOP history is requested
43 * @param simpleEOP if true, tidal effects are ignored when interpolating EOP
44 * @return Earth Orientation Parameters history
45 */
46 EOPHistory getEOPHistory(IERSConventions conventions, boolean simpleEOP);
47
48 /** Get one of the predefined frames.
49 * @param factoryKey key of the frame within the factory
50 * @return the predefined frame
51 */
52 Frame getFrame(Predefined factoryKey);
53
54 /** Get the unique GCRF frame.
55 * <p>The GCRF frame is the root frame in the frame tree.</p>
56 * @return the unique instance of the GCRF frame
57 */
58 Frame getGCRF();
59
60 /** Get the unique ICRF frame.
61 * <p>The ICRF frame is centered at solar system barycenter and aligned
62 * with GCRF.</p>
63 * @return the unique instance of the ICRF frame
64 */
65 Frame getICRF();
66
67 /** Get the ecliptic frame.
68 * The IAU defines the ecliptic as "the plane perpendicular to the mean heliocentric
69 * orbital angular momentum vector of the Earth-Moon barycentre in the BCRS (IAU 2006
70 * Resolution B1)." The +z axis is aligned with the angular momentum vector, and the +x
71 * axis is aligned with +x axis of {@link #getMOD(IERSConventions) MOD}.
72 *
73 * <p> This implementation agrees with the JPL 406 ephemerides to within 0.5 arc seconds.
74 * @param conventions IERS conventions to apply
75 * @return the selected reference frame singleton.
76 */
77 Frame getEcliptic(IERSConventions conventions);
78
79 /** Get the unique EME2000 frame.
80 * <p>The EME2000 frame is also called the J2000 frame.
81 * The former denomination is preferred in Orekit.</p>
82 * @return the unique instance of the EME2000 frame
83 */
84 FactoryManagedFrame getEME2000();
85
86 /** Get an unspecified International Terrestrial Reference Frame.
87 * <p>
88 * The frame returned uses the {@link EOPEntry Earth Orientation Parameters}
89 * blindly. So if for example one loads only EOP 14 C04 files to retrieve
90 * the parameters, the frame will be an {@link ITRFVersion#ITRF_2014}. However,
91 * if parameters are loaded from different files types, or even for file
92 * types that changed their reference (like Bulletin A switching from
93 * {@link ITRFVersion#ITRF_2008} to {@link ITRFVersion#ITRF_2014} starting
94 * with Vol. XXXI No. 013 published on 2018-03-29), then the ITRF returned
95 * by this method will jump from one version to another version.
96 * </p>
97 * <p>
98 * IF a specific version of ITRF is needed, then {@link #getITRF(ITRFVersion,
99 * IERSConventions, boolean)} should be used instead.
100 * </p>
101 * @param conventions IERS conventions to apply
102 * @param simpleEOP if true, tidal effects are ignored when interpolating EOP
103 * @return the selected reference frame singleton.
104 * @see #getITRF(ITRFVersion, IERSConventions, boolean)
105 * @since 6.1
106 */
107 FactoryManagedFrame getITRF(IERSConventions conventions,
108 boolean simpleEOP);
109
110 /** Get the TIRF reference frame, ignoring tidal effects.
111 * @param conventions IERS conventions to apply
112 * @return the selected reference frame singleton.
113 * library cannot be read.
114 */
115 FactoryManagedFrame getTIRF(IERSConventions conventions);
116
117 /** Get an specific International Terrestrial Reference Frame.
118 * <p>
119 * Note that if a specific version of ITRF is required, then {@code simpleEOP}
120 * should most probably be set to {@code false}, as ignoring tidal effects
121 * has an effect of the same order of magnitude as the differences between
122 * the various {@link ITRFVersion ITRF versions}.
123 * </p>
124 * @param version ITRF version
125 * @param conventions IERS conventions to apply
126 * @param simpleEOP if true, tidal effects are ignored when interpolating EOP
127 * @return the selected reference frame singleton.
128 * @since 9.2
129 */
130 VersionedITRF getITRF(ITRFVersion version,
131 IERSConventions conventions,
132 boolean simpleEOP);
133
134 /** Build an uncached International Terrestrial Reference Frame with specific {@link EOPHistory EOP history}.
135 * <p>
136 * This frame and its parent frames (TIRF and CIRF) will <em>not</em> be cached, they are
137 * rebuilt from scratch each time this method is called. This factory method is intended
138 * to be used when EOP history is changed at run time. For regular ITRF use, the
139 * {@link #getITRF(IERSConventions, boolean)} and {link {@link #getITRF(ITRFVersion, IERSConventions, boolean)}
140 * are more suitable.
141 * </p>
142 * @param ut1 UT1 time scale (contains the {@link EOPHistory EOP history})
143 * @return an ITRF frame with specified time scale and embedded EOP history
144 * @since 12.0
145 */
146 Frame buildUncachedITRF(UT1Scale ut1);
147
148 /** Get the TIRF reference frame.
149 * @param conventions IERS conventions to apply
150 * @param simpleEOP if true, tidal effects are ignored when interpolating EOP
151 * @return the selected reference frame singleton.
152 * @since 6.1
153 */
154 FactoryManagedFrame getTIRF(IERSConventions conventions,
155 boolean simpleEOP);
156
157 /** Get the CIRF2000 reference frame.
158 * @param conventions IERS conventions to apply
159 * @param simpleEOP if true, tidal effects are ignored when interpolating EOP
160 * @return the selected reference frame singleton.
161 */
162 FactoryManagedFrame getCIRF(IERSConventions conventions,
163 boolean simpleEOP);
164
165 /** Get the VEIS 1950 reference frame.
166 * <p>Its parent frame is the GTOD frame with IERS 1996 conventions without EOP corrections.</p>
167 * @return the selected reference frame singleton.
168 */
169 FactoryManagedFrame getVeis1950();
170
171 /** Get the equinox-based ITRF reference frame.
172 * @param conventions IERS conventions to apply
173 * @param simpleEOP if true, tidal effects are ignored when interpolating EOP
174 * @return the selected reference frame singleton.
175 * @since 6.1
176 */
177 FactoryManagedFrame getITRFEquinox(IERSConventions conventions,
178 boolean simpleEOP);
179
180 /** Get the GTOD reference frame.
181 * <p>
182 * The applyEOPCorr parameter is available mainly for testing purposes or for
183 * consistency with legacy software that don't handle EOP correction parameters.
184 * Beware that setting this parameter to {@code false} leads to crude accuracy
185 * (order of magnitudes for errors might be above 250m in LEO and 1400m in GEO).
186 * For this reason, setting this parameter to false is restricted to {@link
187 * IERSConventions#IERS_1996 IERS 1996} conventions, and hence the {@link
188 * IERSConventions IERS conventions} cannot be freely chosen here.
189 * </p>
190 * @param applyEOPCorr if true, EOP corrections are applied (here, dut1 and lod)
191 * @return the selected reference frame singleton.
192 */
193 FactoryManagedFrame getGTOD(boolean applyEOPCorr);
194
195 /** Get the GTOD reference frame.
196 * @param conventions IERS conventions to apply
197 * @param simpleEOP if true, tidal effects are ignored when interpolating EOP
198 * @return the selected reference frame singleton.
199 */
200 FactoryManagedFrame getGTOD(IERSConventions conventions,
201 boolean simpleEOP);
202
203 /** Get the TOD reference frame.
204 * <p>
205 * The applyEOPCorr parameter is available mainly for testing purposes or for
206 * consistency with legacy software that don't handle EOP correction parameters.
207 * Beware that setting this parameter to {@code false} leads to crude accuracy
208 * (order of magnitudes for errors might be above 1m in LEO and 10m in GEO).
209 * For this reason, setting this parameter to false is restricted to {@link
210 * IERSConventions#IERS_1996 IERS 1996} conventions, and hence the {@link
211 * IERSConventions IERS conventions} cannot be freely chosen here.
212 * </p>
213 * @param applyEOPCorr if true, EOP corrections are applied (here, nutation)
214 * @return the selected reference frame singleton.
215 */
216 FactoryManagedFrame getTOD(boolean applyEOPCorr);
217
218 /** Get the TOD reference frame.
219 * @param conventions IERS conventions to apply
220 * @param simpleEOP if true, tidal effects are ignored when interpolating EOP
221 * @return the selected reference frame singleton.
222 */
223 FactoryManagedFrame getTOD(IERSConventions conventions,
224 boolean simpleEOP);
225
226 /** Get the MOD reference frame.
227 * <p>
228 * The applyEOPCorr parameter is available mainly for testing purposes or for
229 * consistency with legacy software that don't handle EOP correction parameters.
230 * Beware that setting this parameter to {@code false} leads to crude accuracy
231 * (order of magnitudes for errors might be above 1m in LEO and 10m in GEO).
232 * For this reason, setting this parameter to false is restricted to {@link
233 * IERSConventions#IERS_1996 IERS 1996} conventions, and hence the {@link
234 * IERSConventions IERS conventions} cannot be freely chosen here.
235 * </p>
236 * @param applyEOPCorr if true, EOP corrections are applied (EME2000/GCRF bias compensation)
237 * @return the selected reference frame singleton.
238 */
239 FactoryManagedFrame getMOD(boolean applyEOPCorr);
240
241 /** Get the MOD reference frame.
242 * @param conventions IERS conventions to apply
243 * @return the selected reference frame singleton.
244 */
245 FactoryManagedFrame getMOD(IERSConventions conventions);
246
247 /** Get the TEME reference frame.
248 * <p>
249 * The TEME frame is used for the SGP4 model in TLE propagation. This frame has <em>no</em>
250 * official definition and there are some ambiguities about whether it should be used
251 * as "of date" or "of epoch". This frame should therefore be used <em>only</em> for
252 * TLE propagation and not for anything else, as recommended by the CCSDS Orbit Data Message
253 * blue book.
254 * </p>
255 * @return the selected reference frame singleton.
256 */
257 FactoryManagedFrame getTEME();
258
259 /** Get the PZ-90.11 (Parametry Zemly – 1990.11) reference frame.
260 * <p>
261 * The PZ-90.11 reference system was updated on all operational
262 * GLONASS satellites starting from 3:00 pm on December 31, 2013.
263 * </p>
264 * <p>
265 * The transition between parent frame (ITRF-2008) and PZ-90.11 frame is performed using
266 * a seven parameters Helmert transformation.
267 * <pre>
268 * From To ΔX(m) ΔY(m) ΔZ(m) RX(mas) RY(mas) RZ(mas) Epoch
269 * ITRF-2008 PZ-90.11 +0.003 +0.001 -0.000 +0.019 -0.042 +0.002 2010
270 * </pre>
271 * @see "Springer Handbook of Global Navigation Satellite Systems, Peter Teunissen & Oliver Montenbruck"
272 *
273 * @param convention IERS conventions to apply
274 * @param simpleEOP if true, tidal effects are ignored when interpolating EOP
275 * @return the selected reference frame singleton.
276 */
277 FactoryManagedFrame getPZ9011(IERSConventions convention,
278 boolean simpleEOP);
279
280 /* Helpers for creating instances */
281
282 /**
283 * Create a set of frames from the given data.
284 *
285 * @param timeScales used to build the frames as well as the EOP data set.
286 * @param celestialBodies used to get {@link #getICRF()} which is the inertial frame
287 * of the solar system barycenter.
288 * @return a set of reference frame constructed from the given data.
289 * @see #of(TimeScales, Supplier)
290 */
291 static Frames of(final TimeScales timeScales,
292 final CelestialBodies celestialBodies) {
293 return of(timeScales, () -> celestialBodies.getSolarSystemBarycenter()
294 .getInertiallyOrientedFrame());
295 }
296
297 /**
298 * Create a set of frames from the given data.
299 *
300 * @param timeScales used to build the frames as well as the EOP data set.
301 * @param icrfSupplier used to get {@link #getICRF()}. For example, {@code
302 * celestialBodies.getSolarSystemBarycenter().getInertiallyOrientedFrame()}
303 * @return a set of reference frame constructed from the given data.
304 * @see CelestialBodies
305 * @see TimeScales#of(Collection, BiFunction)
306 */
307 static Frames of(final TimeScales timeScales,
308 final Supplier<Frame> icrfSupplier) {
309 return new AbstractFrames(timeScales, icrfSupplier) {
310 @Override
311 public EOPHistory getEOPHistory(final IERSConventions conventions,
312 final boolean simpleEOP) {
313 return getTimeScales().getUT1(conventions, simpleEOP).getEOPHistory();
314 }
315 };
316 }
317
318 }