FACT++  1.0
palPlanel.c
Go to the documentation of this file.
1 /*
2 *+
3 * Name:
4 * palPlanel
5 
6 * Purpose:
7 * Transform conventional elements into position and velocity
8 
9 * Language:
10 * Starlink ANSI C
11 
12 * Type of Module:
13 * Library routine
14 
15 * Invocation:
16 * void palPlanel ( double date, int jform, double epoch, double orbinc,
17 * double anode, double perih, double aorq, double e,
18 * double aorl, double dm, double pv[6], int *jstat );
19 
20 * Arguments:
21 * date = double (Given)
22 * Epoch (TT MJD) of osculation (Note 1)
23 * jform = int (Given)
24 * Element set actually returned (1-3; Note 3)
25 * epoch = double (Given)
26 * Epoch of elements (TT MJD) (Note 4)
27 * orbinc = double (Given)
28 * inclination (radians)
29 * anode = double (Given)
30 * longitude of the ascending node (radians)
31 * perih = double (Given)
32 * longitude or argument of perihelion (radians)
33 * aorq = double (Given)
34 * mean distance or perihelion distance (AU)
35 * e = double (Given)
36 * eccentricity
37 * aorl = double (Given)
38 * mean anomaly or longitude (radians, JFORM=1,2 only)
39 * dm = double (Given)
40 * daily motion (radians, JFORM=1 only)
41 * u = double [13] (Returned)
42 * Universal orbital elements (Note 1)
43 * (0) combined mass (M+m)
44 * (1) total energy of the orbit (alpha)
45 * (2) reference (osculating) epoch (t0)
46 * (3-5) position at reference epoch (r0)
47 * (6-8) velocity at reference epoch (v0)
48 * (9) heliocentric distance at reference epoch
49 * (10) r0.v0
50 * (11) date (t)
51 * (12) universal eccentric anomaly (psi) of date, approx
52 * jstat = int * (Returned)
53 * status: 0 = OK
54 * - -1 = illegal JFORM
55 * - -2 = illegal E
56 * - -3 = illegal AORQ
57 * - -4 = illegal DM
58 * - -5 = numerical error
59 
60 * Description:
61 * Heliocentric position and velocity of a planet, asteroid or comet,
62 * starting from orbital elements.
63 
64 * Authors:
65 * PTW: Pat Wallace (STFC)
66 * TIMJ: Tim Jenness (JAC, Hawaii)
67 * {enter_new_authors_here}
68 
69 * Notes:
70 * - DATE is the instant for which the prediction is required. It is
71 * in the TT timescale (formerly Ephemeris Time, ET) and is a
72 * Modified Julian Date (JD-2400000.5).
73 * - The elements are with respect to the J2000 ecliptic and equinox.
74 * - A choice of three different element-set options is available:
75 *
76 * Option JFORM = 1, suitable for the major planets:
77 *
78 * EPOCH = epoch of elements (TT MJD)
79 * ORBINC = inclination i (radians)
80 * ANODE = longitude of the ascending node, big omega (radians)
81 * PERIH = longitude of perihelion, curly pi (radians)
82 * AORQ = mean distance, a (AU)
83 * E = eccentricity, e (range 0 to <1)
84 * AORL = mean longitude L (radians)
85 * DM = daily motion (radians)
86 *
87 * Option JFORM = 2, suitable for minor planets:
88 *
89 * EPOCH = epoch of elements (TT MJD)
90 * ORBINC = inclination i (radians)
91 * ANODE = longitude of the ascending node, big omega (radians)
92 * PERIH = argument of perihelion, little omega (radians)
93 * AORQ = mean distance, a (AU)
94 * E = eccentricity, e (range 0 to <1)
95 * AORL = mean anomaly M (radians)
96 *
97 * Option JFORM = 3, suitable for comets:
98 *
99 * EPOCH = epoch of elements and perihelion (TT MJD)
100 * ORBINC = inclination i (radians)
101 * ANODE = longitude of the ascending node, big omega (radians)
102 * PERIH = argument of perihelion, little omega (radians)
103 * AORQ = perihelion distance, q (AU)
104 * E = eccentricity, e (range 0 to 10)
105 *
106 * Unused arguments (DM for JFORM=2, AORL and DM for JFORM=3) are not
107 * accessed.
108 * - Each of the three element sets defines an unperturbed heliocentric
109 * orbit. For a given epoch of observation, the position of the body
110 * in its orbit can be predicted from these elements, which are
111 * called "osculating elements", using standard two-body analytical
112 * solutions. However, due to planetary perturbations, a given set
113 * of osculating elements remains usable for only as long as the
114 * unperturbed orbit that it describes is an adequate approximation
115 * to reality. Attached to such a set of elements is a date called
116 * the "osculating epoch", at which the elements are, momentarily,
117 * a perfect representation of the instantaneous position and
118 * velocity of the body.
119 *
120 * Therefore, for any given problem there are up to three different
121 * epochs in play, and it is vital to distinguish clearly between
122 * them:
123 *
124 * . The epoch of observation: the moment in time for which the
125 * position of the body is to be predicted.
126 *
127 * . The epoch defining the position of the body: the moment in time
128 * at which, in the absence of purturbations, the specified
129 * position (mean longitude, mean anomaly, or perihelion) is
130 * reached.
131 *
132 * . The osculating epoch: the moment in time at which the given
133 * elements are correct.
134 *
135 * For the major-planet and minor-planet cases it is usual to make
136 * the epoch that defines the position of the body the same as the
137 * epoch of osculation. Thus, only two different epochs are
138 * involved: the epoch of the elements and the epoch of observation.
139 *
140 * For comets, the epoch of perihelion fixes the position in the
141 * orbit and in general a different epoch of osculation will be
142 * chosen. Thus, all three types of epoch are involved.
143 *
144 * For the present routine:
145 *
146 * . The epoch of observation is the argument DATE.
147 *
148 * . The epoch defining the position of the body is the argument
149 * EPOCH.
150 *
151 * . The osculating epoch is not used and is assumed to be close
152 * enough to the epoch of observation to deliver adequate accuracy.
153 * If not, a preliminary call to palPertel may be used to update
154 * the element-set (and its associated osculating epoch) by
155 * applying planetary perturbations.
156 * - The reference frame for the result is with respect to the mean
157 * equator and equinox of epoch J2000.
158 * - The algorithm was originally adapted from the EPHSLA program of
159 * D.H.P.Jones (private communication, 1996). The method is based
160 * on Stumpff's Universal Variables.
161 
162 * See Also:
163 * Everhart, E. & Pitkin, E.T., Am.J.Phys. 51, 712, 1983.
164 
165 * History:
166 * 2012-03-12 (TIMJ):
167 * Initial version taken directly from SLA/F.
168 * Adapted with permission from the Fortran SLALIB library.
169 * {enter_further_changes_here}
170 
171 * Copyright:
172 * Copyright (C) 2002 Rutherford Appleton Laboratory
173 * Copyright (C) 2012 Science and Technology Facilities Council.
174 * All Rights Reserved.
175 
176 * Licence:
177 * This program is free software; you can redistribute it and/or
178 * modify it under the terms of the GNU General Public License as
179 * published by the Free Software Foundation; either version 3 of
180 * the License, or (at your option) any later version.
181 *
182 * This program is distributed in the hope that it will be
183 * useful, but WITHOUT ANY WARRANTY; without even the implied
184 * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
185 * PURPOSE. See the GNU General Public License for more details.
186 *
187 * You should have received a copy of the GNU General Public License
188 * along with this program; if not, write to the Free Software
189 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
190 * MA 02110-1301, USA.
191 
192 * Bugs:
193 * {note_any_bugs_here}
194 *-
195 */
196 
197 #include "pal.h"
198 
199 
200 void palPlanel ( double date, int jform, double epoch, double orbinc,
201  double anode, double perih, double aorq, double e,
202  double aorl, double dm, double pv[6], int *jstat ) {
203 
204  int j;
205  double u[13];
206 
207  /* Validate elements and convert to "universal variables" parameters. */
208  palEl2ue( date, jform, epoch, orbinc, anode, perih, aorq, e, aorl,
209  dm, u, &j );
210 
211  /* Determine the position and velocity */
212  if (j == 0) {
213  palUe2pv( date, u, pv, &j);
214  if (j != 0) j = -5;
215  }
216 
217  /* Wrap up */
218  *jstat = j;
219 
220 }
void palPlanel(double date, int jform, double epoch, double orbinc, double anode, double perih, double aorq, double e, double aorl, double dm, double pv[6], int *jstat)
Definition: palPlanel.c:200
void palEl2ue(double date, int jform, double epoch, double orbinc, double anode, double perih, double aorq, double e, double aorl, double dm, double u[13], int *jstat)
Definition: palEl2ue.c:178
void palUe2pv(double date, double u[13], double pv[], int *jstat)