/*============================================================================
WCSLIB 4.3 - an implementation of the FITS WCS standard.
Copyright (C) 1995-2007, Mark Calabretta
This file is part of WCSLIB.
WCSLIB is free software: you can redistribute it and/or modify it under
the terms of the GNU Lesser General Public License as published by the
Free Software Foundation, either version 3 of the License, or (at your
option) any later version.
WCSLIB 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 Lesser General Public License for
more details.
You should have received a copy of the GNU Lesser General Public License
along with WCSLIB. If not, see .
Correspondence concerning WCSLIB may be directed to:
Internet email: mcalabre@atnf.csiro.au
Postal address: Dr. Mark Calabretta
Australia Telescope National Facility, CSIRO
PO Box 76
Epping NSW 1710
AUSTRALIA
Author: Mark Calabretta, Australia Telescope National Facility
http://www.atnf.csiro.au/~mcalabre/index.html
$Id: tsph.c,v 4.3 2007/12/27 05:35:51 cal103 Exp $
*=============================================================================
*
* tsph tests the spherical coordinate transformation routines for closure.
*
*---------------------------------------------------------------------------*/
#include
#include
#include
#include
#include
int main()
{
int j, lat, lng;
double coslat, lng1[361], lng2[361], eul[5], lat1, lat2[361], phi[361],
theta[361], zeta;
const double tol = 1.0e-12;
printf(
"Testing closure of WCSLIB coordinate transformation routines (tsph.c)\n"
"---------------------------------------------------------------------\n");
/* Set reference angles. */
eul[0] = 90.0;
eul[1] = 30.0;
eul[2] = -90.0;
printf("\n%s\n%s%10.4f%10.4f%10.4f\n",
"Celestial longitude and latitude of the native pole, and native",
"longitude of the celestial pole (degrees):", eul[0], eul[1], eul[2]);
eul[3] = cosd(eul[1]);
eul[4] = sind(eul[1]);
printf ("Reporting tolerance:%8.1E degrees of arc.\n", tol);
for (lat = 90; lat >= -90; lat--) {
lat1 = (double)lat;
coslat = cosd(lat1);
for (j = 0, lng = -180; lng <= 180; lng++, j++) {
lng1[j] = (double)lng;
}
sphs2x(eul, 361, 1, 1, 1, lng1, &lat1, phi, theta);
sphx2s(eul, 361, 0, 1, 1, phi, theta, lng2, lat2);
for (j = 0; j <= 360; j++) {
if (fabs(lat2[j]-lat1) > tol ||
(fabs(lng2[j]-lng1[j])*coslat > tol &&
fabs(fabs(lng2[j]-lng1[j])-360.0)*coslat > tol)) {
printf("Unclosed: lng1 =%20.15f lat1 =%20.15f\n",
lng1[j], lat1);
printf(" phi =%20.15f theta =%20.15f\n",
phi[j], theta[j]);
printf(" lng2 =%20.15f lat2 =%20.15f\n",
lng2[j], lat2[j]);
}
}
}
/* Test closure at points close to the pole. */
for (j = -1; j <= 1; j += 2) {
zeta = 1.0;
lng1[0] = -180.0;
for (lat = 0; lat < 12; lat++) {
lat1 = (double)j*(90.0 - zeta);
sphs2x(eul, 1, 1, 1, 1, lng1, &lat1, phi, theta);
sphx2s(eul, 1, 1, 1, 1, phi, theta, lng2, lat2);
if (fabs(lat2[0]-lat1) > tol ||
(fabs(lng2[0]-lng1[0])*coslat > tol &&
fabs(fabs(lng2[0]-lng1[0])-360.0)*coslat > tol)) {
printf("Unclosed: lng1 =%20.15f lat1 =%20.15f\n",
lng1[0], lat1);
printf(" phi =%20.15f theta =%20.15f\n",
phi[0], theta[0]);
printf(" lng2 =%20.15f lat2 =%20.15f\n",
lng2[0], lat2[0]);
}
zeta /= 10.0;
lng1[0] += 30.0;
}
}
return 0;
}