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 | * <http://www.gnu.org/licenses/>.
|
---|
95 |
|
---|
96 | * Bugs:
|
---|
97 | * {note_any_bugs_here}
|
---|
98 | *-
|
---|
99 | */
|
---|
100 |
|
---|
101 | #include "pal.h"
|
---|
102 | #include "pal1sofa.h"
|
---|
103 |
|
---|
104 | #include <math.h>
|
---|
105 |
|
---|
106 | void
|
---|
107 | 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 | x2 = xi * xi;
|
---|
119 | y2 = eta * eta;
|
---|
120 | sd = sin(dec);
|
---|
121 | cd = cos(dec);
|
---|
122 | sdf = sd * sqrt(x2 + 1. + y2);
|
---|
123 | r2 = cd * cd * (y2 + 1.) - sd * sd * x2;
|
---|
124 | if (r2 >= 0.) {
|
---|
125 | double r;
|
---|
126 | double s;
|
---|
127 | double c;
|
---|
128 |
|
---|
129 | r = sqrt(r2);
|
---|
130 | s = sdf - eta * r;
|
---|
131 | c = sdf * eta + r;
|
---|
132 | if (xi == 0. && r == 0.) {
|
---|
133 | r = 1.;
|
---|
134 | }
|
---|
135 | *raz1 = eraAnp(ra - atan2(xi, r));
|
---|
136 | *decz1 = atan2(s, c);
|
---|
137 | r = -r;
|
---|
138 | s = sdf - eta * r;
|
---|
139 | c = sdf * eta + r;
|
---|
140 | *raz2 = eraAnp(ra - atan2(xi, r));
|
---|
141 | *decz2 = atan2(s, c);
|
---|
142 | if (fabs(sdf) < 1.) {
|
---|
143 | *n = 1;
|
---|
144 | } else {
|
---|
145 | *n = 2;
|
---|
146 | }
|
---|
147 | } else {
|
---|
148 | *n = 0;
|
---|
149 | }
|
---|
150 | return;
|
---|
151 | }
|
---|