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 | }
|
---|