/*
*+
* Name:
* palPolmo
* Purpose:
* Correct for polar motion
* Language:
* Starlink ANSI C
* Type of Module:
* Library routine
* Invocation:
* palPolmo ( double elongm, double phim, double xp, double yp,
* double *elong, double *phi, double *daz );
* Arguments:
* elongm = double (Given)
* Mean logitude of the observer (radians, east +ve)
* phim = double (Given)
* Mean geodetic latitude of the observer (radians)
* xp = double (Given)
* Polar motion x-coordinate (radians)
* yp = double (Given)
* Polar motion y-coordinate (radians)
* elong = double * (Returned)
* True longitude of the observer (radians, east +ve)
* phi = double * (Returned)
* True geodetic latitude of the observer (radians)
* daz = double * (Returned)
* Azimuth correction (terrestrial-celestial, radians)
* Description:
* Polar motion: correct site longitude and latitude for polar
* motion and calculate azimuth difference between celestial and
* terrestrial poles.
* Authors:
* PTW: Patrick Wallace (STFC)
* TIMJ: Tim Jenness (Cornell)
* {enter_new_authors_here}
* Notes:
* - "Mean" longitude and latitude are the (fixed) values for the
* site's location with respect to the IERS terrestrial reference
* frame; the latitude is geodetic. TAKE CARE WITH THE LONGITUDE
* SIGN CONVENTION. The longitudes used by the present routine
* are east-positive, in accordance with geographical convention
* (and right-handed). In particular, note that the longitudes
* returned by the sla_OBS routine are west-positive, following
* astronomical usage, and must be reversed in sign before use in
* the present routine.
*
* - XP and YP are the (changing) coordinates of the Celestial
* Ephemeris Pole with respect to the IERS Reference Pole.
* XP is positive along the meridian at longitude 0 degrees,
* and YP is positive along the meridian at longitude
* 270 degrees (i.e. 90 degrees west). Values for XP,YP can
* be obtained from IERS circulars and equivalent publications;
* the maximum amplitude observed so far is about 0.3 arcseconds.
*
* - "True" longitude and latitude are the (moving) values for
* the site's location with respect to the celestial ephemeris
* pole and the meridian which corresponds to the Greenwich
* apparent sidereal time. The true longitude and latitude
* link the terrestrial coordinates with the standard celestial
* models (for precession, nutation, sidereal time etc).
*
* - The azimuths produced by sla_AOP and sla_AOPQK are with
* respect to due north as defined by the Celestial Ephemeris
* Pole, and can therefore be called "celestial azimuths".
* However, a telescope fixed to the Earth measures azimuth
* essentially with respect to due north as defined by the
* IERS Reference Pole, and can therefore be called "terrestrial
* azimuth". Uncorrected, this would manifest itself as a
* changing "azimuth zero-point error". The value DAZ is the
* correction to be added to a celestial azimuth to produce
* a terrestrial azimuth.
*
* - The present routine is rigorous. For most practical
* purposes, the following simplified formulae provide an
* adequate approximation:
*
* elong = elongm+xp*cos(elongm)-yp*sin(elongm)
* phi = phim+(xp*sin(elongm)+yp*cos(elongm))*tan(phim)
* daz = -sqrt(xp*xp+yp*yp)*cos(elongm-atan2(xp,yp))/cos(phim)
*
* An alternative formulation for DAZ is:
*
* x = cos(elongm)*cos(phim)
* y = sin(elongm)*cos(phim)
* daz = atan2(-x*yp-y*xp,x*x+y*y)
*
* - Reference: Seidelmann, P.K. (ed), 1992. "Explanatory Supplement
* to the Astronomical Almanac", ISBN 0-935702-68-7,
* sections 3.27, 4.25, 4.52.
* History:
* 2000-11-30 (PTW):
* SLALIB implementation.
* 2014-10-18 (TIMJ):
* Initial version in C.
* {enter_further_changes_here}
* Copyright:
* Copyright (C) 2000 Rutherford Appleton Laboratory.
* 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"
void palPolmo ( double elongm, double phim, double xp, double yp,
double *elong, double *phi, double *daz ) {
double sel,cel,sph,cph,xm,ym,zm,xnm,ynm,znm,
sxp,cxp,syp,cyp,zw,xt,yt,zt,xnt,ynt;
/* Site mean longitude and mean geodetic latitude as a Cartesian vector */
sel=sin(elongm);
cel=cos(elongm);
sph=sin(phim);
cph=cos(phim);
xm=cel*cph;
ym=sel*cph;
zm=sph;
/* Rotate site vector by polar motion, Y-component then X-component */
sxp=sin(xp);
cxp=cos(xp);
syp=sin(yp);
cyp=cos(yp);
zw=(-ym*syp+zm*cyp);
xt=xm*cxp-zw*sxp;
yt=ym*cyp+zm*syp;
zt=xm*sxp+zw*cxp;
/* Rotate also the geocentric direction of the terrestrial pole (0,0,1) */
xnm=-sxp*cyp;
ynm=syp;
znm=cxp*cyp;
cph=sqrt(xt*xt+yt*yt);
if (cph == 0.0) xt=1.0;
sel=yt/cph;
cel=xt/cph;
/* Return true longitude and true geodetic latitude of site */
if (xt != 0.0 || yt != 0.0) {
*elong=atan2(yt,xt);
} else {
*elong=0.0;
}
*phi=atan2(zt,cph);
/* Return current azimuth of terrestrial pole seen from site position */
xnt=(xnm*cel+ynm*sel)*zt-znm*cph;
ynt=-xnm*sel+ynm*cel;
if (xnt != 0.0 || ynt != 0.0) {
*daz=atan2(-ynt,-xnt);
} else {
*daz=0.0;
}
}