File Coverage

palsrc/palDtps2c.c
Criterion Covered Total %
statement 0 24 0.0
branch 0 6 0.0
condition n/a
subroutine n/a
pod n/a
total 0 30 0.0


line stmt bran cond sub pod time code
1             /*
2             *+
3             * Name:
4             * palDtps2c
5              
6             * Purpose:
7             * Determine RA,Dec of tangent point from coordinates
8              
9             * Language:
10             * Starlink ANSI C
11              
12             * Type of Module:
13             * Library routine
14              
15             * Invocation:
16             * palDtps2c( double xi, double eta, double ra, double dec,
17             * double * raz1, double decz1,
18             * double * raz2, double decz2, int *n);
19              
20             * Arguments:
21             * xi = double (Given)
22             * First rectangular coordinate on tangent plane (radians)
23             * eta = double (Given)
24             * Second rectangular coordinate on tangent plane (radians)
25             * ra = double (Given)
26             * RA spherical coordinate of star (radians)
27             * dec = double (Given)
28             * Dec spherical coordinate of star (radians)
29             * raz1 = double * (Returned)
30             * RA spherical coordinate of tangent point, solution 1 (radians)
31             * decz1 = double * (Returned)
32             * Dec spherical coordinate of tangent point, solution 1 (radians)
33             * raz2 = double * (Returned)
34             * RA spherical coordinate of tangent point, solution 2 (radians)
35             * decz2 = double * (Returned)
36             * Dec spherical coordinate of tangent point, solution 2 (radians)
37             * n = int * (Returned)
38             * number of solutions: 0 = no solutions returned (note 2)
39             * 1 = only the first solution is useful (note 3)
40             * 2 = both solutions are useful (note 3)
41              
42              
43             * Description:
44             * From the tangent plane coordinates of a star of known RA,Dec,
45             * determine the RA,Dec of the tangent point.
46              
47             * Authors:
48             * PTW: Pat Wallace (STFC)
49             * TIMJ: Tim Jenness (JAC, Hawaii)
50             * {enter_new_authors_here}
51              
52             * Notes:
53             * - The RAZ1 and RAZ2 values are returned in the range 0-2pi.
54             * - Cases where there is no solution can only arise near the poles.
55             * For example, it is clearly impossible for a star at the pole
56             * itself to have a non-zero XI value, and hence it is
57             * meaningless to ask where the tangent point would have to be
58             * to bring about this combination of XI and DEC.
59             * - Also near the poles, cases can arise where there are two useful
60             * solutions. The argument N indicates whether the second of the
61             * two solutions returned is useful. N=1 indicates only one useful
62             * solution, the usual case; under these circumstances, the second
63             * solution corresponds to the "over-the-pole" case, and this is
64             * reflected in the values of RAZ2 and DECZ2 which are returned.
65             * - The DECZ1 and DECZ2 values are returned in the range +/-pi, but
66             * in the usual, non-pole-crossing, case, the range is +/-pi/2.
67             * - This routine is the spherical equivalent of the routine sla_DTPV2C.
68              
69             * History:
70             * 2012-02-08 (TIMJ):
71             * Initial version with documentation taken from Fortran SLA
72             * Adapted with permission from the Fortran SLALIB library.
73             * {enter_further_changes_here}
74              
75             * Copyright:
76             * Copyright (C) 1995 Rutherford Appleton Laboratory
77             * Copyright (C) 2012 Science and Technology Facilities Council.
78             * All Rights Reserved.
79              
80             * Licence:
81             * This program is free software: you can redistribute it and/or
82             * modify it under the terms of the GNU Lesser General Public
83             * License as published by the Free Software Foundation, either
84             * version 3 of the License, or (at your option) any later
85             * version.
86             *
87             * This program is distributed in the hope that it will be useful,
88             * but WITHOUT ANY WARRANTY; without even the implied warranty of
89             * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
90             * GNU Lesser General Public License for more details.
91             *
92             * You should have received a copy of the GNU Lesser General
93             * License along with this program. If not, see
94             * .
95              
96             * Bugs:
97             * {note_any_bugs_here}
98             *-
99             */
100              
101             #include "pal.h"
102             #include "pal1sofa.h"
103              
104             #include
105              
106             void
107 0           palDtps2c( double xi, double eta, double ra, double dec,
108             double * raz1, double * decz1,
109             double * raz2, double * decz2, int *n) {
110              
111             double x2;
112             double y2;
113             double sd;
114             double cd;
115             double sdf;
116             double r2;
117              
118 0           x2 = xi * xi;
119 0           y2 = eta * eta;
120 0           sd = sin(dec);
121 0           cd = cos(dec);
122 0           sdf = sd * sqrt(x2 + 1. + y2);
123 0           r2 = cd * cd * (y2 + 1.) - sd * sd * x2;
124 0 0         if (r2 >= 0.) {
125             double r;
126             double s;
127             double c;
128              
129 0           r = sqrt(r2);
130 0           s = sdf - eta * r;
131 0           c = sdf * eta + r;
132 0 0         if (xi == 0. && r == 0.) {
133             r = 1.;
134             }
135 0           *raz1 = eraAnp(ra - atan2(xi, r));
136 0           *decz1 = atan2(s, c);
137 0           r = -r;
138 0           s = sdf - eta * r;
139 0           c = sdf * eta + r;
140 0           *raz2 = eraAnp(ra - atan2(xi, r));
141 0           *decz2 = atan2(s, c);
142 0 0         if (fabs(sdf) < 1.) {
143 0           *n = 1;
144             } else {
145 0           *n = 2;
146             }
147             } else {
148 0           *n = 0;
149             }
150 0           return;
151             }