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