1 /*
2 *+
3 *  Name:
4 *     palPreces
5 
6 *  Purpose:
7 *     Precession - either FK4 or FK5 as required.
8 
9 *  Language:
10 *     Starlink ANSI C
11 
12 *  Type of Module:
13 *     Library routine
14 
15 *  Invocation:
16 *     void palPreces ( const char sys[3], double ep0, double ep1,
17 *                      double *ra, double *dc );
18 
19 *  Arguments:
20 *     sys = const char [3] (Given)
21 *        Precession to be applied: FK4 or FK5. Case insensitive.
22 *     ep0 = double (Given)
23 *        Starting epoch.
24 *     ep1 = double (Given)
25 *        Ending epoch
26 *     ra = double * (Given & Returned)
27 *        On input the RA mean equator & equinox at epoch ep0. On exit
28 *        the RA mean equator & equinox of epoch ep1.
29 *     dec = double * (Given & Returned)
30 *        On input the dec mean equator & equinox at epoch ep0. On exit
31 *        the dec mean equator & equinox of epoch ep1.
32 
33 *  Description:
34 *     Precess coordinates using the appropriate system and epochs.
35 
36 *  Authors:
37 *     PTW: Patrick T. Wallace
38 *     TIMJ: Tim Jenness (JAC, Hawaii)
39 *     {enter_new_authors_here}
40 
41 *  Notes:
42 *     - Uses palPrec for FK5 data and palPrebn for FK4 data.
43 *     - The epochs are Besselian if SYSTEM='FK4' and Julian if 'FK5'.
44 *        For example, to precess coordinates in the old system from
45 *        equinox 1900.0 to 1950.0 the call would be:
46 *             palPreces( "FK4", 1900.0, 1950.0, &ra, &dc );
47 *     - This routine will NOT correctly convert between the old and
48 *       the new systems - for example conversion from B1950 to J2000.
49 *       For these purposes see palFk425, palFk524, palFk45z and
50 *       palFk54z.
51 *     - If an invalid SYSTEM is supplied, values of -99D0,-99D0 will
52 *       be returned for both RA and DC.
53 
54 *  History:
55 *     2012-03-02 (TIMJ):
56 *        Initial version
57 *        Adapted with permission from the Fortran SLALIB library.
58 *     {enter_further_changes_here}
59 
60 *  Copyright:
61 *     Copyright (C) 1995 Rutherford Appleton Laboratory
62 *     Copyright (C) 2012 Science and Technology Facilities Council.
63 *     All Rights Reserved.
64 
65 *  Licence:
66 *     This program is free software; you can redistribute it and/or
67 *     modify it under the terms of the GNU General Public License as
68 *     published by the Free Software Foundation; either version 3 of
69 *     the License, or (at your option) any later version.
70 *
71 *     This program is distributed in the hope that it will be
72 *     useful, but WITHOUT ANY WARRANTY; without even the implied
73 *     warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
74 *     PURPOSE. See the GNU General Public License for more details.
75 *
76 *     You should have received a copy of the GNU General Public License
77 *     along with this program; if not, write to the Free Software
78 *     Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
79 *     MA 02110-1301, USA.
80 
81 *  Bugs:
82 *     {note_any_bugs_here}
83 *-
84 */
85 
86 #if HAVE_CONFIG_H
87 #  include <config.h>
88 #endif
89 
90 #include "pal.h"
91 #include "pal1sofa.h"
92 
93 #include <string.h>
94 
95 #if HAVE__STRNICMP || defined(_WIN32) || defined(_WIN64)
96 #  define strncasecmp _strnicmp
97 #endif
98 
palPreces(const char sys[3],double ep0,double ep1,double * ra,double * dc)99 void palPreces ( const char sys[3], double ep0, double ep1,
100                  double *ra, double *dc ) {
101 
102   double pm[3][3];
103   double v1[3];
104   double v2[3];
105 
106   /* Generate appropriate precession matrix */
107   if ( strncasecmp( "FK4", sys, 3 ) == 0 ) {
108     palPrebn( ep0, ep1, pm );
109   } else if (strncasecmp( "FK5", sys, 3 ) == 0 ) {
110     palPrec( ep0, ep1, pm );
111   } else {
112     *ra = -99.0;
113     *dc = -99.0;
114     return;
115   }
116 
117   /* Convert RA,Dec to x,y,z */
118   eraS2c( *ra, *dc, v1 );
119 
120   /* Precess */
121   eraRxp( pm, v1, v2 );
122 
123   /* Back to RA,Dec */
124   eraC2s( v2, ra, dc );
125   *ra = eraAnp( *ra );
126 }
127