1 | #include "slalib.h"
|
---|
2 | #include "slamac.h"
|
---|
3 | void slaPv2ue ( double pv[], double date, double pmass,
|
---|
4 | double u[], int *jstat )
|
---|
5 | /*
|
---|
6 | ** - - - - - - - - -
|
---|
7 | ** s l a P v 2 u e
|
---|
8 | ** - - - - - - - - -
|
---|
9 | **
|
---|
10 | ** Construct a universal element set based on an instantaneous position
|
---|
11 | ** and velocity.
|
---|
12 | **
|
---|
13 | ** Given:
|
---|
14 | ** pv double[6] heliocentric x,y,z,xdot,ydot,zdot of date,
|
---|
15 | ** (au,au/s; Note 1)
|
---|
16 | ** date double date (TT Modified Julian Date = JD-2400000.5)
|
---|
17 | ** pmass double mass of the planet (Sun=1; Note 2)
|
---|
18 | **
|
---|
19 | ** Returned:
|
---|
20 | **
|
---|
21 | ** u double[13] universal orbital elements (Note 3)
|
---|
22 | **
|
---|
23 | ** [0] combined mass (M+m)
|
---|
24 | ** [1] total energy of the orbit (alpha)
|
---|
25 | ** [2] reference (osculating) epoch (t0)
|
---|
26 | ** [3-5] position at reference epoch (r0)
|
---|
27 | ** [6-8] velocity at reference epoch (v0)
|
---|
28 | ** [9] heliocentric distance at reference epoch
|
---|
29 | ** [10] r0.v0
|
---|
30 | ** [11] date (t)
|
---|
31 | ** [12] universal eccentric anomaly (psi) of date
|
---|
32 | **
|
---|
33 | ** jstat int* status: 0 = OK
|
---|
34 | ** -1 = illegal pmass
|
---|
35 | ** -2 = too close to Sun
|
---|
36 | ** -3 = too slow
|
---|
37 | **
|
---|
38 | ** Notes
|
---|
39 | **
|
---|
40 | ** 1 The pv 6-vector can be with respect to any chosen inertial frame,
|
---|
41 | ** and the resulting universal-element set will be with respect to
|
---|
42 | ** the same frame. A common choice will be mean equator and ecliptic
|
---|
43 | ** of epoch J2000.
|
---|
44 | **
|
---|
45 | ** 2 The mass, pmass, is important only for the larger planets. For
|
---|
46 | ** most purposes (e.g. asteroids) use 0.0. Values less than zero
|
---|
47 | ** are illegal.
|
---|
48 | **
|
---|
49 | ** 3 The "universal" elements are those which define the orbit for the
|
---|
50 | ** purposes of the method of universal variables (see reference).
|
---|
51 | ** They consist of the combined mass of the two bodies, an epoch,
|
---|
52 | ** and the position and velocity vectors (arbitrary reference frame)
|
---|
53 | ** at that epoch. The parameter set used here includes also various
|
---|
54 | ** quantities that can, in fact, be derived from the other
|
---|
55 | ** information. This approach is taken to avoiding unnecessary
|
---|
56 | ** computation and loss of accuracy. The supplementary quantities
|
---|
57 | ** are (i) alpha, which is proportional to the total energy of the
|
---|
58 | ** orbit, (ii) the heliocentric distance at epoch, (iii) the
|
---|
59 | ** outwards component of the velocity at the given epoch, (iv) an
|
---|
60 | ** estimate of psi, the "universal eccentric anomaly" at a given
|
---|
61 | ** date and (v) that date.
|
---|
62 | **
|
---|
63 | ** Reference: Everhart, E. & Pitkin, E.T., Am.J.Phys. 51, 712, 1983.
|
---|
64 | **
|
---|
65 | ** Last revision: 17 March 1999
|
---|
66 | **
|
---|
67 | ** Copyright P.T.Wallace. All rights reserved.
|
---|
68 | */
|
---|
69 |
|
---|
70 | /* Gaussian gravitational constant (exact) */
|
---|
71 | #define GCON 0.01720209895
|
---|
72 |
|
---|
73 | /* Canonical days to seconds */
|
---|
74 | #define CD2S ( GCON / 86400.0 );
|
---|
75 |
|
---|
76 | /* Minimum allowed distance (AU) and speed (AU per canonical day) */
|
---|
77 | #define RMIN 1e-3
|
---|
78 | #define VMIN 1e-3
|
---|
79 |
|
---|
80 | {
|
---|
81 | double t0, cm, x, y, z, xd, yd, zd, r, v2, v, alpha, rdv;
|
---|
82 |
|
---|
83 |
|
---|
84 | /* Reference epoch. */
|
---|
85 | t0 = date;
|
---|
86 |
|
---|
87 | /* Combined mass (mu=M+m). */
|
---|
88 | if ( pmass < 0.0 ) {
|
---|
89 | *jstat = -1;
|
---|
90 | return;
|
---|
91 | }
|
---|
92 | cm = 1.0 + pmass;
|
---|
93 |
|
---|
94 | /* Unpack the state vector, expressing velocity in AU per canonical day. */
|
---|
95 | x = pv[0];
|
---|
96 | y = pv[1];
|
---|
97 | z = pv[2];
|
---|
98 | xd = pv[3] / CD2S;
|
---|
99 | yd = pv[4] / CD2S;
|
---|
100 | zd = pv[5] / CD2S;
|
---|
101 |
|
---|
102 | /* Heliocentric distance, and speed. */
|
---|
103 | r = sqrt ( x * x + y * y + z * z );
|
---|
104 | v2 = xd * xd + yd * yd + zd * zd;
|
---|
105 | v = sqrt ( v2 );
|
---|
106 |
|
---|
107 | /* Reject unreasonably small values. */
|
---|
108 | if ( r < RMIN ) {
|
---|
109 | *jstat = -2;
|
---|
110 | return;
|
---|
111 | }
|
---|
112 | if ( v < VMIN ) {
|
---|
113 | *jstat = -3;
|
---|
114 | return;
|
---|
115 | }
|
---|
116 |
|
---|
117 | /* Total energy of the orbit. */
|
---|
118 | alpha = v2 - 2.0 * cm / r;
|
---|
119 |
|
---|
120 | /* Outward component of velocity. */
|
---|
121 | rdv = x * xd + y * yd + z * zd;
|
---|
122 |
|
---|
123 | /* Construct the universal-element set. */
|
---|
124 | u[0] = cm;
|
---|
125 | u[1] = alpha;
|
---|
126 | u[2] = t0;
|
---|
127 | u[3] = x;
|
---|
128 | u[4] = y;
|
---|
129 | u[5] = z;
|
---|
130 | u[6] = xd;
|
---|
131 | u[7] = yd;
|
---|
132 | u[8] = zd;
|
---|
133 | u[9 ] = r;
|
---|
134 | u[10] = rdv;
|
---|
135 | u[11] = t0;
|
---|
136 | u[12] = 0.0;
|
---|
137 |
|
---|
138 | /* Exit. */
|
---|
139 | *jstat = 0;
|
---|
140 |
|
---|
141 | }
|
---|