source: trunk/FACT++/pal/palAltaz.c@ 20115

Last change on this file since 20115 was 18347, checked in by tbretz, 9 years ago
File size: 5.7 KB
Line 
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
131void
132palAltaz ( 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}
Note: See TracBrowser for help on using the repository browser.