File Coverage

palsrc/palPertel.c
Criterion Covered Total %
statement 10 17 58.8
branch 6 12 50.0
condition n/a
subroutine n/a
pod n/a
total 16 29 55.1


line stmt bran cond sub pod time code
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 2           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 2 50         if (jform < 2 || jform > 3) {
183 0           *jstat = -1;
184 0           return;
185             } else {
186              
187             /* Provisionally set the status to OK. */
188 2           *jstat = 0;
189             }
190              
191             /* Transform the elements from conventional to universal form. */
192 2           palEl2ue(date0,jform,epoch0,orbi0,anode0,perih0,
193             aorq0,e0,am0,0.0,u,&j);
194 2 50         if (j != 0) {
195 0           *jstat = j;
196 0           return;
197             }
198              
199             /* Update the universal elements. */
200 2           palPertue(date1,u,&j);
201 2 50         if (j > 0) {
202 0           *jstat = j;
203 2 50         } else if (j < 0) {
204 0           *jstat = -5;
205 0           return;
206             }
207              
208             /* Transform from universal to conventional elements. */
209 2           palUe2el(u, jform, &jf, epoch1, orbi1, anode1, perih1,
210             aorq1, e1, am1, &dm, &j);
211 2 50         if (jf != jform || j != 0) *jstat = -5;
    50          
212             }