| 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 | } | 
|---|