File: tlog.c

package info (click to toggle)
wcslib 7.12%2Bds-1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 8,612 kB
  • sloc: ansic: 34,618; lex: 9,328; fortran: 6,731; sh: 3,367; sed: 497; pascal: 190; makefile: 15
file content (119 lines) | stat: -r--r--r-- 3,526 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
/*============================================================================
  WCSLIB 7.12 - an implementation of the FITS WCS standard.
  Copyright (C) 1995-2022, 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 http://www.gnu.org/licenses.

  Author: Mark Calabretta, Australia Telescope National Facility, CSIRO.
  http://www.atnf.csiro.au/people/Mark.Calabretta
  $Id: tlog.c,v 7.12 2022/09/09 04:57:58 mcalabre Exp $
*=============================================================================
*
*   tlog tests the logarithmic coordinate transformation routines for closure.
*
*---------------------------------------------------------------------------*/

#include <math.h>
#include <stdio.h>

#include <log.h>


#define NCRD 10000

const double tol = 2.0e-13;


int main()

{
  register int j, k;
  int    nFail = 0, 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) {
      nFail++;
      printf("logx2s: x =%20.12e -> log =%20.12e ->\n        x =%20.12e, "
        "resid =%20.12e\n", x0[j], logc[j], x1[j], resid);
    }
  }

  if (nFail) printf("\n");
  printf("logx2s/logs2x: Maximum closure residual = %.1e\n", residmax);


  if (nFail) {
    printf("\nFAIL: %d closure residuals exceed reporting tolerance.\n",
      nFail);
  } else {
    printf("\nPASS: All closure residuals are within reporting tolerance.\n");
  }

  return nFail;
}