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