/*
*+
* Name:
* palAltaz
* Purpose:
* Positions, velocities and accelerations for an altazimuth telescope mount
* Language:
* Starlink ANSI C
* Type of Module:
* Library routine
* Invocation:
* 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 );
* Arguments:
* ha = double (Given)
* Hour angle (radians)
* dec = double (Given)
* Declination (radians)
* phi = double (Given)
* Observatory latitude (radians)
* az = double * (Returned)
* Azimuth (radians)
* azd = double * (Returned)
* Azimuth velocity (radians per radian of HA)
* azdd = double * (Returned)
* Azimuth acceleration (radians per radian of HA squared)
* el = double * (Returned)
* Elevation (radians)
* eld = double * (Returned)
* Elevation velocity (radians per radian of HA)
* eldd = double * (Returned)
* Elevation acceleration (radians per radian of HA squared)
* pa = double * (Returned)
* Parallactic angle (radians)
* pad = double * (Returned)
* Parallactic angle velocity (radians per radian of HA)
* padd = double * (Returned)
* Parallactic angle acceleration (radians per radian of HA squared)
* Description:
* Positions, velocities and accelerations for an altazimuth
* telescope mount.
* Authors:
* PTW: P. T. Wallace
* TIMJ: Tim Jenness (Cornell)
* {enter_new_authors_here}
* Notes:
* - Natural units are used throughout. HA, DEC, PHI, AZ, EL
* and ZD are in radians. The velocities and accelerations
* assume constant declination and constant rate of change of
* hour angle (as for tracking a star); the units of AZD, ELD
* and PAD are radians per radian of HA, while the units of AZDD,
* ELDD and PADD are radians per radian of HA squared. To
* convert into practical degree- and second-based units:
*
* angles * 360/2pi -> degrees
* velocities * (2pi/86400)*(360/2pi) -> degree/sec
* accelerations * ((2pi/86400)**2)*(360/2pi) -> degree/sec/sec
*
* Note that the seconds here are sidereal rather than SI. One
* sidereal second is about 0.99727 SI seconds.
*
* The velocity and acceleration factors assume the sidereal
* tracking case. Their respective numerical values are (exactly)
* 1/240 and (approximately) 1/3300236.9.
*
* - Azimuth is returned in the range 0-2pi; north is zero,
* and east is +pi/2. Elevation and parallactic angle are
* returned in the range +/-pi. Parallactic angle is +ve for
* a star west of the meridian and is the angle NP-star-zenith.
*
* - The latitude is geodetic as opposed to geocentric. The
* hour angle and declination are topocentric. Refraction and
* deficiencies in the telescope mounting are ignored. The
* purpose of the routine is to give the general form of the
* quantities. The details of a real telescope could profoundly
* change the results, especially close to the zenith.
*
* - No range checking of arguments is carried out.
*
* - In applications which involve many such calculations, rather
* than calling the present routine it will be more efficient to
* use inline code, having previously computed fixed terms such
* as sine and cosine of latitude, and (for tracking a star)
* sine and cosine of declination.
* History:
* 2014-09-30 (TIMJ):
* Initial version. Ported from Fortran SLA
* {enter_further_changes_here}
* Copyright:
* Copyright (C) 2004 P.T. Wallace
* Copyright (C) 2014 Cornell University
* All Rights Reserved.
* Licence:
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 3 of
* the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be
* useful, but WITHOUT ANY WARRANTY; without even the implied
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
* PURPOSE. See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
* Bugs:
* {note_any_bugs_here}
*-
*/
#include
#include "pal.h"
#include "palmac.h"
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 ) {
const double TINY = 1E-30;
double sh,ch,sd,cd,sp,cp,chcd,sdcp,x,y,z,rsq,r,a,e,c,s,
q,qd,ad,ed,edr,add,edd,qdd;
/* Useful functions */
sh=sin(ha);
ch=cos(ha);
sd=sin(dec);
cd=cos(dec);
sp=sin(phi);
cp=cos(phi);
chcd=ch*cd;
sdcp=sd*cp;
x=-chcd*sp+sdcp;
y=-sh*cd;
z=chcd*cp+sd*sp;
rsq=x*x+y*y;
r=sqrt(rsq);
/* Azimuth and elevation */
if (rsq == 0.0) {
a=0.0;
} else {
a=atan2(y,x);
}
if (a < 0.0) a += PAL__D2PI;
e=atan2(z,r);
/* Parallactic angle */
c=cd*sp-ch*sdcp;
s=sh*cp;
if (c*c+s*s > 0) {
q=atan2(s,c);
} else {
q= PAL__DPI - ha;
}
/* Velocities and accelerations (clamped at zenith/nadir) */
if (rsq < TINY) {
rsq=TINY;
r=sqrt(rsq);
}
qd=-x*cp/rsq;
ad=sp+z*qd;
ed=cp*y/r;
edr=ed/r;
add=edr*(z*sp+(2.0-rsq)*qd);
edd=-r*qd*ad;
qdd=edr*(sp+2.0*z*qd);
/* Results */
*az=a;
*azd=ad;
*azdd=add;
*el=e;
*eld=ed;
*eldd=edd;
*pa=q;
*pad=qd;
*padd=qdd;
}