1 | #include "slalib.h"
|
---|
2 | #include "slamac.h"
|
---|
3 | void slaAltaz ( double ha, double dec, double phi,
|
---|
4 | double *az, double *azd, double *azdd,
|
---|
5 | double *el, double *eld, double *eldd,
|
---|
6 | double *pa, double *pad, double *padd )
|
---|
7 | /*
|
---|
8 | ** - - - - - - - - -
|
---|
9 | ** s l a A l t a z
|
---|
10 | ** - - - - - - - - -
|
---|
11 | **
|
---|
12 | ** Positions, velocities and accelerations for an altazimuth
|
---|
13 | ** telescope mount.
|
---|
14 | **
|
---|
15 | ** (double precision)
|
---|
16 | **
|
---|
17 | ** Given:
|
---|
18 | ** ha double hour angle
|
---|
19 | ** dec double declination
|
---|
20 | ** phi double latitude
|
---|
21 | **
|
---|
22 | ** Returned:
|
---|
23 | ** *az double azimuth
|
---|
24 | ** *azd double " velocity
|
---|
25 | ** *azdd double " acceleration
|
---|
26 | ** *el double elevation
|
---|
27 | ** *eld double " velocity
|
---|
28 | ** *eldd double " acceleration
|
---|
29 | ** *pa double parallactic angle
|
---|
30 | ** *pad double " " velocity
|
---|
31 | ** *padd double " " acceleration
|
---|
32 | **
|
---|
33 | ** Notes:
|
---|
34 | **
|
---|
35 | ** 1) Natural units are used throughout. HA, DEC, PHI, AZ, EL
|
---|
36 | ** and ZD are in radians. The velocities and accelerations
|
---|
37 | ** assume constant declination and constant rate of change of
|
---|
38 | ** hour angle (as for tracking a star); the units of AZD, ELD
|
---|
39 | ** and PAD are radians per radian of HA, while the units of AZDD,
|
---|
40 | ** ELDD and PADD are radians per radian of HA squared. To
|
---|
41 | ** convert into practical degree- and second-based units:
|
---|
42 | **
|
---|
43 | ** angles * 360/2pi -> degrees
|
---|
44 | ** velocities * (2pi/86400)*(360/2pi) -> degree/sec
|
---|
45 | ** accelerations * ((2pi/86400)**2)*(360/2pi) -> degree/sec/sec
|
---|
46 | **
|
---|
47 | ** Note that the seconds here are sidereal rather than SI. One
|
---|
48 | ** sidereal second is about 0.99727 SI seconds.
|
---|
49 | **
|
---|
50 | ** The velocity and acceleration factors assume the sidereal
|
---|
51 | ** tracking case. Their respective numerical values are (exactly)
|
---|
52 | ** 1/240 and (approximately) 1/3300236.9.
|
---|
53 | **
|
---|
54 | ** 2) Azimuth is returned in the range 0-2pi; north is zero,
|
---|
55 | ** and east is +pi/2. Elevation and parallactic angle are
|
---|
56 | ** returned in the range +/-pi/2. Position angle is +ve
|
---|
57 | ** for a star west of the meridian and is the angle NP-star-zenith.
|
---|
58 | **
|
---|
59 | ** 3) The latitude is geodetic as opposed to geocentric. The
|
---|
60 | ** hour angle and declination are topocentric. Refraction and
|
---|
61 | ** deficiencies in the telescope mounting are ignored. The
|
---|
62 | ** purpose of the routine is to give the general form of the
|
---|
63 | ** quantities. The details of a real telescope could profoundly
|
---|
64 | ** change the results, especially close to the zenith.
|
---|
65 | **
|
---|
66 | ** 4) No range checking of arguments is carried out.
|
---|
67 | **
|
---|
68 | ** 5) In applications which involve many such calculations, rather
|
---|
69 | ** than calling the present routine it will be more efficient to
|
---|
70 | ** use inline code, having previously computed fixed terms such
|
---|
71 | ** as sine and cosine of latitude, and (for tracking a star)
|
---|
72 | ** sine and cosine of declination.
|
---|
73 | **
|
---|
74 | ** Defined in slamac.h: DPI, D2PI
|
---|
75 | **
|
---|
76 | ** Last revision: 14 March 1997
|
---|
77 | **
|
---|
78 | ** Copyright P.T.Wallace. All rights reserved.
|
---|
79 | */
|
---|
80 |
|
---|
81 | #define TINY 1e-30 /* Zone of avoidance around zenith/nadir */
|
---|
82 |
|
---|
83 | {
|
---|
84 | double sh, ch, sd, cd, sp, cp, chcd, sdcp, x, y, z, rsq, r, a, e,
|
---|
85 | c, s, q, qd, ad, ed, edr, add, edd, qdd;
|
---|
86 |
|
---|
87 | /* Useful functions */
|
---|
88 | sh = sin ( ha );
|
---|
89 | ch = cos ( ha );
|
---|
90 | sd = sin ( dec );
|
---|
91 | cd = cos ( dec );
|
---|
92 | sp = sin ( phi );
|
---|
93 | cp = cos ( phi );
|
---|
94 | chcd = ch * cd;
|
---|
95 | sdcp = sd * cp;
|
---|
96 | x = - chcd * sp + sdcp;
|
---|
97 | y = - sh * cd;
|
---|
98 | z = chcd * cp + sd * sp;
|
---|
99 | rsq = x * x + y * y;
|
---|
100 | r = sqrt ( rsq );
|
---|
101 |
|
---|
102 | /* Azimuth and elevation */
|
---|
103 | if ( rsq == 0.0 ) {
|
---|
104 | a = 0.0;
|
---|
105 | } else {
|
---|
106 | a = atan2 ( y, x );
|
---|
107 | }
|
---|
108 | if ( a < 0.0 ) a += D2PI;
|
---|
109 | e = atan2 ( z, r );
|
---|
110 |
|
---|
111 | /* Parallactic angle */
|
---|
112 | c = cd * sp - ch * sdcp;
|
---|
113 | s = sh * cp;
|
---|
114 | if ( c * c + s * s > 0.0 ) {
|
---|
115 | q = atan2 ( s, c );
|
---|
116 | } else {
|
---|
117 | q = DPI - ha;
|
---|
118 | }
|
---|
119 |
|
---|
120 | /* Velocities and accelerations (clamped at zenith/nadir) */
|
---|
121 | if ( rsq < TINY ) {
|
---|
122 | rsq = TINY;
|
---|
123 | r = sqrt ( rsq );
|
---|
124 | }
|
---|
125 | qd = - x * cp / rsq;
|
---|
126 | ad = sp + z * qd;
|
---|
127 | ed = cp * y / r;
|
---|
128 | edr = ed / r;
|
---|
129 | add = edr * ( z * sp + ( 2.0 - rsq ) * qd );
|
---|
130 | edd = - r * qd * ad;
|
---|
131 | qdd = edr * ( sp + 2.0 * z * qd );
|
---|
132 |
|
---|
133 | /* Results */
|
---|
134 | *az = a;
|
---|
135 | *azd = ad;
|
---|
136 | *azdd = add;
|
---|
137 | *el = e;
|
---|
138 | *eld = ed;
|
---|
139 | *eldd = edd;
|
---|
140 | *pa = q;
|
---|
141 | *pad = qd;
|
---|
142 | *padd = qdd;
|
---|
143 | }
|
---|