1 /*
2 *+
3 *  Name:
4 *     palRefco
5 
6 *  Purpose:
7 *     Determine constants in atmospheric refraction model
8 
9 *  Language:
10 *     Starlink ANSI C
11 
12 *  Type of Module:
13 *     Library routine
14 
15 *  Invocation:
16 *     void palRefco ( double hm, double tdk, double pmb, double rh,
17 *                     double wl, double phi, double tlr, double eps,
18 *                     double *refa, double *refb );
19 
20 *  Arguments:
21 *     hm = double (Given)
22 *        Height of the observer above sea level (metre)
23 *     tdk = double (Given)
24 *        Ambient temperature at the observer (K)
25 *     pmb = double (Given)
26 *        Pressure at the observer (millibar)
27 *     rh = double (Given)
28 *        Relative humidity at the observer (range 0-1)
29 *     wl = double (Given)
30 *        Effective wavelength of the source (micrometre)
31 *     phi = double (Given)
32 *        Latitude of the observer (radian, astronomical)
33 *     tlr = double (Given)
34 *        Temperature lapse rate in the troposphere (K/metre)
35 *     eps = double (Given)
36 *        Precision required to terminate iteration (radian)
37 *     refa = double * (Returned)
38 *        tan Z coefficient (radian)
39 *     refb = double * (Returned)
40 *        tan**3 Z coefficient (radian)
41 
42 *  Description:
43 *     Determine the constants A and B in the atmospheric refraction
44 *     model dZ = A tan Z + B tan**3 Z.
45 *
46 *     Z is the "observed" zenith distance (i.e. affected by refraction)
47 *     and dZ is what to add to Z to give the "topocentric" (i.e. in vacuo)
48 *     zenith distance.
49 
50 *  Authors:
51 *     PTW: Patrick T. Wallace
52 *     TIMJ: Tim Jenness (JAC, Hawaii)
53 *     {enter_new_authors_here}
54 
55 *  Notes:
56 *     - Typical values for the TLR and EPS arguments might be 0.0065 and
57 *     1E-10 respectively.
58 *
59 *     - The radio refraction is chosen by specifying WL > 100 micrometres.
60 *
61 *     - The routine is a slower but more accurate alternative to the
62 *     palRefcoq routine.  The constants it produces give perfect
63 *     agreement with palRefro at zenith distances arctan(1) (45 deg)
64 *     and arctan(4) (about 76 deg).  It achieves 0.5 arcsec accuracy
65 *     for ZD < 80 deg, 0.01 arcsec accuracy for ZD < 60 deg, and
66 *     0.001 arcsec accuracy for ZD < 45 deg.
67 
68 *  History:
69 *     2012-08-24 (TIMJ):
70 *        Initial version. A direct copy of the Fortran SLA implementation.
71 *        Adapted with permission from the Fortran SLALIB library.
72 *     {enter_further_changes_here}
73 
74 *  Copyright:
75 *     Copyright (C) 2004 Rutherford Appleton Laboratory
76 *     Copyright (C) 2012 Science and Technology Facilities Council.
77 *     All Rights Reserved.
78 
79 *  Licence:
80 *     This program is free software; you can redistribute it and/or
81 *     modify it under the terms of the GNU General Public License as
82 *     published by the Free Software Foundation; either version 3 of
83 *     the License, or (at your option) any later version.
84 *
85 *     This program is distributed in the hope that it will be
86 *     useful, but WITHOUT ANY WARRANTY; without even the implied
87 *     warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
88 *     PURPOSE. See the GNU General Public License for more details.
89 *
90 *     You should have received a copy of the GNU General Public License
91 *     along with this program; if not, write to the Free Software
92 *     Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
93 *     MA 02110-1301, USA.
94 
95 *  Bugs:
96 *     {note_any_bugs_here}
97 *-
98 */
99 
100 #include "pal.h"
101 
palRefco(double hm,double tdk,double pmb,double rh,double wl,double phi,double tlr,double eps,double * refa,double * refb)102 void palRefco ( double hm, double tdk, double pmb, double rh,
103                 double wl, double phi, double tlr, double eps,
104                 double *refa, double *refb ) {
105 
106   double r1, r2;
107 
108   /*  Sample zenith distances: arctan(1) and arctan(4) */
109   const double ATN1 = 0.7853981633974483;
110   const double ATN4 = 1.325817663668033;
111 
112   /*  Determine refraction for the two sample zenith distances */
113   palRefro(ATN1,hm,tdk,pmb,rh,wl,phi,tlr,eps,&r1);
114   palRefro(ATN4,hm,tdk,pmb,rh,wl,phi,tlr,eps,&r2);
115 
116   /*  Solve for refraction constants */
117   *refa = (64.0*r1-r2)/60.0;
118   *refb = (r2-4.0*r1)/60.0;
119 
120 }
121