1 | #include "slalib.h"
|
---|
2 | #include "slamac.h"
|
---|
3 | void slaAtmdsp ( double tdk, double pmb, double rh, double wl1,
|
---|
4 | double a1, double b1, double wl2, double *a2, double *b2 )
|
---|
5 | /*
|
---|
6 | ** - - - - - - - - - -
|
---|
7 | ** s l a A t m d s p
|
---|
8 | ** - - - - - - - - - -
|
---|
9 | **
|
---|
10 | ** Apply atmospheric-dispersion adjustments to refraction coefficients.
|
---|
11 | **
|
---|
12 | ** Given:
|
---|
13 | ** tdk double ambient temperature, degrees K
|
---|
14 | ** pmb double ambient pressure, millibars
|
---|
15 | ** rh double ambient relative humidity, 0-1
|
---|
16 | ** wl1 double reference wavelength, micrometre (0.4 recommended)
|
---|
17 | ** a1 double refraction coefficient A for wavelength wl1 (radians)
|
---|
18 | ** b1 double refraction coefficient B for wavelength wl1 (radians)
|
---|
19 | ** wl2 double wavelength for which adjusted A,B required
|
---|
20 | **
|
---|
21 | ** Returned:
|
---|
22 | ** *a2 double refraction coefficient A for wavelength wl2 (radians)
|
---|
23 | ** *b2 double refraction coefficient B for wavelength wl2 (radians)
|
---|
24 | **
|
---|
25 | ** Notes:
|
---|
26 | **
|
---|
27 | ** 1 To use this routine, first call slaRefco specifying wl1 as the
|
---|
28 | ** wavelength. This yields refraction coefficients a1,b1, correct
|
---|
29 | ** for that wavelength. Subsequently, calls to slaAtmdsp specifying
|
---|
30 | ** different wavelengths will produce new, slightly adjusted
|
---|
31 | ** refraction coefficients which apply to the specified wavelength.
|
---|
32 | **
|
---|
33 | ** 2 Most of the atmospheric dispersion happens between 0.7 micrometre
|
---|
34 | ** and the UV atmospheric cutoff, and the effect increases strongly
|
---|
35 | ** towards the UV end. For this reason a blue reference wavelength
|
---|
36 | ** is recommended, for example 0.4 micrometres.
|
---|
37 | **
|
---|
38 | ** 3 The accuracy, for this set of conditions:
|
---|
39 | **
|
---|
40 | ** height above sea level 2000 m
|
---|
41 | ** latitude 29 deg
|
---|
42 | ** pressure 793 mB
|
---|
43 | ** temperature 17 degC
|
---|
44 | ** humidity 50%
|
---|
45 | ** lapse rate 0.0065 degC/m
|
---|
46 | ** reference wavelength 0.4 micrometre
|
---|
47 | ** star elevation 15 deg
|
---|
48 | **
|
---|
49 | ** is about 2.5 mas RMS between 0.3 and 1.0 micrometres, and stays
|
---|
50 | ** within 4 mas for the whole range longward of 0.3 micrometres
|
---|
51 | ** (compared with a total dispersion from 0.3 to 20.0 micrometres
|
---|
52 | ** of about 11 arcsec). These errors are typical for ordinary
|
---|
53 | ** conditions and the given elevation; in extreme conditions values
|
---|
54 | ** a few times this size may occur, while at higher elevations the
|
---|
55 | ** errors become much smaller.
|
---|
56 | **
|
---|
57 | ** 4 If either wavelength exceeds 100 micrometres, the radio case
|
---|
58 | ** is assumed and the returned refraction coefficients are the
|
---|
59 | ** same as the given ones.
|
---|
60 | **
|
---|
61 | ** 5 The algorithm consists of calculation of the refractivity of the
|
---|
62 | ** air at the observer for the two wavelengths, using the methods
|
---|
63 | ** of the slaRefro routine, and then scaling of the two refraction
|
---|
64 | ** coefficients according to classical refraction theory. This
|
---|
65 | ** amounts to scaling the A coefficient in proportion to (n-1) and
|
---|
66 | ** the B coefficient almost in the same ratio (see R.M.Green,
|
---|
67 | ** "Spherical Astronomy", Cambridge University Press, 1985).
|
---|
68 | **
|
---|
69 | ** Last revision: 25 June 1996
|
---|
70 | **
|
---|
71 | ** Copyright P.T.Wallace. All rights reserved.
|
---|
72 | */
|
---|
73 | {
|
---|
74 | double tdkok, pmbok, rhok, psat, pwo, w1, wlok, wlsq, w2, dn1, dn2, f;
|
---|
75 |
|
---|
76 |
|
---|
77 | /* Check for radio wavelengths. */
|
---|
78 | if ( wl1 > 100.0 || wl2 > 100.0 ) {
|
---|
79 |
|
---|
80 | /* Radio: no dispersion. */
|
---|
81 | *a2 = a1;
|
---|
82 | *b2 = b1;
|
---|
83 | } else {
|
---|
84 |
|
---|
85 | /* Optical: keep arguments within safe bounds. */
|
---|
86 | tdkok = gmax ( tdk, 100.0 );
|
---|
87 | tdkok = gmin ( tdkok, 500.0 );
|
---|
88 | pmbok = gmax ( pmb, 0.0 );
|
---|
89 | pmbok = gmin ( pmbok, 10000.0 );
|
---|
90 | rhok = gmax ( rh, 0.0 );
|
---|
91 | rhok = gmin ( rhok, 1.0 );
|
---|
92 |
|
---|
93 | /* Atmosphere parameters at the observer. */
|
---|
94 | psat = pow ( 10.0, -8.7115 + 0.03477 * tdkok );
|
---|
95 | pwo = rhok * psat;
|
---|
96 | w1 = 11.2684e-6 * pwo;
|
---|
97 |
|
---|
98 | /* Refractivity at the observer for first wavelength. */
|
---|
99 | wlok = gmax ( wl1, 0.1 );
|
---|
100 | wlsq = wlok * wlok;
|
---|
101 | w2 = 77.5317e-6 + ( 0.43909e-6 + 0.00367e-6 / wlsq ) / wlsq;
|
---|
102 | dn1 = ( w2 * pmbok - w1 ) / tdkok;
|
---|
103 |
|
---|
104 | /* Refractivity at the observer for second wavelength. */
|
---|
105 | wlok = gmax ( wl2, 0.1 );
|
---|
106 | wlsq = wlok * wlok;
|
---|
107 | w2 = 77.5317e-6 + ( 0.43909e-6 + 0.00367e-6 / wlsq ) / wlsq;
|
---|
108 | dn2 = ( w2 * pmbok - w1 ) / tdkok;
|
---|
109 |
|
---|
110 | /* Scale the refraction coefficients (see Green 4.31, p93). */
|
---|
111 | if ( dn1 != 0.0 ) {
|
---|
112 | f = dn2 / dn1;
|
---|
113 | *a2 = a1 * f;
|
---|
114 | *b2 = b1 * f;
|
---|
115 | if ( dn1 != a1 )
|
---|
116 | *b2 = *b2 * ( 1.0 + dn1 * ( dn1 - dn2 ) /
|
---|
117 | ( 2.0 * ( dn1 - a1 ) ) );
|
---|
118 | } else {
|
---|
119 | *a2 = a1;
|
---|
120 | *b2 = b1;
|
---|
121 | }
|
---|
122 | }
|
---|
123 | }
|
---|