FACT++  1.0
palAltaz.c
Go to the documentation of this file.
1 /*
2 *+
3 * Name:
4 * palAltaz
5 
6 * Purpose:
7 * Positions, velocities and accelerations for an altazimuth telescope mount
8 
9 * Language:
10 * Starlink ANSI C
11 
12 * Type of Module:
13 * Library routine
14 
15 * Invocation:
16 * palAltaz ( double ha, double dec, double phi,
17 * double *az, double *azd, double *azdd,
18 * double *el, double *eld, double *eldd,
19 * double *pa, double *pad, double *padd );
20 
21 * Arguments:
22 * ha = double (Given)
23 * Hour angle (radians)
24 * dec = double (Given)
25 * Declination (radians)
26 * phi = double (Given)
27 * Observatory latitude (radians)
28 * az = double * (Returned)
29 * Azimuth (radians)
30 * azd = double * (Returned)
31 * Azimuth velocity (radians per radian of HA)
32 * azdd = double * (Returned)
33 * Azimuth acceleration (radians per radian of HA squared)
34 * el = double * (Returned)
35 * Elevation (radians)
36 * eld = double * (Returned)
37 * Elevation velocity (radians per radian of HA)
38 * eldd = double * (Returned)
39 * Elevation acceleration (radians per radian of HA squared)
40 * pa = double * (Returned)
41 * Parallactic angle (radians)
42 * pad = double * (Returned)
43 * Parallactic angle velocity (radians per radian of HA)
44 * padd = double * (Returned)
45 * Parallactic angle acceleration (radians per radian of HA squared)
46 
47 
48 * Description:
49 * Positions, velocities and accelerations for an altazimuth
50 * telescope mount.
51 
52 * Authors:
53 * PTW: P. T. Wallace
54 * TIMJ: Tim Jenness (Cornell)
55 * {enter_new_authors_here}
56 
57 * Notes:
58 * - Natural units are used throughout. HA, DEC, PHI, AZ, EL
59 * and ZD are in radians. The velocities and accelerations
60 * assume constant declination and constant rate of change of
61 * hour angle (as for tracking a star); the units of AZD, ELD
62 * and PAD are radians per radian of HA, while the units of AZDD,
63 * ELDD and PADD are radians per radian of HA squared. To
64 * convert into practical degree- and second-based units:
65 *
66 * angles * 360/2pi -> degrees
67 * velocities * (2pi/86400)*(360/2pi) -> degree/sec
68 * accelerations * ((2pi/86400)**2)*(360/2pi) -> degree/sec/sec
69 *
70 * Note that the seconds here are sidereal rather than SI. One
71 * sidereal second is about 0.99727 SI seconds.
72 *
73 * The velocity and acceleration factors assume the sidereal
74 * tracking case. Their respective numerical values are (exactly)
75 * 1/240 and (approximately) 1/3300236.9.
76 *
77 * - Azimuth is returned in the range 0-2pi; north is zero,
78 * and east is +pi/2. Elevation and parallactic angle are
79 * returned in the range +/-pi. Parallactic angle is +ve for
80 * a star west of the meridian and is the angle NP-star-zenith.
81 *
82 * - The latitude is geodetic as opposed to geocentric. The
83 * hour angle and declination are topocentric. Refraction and
84 * deficiencies in the telescope mounting are ignored. The
85 * purpose of the routine is to give the general form of the
86 * quantities. The details of a real telescope could profoundly
87 * change the results, especially close to the zenith.
88 *
89 * - No range checking of arguments is carried out.
90 *
91 * - In applications which involve many such calculations, rather
92 * than calling the present routine it will be more efficient to
93 * use inline code, having previously computed fixed terms such
94 * as sine and cosine of latitude, and (for tracking a star)
95 * sine and cosine of declination.
96 
97 * History:
98 * 2014-09-30 (TIMJ):
99 * Initial version. Ported from Fortran SLA
100 * {enter_further_changes_here}
101 
102 * Copyright:
103 * Copyright (C) 2004 P.T. Wallace
104 * Copyright (C) 2014 Cornell University
105 * All Rights Reserved.
106 
107 * Licence:
108 * This program is free software; you can redistribute it and/or
109 * modify it under the terms of the GNU General Public License as
110 * published by the Free Software Foundation; either version 3 of
111 * the License, or (at your option) any later version.
112 *
113 * This program is distributed in the hope that it will be
114 * useful, but WITHOUT ANY WARRANTY; without even the implied
115 * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
116 * PURPOSE. See the GNU General Public License for more details.
117 *
118 * You should have received a copy of the GNU General Public License
119 * along with this program. If not, see <http://www.gnu.org/licenses/>.
120 
121 * Bugs:
122 * {note_any_bugs_here}
123 *-
124 */
125 
126 #include <math.h>
127 
128 #include "pal.h"
129 #include "palmac.h"
130 
131 void
132 palAltaz ( double ha, double dec, double phi,
133  double *az, double *azd, double *azdd,
134  double *el, double *eld, double *eldd,
135  double *pa, double *pad, double *padd ) {
136 
137  const double TINY = 1E-30;
138 
139  double sh,ch,sd,cd,sp,cp,chcd,sdcp,x,y,z,rsq,r,a,e,c,s,
140  q,qd,ad,ed,edr,add,edd,qdd;
141 
142 
143  /* Useful functions */
144  sh=sin(ha);
145  ch=cos(ha);
146  sd=sin(dec);
147  cd=cos(dec);
148  sp=sin(phi);
149  cp=cos(phi);
150  chcd=ch*cd;
151  sdcp=sd*cp;
152  x=-chcd*sp+sdcp;
153  y=-sh*cd;
154  z=chcd*cp+sd*sp;
155  rsq=x*x+y*y;
156  r=sqrt(rsq);
157 
158  /* Azimuth and elevation */
159  if (rsq == 0.0) {
160  a=0.0;
161  } else {
162  a=atan2(y,x);
163  }
164  if (a < 0.0) a += PAL__D2PI;
165  e=atan2(z,r);
166 
167  /* Parallactic angle */
168  c=cd*sp-ch*sdcp;
169  s=sh*cp;
170  if (c*c+s*s > 0) {
171  q=atan2(s,c);
172  } else {
173  q= PAL__DPI - ha;
174  }
175 
176  /* Velocities and accelerations (clamped at zenith/nadir) */
177  if (rsq < TINY) {
178  rsq=TINY;
179  r=sqrt(rsq);
180  }
181  qd=-x*cp/rsq;
182  ad=sp+z*qd;
183  ed=cp*y/r;
184  edr=ed/r;
185  add=edr*(z*sp+(2.0-rsq)*qd);
186  edd=-r*qd*ad;
187  qdd=edr*(sp+2.0*z*qd);
188 
189  /* Results */
190  *az=a;
191  *azd=ad;
192  *azdd=add;
193  *el=e;
194  *eld=ed;
195  *eldd=edd;
196  *pa=q;
197  *pad=qd;
198  *padd=qdd;
199 
200 }
void palAltaz(double ha, double dec, double phi, double *az, double *azd, double *azdd, double *el, double *eld, double *eldd, double *pa, double *pad, double *padd)
Definition: palAltaz.c:132
static const double PAL__DPI
Definition: palmac.h:63
static const double PAL__D2PI
Definition: palmac.h:66