SUBROUTINE DDRAD2(KFILDO,CCALL,XP,YP,LTAG,LTAGPT, 1 LNDSEA,XDATA,NSTA,ND1,R,IQUAL, 2 NPASS,NPASRR,LAUGBO,VRAD,IER) C C FEBRUARY 2019 GLAHN MDL C COPIED FROM DDRAD C APRIL 2019 CHANGED NPASR TO NPASRR C C PURPOSE C C TO ADJUST THE LAST PASS RADIUS OF EACH STATION TO 1 C GRIDLENGTH LESS THAN THE DISTANCE TO THE CLOSEST STATION, C BUT NOT LESS THAN 0.8 AND FOR WATER NOT MORE THAN THE C ORIGINAL RADIUS. C C TWO CLOSEST STATIONS ARE FOUND IN CASE THE 2ND C CLOSEST IS NEEDED FOR SOME PURPOSE. C C ADAPTED FROM DDRAD. C C THE SEARCH ALGORITHM IS PATTERNED AFTER CLOS2. C C DATA SET USE C KFILDO - UNIT NUMBER FOR OUTPUT (PRINT) FILE. (OUTPUT) C C VARIABLES C KFILDO = UNIT NUMBER FOR OUTPUT (PRINT) FILE. (INPUT) C CCALL(K) = CALL LETTERS OF STATIONS (K=1,NSTA). C (CHARACTER*8) (INPUT) C XP(J) = X-POSITION OF STATION J ON GRID (J=1,NSTA). C (INPUT) C YP(J) = Y-POSITION OF STATION J ON GRID (J=1,NSTA). C (INPUT) C LTAG(J) = DON'T USE THIS STATION IF LTAG( ) GT 0 C (J=1,NSTA). (INPUT) C LTAGPT(K) = FOR STATION K (K=1NSTA), C 1 = AUGMENTED DATA (FIRST PASS) C 2 = AUGMENTED DATA (2ND PASS) C 3 = BOGUS DATA C 0 = EVERYTHING ELSE C LNDSEA(K) = LAND/SEA INFLUENCE FLAG FOR EACH STATION C (K=1,ND1). C 0 = WILL BE USED FOR ONLY OCEAN WATER (=0) C GRIDPOINTS. C 3 = WILL BE USED FOR ONLY INLAND WATER (=3) C GRIDPOINTS. C 6 = WILL BE USED FOR BOTH INLAND WATER (=3) C AND LAND (=9) GRIDPOINTS. C 9 = WILL BE USED FOR ONLY LAND (=9) GRIDPOINTS. C (INPUT) C XDATA(J) = THE DATUM FOR EACH STATION (J=1,ND1). (INPUT) C NSTA = NUMBER OF STATIONS IN LIST. THIS DOES NOT C INCLUDE ANY TYPE 4 BOGUS. (INPUT) C ND1 = MAXIMUM NUMBER OF STATIONS THAT CAN BE DEALT C WITH. (INPUT) C R(J) = (R(J) J=1,6)= RADIUS READ FROM U405A.CN FILE. C THE DEFAULT RADIUS OF INFLUENCE. (INPUT) C IQUAL(K,I) = THE QUALITY VALUES FROM THE STATION DICTIONARY C FOR FIVE POSSIBLE DATA TYPES (K=1,ND1) (I=1,5). C (INPUT) C NPASS = NUMBER OF ANALYSIS PASSES. (INPUT) C NPASRR = NUMBER OF THE PASS TO START MODIFICATION C OF RADII. (INPUT) C LAUGBO = INDICATOR OF WHICH DATA TO USE IN CALCULATING C RADII. VALUES CORRESPOND TO LATGPT( ). C 0 = USE ONLY BASE DATA C 1 = USE 1ST PASS AUGMENTED DATA C 2 = USE ALL AUGMENTED DATA C 3 = USE ALL DATA, AUGMENTED AND BOGUS C (INPUT) C VRAD(K,J) = ((VRAD(K,J), J=1,6), K=1,NSTA) HOLDS THE C VARIABLE RADII (INPUT) THEN MODIFIED. C (INPUT/OUTPUT) C IER = STATUS RETURN C 0 = GOOD. C SAV1 = DISTANCE SQUARED TO CLOSEST STATION. (INTERNAL) C SAV2 = DISTANCE SQUARED TO 2ND CLOSEST STATION. C (INTERNAL) C DISTSQ = DISTANCE (IN GRID UNITS) SQUARED BETWEEN TWO C STATIONS. (INTERNAL) C CCSTA1(K) = CALL LETTERS OF CLOSEST STATION. (CHARACTER) C (INTERNAL) C CCSTA2(K) = CALL LETTERS OF 2ND CLOSEST STATION. C (CHARACTER) (INTERNAL) C NSTA1(K) = THE NUMBER IN THE LIST OF THE CLOSEST STATION. C (INTERNAL) C NSTA2(K) = THE NUMBER IN THE LIST OF THE 2ND CLOSEST C STATION. (INTERNAL) C 1 2 3 4 5 6 7 X C C NONSYSTEM SUBROUTINES CALLED C NONE. C CHARACTER*8 CCALL(ND1),CCSTA1,CCSTA2 C DIMENSION XP(ND1),YP(ND1),LTAG(ND1),LNDSEA(ND1),XDATA(ND1), 1 LTAGPT(ND1),IQUAL(ND1,5) DIMENSION CCSTA1(ND1),CCSTA2(ND1) C CCSTA1( ) AND CCSTA2( ) ARE AUTOMATIC ARRAYS. DIMENSION NSTA1(ND1),NSTA2(ND1) C NSTA1( ) AND NSTA2( ) ARE AUTOMATIC ARRAYS. DIMENSION VRAD(ND1,6) DIMENSION R(6) C CALL TIMPR(KFILDO,KFILDO,'START DDRAD2 ') C IER=0 C CCCC WRITE(KFILDO,105)NSTA,NPASS,NPASRR,LAUGBO,(R(J),J=1,6) CCCC 105 FORMAT(/' IN DDRAD2--NSTA,NPASS,NPASRR,LAUGBO,', CCCC 1 '(R(J),J=1,6)',4I3,6F6.2) C CCCC DO 1051 K=1,NSTA CCCC WRITE(KFILDO,1050)CCALL(K),(IQUAL(K,J),J=1,5) CCCC 1050 FORMAT(' STATIONS AND QUALITY FLAGS',/, CCCC 1 (5X,A8,5I4)) CCCC 1051 CONTINUE C DO 150 K=1,NSTA 106 NCOUNT=0 C NCOUNT COUNTS THE NUMBER OF SEARCHES PER STATION. C UPDATED IF RADIUS HAS TO BE INCREASED. IF(XDATA(K).GT.9998.5)GO TO 150 C DO NOT USE STATION WITH MISSING DATA. IF(LTAG(K).GT.0)GO TO 150 C DO NOT USE STATION WHEN LTAG( ) > 0. RR=R(1) C RR = SEARCH RADIUS. C TEMPORARY VALUE OF R(1) IN CASE IT NEEDS TO BE INCREASED. RSQ=RR*RR+.01 C THE SMALL CONSTANT IS ADDED TO ASSURE A POINT IS NOT C MISSED BECAUSE OF ROUNDOFF. 110 SAV1=999999. SAV2=999999. CCSTA1(K)=' ' CCSTA2(K)=' ' NSTA1(K)=1 NSTA2(K)=1 C NSTA1( ) AND NSTA2( ) ARE SET TO 1 FOR SAFETY, AS THEY C ARE USED AS INDICES. C 120 DO 140 L=1,NSTA IF(XDATA(L).GT.9998.5)GO TO 140 C DO NOT USE STATION WITH MISSING DATA. IF(LTAG(L).GT.0)GO TO 140 C DO NOT USE STATION WHEN LTAG( ) > 0. IF(ABS(XP(K)-XP(L)).GT.RR)GO TO 140 IF(ABS(YP(K)-YP(L)).GT.RR)GO TO 140 C IN A LONG LIST OF STATIONS, THE ABOVE TWO TESTS SHOULD BE C MORE EFFICIENT THAN ALWAYS CALCULATING THE DISTANCE. C ALSO, THEY SHOULD RULE OUT MORE THAN THE OTHER TESTS. IF(L.EQ.K)GO TO 140 C THIS STATEMENT WON'T SCREEN OUT BUT ONE. C IF(LNDSEA(K).EQ.9.AND.LNDSEA(L).LE.3)GO TO 140 C TYPE 9 USES TYPES 9 AND 6. C IF(LNDSEA(K).EQ.3.AND.LNDSEA(L).NE.3)GO TO 140 C ONLY TYPE 3 IS USED WITH ONLY TYPE 3, NOT TYPE 6. C THIS CHANGE MADE NOON 10/28/13. C (THIS STATEMENT HAD "C" AND WAS REMOVED 11/17/13. THIS WOULD C HAVE HAD THE EFFECT OF USING ALL STATIONS FOR TYPE 3.) C IF(LNDSEA(K).EQ.6.AND.LNDSEA(L).EQ.0)GO TO 140 CCCC IF(LNDSEA(K).EQ.6.AND.(LNDSEA(L).EQ.0.OR.LNDSEA(L).EQ.9))GO TO 140 C THIS CHANGE MADE 11/19/13 C TYPE 6 STATION WILL ACCEPT TYPES 3,6 AND 9. C IF(LNDSEA(K).EQ.0.AND.LNDSEA(L).GT.0)GO TO 140 C TYPE 0 ONLY USES TYPE 0. C C MAKE SURE ONLY STATIONS DESIGNATED BY LAUGBO ARE USED FOR C NEIGHBORS. EACH TYPE OF STATION IS TREATED THE SAME C FOR GETTING A NEIGHBOR. IT IS THE POTENTIAL NEIGHBOR THAT C LAUGBO PERTAINS TO. C IF(LAUGBO.EQ.0)THEN IF(LTAGPT(L).GT.0)GO TO 140 ELSEIF(LAUGBO.EQ.1)THEN IF(LTAGPT(L).GT.1)GO TO 140 ELSEIF(LAUGBO.EQ.2)THEN IF(LTAGPT(L).GT.2)GO TO 140 ENDIF C DISTSQ=(XP(K)-XP(L))**2+(YP(K)-YP(L))**2 C IF(DISTSQ.LT.RSQ)THEN IF(SAV2.LE.DISTSQ)GO TO 140 IF(SAV1.GT.DISTSQ)GO TO 130 SAV2=DISTSQ CCSTA2(K)=CCALL(L) NSTA2(K)=L GO TO 140 C 130 SAV2=SAV1 CCSTA2(K)=CCSTA1(K) NSTA2(K)=NSTA1(K) SAV1=DISTSQ CCSTA1(K)=CCALL(L) NSTA1(K)=L ENDIF C 140 CONTINUE C IF(SAV2.GT.999998.5)THEN C D WRITE(KFILDO,142)CCALL(K) D142 FORMAT(/,' ###CANNOT FIND TWO CLOSEST STATIONS TO =',A8, D 1 ' IN DDRAD2.') NCOUNT=NCOUNT+1 C IF(NCOUNT.LT.5)THEN RR=RR*2 RSQ=RR*RR+.01 C CCCC WRITE(KFILDO,143)RR CCCC 143 FORMAT(' INCREASE RADIUS OF SEARCH TO ',F7.1, CCCC 1 ' GRIDLENGTHS.') C GO TO 110 ELSE WRITE(KFILDO,144) 144 FORMAT(' DO NOT CHANGE RADIUS FOR THIS STATION.') GO TO 150 ENDIF C ELSE DIST1=SQRT(SAV1) DIST2=SQRT(SAV2) ENDIF C M=NPASS C C THE VARIABLE RADIUS IS A FUNCTION OF THE DISTANCE TO C THE CLOSEST STATION. C THIS IS FOR THE LAST PASS. THE STATION WILL NOT AFFECT C THE GRID AT ANY OTHER STATION THAN ITSELF. C IF(LNDSEA(K).EQ.9)THEN VRAD(K,M)=MAX(DIST1-1.,0.8) C BECAUSE 0.8 IS GT 0.707, THE CLOSEST GRIDPONT WILL C ALWAYS BE ADJUSTED. THIS IS A LAND STATION. ELSE VRAD(K,M)=MIN(MAX(DIST1-1.,0.8),VRAD(K,M)) C THIS IS A WATER STATION AND THE RADIUS IS NOT REDUCED C BELOW WHAT IT WAS ORIGINALLY. ENDIF C CCCC IF(CCALL(K).EQ.'PAMO '.OR.CCALL(K).EQ.'PASM ')THEN CCCC WRITE(KFILDO,1450)K,CCALL(K),CCSTA1(K),CCSTA2(K),LNDSEA(K), CCCC 1 DIST1,DIST2, CCCC 1 (VRAD(K,J),J=1,6),LTAGPT(K) CCCC 1450 FORMAT(' AT 1450--K,CCALL(K),CCSTA1(K),CCSTA2(K),LNDSEA(K),', CCCC 1 'DIST1,DIST2,', CCCC 1 '(VRAD(K,J),J=1,6)',I6,2X,A8,2X,A8,2X,A8,I2,8F7.1,I2) CCCC ENDIF C 150 CONTINUE C CCC WRITE(KFILDO,159)(K,CCALL(K),XDATA(K),LTAG(K),LTAGPT(K), CCC 1 (VRAD(K,M),M=1,6),K=1,NSTA) CCC 159 FORMAT(/' AT 159 IN DDRAD2--K,CCALL(K),XDATA(K),LTAG(K),LTAGPT(K),' CCC 1 ,'(VRAD(K,M),M=1,6)',/,(I6,2X,A8,F8.1,2I4,6F8.2)) C CALL TIMPR(KFILDO,KFILDO,'END DDRAD2 ') RETURN END