1 | /*
|
---|
2 | *+
|
---|
3 | * Name:
|
---|
4 | * palPertel
|
---|
5 |
|
---|
6 | * Purpose:
|
---|
7 | * Update elements by applying planetary perturbations
|
---|
8 |
|
---|
9 | * Language:
|
---|
10 | * Starlink ANSI C
|
---|
11 |
|
---|
12 | * Type of Module:
|
---|
13 | * Library routine
|
---|
14 |
|
---|
15 | * Invocation:
|
---|
16 | * void palPertel (int jform, double date0, double date1,
|
---|
17 | * double epoch0, double orbi0, double anode0,
|
---|
18 | * double perih0, double aorq0, double e0, double am0,
|
---|
19 | * double *epoch1, double *orbi1, double *anode1,
|
---|
20 | * double *perih1, double *aorq1, double *e1, double *am1,
|
---|
21 | * int *jstat );
|
---|
22 |
|
---|
23 | * Arguments:
|
---|
24 | * jform = int (Given)
|
---|
25 | * Element set actually returned (1-3; Note 6)
|
---|
26 | * date0 = double (Given)
|
---|
27 | * Date of osculation (TT MJD) for the given elements.
|
---|
28 | * date1 = double (Given)
|
---|
29 | * Date of osculation (TT MJD) for the updated elements.
|
---|
30 | * epoch0 = double (Given)
|
---|
31 | * Epoch of elements (TT MJD)
|
---|
32 | * orbi0 = double (Given)
|
---|
33 | * inclination (radians)
|
---|
34 | * anode0 = double (Given)
|
---|
35 | * longitude of the ascending node (radians)
|
---|
36 | * perih0 = double (Given)
|
---|
37 | * longitude or argument of perihelion (radians)
|
---|
38 | * aorq0 = double (Given)
|
---|
39 | * mean distance or perihelion distance (AU)
|
---|
40 | * e0 = double (Given)
|
---|
41 | * eccentricity
|
---|
42 | * am0 = double (Given)
|
---|
43 | * mean anomaly (radians, JFORM=2 only)
|
---|
44 | * epoch1 = double * (Returned)
|
---|
45 | * Epoch of elements (TT MJD)
|
---|
46 | * orbi1 = double * (Returned)
|
---|
47 | * inclination (radians)
|
---|
48 | * anode1 = double * (Returned)
|
---|
49 | * longitude of the ascending node (radians)
|
---|
50 | * perih1 = double * (Returned)
|
---|
51 | * longitude or argument of perihelion (radians)
|
---|
52 | * aorq1 = double * (Returned)
|
---|
53 | * mean distance or perihelion distance (AU)
|
---|
54 | * e1 = double * (Returned)
|
---|
55 | * eccentricity
|
---|
56 | * am1 = double * (Returned)
|
---|
57 | * mean anomaly (radians, JFORM=2 only)
|
---|
58 | * jstat = int * (Returned)
|
---|
59 | * status:
|
---|
60 | * - +102 = warning, distant epoch
|
---|
61 | * - +101 = warning, large timespan ( > 100 years)
|
---|
62 | * - +1 to +10 = coincident with planet (Note 6)
|
---|
63 | * - 0 = OK
|
---|
64 | * - -1 = illegal JFORM
|
---|
65 | * - -2 = illegal E0
|
---|
66 | * - -3 = illegal AORQ0
|
---|
67 | * - -4 = internal error
|
---|
68 | * - -5 = numerical error
|
---|
69 |
|
---|
70 | * Description:
|
---|
71 | * Update the osculating orbital elements of an asteroid or comet by
|
---|
72 | * applying planetary perturbations.
|
---|
73 |
|
---|
74 | * Authors:
|
---|
75 | * PTW: Pat Wallace (STFC)
|
---|
76 | * TIMJ: Tim Jenness (JAC, Hawaii)
|
---|
77 | * {enter_new_authors_here}
|
---|
78 |
|
---|
79 | * Notes:
|
---|
80 | * - Two different element-format options are available:
|
---|
81 | *
|
---|
82 | * Option JFORM=2, suitable for minor planets:
|
---|
83 | *
|
---|
84 | * EPOCH = epoch of elements (TT MJD)
|
---|
85 | * ORBI = inclination i (radians)
|
---|
86 | * ANODE = longitude of the ascending node, big omega (radians)
|
---|
87 | * PERIH = argument of perihelion, little omega (radians)
|
---|
88 | * AORQ = mean distance, a (AU)
|
---|
89 | * E = eccentricity, e
|
---|
90 | * AM = mean anomaly M (radians)
|
---|
91 | *
|
---|
92 | * Option JFORM=3, suitable for comets:
|
---|
93 | *
|
---|
94 | * EPOCH = epoch of perihelion (TT MJD)
|
---|
95 | * ORBI = inclination i (radians)
|
---|
96 | * ANODE = longitude of the ascending node, big omega (radians)
|
---|
97 | * PERIH = argument of perihelion, little omega (radians)
|
---|
98 | * AORQ = perihelion distance, q (AU)
|
---|
99 | * E = eccentricity, e
|
---|
100 | *
|
---|
101 | * - DATE0, DATE1, EPOCH0 and EPOCH1 are all instants of time in
|
---|
102 | * the TT timescale (formerly Ephemeris Time, ET), expressed
|
---|
103 | * as Modified Julian Dates (JD-2400000.5).
|
---|
104 | *
|
---|
105 | * DATE0 is the instant at which the given (i.e. unperturbed)
|
---|
106 | * osculating elements are correct.
|
---|
107 | *
|
---|
108 | * DATE1 is the specified instant at which the updated osculating
|
---|
109 | * elements are correct.
|
---|
110 | *
|
---|
111 | * EPOCH0 and EPOCH1 will be the same as DATE0 and DATE1
|
---|
112 | * (respectively) for the JFORM=2 case, normally used for minor
|
---|
113 | * planets. For the JFORM=3 case, the two epochs will refer to
|
---|
114 | * perihelion passage and so will not, in general, be the same as
|
---|
115 | * DATE0 and/or DATE1 though they may be similar to one another.
|
---|
116 | * - The elements are with respect to the J2000 ecliptic and equinox.
|
---|
117 | * - Unused elements (AM0 and AM1 for JFORM=3) are not accessed.
|
---|
118 | * - See the palPertue routine for details of the algorithm used.
|
---|
119 | * - This routine is not intended to be used for major planets, which
|
---|
120 | * is why JFORM=1 is not available and why there is no opportunity
|
---|
121 | * to specify either the longitude of perihelion or the daily
|
---|
122 | * motion. However, if JFORM=2 elements are somehow obtained for a
|
---|
123 | * major planet and supplied to the routine, sensible results will,
|
---|
124 | * in fact, be produced. This happens because the palPertue routine
|
---|
125 | * that is called to perform the calculations checks the separation
|
---|
126 | * between the body and each of the planets and interprets a
|
---|
127 | * suspiciously small value (0.001 AU) as an attempt to apply it to
|
---|
128 | * the planet concerned. If this condition is detected, the
|
---|
129 | * contribution from that planet is ignored, and the status is set to
|
---|
130 | * the planet number (1-10 = Mercury, Venus, EMB, Mars, Jupiter,
|
---|
131 | * Saturn, Uranus, Neptune, Earth, Moon) as a warning.
|
---|
132 | *
|
---|
133 | * See Also:
|
---|
134 | * - Sterne, Theodore E., "An Introduction to Celestial Mechanics",
|
---|
135 | * Interscience Publishers Inc., 1960. Section 6.7, p199.
|
---|
136 |
|
---|
137 | * History:
|
---|
138 | * 2012-03-12 (TIMJ):
|
---|
139 | * Initial version direct conversion of SLA/F.
|
---|
140 | * Adapted with permission from the Fortran SLALIB library.
|
---|
141 | * {enter_further_changes_here}
|
---|
142 |
|
---|
143 | * Copyright:
|
---|
144 | * Copyright (C) 2004 Patrick T. Wallace
|
---|
145 | * Copyright (C) 2012 Science and Technology Facilities Council.
|
---|
146 | * All Rights Reserved.
|
---|
147 |
|
---|
148 | * Licence:
|
---|
149 | * This program is free software; you can redistribute it and/or
|
---|
150 | * modify it under the terms of the GNU General Public License as
|
---|
151 | * published by the Free Software Foundation; either version 3 of
|
---|
152 | * the License, or (at your option) any later version.
|
---|
153 | *
|
---|
154 | * This program is distributed in the hope that it will be
|
---|
155 | * useful, but WITHOUT ANY WARRANTY; without even the implied
|
---|
156 | * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
---|
157 | * PURPOSE. See the GNU General Public License for more details.
|
---|
158 | *
|
---|
159 | * You should have received a copy of the GNU General Public License
|
---|
160 | * along with this program; if not, write to the Free Software
|
---|
161 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
---|
162 | * MA 02110-1301, USA.
|
---|
163 |
|
---|
164 | * Bugs:
|
---|
165 | * {note_any_bugs_here}
|
---|
166 | *-
|
---|
167 | */
|
---|
168 |
|
---|
169 | #include "pal.h"
|
---|
170 |
|
---|
171 | void palPertel (int jform, double date0, double date1,
|
---|
172 | double epoch0, double orbi0, double anode0,
|
---|
173 | double perih0, double aorq0, double e0, double am0,
|
---|
174 | double *epoch1, double *orbi1, double *anode1,
|
---|
175 | double *perih1, double *aorq1, double *e1, double *am1,
|
---|
176 | int *jstat ) {
|
---|
177 |
|
---|
178 | double u[13], dm;
|
---|
179 | int j, jf;
|
---|
180 |
|
---|
181 | /* Check that the elements are either minor-planet or comet format. */
|
---|
182 | if (jform < 2 || jform > 3) {
|
---|
183 | *jstat = -1;
|
---|
184 | return;
|
---|
185 | } else {
|
---|
186 |
|
---|
187 | /* Provisionally set the status to OK. */
|
---|
188 | *jstat = 0;
|
---|
189 | }
|
---|
190 |
|
---|
191 | /* Transform the elements from conventional to universal form. */
|
---|
192 | palEl2ue(date0,jform,epoch0,orbi0,anode0,perih0,
|
---|
193 | aorq0,e0,am0,0.0,u,&j);
|
---|
194 | if (j != 0) {
|
---|
195 | *jstat = j;
|
---|
196 | return;
|
---|
197 | }
|
---|
198 |
|
---|
199 | /* Update the universal elements. */
|
---|
200 | palPertue(date1,u,&j);
|
---|
201 | if (j > 0) {
|
---|
202 | *jstat = j;
|
---|
203 | } else if (j < 0) {
|
---|
204 | *jstat = -5;
|
---|
205 | return;
|
---|
206 | }
|
---|
207 |
|
---|
208 | /* Transform from universal to conventional elements. */
|
---|
209 | palUe2el(u, jform, &jf, epoch1, orbi1, anode1, perih1,
|
---|
210 | aorq1, e1, am1, &dm, &j);
|
---|
211 | if (jf != jform || j != 0) *jstat = -5;
|
---|
212 | }
|
---|