| 1 | #include "slalib.h"
|
|---|
| 2 | #include "slamac.h"
|
|---|
| 3 | void slaRefv ( double vu[3], double refa, double refb, double vr[3] )
|
|---|
| 4 | /*
|
|---|
| 5 | ** - - - - - - - -
|
|---|
| 6 | ** s l a R e f v
|
|---|
| 7 | ** - - - - - - - -
|
|---|
| 8 | **
|
|---|
| 9 | ** Adjust an unrefracted Cartesian vector to include the effect of
|
|---|
| 10 | ** atmospheric refraction, using the simple A tan z + B tan^3 z
|
|---|
| 11 | ** model.
|
|---|
| 12 | **
|
|---|
| 13 | ** Given:
|
|---|
| 14 | ** vu double unrefracted position of the source (az/el 3-vector)
|
|---|
| 15 | ** refa double A: tan z coefficient (radian)
|
|---|
| 16 | ** refb double B: tan^3 z coefficient (radian)
|
|---|
| 17 | **
|
|---|
| 18 | ** Returned:
|
|---|
| 19 | ** *vr double refracted position of the source (az/el 3-vector)
|
|---|
| 20 | **
|
|---|
| 21 | ** Notes:
|
|---|
| 22 | **
|
|---|
| 23 | ** 1 This routine applies the adjustment for refraction in the
|
|---|
| 24 | ** opposite sense to the usual one - it takes an unrefracted
|
|---|
| 25 | ** (in vacuo) position and produces an observed (refracted)
|
|---|
| 26 | ** position, whereas the A tan Z + B tan^3 Z model strictly
|
|---|
| 27 | ** applies to the case where an observed position is to have the
|
|---|
| 28 | ** refraction removed. The unrefracted to refracted case is
|
|---|
| 29 | ** harder, and requires an inverted form of the text-book
|
|---|
| 30 | ** refraction models; the algorithm used here is equivalent to
|
|---|
| 31 | ** one iteration of the Newton-Raphson method applied to the above
|
|---|
| 32 | ** formula.
|
|---|
| 33 | **
|
|---|
| 34 | ** 2 Though optimized for speed rather than precision, the present
|
|---|
| 35 | ** routine achieves consistency with the refracted-to-unrefracted
|
|---|
| 36 | ** A tan Z + B tan^3 Z model at better than 1 microarcsecond within
|
|---|
| 37 | ** 30 degrees of the zenith and remains within 1 milliarcsecond to
|
|---|
| 38 | ** beyond ZD 70 degrees. The inherent accuracy of the model is, of
|
|---|
| 39 | ** course, far worse than this - see the documentation for slaRefco
|
|---|
| 40 | ** for more information.
|
|---|
| 41 | **
|
|---|
| 42 | ** 3 At low elevations (below about 3 degrees) the refraction
|
|---|
| 43 | ** correction is held back to prevent arithmetic problems and
|
|---|
| 44 | ** wildly wrong results. Over a wide range of observer heights
|
|---|
| 45 | ** and corresponding temperatures and pressures, the following
|
|---|
| 46 | ** levels of accuracy (arcsec) are achieved, relative to numerical
|
|---|
| 47 | ** integration through a model atmosphere:
|
|---|
| 48 | **
|
|---|
| 49 | ** ZD error
|
|---|
| 50 | **
|
|---|
| 51 | ** 80 0.4
|
|---|
| 52 | ** 81 0.8
|
|---|
| 53 | ** 82 1.6
|
|---|
| 54 | ** 83 3
|
|---|
| 55 | ** 84 7
|
|---|
| 56 | ** 85 17
|
|---|
| 57 | ** 86 45
|
|---|
| 58 | ** 87 150
|
|---|
| 59 | ** 88 340
|
|---|
| 60 | ** 89 620
|
|---|
| 61 | ** 90 1100
|
|---|
| 62 | ** 91 1900 } relevant only to
|
|---|
| 63 | ** 92 3200 } high-elevation sites
|
|---|
| 64 | **
|
|---|
| 65 | ** 4 See also the routine slaRefz, which performs the adjustment to
|
|---|
| 66 | ** the zenith distance rather than in Cartesian Az/El coordinates.
|
|---|
| 67 | ** The present routine is faster than slaRefz and, except very low down,
|
|---|
| 68 | ** is equally accurate for all practical purposes. However, beyond
|
|---|
| 69 | ** about ZD 84 degrees slaRefz should be used, and for the utmost
|
|---|
| 70 | ** accuracy iterative use of slaRefro should be considered.
|
|---|
| 71 | **
|
|---|
| 72 | ** Last revision: 4 June 1997
|
|---|
| 73 | **
|
|---|
| 74 | ** Copyright P.T.Wallace. All rights reserved.
|
|---|
| 75 | */
|
|---|
| 76 | {
|
|---|
| 77 | double x, y, z1, z, zsq, rsq, r, wb, wt, d, cd, f;
|
|---|
| 78 |
|
|---|
| 79 | /* Initial estimate = unrefracted vector */
|
|---|
| 80 | x = vu[0];
|
|---|
| 81 | y = vu[1];
|
|---|
| 82 | z1 = vu[2];
|
|---|
| 83 |
|
|---|
| 84 | /* Keep correction approximately constant below about 3 deg elevation */
|
|---|
| 85 | z = gmax ( z1, 0.05 );
|
|---|
| 86 |
|
|---|
| 87 | /* One Newton-Raphson iteration */
|
|---|
| 88 | zsq = z * z;
|
|---|
| 89 | rsq = x * x + y * y;
|
|---|
| 90 | r = sqrt ( rsq );
|
|---|
| 91 | wb = refb * rsq / zsq;
|
|---|
| 92 | wt = ( refa + wb ) / ( 1.0 + ( refa + 3.0 * wb ) * ( zsq + rsq ) / zsq );
|
|---|
| 93 | d = wt * r / z;
|
|---|
| 94 | cd = 1.0 - d * d / 2.0;
|
|---|
| 95 | f = cd * ( 1.0 - wt );
|
|---|
| 96 |
|
|---|
| 97 | /* Post-refraction x,y,z */
|
|---|
| 98 | vr[0] = x * f;
|
|---|
| 99 | vr[1] = y * f;
|
|---|
| 100 | vr[2] = cd * ( z + d * r ) + ( z1 - z );
|
|---|
| 101 | }
|
|---|