C $Id: gdran.f 3304 2011-01-17 15:25:59Z brideout $ C DOUBLE PRECISION FUNCTION GDRAN(SR,SLATGC,SLON,AZ,EL,ALT) C C GDRAN uses a half-interval (binary) search technique to determine C the geodetic range to a point of observation given in terms of C azimuth, elevation, and geodetic altitude. C C Input: C SR - radial distance of station from center of earth C SLATGC - station geocentric latitude C SLON - station longitude C AZ - radar azimuth C EL - radar elevation C ALT - geodetic altitude C C harris fortran 77 C rgm - 8/85 C C .. Scalar Arguments .. DOUBLE PRECISION ALT,AZ,EL,SLATGC,SLON,SR C .. C .. Local Scalars .. DOUBLE PRECISION ALT1,ALT2,GCLAT,GDALT,GDLAT,GLONG,PR,R1,R2,RFRST, * TINTER C .. C .. External Functions .. DOUBLE PRECISION RFUN EXTERNAL RFUN C .. C .. External Subroutines .. EXTERNAL CONVRT,POINT C .. C .. Intrinsic Functions .. INTRINSIC ABS,SIGN C .. C C determine two ranges which bound the actual range. the first C range is obtained by making a spherical earth range calculation C using the supplied station radius. this range will be on one C side or the other of the actual range and will be added to or C subtracted from to determine the second range until the second C range is on the opposite side of the actual range as the first C range (whew!). C R1 = RFUN(SR,EL,ALT) R2 = R1 CALL POINT(SR,SLATGC,SLON,AZ,EL,R2,PR,GCLAT,GLONG) CALL CONVRT(2,GDLAT,ALT1,GCLAT,PR) 10 CONTINUE R2 = R2 + SIGN(1.D0,ALT-ALT1) CALL POINT(SR,SLATGC,SLON,AZ,EL,R2,PR,GCLAT,GLONG) CALL CONVRT(2,GDLAT,ALT2,GCLAT,PR) IF (SIGN(1.D0,ALT-ALT1).EQ.SIGN(1.D0,ALT-ALT2)) GO TO 10 C C use the center of the range boundary as a first guess. the C half-interval is initially 1/4 of the total range boundary. C RFRST = (R1+R2)/2.D0 TINTER = ABS(R2-R1)/4.D0 C C add to or subtract from the current range guess the current C half-interval, halving the half-interval on each iteration until C the actual range is approached to within a tolerance of .01 km. C 20 CONTINUE CALL POINT(SR,SLATGC,SLON,AZ,EL,RFRST,PR,GCLAT,GLONG) CALL CONVRT(2,GDLAT,GDALT,GCLAT,PR) RFRST = RFRST + SIGN(TINTER,ALT-GDALT) TINTER = TINTER/2.D0 IF (ABS(GDALT-ALT).GE.1.D-2) GO TO 20 GDRAN = RFRST RETURN END