/*============================================================================ 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: tlog.c,v 4.3 2007/12/27 05:35:51 cal103 Exp $ *============================================================================= * * tlog tests the logarithmic coordinate transformation routines for closure. * *---------------------------------------------------------------------------*/ #include #include #include #define NCRD 10000 const double tol = 6.0e-14; int main() { register int j, k; int stat1[NCRD], stat2[NCRD], status; double logc[NCRD], resid, residmax, step, x0[NCRD], x1[NCRD]; double crval = 3.3; printf( "Testing closure of WCSLIB logarithmic coordinate routines (tlog.c)\n" "------------------------------------------------------------------\n"); /* List status return messages. */ printf("\nList of log status return values:\n"); for (status = 2; status <= 3; status++) { printf("%4d: %s.\n", status, log_errmsg[status]); } /* Construct a logarithmic axis and test closure. */ step = (40.0/NCRD) / 2.0; for (j = 0, k = -NCRD; j < NCRD; j++, k += 2) { x0[j] = k*step; } printf("\nLogarithmic range: %.1f to %.1f, step: %.4f\n", x0[0], x0[NCRD-1], x0[1] - x0[0]); /* Convert the first to the second. */ if ((status = logx2s(crval, NCRD, 1, 1, x0, logc, stat1))) { printf("logx2s ERROR %d: %s.\n", status, log_errmsg[status]); } /* Convert the second back to the first. */ if ((status = logs2x(crval, NCRD, 1, 1, logc, x1, stat2))) { printf("logs2x ERROR %d: %s.\n", status, log_errmsg[status]); } residmax = 0.0; /* Test closure. */ for (j = 0; j < NCRD; j++) { if (stat1[j]) { printf("logx2s: x =%20.12E -> log = ???, stat = %d\n", x0[j], stat1[j]); continue; } if (stat2[j]) { printf("logs2x: x =%20.12E -> log =%20.12E -> x = ???, stat = %d\n", x0[j], logc[j], stat2[j]); continue; } if (x0[j] == 0.0) { resid = fabs(x1[j] - x0[j]); } else { resid = fabs((x1[j] - x0[j]) / x0[j]); if (resid > residmax) residmax = resid; } if (resid > tol) { printf("logx2s: x =%20.12E -> log =%20.12E ->\n x =" "%20.12E, resid =%20.12E\n", x0[j], logc[j], x1[j], resid); } } if (residmax > tol) printf("\n"); printf("logx2s: Maximum residual =%19.12E\n", residmax); return 0; }