| 1 | #include "slalib.h" | 
|---|
| 2 | #include "slamac.h" | 
|---|
| 3 |  | 
|---|
| 4 | static void atmt ( double, double, double, double, double, double, | 
|---|
| 5 | double, double, double, double, double, double, | 
|---|
| 6 | double*, double*, double* ); | 
|---|
| 7 | static void atms ( double, double, double, double, double, | 
|---|
| 8 | double*, double* ); | 
|---|
| 9 |  | 
|---|
| 10 | void slaRefro ( double zobs, double hm, double tdk, double pmb, | 
|---|
| 11 | double rh, double wl, double phi, double tlr, | 
|---|
| 12 | double eps, double *ref ) | 
|---|
| 13 | /* | 
|---|
| 14 | **  - - - - - - - - - | 
|---|
| 15 | **   s l a R e f r o | 
|---|
| 16 | **  - - - - - - - - - | 
|---|
| 17 | ** | 
|---|
| 18 | **  Atmospheric refraction for radio and optical/IR wavelengths. | 
|---|
| 19 | ** | 
|---|
| 20 | **  Given: | 
|---|
| 21 | **    zobs    double  observed zenith distance of the source (radian) | 
|---|
| 22 | **    hm      double  height of the observer above sea level (metre) | 
|---|
| 23 | **    tdk     double  ambient temperature at the observer (deg K) | 
|---|
| 24 | **    pmb     double  pressure at the observer (millibar) | 
|---|
| 25 | **    rh      double  relative humidity at the observer (range 0-1) | 
|---|
| 26 | **    wl      double  effective wavelength of the source (micrometre) | 
|---|
| 27 | **    phi     double  latitude of the observer (radian, astronomical) | 
|---|
| 28 | **    tlr     double  tropospheric lapse rate (degK/metre) | 
|---|
| 29 | **    eps     double  precision required to terminate iteration (radian) | 
|---|
| 30 | ** | 
|---|
| 31 | **  Returned: | 
|---|
| 32 | **    ref     double  refraction: in vacuo ZD minus observed ZD (radian) | 
|---|
| 33 | ** | 
|---|
| 34 | **  Notes: | 
|---|
| 35 | ** | 
|---|
| 36 | **  1  A suggested value for the tlr argument is 0.0065.  The | 
|---|
| 37 | **     refraction is significantly affected by tlr, and if studies | 
|---|
| 38 | **     of the local atmosphere have been carried out a better tlr | 
|---|
| 39 | **     value may be available. | 
|---|
| 40 | ** | 
|---|
| 41 | **  2  A suggested value for the eps argument is 1e-8.  The result is | 
|---|
| 42 | **     usually at least two orders of magnitude more computationally | 
|---|
| 43 | **     precise than the supplied eps value. | 
|---|
| 44 | ** | 
|---|
| 45 | **  3  The routine computes the refraction for zenith distances up | 
|---|
| 46 | **     to and a little beyond 90 deg using the method of Hohenkerk | 
|---|
| 47 | **     and Sinclair (NAO Technical Notes 59 and 63, subsequently adopted | 
|---|
| 48 | **     in the Explanatory Supplement, 1992 edition - see section 3.281). | 
|---|
| 49 | ** | 
|---|
| 50 | **  4  The C code is an adaptation of the Fortran optical/IR refraction | 
|---|
| 51 | **     subroutine AREF of C.Hohenkerk (HMNAO, September 1984), with | 
|---|
| 52 | **     extensions to support the radio case.  The following modifications | 
|---|
| 53 | **     to the original HMNAO optical/IR refraction algorithm have been made: | 
|---|
| 54 | ** | 
|---|
| 55 | **     .  The angle arguments have been changed to radians. | 
|---|
| 56 | ** | 
|---|
| 57 | **     .  Any value of zobs is allowed (see note 6, below). | 
|---|
| 58 | ** | 
|---|
| 59 | **     .  Other argument values have been limited to safe values. | 
|---|
| 60 | ** | 
|---|
| 61 | **     .  Murray's values for the gas constants have been used | 
|---|
| 62 | **        (Vectorial Astrometry, Adam Hilger, 1983). | 
|---|
| 63 | ** | 
|---|
| 64 | **     .  The numerical integration phase has been rearranged for | 
|---|
| 65 | **        extra clarity. | 
|---|
| 66 | ** | 
|---|
| 67 | **     .  A better model for Ps(T) has been adopted (taken from | 
|---|
| 68 | **        Gill, Atmosphere-Ocean Dynamics, Academic Press, 1982). | 
|---|
| 69 | ** | 
|---|
| 70 | **     .  More accurate expressions for Pwo have been adopted | 
|---|
| 71 | **        (again from Gill 1982). | 
|---|
| 72 | ** | 
|---|
| 73 | **     .  Provision for radio wavelengths has been added using | 
|---|
| 74 | **        expressions devised by A.T.Sinclair, RGO (private | 
|---|
| 75 | **        communication 1989), based on the Essen & Froome | 
|---|
| 76 | **        refractivity formula adopted in Resolution 1 of the | 
|---|
| 77 | **        13th International Geodesy Association General Assembly | 
|---|
| 78 | **        (Bulletin Geodesique 70 p390, 1963). | 
|---|
| 79 | ** | 
|---|
| 80 | **     .  Various small changes have been made to gain speed. | 
|---|
| 81 | ** | 
|---|
| 82 | **     None of the changes significantly affects the optical/IR results | 
|---|
| 83 | **     with respect to the algorithm given in the 1992 Explanatory | 
|---|
| 84 | **     Supplement.  For example, at 70 deg zenith distance the present | 
|---|
| 85 | **     routine agrees with the ES algorithm to better than 0.05 arcsec | 
|---|
| 86 | **     for any reasonable combination of parameters.  However, the | 
|---|
| 87 | **     improved water-vapour expressions do make a significant difference | 
|---|
| 88 | **     in the radio band, at 70 deg zenith distance reaching almost | 
|---|
| 89 | **     4 arcsec for a hot, humid, low-altitude site during a period of | 
|---|
| 90 | **     low pressure. | 
|---|
| 91 | ** | 
|---|
| 92 | **  5  The radio refraction is chosen by specifying wl > 100 micrometres. | 
|---|
| 93 | **     Because the algorithm takes no account of the ionosphere, the | 
|---|
| 94 | **     accuracy deteriorates at low frequencies, below about 30 MHz. | 
|---|
| 95 | ** | 
|---|
| 96 | **  6  Before use, the value of zobs is expressed in the range +/- pi. | 
|---|
| 97 | **     If this ranged zobs is -ve, the result ref is computed from its | 
|---|
| 98 | **     absolute value before being made -ve to match.  In addition, if | 
|---|
| 99 | **     it has an absolute value greater than 93 deg, a fixed ref value | 
|---|
| 100 | **     equal to the result for zobs = 93 deg is returned, appropriately | 
|---|
| 101 | **     signed. | 
|---|
| 102 | ** | 
|---|
| 103 | **  7  As in the original Hohenkerk and Sinclair algorithm, fixed | 
|---|
| 104 | **     values of the water vapour polytrope exponent, the height of the | 
|---|
| 105 | **     tropopause, and the height at which refraction is negligible are | 
|---|
| 106 | **     used. | 
|---|
| 107 | ** | 
|---|
| 108 | **  8  The radio refraction has been tested against work done by | 
|---|
| 109 | **     Iain Coulson, JACH, (private communication 1995) for the | 
|---|
| 110 | **     James Clerk Maxwell Telescope, Mauna Kea.  For typical conditions, | 
|---|
| 111 | **     agreement at the 0.1 arcsec level is achieved for moderate ZD, | 
|---|
| 112 | **     worsening to perhaps 0.5-1.0 arcsec at ZD 80 deg.  At hot and | 
|---|
| 113 | **     humid sea-level sites the accuracy will not be as good. | 
|---|
| 114 | ** | 
|---|
| 115 | **  9  It should be noted that the relative humidity rh is formally | 
|---|
| 116 | **     defined in terms of "mixing ratio" rather than pressures or | 
|---|
| 117 | **     densities as is often stated.  It is the mass of water per unit | 
|---|
| 118 | **     mass of dry air divided by that for saturated air at the same | 
|---|
| 119 | **     temperature and pressure (see Gill 1982). | 
|---|
| 120 | ** | 
|---|
| 121 | **  Called:  slaDrange, atmt, atms | 
|---|
| 122 | ** | 
|---|
| 123 | **  Defined in slamac.h:  TRUE, FALSE | 
|---|
| 124 | ** | 
|---|
| 125 | **  Last revision:   3 June 1997 | 
|---|
| 126 | ** | 
|---|
| 127 | **  Copyright P.T.Wallace.  All rights reserved. | 
|---|
| 128 | */ | 
|---|
| 129 | { | 
|---|
| 130 | /* Fixed parameters */ | 
|---|
| 131 |  | 
|---|
| 132 | static double d93 = 1.623156204; /* 93 degrees in radians        */ | 
|---|
| 133 | static double gcr = 8314.32;     /* Universal gas constant       */ | 
|---|
| 134 | static double dmd = 28.9644;     /* Molecular weight of dry air  */ | 
|---|
| 135 | static double dmw = 18.0152;     /* Molecular weight of water | 
|---|
| 136 | vapour */ | 
|---|
| 137 | static double s = 6378120.0;     /* Mean Earth radius (metre)    */ | 
|---|
| 138 | static double delta = 18.36;     /* Exponent of temperature | 
|---|
| 139 | dependence of water vapour | 
|---|
| 140 | pressure */ | 
|---|
| 141 | static double ht = 11000.0;      /* Height of tropopause (metre) */ | 
|---|
| 142 | static double hs = 80000.0;      /* Upper limit for refractive | 
|---|
| 143 | effects (metre) */ | 
|---|
| 144 |  | 
|---|
| 145 | /* Variables used when calling the internal routine atmt */ | 
|---|
| 146 | double robs;   /* height of observer from centre of Earth (metre) */ | 
|---|
| 147 | double tdkok;  /* temperature at the observer (deg K) */ | 
|---|
| 148 | double alpha;  /* alpha          |        */ | 
|---|
| 149 | double gamm2;  /* gamma minus 2  | see ES */ | 
|---|
| 150 | double delm2;  /* delta minus 2  |        */ | 
|---|
| 151 | double c1,c2,c3,c4,c5,c6;  /* various */ | 
|---|
| 152 |  | 
|---|
| 153 | /* Variables used when calling the internal routine atms */ | 
|---|
| 154 | double rt;     /* height of tropopause from centre of Earth (metre) */ | 
|---|
| 155 | double tt;     /* temperature at the tropopause (deg k) */ | 
|---|
| 156 | double dnt;    /* refractive index at the tropopause */ | 
|---|
| 157 | double gamal;  /* constant of the atmospheric model = g*md/r */ | 
|---|
| 158 |  | 
|---|
| 159 | int is, k, n, i, j, optic; | 
|---|
| 160 | double zobs1, zobs2, hmok, pmbok, rhok, wlok, tol, wlsq, gb, | 
|---|
| 161 | a, gamma, tdc, psat, pwo, w, tempo, dn0, rdndr0, sk0, | 
|---|
| 162 | f0, rdndrt, zt, ft, dnts, rdndrp, zts, fts, rs, | 
|---|
| 163 | dns, rdndrs, zs, fs, refold, z0, zrange, fb, ff, fo, | 
|---|
| 164 | fe, h, r, sz, rg, dr, tg, dn, rdndr, t, f, refp, reft; | 
|---|
| 165 |  | 
|---|
| 166 | /* The refraction integrand */ | 
|---|
| 167 | #define refi(R,DN,RDNDR) ((RDNDR)/(DN+RDNDR)); | 
|---|
| 168 |  | 
|---|
| 169 |  | 
|---|
| 170 |  | 
|---|
| 171 | /* Transform zobs into the normal range. */ | 
|---|
| 172 | zobs1 = slaDrange ( zobs ); | 
|---|
| 173 | zobs2 = fabs ( zobs1 ); | 
|---|
| 174 | zobs2 = gmin ( zobs2, d93 ); | 
|---|
| 175 |  | 
|---|
| 176 | /* Keep other arguments within safe bounds. */ | 
|---|
| 177 | hmok = gmax ( hm, -1000.0 ); | 
|---|
| 178 | hmok = gmin ( hmok, 10000.0 ); | 
|---|
| 179 | tdkok = gmax ( tdk, 100.0 ); | 
|---|
| 180 | tdkok = gmin ( tdkok, 500.0 ); | 
|---|
| 181 | pmbok = gmax ( pmb, 0.0 ); | 
|---|
| 182 | pmbok = gmin ( pmbok, 10000.0 ); | 
|---|
| 183 | rhok  = gmax ( rh, 0.0 ); | 
|---|
| 184 | rhok  = gmin ( rhok, 1.0 ); | 
|---|
| 185 | wlok  = gmax ( wl, 0.1 ); | 
|---|
| 186 | alpha = fabs ( tlr ); | 
|---|
| 187 | alpha = gmax ( alpha, 0.001 ); | 
|---|
| 188 | alpha = gmin ( alpha, 0.01 ); | 
|---|
| 189 |  | 
|---|
| 190 | /* Tolerance for iteration. */ | 
|---|
| 191 | w = fabs ( eps ); | 
|---|
| 192 | w = gmax ( w, 1e-12 ); | 
|---|
| 193 | tol = gmin ( w, 0.1 ) / 2.0; | 
|---|
| 194 |  | 
|---|
| 195 | /* Decide whether optical/IR or radio case - switch at 100 microns. */ | 
|---|
| 196 | optic = ( wlok <= 100.0 ); | 
|---|
| 197 |  | 
|---|
| 198 | /* Set up model atmosphere parameters defined at the observer. */ | 
|---|
| 199 | wlsq = wlok * wlok; | 
|---|
| 200 | gb = 9.784 * ( 1.0 - 0.0026 * cos ( 2.0 * phi ) - 2.8e-7 * hmok ); | 
|---|
| 201 | a = ( optic ) ? | 
|---|
| 202 | ( ( 287.604 + 1.6288 / wlsq + 0.0136 / ( wlsq * wlsq ) ) | 
|---|
| 203 | * 273.15 / 1013.25 ) * 1e-6 | 
|---|
| 204 | : | 
|---|
| 205 | 77.624e-6; | 
|---|
| 206 | gamal = gb * dmd / gcr; | 
|---|
| 207 | gamma = gamal / alpha; | 
|---|
| 208 | gamm2 = gamma - 2.0; | 
|---|
| 209 | delm2 = delta - 2.0; | 
|---|
| 210 | tdc = tdkok - 273.15; | 
|---|
| 211 | psat = pow ( 10.0, ( 0.7859 + 0.03477 * tdc ) / | 
|---|
| 212 | ( 1.0 + 0.00412 * tdc ) ) * | 
|---|
| 213 | ( 1.0 + pmbok * ( 4.5e-6 + 6e-10 * tdc * tdc ) ); | 
|---|
| 214 | pwo = ( pmbok > 0.0 ) ? | 
|---|
| 215 | rhok * psat / ( 1.0 - ( 1.0 - rhok ) * psat / pmbok ) : | 
|---|
| 216 | 0.0; | 
|---|
| 217 | w = pwo * ( 1.0 - dmw / dmd ) * gamma / ( delta - gamma ); | 
|---|
| 218 | c1 = a * ( pmbok + w ) / tdkok; | 
|---|
| 219 | c2 = ( a * w + ( optic ? 11.2684e-6 : 12.92e-6 ) * pwo ) / tdkok; | 
|---|
| 220 | c3 = ( gamma - 1.0 ) * alpha * c1 / tdkok; | 
|---|
| 221 | c4 = ( delta - 1.0 ) * alpha * c2 / tdkok; | 
|---|
| 222 | c5 = optic ? 0.0 : 371897e-6 * pwo / tdkok; | 
|---|
| 223 | c6 = c5 * delm2 * alpha / ( tdkok * tdkok ); | 
|---|
| 224 |  | 
|---|
| 225 | /* Conditions at the observer. */ | 
|---|
| 226 | robs = s + hmok; | 
|---|
| 227 | atmt ( robs, tdkok, alpha, gamm2, delm2, c1, c2, c3, c4, c5, c6, robs, | 
|---|
| 228 | &tempo, &dn0, &rdndr0 ); | 
|---|
| 229 | sk0 = dn0 * robs * sin ( zobs2 ); | 
|---|
| 230 | f0 = refi ( robs, dn0, rdndr0 ); | 
|---|
| 231 |  | 
|---|
| 232 | /* Conditions at the tropopause in the troposphere. */ | 
|---|
| 233 | rt = s + ht; | 
|---|
| 234 | atmt ( robs, tdkok, alpha, gamm2, delm2, c1, c2, c3, c4, c5, c6, rt, | 
|---|
| 235 | &tt, &dnt, &rdndrt ); | 
|---|
| 236 | zt = asin ( sk0 / ( rt * dnt ) ); | 
|---|
| 237 | ft = refi ( rt, dnt, rdndrt ); | 
|---|
| 238 |  | 
|---|
| 239 | /* Conditions at the tropopause in the stratosphere. */ | 
|---|
| 240 | atms ( rt, tt, dnt, gamal, rt, &dnts, &rdndrp ); | 
|---|
| 241 | zts = asin ( sk0 / ( rt * dnts ) ); | 
|---|
| 242 | fts = refi ( rt, dnts, rdndrp ); | 
|---|
| 243 |  | 
|---|
| 244 | /* Conditions at the stratosphere limit. */ | 
|---|
| 245 | rs = s + hs; | 
|---|
| 246 | atms ( rt, tt, dnt, gamal, rs, &dns, &rdndrs ); | 
|---|
| 247 | zs = asin ( sk0 / ( rs * dns ) ); | 
|---|
| 248 | fs = refi ( rs, dns, rdndrs ); | 
|---|
| 249 |  | 
|---|
| 250 | /* | 
|---|
| 251 | ** Integrate the refraction integral in two parts;  first in the | 
|---|
| 252 | ** troposphere (k=1), then in the stratosphere (k=2). | 
|---|
| 253 | */ | 
|---|
| 254 |  | 
|---|
| 255 | /* Initialize previous refraction to ensure at least two iterations. */ | 
|---|
| 256 | refold = 1e6; | 
|---|
| 257 |  | 
|---|
| 258 | /* | 
|---|
| 259 | ** Start off with 8 strips for the troposphere integration, and then | 
|---|
| 260 | ** use the final troposphere value for the stratosphere integration, | 
|---|
| 261 | ** which tends to need more strips. | 
|---|
| 262 | */ | 
|---|
| 263 | is = 8; | 
|---|
| 264 |  | 
|---|
| 265 | /* Troposphere then stratosphere. */ | 
|---|
| 266 | for ( k = 1; k <= 2; k++ ) { | 
|---|
| 267 |  | 
|---|
| 268 | /* Start z, z range, and start and end values. */ | 
|---|
| 269 | if ( k == 1 ) { | 
|---|
| 270 | z0 = zobs2; | 
|---|
| 271 | zrange = zt - z0; | 
|---|
| 272 | fb = f0; | 
|---|
| 273 | ff = ft; | 
|---|
| 274 | } else { | 
|---|
| 275 | z0 = zts; | 
|---|
| 276 | zrange = zs - z0; | 
|---|
| 277 | fb = fts; | 
|---|
| 278 | ff = fs; | 
|---|
| 279 | } | 
|---|
| 280 |  | 
|---|
| 281 | /* Sums of odd and even values. */ | 
|---|
| 282 | fo = 0.0; | 
|---|
| 283 | fe = 0.0; | 
|---|
| 284 |  | 
|---|
| 285 | /* First time through the loop we have to do every point. */ | 
|---|
| 286 | n = 1; | 
|---|
| 287 |  | 
|---|
| 288 | /* Start of iteration loop (terminates at specified precision). */ | 
|---|
| 289 | for ( ; ; ) { | 
|---|
| 290 |  | 
|---|
| 291 | /* Strip width */ | 
|---|
| 292 | h = zrange / (double) is; | 
|---|
| 293 |  | 
|---|
| 294 | /* Initialize distance from Earth centre for quadrature pass. */ | 
|---|
| 295 | r = ( k == 1 ) ? robs : rt; | 
|---|
| 296 |  | 
|---|
| 297 | /* One pass (no need to compute evens after first time). */ | 
|---|
| 298 | for ( i = 1; i < is; i += n ) { | 
|---|
| 299 |  | 
|---|
| 300 | /* Sine of observed zenith distance. */ | 
|---|
| 301 | sz = sin ( z0 + h * (double) i ); | 
|---|
| 302 |  | 
|---|
| 303 | /* Find r (to nearest metre, maximum four iterations). */ | 
|---|
| 304 | if ( sz > 1e-20 ) { | 
|---|
| 305 | w = sk0 / sz; | 
|---|
| 306 | rg = r; | 
|---|
| 307 | j = 0; | 
|---|
| 308 | do { | 
|---|
| 309 | if ( k == 1 ) { | 
|---|
| 310 | atmt ( robs, tdkok, alpha, gamm2, delm2, | 
|---|
| 311 | c1, c2, c3, c4, c5, c6, rg, | 
|---|
| 312 | &tg, &dn, &rdndr ); | 
|---|
| 313 | } else { | 
|---|
| 314 | atms ( rt, tt, dnt, gamal, rg, &dn, &rdndr ); | 
|---|
| 315 | } | 
|---|
| 316 | dr = ( rg * dn - w ) / ( dn + rdndr ); | 
|---|
| 317 | rg -= dr; | 
|---|
| 318 | } while ( fabs ( dr ) > 1.0 && j++ <= 4 ); | 
|---|
| 319 | r = rg; | 
|---|
| 320 | } | 
|---|
| 321 |  | 
|---|
| 322 | /* Find refractive index and integrand at r. */ | 
|---|
| 323 | if ( k == 1 ) { | 
|---|
| 324 | atmt ( robs, tdkok, alpha, gamm2, delm2, | 
|---|
| 325 | c1, c2, c3, c4, c5, c6, r, | 
|---|
| 326 | &t, &dn, &rdndr ); | 
|---|
| 327 | } else { | 
|---|
| 328 | atms ( rt, tt, dnt, gamal, r, &dn, &rdndr ); | 
|---|
| 329 | } | 
|---|
| 330 | f = refi ( r, dn, rdndr ); | 
|---|
| 331 |  | 
|---|
| 332 | /* Accumulate odd and (first time only) even values. */ | 
|---|
| 333 | if ( n == 1 && i % 2 == 0 ) { | 
|---|
| 334 | fe += f; | 
|---|
| 335 | } else { | 
|---|
| 336 | fo += f; | 
|---|
| 337 | } | 
|---|
| 338 | } | 
|---|
| 339 |  | 
|---|
| 340 | /* Evaluate the integrand using Simpson's Rule. */ | 
|---|
| 341 | refp = h * ( fb + 4.0 * fo + 2.0 * fe + ff ) / 3.0; | 
|---|
| 342 |  | 
|---|
| 343 | /* Has the required precision been reached? */ | 
|---|
| 344 | if ( fabs ( refp - refold ) > tol ) { | 
|---|
| 345 |  | 
|---|
| 346 | /* No: prepare for next iteration. */ | 
|---|
| 347 | refold = refp;   /* Save current value for convergence test */ | 
|---|
| 348 | is += is;        /* Double the number of strips */ | 
|---|
| 349 | fe += fo;        /* Sum of all = sum of evens next time */ | 
|---|
| 350 | fo = 0.0;        /* Reset odds accumulator */ | 
|---|
| 351 | n = 2;           /* Skip even values next time */ | 
|---|
| 352 |  | 
|---|
| 353 | } else { | 
|---|
| 354 |  | 
|---|
| 355 | /* Yes: save troposphere component and terminate loop. */ | 
|---|
| 356 | if ( k == 1 ) reft = refp; | 
|---|
| 357 | break; | 
|---|
| 358 | } | 
|---|
| 359 | } | 
|---|
| 360 | } | 
|---|
| 361 |  | 
|---|
| 362 | /* Result. */ | 
|---|
| 363 | *ref = reft + refp; | 
|---|
| 364 | if ( zobs1 < 0.0 ) *ref = - ( *ref ); | 
|---|
| 365 | } | 
|---|
| 366 |  | 
|---|
| 367 | /*--------------------------------------------------------------------------*/ | 
|---|
| 368 |  | 
|---|
| 369 | static void atmt ( double robs, double tdkok, double alpha, double gamm2, | 
|---|
| 370 | double delm2, double c1, double c2, double c3, | 
|---|
| 371 | double c4, double c5, double c6, double r, | 
|---|
| 372 | double *t, double *dn, double *rdndr ) | 
|---|
| 373 | /* | 
|---|
| 374 | **  - - - - - | 
|---|
| 375 | **   a t m t | 
|---|
| 376 | **  - - - - - | 
|---|
| 377 | ** | 
|---|
| 378 | **  Internal routine used by slaRefro: | 
|---|
| 379 | ** | 
|---|
| 380 | **    refractive index and derivative with respect to height for the | 
|---|
| 381 | **    troposphere. | 
|---|
| 382 | ** | 
|---|
| 383 | **  Given: | 
|---|
| 384 | **    robs    double   height of observer from centre of the Earth (metre) | 
|---|
| 385 | **    tdkok   double   temperature at the observer (deg K) | 
|---|
| 386 | **    alpha   double   alpha          ) | 
|---|
| 387 | **    gamm2   double   gamma minus 2  ) see ES | 
|---|
| 388 | **    delm2   double   delta minus 2  ) | 
|---|
| 389 | **    c1      double   useful term  ) | 
|---|
| 390 | **    c2      double   useful term  ) | 
|---|
| 391 | **    c3      double   useful term  ) see source of | 
|---|
| 392 | **    c4      double   useful term  ) slaRefro main routine | 
|---|
| 393 | **    c5      double   useful term  ) | 
|---|
| 394 | **    c6      double   useful term  ) | 
|---|
| 395 | **    r       double   current distance from the centre of the Earth (metre) | 
|---|
| 396 | ** | 
|---|
| 397 | **  Returned: | 
|---|
| 398 | **    *t      double   temperature at r (deg K) | 
|---|
| 399 | **    *dn     double   refractive index at r | 
|---|
| 400 | **    *rdndr  double   r * rate the refractive index is changing at r | 
|---|
| 401 | ** | 
|---|
| 402 | **  This routine is derived from the ATMOSTRO routine (C.Hohenkerk, | 
|---|
| 403 | **  HMNAO), with enhancements specified by A.T.Sinclair (RGO) to | 
|---|
| 404 | **  handle the radio case. | 
|---|
| 405 | ** | 
|---|
| 406 | **  Note that in the optical case c5 and c6 are zero. | 
|---|
| 407 | */ | 
|---|
| 408 | { | 
|---|
| 409 | double w, tt0, tt0gm2, tt0dm2; | 
|---|
| 410 |  | 
|---|
| 411 | w = tdkok - alpha * ( r - robs ); | 
|---|
| 412 | w = gmin ( w, 320.0 ); | 
|---|
| 413 | w = gmax ( w, 100.0 ); | 
|---|
| 414 | tt0 = w / tdkok; | 
|---|
| 415 | tt0gm2 = pow ( tt0, gamm2 ); | 
|---|
| 416 | tt0dm2 = pow ( tt0, delm2 ); | 
|---|
| 417 | *t = w; | 
|---|
| 418 | *dn = 1.0 + ( c1 * tt0gm2 - ( c2 - c5 / w ) * tt0dm2 ) * tt0; | 
|---|
| 419 | *rdndr = r * ( - c3 * tt0gm2 + ( c4 - c6 / tt0 ) * tt0dm2 ); | 
|---|
| 420 | } | 
|---|
| 421 |  | 
|---|
| 422 | /*--------------------------------------------------------------------------*/ | 
|---|
| 423 |  | 
|---|
| 424 | static void atms ( double rt, double tt, double dnt, double gamal, double r, | 
|---|
| 425 | double *dn, double *rdndr ) | 
|---|
| 426 | /* | 
|---|
| 427 | **  - - - - - | 
|---|
| 428 | **   a t m s | 
|---|
| 429 | **  - - - - - | 
|---|
| 430 | ** | 
|---|
| 431 | **  Internal routine used by slaRefro: | 
|---|
| 432 | ** | 
|---|
| 433 | **   refractive index and derivative with respect to height for the | 
|---|
| 434 | **   stratosphere. | 
|---|
| 435 | ** | 
|---|
| 436 | **  Given: | 
|---|
| 437 | **    rt      double   height of tropopause from centre of the Earth (metre) | 
|---|
| 438 | **    tt      double   temperature at the tropopause (deg k) | 
|---|
| 439 | **    dnt     double   refractive index at the tropopause | 
|---|
| 440 | **    gamal   double   constant of the atmospheric model = g*md/r | 
|---|
| 441 | **    r       double   current distance from the centre of the Earth (metre) | 
|---|
| 442 | ** | 
|---|
| 443 | **  Returned: | 
|---|
| 444 | **    *dn     double   refractive index at r | 
|---|
| 445 | **    *rdndr  double   r * rate the refractive index is changing at r | 
|---|
| 446 | ** | 
|---|
| 447 | **  This routine is derived from the ATMOSSTR routine (C.Hohenkerk, HMNAO). | 
|---|
| 448 | */ | 
|---|
| 449 | { | 
|---|
| 450 | double b, w; | 
|---|
| 451 |  | 
|---|
| 452 | b = gamal / tt; | 
|---|
| 453 | w = ( dnt - 1.0 ) * exp ( - b * ( r - rt ) ); | 
|---|
| 454 | *dn = 1.0 + w; | 
|---|
| 455 | *rdndr = - r * b * w; | 
|---|
| 456 | } | 
|---|