SUBROUTINE PIX1(KFILDO,DATA,TELEV,HOLD,NX,NY,MTIMES,DIFFV, 1 DIFFA,LVRBL,IER) C C JUNE 2015 GLAHN MDL MOS-2000 C COPIED FROM PIX IN U201LIB C JUNE 2015 GLAHN CHANGED ITALBE(ICAT,1) FROM C 120.5 TO 119.5 C JUNE 2015 GLAHN ALTERNATED DIRECTION OVER ROWS AND C COLUMNS C JUNE 2015 GLAHN ADDITIONAL ACHECKING ON ELEVATION C DIFFERENCE C JUNE 2015 GLAHN CHANGED 121 TO 123 TO GET WHITE C FOR ABOVE 12,000 FT C JULY 2015 GLAHN MINOR CORRECTIONS TO TABLE( , ) C FOR CEILING C JULY 2015 GLAHN CORRECTIONS TO TABLE( , ) FOR C VISIBILITY TO AGREE WITH ON TABLE 3 C AND TABLE( , ) IN MELD; TABLE( , ) C VALUE FOR CEILING 50.5 CHANGED TO C 49.5 C JANUARY 2016 HUANG COMMENTED OUT DO LOOP 145 WHOSE C BODY WAS COMMENTED OUT, AND THE C ASSOCIATED IF/ENDIF STATEMENT; C ALSO COMMENTED OUT THE IF/ENDIF C FOLLOWS DO LOOP 155, WHOSE BODY C WAS COMMENTED OUT C JULY 2016 SCHNAPP CHANGED 123 TO 888 IN ACCORDANCE WITH C STANDARDS FOR CIG > 12,000 FT C NOVEMBER 2018 HUANG CHANGED MAXIMUM VISIBILITY FROM C 10.01 to 10.08 FOR IMAGE PRODUCTION C PURPOSES. C C PURPOSE C TO REMOVE ISOLATED PIXELS (SPOTS LE 7 IN SIZE) FROM A C GRID. THE FIRST PORTION IS PIX AND TREATS SPOTS C INVOLVING 5 GRIDPOINTS. THIS ROUTINE THEN TREATS C 7 GRIDPOINTS COVERING 6 GRIDLENGTHS (15 KM AT 2.5 KM). C C DATA SET USE C KFILDO - DEFAULT UNIT NUMBER FOR OUTPUT (PRINT) FILE. C (OUTPUT) C C VARIABLES C KFILDO = DEFAULT UNIT NUMBER FOR OUTPUT (PRINT) FILE. C (INPUT) C DATA(IX,JY) = ARRAY TO OPERATE ON AND RETURN (IX=1,NX) C (JY=1,NY). (INPUT/OUTPUT) C TELEV(IX,JY) = GRIDPOINT ELEVATIONS ARRAY (IX=1,NY) (JY=1,NY). C (INTERNAL) C HOLD(IX,JY) = WORK ARRAY (IX=1,NX) (JY=1,NY). (INTERNAL) C NX,NY = DIMENSIONS IN X AND Y DIRECTIONS OF DATA( , ), C TELEV( , ), AND HOLD( , ). (INPUT) C MTIMES = NUMBER OF PASSES OVER THE DATA TO MAKE. C MTIMES SHOULD BE EVENLY DIVISIBLE BY 4 FOR C SYMMETRY. (INPUT) C DIFFV = REMOVAL IS DONE WHEN TWO END POINTS DIFFER BY C LT DIFFV. (INPUT) (ACTUALLY NOT USED) C DIFFA = THE ELEVATION DIFFERENCE IF EXCEEDED, REMOVAL C IS NOT DONE. (INPUT) C LVRBL = 1 FOR CEILING, C = 2 FOR VISIBILITY C (INPUT) C IER = STATUS RETURN. C 0 = GOOD RETURN. C (OUTPUT) C NCAT = THE NUMBER OF CATEGORIES OF THE VARIABLE BEING C PROCESSED. (INTERNAL) C INDEX1(IX,JY) = A GRID OF CATEGORIES (IX=1,NX) (JY=1,NY). C (INTERNAL) C INDEX2(IX,JY) = A GRID OF CATEGORIES (IX=1,NX) (JY=1,NY). C SAVES THE VALUES OF INDEX1( , ) WHILE CHANGES C ARE BEING MADE. (INTERNAL) C 1 2 3 4 5 6 7 X C C NONSYSTEM SUBROUTINES USED C NONE c PARAMETER (ICAT=24) C DIMENSION DATA(NX,NY),TELEV(NX,NY),HOLD(NX,NY) DIMENSION INDEX1(NX,NY),INDEX2(NX,NY) C INDEX1( , ) AND INDEX2( , ) ARE AUTOMATIC ARRAYS. DIMENSION TABLE(ICAT+1,2),SABLE(ICAT+1,2),NCAT(2) C DATA TABLE/.0095, 1.5, 2.5, 3.5, 4.5, 5.5, 6.5, 7.5, 1 8.5, 9.5, 11.5, 14.5, 16.5, 19.5, 24.5, 30.5, 2 40.5, 49.5, 65.5, 80.5, 90.5, 100.5, 110.5, 120.5, 3 .0, C 1 .005, .245, .495, .745, .995, 1.495, 1.995, 2.495, 2 2.995, 3.005, 4.005, 5.005, 6.005, 7.005, 8.005, 9.995, 3 0, 0, 0, 0, 0, 0, 0, 0, 4 0/ C DATA SABLE/ 0., 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 1 8.0, 9.0, 11.0, 13., 15.0, 18.0, 22.0, 27.0, 2 35.0, 45.0, 58.0, 73., 85.0, 95.0, 110.0, 120.0, 3 123.0, C 1 0.0, .125, .25, .50, .75, 1.12, 1.62, 2.0, 2 2.5, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 3 10.08, 0., 0., 0., 0., 0., 0., 0., 4 0/ C CCCC DATA SABLE/24*0, 0, CCCC 1 0., .125, .25, .5, .75, 1.12, 1.62, 2., CCCC 2 2.5, 3.0, 4.0, 5., 6., 7., 8., 9., CCCC 3 0, 0., 0., 0., 0., 0., 0., 0./ DATA NCAT/24,16/ C 24 CATEGORIES FOR CEILING AND 16 FOR VISIBILITY. DATA KCOUNT/0/ C KCOUNT ALLOWS ONE MATRIX OF VALUES TO BE PRINTED C FOR EACH ITERATION THE FIRST TIME PIX1 IS ENTERED. SAVE KCOUNT,ICOUNT,JCOUNT C IER=0 CALL TIMPR(KFILDO,KFILDO,'START PIX1 ') C WRITE(KFILDO,101)NX,NY,MTIMES,DIFFV,DIFFA,LVRBL 101 FORMAT(/' IN PIX1 AT 101--NX,NY,MTIMES,DIFFV,DIFFA,LVRBL', 1 3I6,2F10.2,I3) C C PUT VALUES IN DATA IN DISCRETE CATEGORIES. THESE CATEGORIES C ARE EXACTLY THOSE USED IN THE MELD, COORDINATED WITH THE C U602 DEVELOPMENT. VALUES IN TABLE( , ) ARE THOSE IN U602 C PREDICTOR LIST; VALUES IN SABLE( , ) ARE THOSE IN MELD, C MODIFIED TO GET A COLOR TABLE MATCH FOR CHECKOUT. C DO 108 JY=1,NY DO 107 IX=1,NX C DO 105 L=1,NCAT(LVRBL) C CCCC WRITE(KFILDO,104)L,IX,JY,DATA(IX,JY),TABLE(L,LVRBL), CCCC 1 SABLE(L,LVRBL) CCCC 104 FORMAT(' PIX1--L,IX,JY,DATA(IX,JY),TABLE(L,LVRBL),', CCCC 1 'SABLE(L,LVRBL)',3I6,3F10.3) C IF(DATA(IX,JY).LT.TABLE(L,LVRBL))THEN DATA(IX,JY)=SABLE(L,LVRBL) INDEX1(IX,JY)=L C CCCCC WRITE(KFILDO,104)L,IX,JY,DATA(IX,JY),TABLE(L,LVRBL), CCCCC 1 SABLE(L,LVRBL) C GO TO 107 ENDIF C 105 CONTINUE C IF(DATA(IX,JY).LT.9998.)THEN DATA(IX,JY)=SABLE(NCAT(LVRBL)+1,LVRBL) INDEX1(IX,JY)=NCAT(LVRBL)+1 C THIS IS FOR WHEN NO THRESHOLD IS TRIPPED. ELSE INDEX1(IX,JY)=9999 ENDIF C CCCCC WRITE(KFILDO,106)IX,JY,DATA(IX,JY) CCCCC 106 FORMAT(' PIX1--IX,JY,DATA(IX,JY)',2I6,F10.3) C 107 CONTINUE 108 CONTINUE C DO THE REMOVAL. C 109 DO 380 L=1,MTIMES C CCCC WRITE(KFILDO,110)L,MTIMES,DIFFV,DIFFA CCCC 110 FORMAT(/' PASS',I4,' OF',I4,' IN PIX1, DIFFV =',F10.2, CCCC 1 ' DIFFA =',F10.2) C DO 120 JY=1,NY DO 119 IX=1,NX HOLD(IX,JY)=DATA(IX,JY) INDEX2(IX,JY)=INDEX1(IX,JY) 119 CONTINUE 120 CONTINUE C C ELIMINATE SPOTS NO LARGER THAN 3 PIXELS ACROSS. MUCH C CHATTER IS INTRODUCED BY HRRR WHICH IS NOT FORECASTABLE. C THIS REMOVAL IS NOT EXACT NOR COMPLETE, BUT DOES AN C ACCEPTABLE JOB. C C INITIALIZE ICOUNT AND JCOUNT ONLY ON THE FIRST ENTRY C TO PIX1. C IF(KCOUNT.EQ.0)THEN ICOUNT=0 JCOUNT=0 ENDIF C C ARRANGE TO REVERSE MARCHING THROUGH ROWS AND COLUMNS C EVERY 2ND TIME L. MTIMES SHOULD BE BE EVENLY DIVISIBLE C BY 4 FOR COMPLETE SYMMETRY. C IF(MOD((L+1)/2,2).EQ.0)THEN J1=3 J2=NY-2 J3=1 I1=3 I2=NX-2 I3=1 ELSE J1=NY-2 J2=3 J3=-1 I1=NX-2 I2=3 I3=-1 ENDIF DO 200 JY=J1,J2,J3 DO 199 IX=I1,I2,I3 C IF(DATA(IX,JY).LT.9998.)THEN C THIS IS A NON MISSING POINT. C IF(MOD(L,2).NE.0)THEN C ON ODD ITERATIONS, WORK ON EAST-WEST ELIMINATION. C CCCC IF(ICOUNT.EQ.0)THEN CCCC WRITE(KFILDO,139)L CCCC 139 FORMAT(/' START OF ITERATION ',I3,' IN PIX1.') C CCCC DO 145 JYY=40,59 CCCCC WRITE(KFILDO,140)(DATA(IXX,JYY),IXX=25,65), CCCCC 1 (INDEX1(IXX,JYY),IXX=25,65) CCCCC 140 FORMAT(/(41F5.1/41I5)) C CCCC WRITE(KFILDO,141)(INDEX1(IXX,JYY),IXX=25,65) CCCC 141 FORMAT(/60I4) CCCC 145 CONTINUE C CCCC ENDIF C ICOUNT=1 C IF(INDEX1(IX-2,JY).EQ.INDEX1(IX+2,JY))THEN C THIS WILL SMOOTH ONLY WHEN THE END POINTS ARE C OF THE SAME CATEGORY. C IF(ABS(TELEV(IX-2,JY)-TELEV(IX+2,JY)).LT.DIFFA)THEN C THE ELEVATION DISTANCE BETWEEN THE END POINTS C IS LT DIFFA METERS. C IF((ABS(TELEV(IX-2,JY)-TELEV(IX,JY)) .LT.DIFFA).AND. 1 (ABS(TELEV(IX-2,JY)-TELEV(IX-1,JY)).LT.DIFFA).AND. 2 (ABS(TELEV(IX+2,JY)-TELEV(IX,JY)) .LT.DIFFA).AND. 3 (ABS(TELEV(IX+2,JY)-TELEV(IX+1,JY)).LT.DIFFA))THEN C EACH END POINT DIFFERS FROM THE TWO CLOSEST C POINTS TO IT BY LT DIFFA M IN ELEVATION. C IF(INDEX1(IX-2,JY).NE.9999.AND. 1 INDEX1(IX+2,JY).NE.9999)THEN C BOTH END POINTS HAVE THE SAME VALUE AND C ARE NOT MISSING. HOLD(IX,JY)=DATA(IX-2,JY) HOLD(IX-1,JY)=DATA(IX-2,JY) HOLD(IX+1,JY)=DATA(IX-2,JY) INDEX2(IX,JY)=INDEX1(IX-2,JY) INDEX2(IX-1,JY)=INDEX1(IX-2,JY) INDEX2(IX+1,JY)=INDEX1(IX+2,JY) C ENDIF C ENDIF C ENDIF C ELSEIF(INDEX1(IX-2,JY).GT.INDEX1(IX+2,JY))THEN C IF(ABS(TELEV(IX-2,JY)-TELEV(IX+2,JY)).LT.DIFFA)THEN C THE ELEVATION DISTANCE BETWEEN THE END POINTS C IS LT DIFFA M. C IF((ABS(TELEV(IX-2,JY)-TELEV(IX,JY)) .LT.DIFFA).AND. 1 (ABS(TELEV(IX-2,JY)-TELEV(IX-1,JY)).LT.DIFFA).AND. 2 (ABS(TELEV(IX+2,JY)-TELEV(IX,JY)) .LT.DIFFA).AND. 3 (ABS(TELEV(IX+2,JY)-TELEV(IX+1,JY)).LT.DIFFA))THEN C EACH END POINT DIFFERS FROM THE TWO CLOSEST C POINTS TO IT BY LT DIFFA M IN ELEVATION. C IF(INDEX1(IX-2,JY).NE.9999.AND. 1 INDEX1(IX+2,JY).NE.9999)THEN C IF(INDEX1(IX-1,JY).GT.INDEX1(IX-2,JY))THEN INDEX2(IX-1,JY)=INDEX1(IX-2,JY) HOLD(IX-1,JY)=DATA(IX-2,JY) ELSEIF(INDEX1(IX-1,JY).LT.INDEX1(IX+2,JY))THEN INDEX2(IX-1,JY)=INDEX1(IX+2,JY) HOLD(IX-1,JY)=DATA(IX+2,JY) ENDIF C IF(INDEX1(IX,JY).LT.INDEX1(IX+2,JY))THEN INDEX2(IX,JY)=INDEX1(IX+2,JY) HOLD(IX,JY)=DATA(IX+2,JY) ELSEIF(INDEX1(IX,JY).GT.INDEX1(IX-2,JY))THEN INDEX2(IX,JY)=INDEX1(IX-2,JY) HOLD(IX,JY)=DATA(IX-2,JY) ENDIF C IF(INDEX1(IX+1,JY).GT.INDEX1(IX-2,JY))THEN INDEX2(IX+1,JY)=INDEX1(IX-2,JY) HOLD(IX+1,JY)=DATA(IX-2,JY) ELSEIF(INDEX1(IX+1,JY).LT.INDEX1(IX+2,JY))THEN INDEX2(IX+1,JY)=INDEX1(IX+2,JY) HOLD(IX+1,JY)=DATA(IX+2,JY) ENDIF C ENDIF C ENDIF C ENDIF C ELSEIF(INDEX1(IX-2,JY).LT.INDEX1(IX+2,JY))THEN C IF(ABS(TELEV(IX-2,JY)-TELEV(IX+2,JY)).LT.DIFFA)THEN C THE ELEVATION DISTANCE BETWEEN THE END POINTS C IS LT DIFFA M. C IF((ABS(TELEV(IX-2,JY)-TELEV(IX,JY)) .LT.DIFFA).AND. 1 (ABS(TELEV(IX-2,JY)-TELEV(IX-1,JY)).LT.DIFFA).AND. 2 (ABS(TELEV(IX+2,JY)-TELEV(IX,JY)) .LT.DIFFA).AND. 3 (ABS(TELEV(IX+2,JY)-TELEV(IX+1,JY)).LT.DIFFA))THEN C EACH END POINT DIFFERS FROM THE TWO CLOSEST C POINTS TO IT BY LT DIFFA M IN ELEVATION. C IF(INDEX1(IX-2,JY).NE.9999.AND. 1 INDEX1(IX+2,JY).NE.9999)THEN C IF(INDEX1(IX-1,JY).LT.INDEX1(IX-2,JY))THEN INDEX2(IX-1,JY)=INDEX1(IX-2,JY) HOLD(IX-1,JY)=DATA(IX-2,JY) ELSEIF(INDEX1(IX-1,JY).GT.INDEX1(IX+2,JY))THEN INDEX2(IX-1,JY)=INDEX1(IX+2,JY) HOLD(IX-1,JY)=DATA(IX+2,JY) ENDIF C IF(INDEX1(IX,JY).LT.INDEX1(IX-2,JY))THEN INDEX2(IX,JY)=INDEX1(IX-2,JY) HOLD(IX,JY)=DATA(IX-2,JY) ELSEIF(INDEX1(IX,JY).GT.INDEX1(IX+2,JY))THEN INDEX2(IX,JY)=INDEX1(IX+2,JY) HOLD(IX,JY)=DATA(IX+2,JY) ENDIF C IF(INDEX1(IX+1,JY).GT.INDEX1(IX+2,JY))THEN INDEX2(IX+1,JY)=INDEX1(IX+2,JY) HOLD(IX+1,JY)=DATA(IX+2,JY) ELSEIF(INDEX1(IX+1,JY).LT.INDEX1(IX-2,JY))THEN INDEX2(IX+1,JY)=INDEX1(IX-2,JY) HOLD(IX+1,JY)=DATA(IX-2,JY) ENDIF C ENDIF C ENDIF C ENDIF C ENDIF C ELSE C ON EVEN ITERATIONS, WORK ON NORTH=SOUTH ELIMINATION. C CCCC IF(JCOUNT.EQ.0)THEN CCCC WRITE(KFILDO,139)L C CCCC DO 155 JYY=40,59 CCCC WRITE(KFILDO,140)(DATA(IXX,JYY),IXX=25,65), CCCC 1 (INDEX1(IXX,JYY),IXX=25,65) CCCC WRITE(KFILDO,141)(INDEX1(IXX,JYY),IXX=25,65) C CCCC 155 CONTINUE C CCCC ENDIF C JCOUNT=1 C IF(INDEX1(IX,JY-2).EQ.INDEX1(IX,JY+2))THEN C THIS WILL SMOOTH ONLY WHEN THE END POINTS ARE C OF THE SAME CATEGORY. C IF(ABS(TELEV(IX,JY-2)-TELEV(IX,JY+2)).LT.DIFFA)THEN C THE ELEVATION DISTANCE BETWEEN THE END POINTS C IS LT DIFFA METERS. C IF((ABS(TELEV(IX,JY-2)-TELEV(IX,JY)) .LT.DIFFA).AND. 1 (ABS(TELEV(IX,JY-2)-TELEV(IX,JY-1)).LT.DIFFA).AND. 2 (ABS(TELEV(IX,JY+2)-TELEV(IX,JY)) .LT.DIFFA).AND. 3 (ABS(TELEV(IX,JY+2)-TELEV(IX,JY+1)).LT.DIFFA))THEN C EACH END POINT DIFFERS FROM THE TWO CLOSEST C POINTS TO IT BY LT DIFFA M IN ELEVATION. C IF(INDEX1(IX,JY-2).NE.9999.AND. 1 INDEX1(IX,JY+2).NE.9999)THEN C BOTH END POINTS HAVE THE SAME VALUE AND C ARE NOT MISSING. HOLD(IX,JY)=DATA(IX,JY-2) HOLD(IX,JY-1)=DATA(IX,JY-2) HOLD(IX,JY+1)=DATA(IX,JY-2) INDEX2(IX,JY)=INDEX1(IX,JY-2) INDEX2(IX,JY-1)=INDEX1(IX,JY-2) INDEX2(IX,JY+1)=INDEX1(IX,JY-2) C ENDIF C ENDIF C ENDIF C ELSEIF(INDEX1(IX,JY-2).GT.INDEX1(IX,JY+2))THEN C IF(ABS(TELEV(IX,JY-2)-TELEV(IX,JY+2)).LT.DIFFA)THEN C THE ELEVATION DISTANCE BETWEEN THE END POINTS C IS LT DIFFA M. C IF((ABS(TELEV(IX,JY-2)-TELEV(IX,JY)) .LT.DIFFA).AND. 1 (ABS(TELEV(IX,JY-2)-TELEV(IX,JY-1)).LT.DIFFA).AND. 2 (ABS(TELEV(IX,JY+2)-TELEV(IX,JY)) .LT.DIFFA).AND. 3 (ABS(TELEV(IX,JY+2)-TELEV(IX,JY+1)).LT.DIFFA))THEN C EACH END POINT DIFFERS FROM THE TWO CLOSEST C POINTS TO IT BY LT DIFFA M IN ELEVATION. C IF(INDEX1(IX,JY-2).NE.9999.AND. 1 INDEX1(IX,JY+2).NE.9999)THEN C CCC IF(L.EQ.MTIMES)THEN CCC WRITE(KFILDO,188)IX,JY, CCC 1 INDEX1(IX,JY-2),INDEX1(IX,JY-1), CCC 2 INDEX1(IX,JY),INDEX1(IX,JY+1), CCC 3 INDEX1(IX,JY+2) CCC 188 FORMAT('AT 188',2I7,5I5) CCC ENDIF C IF(INDEX1(IX,JY-1).GT.INDEX1(IX,JY-2))THEN INDEX2(IX,JY-1)=INDEX1(IX,JY-2) HOLD(IX,JY-1)=DATA(IX,JY-2) ELSEIF(INDEX1(IX,JY-1).LT.INDEX1(IX,JY+2))THEN INDEX2(IX,JY-1)=INDEX1(IX,JY+2) HOLD(IX,JY-1)=DATA(IX,JY+2) ENDIF C IF(INDEX1(IX,JY).LT.INDEX1(IX,JY+2))THEN INDEX2(IX,JY)=INDEX1(IX,JY+2) HOLD(IX,JY)=DATA(IX,JY+2) ELSEIF(INDEX1(IX,JY).GT.INDEX1(IX,JY-2))THEN INDEX2(IX,JY)=INDEX1(IX,JY-2) HOLD(IX,JY)=DATA(IX,JY-2) ENDIF C IF(INDEX1(IX,JY+1).GT.INDEX1(IX,JY-2))THEN INDEX2(IX,JY+1)=INDEX1(IX,JY-2) HOLD(IX,JY+1)=DATA(IX,JY-2) ELSEIF(INDEX1(IX,JY+1).LT.INDEX1(IX,JY+2))THEN INDEX2(IX,JY+1)=INDEX1(IX,JY+2) HOLD(IX,JY+1)=DATA(IX,JY+2) ENDIF C ENDIF C ENDIF C ENDIF C ELSEIF(INDEX1(IX,JY-2).LT.INDEX1(IX,JY+2))THEN C IF(ABS(TELEV(IX,JY-2)-TELEV(IX,JY+2)).LT.DIFFA)THEN C THE ELEVATION DISTANCE BETWEEN THE END POINTS C IS LT DIFFA M. C IF((ABS(TELEV(IX,JY-2)-TELEV(IX,JY)) .LT.DIFFA).AND. 1 (ABS(TELEV(IX,JY-2)-TELEV(IX,JY-1)).LT.DIFFA).AND. 2 (ABS(TELEV(IX,JY+2)-TELEV(IX,JY)) .LT.DIFFA).AND. 3 (ABS(TELEV(IX,JY+2)-TELEV(IX,JY+1)).LT.DIFFA))THEN C EACH END POINT DIFFERS FROM THE TWO CLOSEST C POINTS TO IT BY LT DIFFA M IN ELEVATION. C IF(INDEX1(IX,JY-2).NE.9999.AND. 1 INDEX1(IX,JY+2).NE.9999)THEN C IF(INDEX1(IX,JY-1).LT.INDEX1(IX,JY-2))THEN INDEX2(IX,JY-1)=INDEX1(IX,JY-2) HOLD(IX,JY-1)=DATA(IX,JY-2) ELSEIF(INDEX1(IX,JY-1).GT.INDEX1(IX,JY+2))THEN INDEX2(IX,JY-1)=INDEX1(IX,JY+2) HOLD(IX,JY-1)=DATA(IX,JY+2) ENDIF C IF(INDEX1(IX,JY).LT.INDEX1(IX,JY-2))THEN INDEX2(IX,JY)=INDEX1(IX,JY-2) HOLD(IX,JY)=DATA(IX,JY-2) ELSEIF(INDEX1(IX,JY).GT.INDEX1(IX,JY+2))THEN INDEX2(IX,JY)=INDEX1(IX,JY+2) HOLD(IX,JY)=DATA(IX,JY+2) ENDIF C IF(INDEX1(IX,JY+1).GT.INDEX1(IX,JY+2))THEN INDEX2(IX,JY+1)=INDEX1(IX,JY+2) HOLD(IX,JY+1)=DATA(IX,JY+2) ELSEIF(INDEX1(IX,JY+1).LT.INDEX1(IX,JY-2))THEN INDEX2(IX,JY+1)=INDEX1(IX,JY-2) HOLD(IX,JY+1)=DATA(IX,JY-2) ENDIF C ENDIF C ENDIF C ENDIF C ENDIF C ENDIF C ENDIF C 199 CONTINUE 200 CONTINUE C C THE ABOVE HAS DEALT WITH 5-GRIDPOINT SPOTS. THE BELOW C DEALS WITH 7-GRIDPOINT SPOTS, BUT ONLY WHEN THE TWO C END POINTS ARE THE SAME. C C ARRANGE TO REVERSE MARCHING THROUGH ROWS AND COLUMNS C EVERY 2ND TIME L. MTIMES SHOULD BE BE EVENLY DIVISIBLE C BY 4 FOR COMPLETE SYMMETRY. C IF(MOD((L+1)/2,2).EQ.0)THEN J1=4 J2=NY-3 J3=1 I1=4 I2=NX-3 I3=1 ELSE J1=NY-3 J2=4 J3=-1 I1=NX-3 I2=4 I3=-1 ENDIF DO 300 JY=J1,J2,J3 DO 299 IX=I1,I2,I3 C IF(DATA(IX,JY).LT.9998.)THEN C THIS IS A NON MISSING POINT. C IF(MOD(L,2).NE.0)THEN C ON ODD ITERATIONS, WORK ON EAST-WEST ELIMINATION. C IF(INDEX1(IX-3,JY).EQ.INDEX1(IX+3,JY))THEN C THIS WILL SMOOTH ONLY WHEN THE END POINTS ARE C OF THE SAME CATEGORY. C IF(ABS(TELEV(IX-3,JY)-TELEV(IX+3,JY)).LT.DIFFA)THEN C THE ELEVATION DISTANCE BETWEEN THE END POINTS C IS LT DIFFA METERS. C IF((ABS(TELEV(IX-3,JY)-TELEV(IX,JY)) .LT.DIFFA).AND. 1 (ABS(TELEV(IX-3,JY)-TELEV(IX-2,JY)).LT.DIFFA).AND. 2 (ABS(TELEV(IX-3,JY)-TELEV(IX-1,JY)).LT.DIFFA).AND. 3 (ABS(TELEV(IX+3,JY)-TELEV(IX,JY)) .LT.DIFFA).AND. 4 (ABS(TELEV(IX+3,JY)-TELEV(IX+2,JY)).LT.DIFFA).AND. 5 (ABS(TELEV(IX+3,JY)-TELEV(IX+1,JY)).LT.DIFFA))THEN C EACH END POINT DIFFERS FROM THE MIDDLE POINT AND C EACH POINT BETWEEN BY LT DIFFA. C IF(INDEX1(IX-3,JY).NE.9999.AND. 1 INDEX1(IX+3,JY).NE.9999)THEN C BOTH END POINTS HAVE THE SAME VALUE AND C ARE NOT MISSING. HOLD(IX,JY)=DATA(IX-3,JY) HOLD(IX-2,JY)=DATA(IX-3,JY) HOLD(IX-1,JY)=DATA(IX-3,JY) HOLD(IX+1,JY)=DATA(IX-3,JY) HOLD(IX+2,JY)=DATA(IX-3,JY) INDEX2(IX,JY)=INDEX1(IX-3,JY) INDEX2(IX-2,JY)=INDEX1(IX-3,JY) INDEX2(IX-1,JY)=INDEX1(IX-3,JY) INDEX2(IX+1,JY)=INDEX1(IX+3,JY) INDEX2(IX+2,JY)=INDEX1(IX+3,JY) C ENDIF C ENDIF C ENDIF C ENDIF C ELSE C IF(INDEX1(IX,JY-3).EQ.INDEX1(IX,JY+3))THEN C THIS WILL SMOOTH ONLY WHEN THE END POINTS ARE C OF THE SAME CATEGORY. C IF(ABS(TELEV(IX,JY-3)-TELEV(IX,JY+3)).LT.DIFFA)THEN C THE ELEVATION DISTANCE BETWEEN THE END POINTS C IS LT DIFFA METERS. C IF((ABS(TELEV(IX,JY-3)-TELEV(IX,JY)) .LT.DIFFA).AND. 1 (ABS(TELEV(IX,JY-3)-TELEV(IX,JY-2)).LT.DIFFA).AND. 2 (ABS(TELEV(IX,JY-3)-TELEV(IX,JY-1)).LT.DIFFA).AND. 3 (ABS(TELEV(IX,JY+3)-TELEV(IX,JY)) .LT.DIFFA).AND. 4 (ABS(TELEV(IX,JY+3)-TELEV(IX,JY+2)).LT.DIFFA).AND. 5 (ABS(TELEV(IX,JY+3)-TELEV(IX,JY+1)).LT.DIFFA))THEN C EACH END POINT DIFFERS FROM THE MIDDLE POINT AND C EACH POINT BETWEEN BY LT DIFFA. C IF(INDEX1(IX,JY-3).NE.9999.AND. 1 INDEX1(IX,JY+3).NE.9999)THEN C BOTH END POINTS HAVE THE SAME VALUE AND C ARE NOT MISSING. HOLD(IX,JY)=DATA(IX,JY-3) HOLD(IX,JY-2)=DATA(IX,JY-3) HOLD(IX,JY-1)=DATA(IX,JY-3) HOLD(IX,JY+1)=DATA(IX,JY-3) HOLD(IX,JY+2)=DATA(IX,JY-3) INDEX2(IX,JY)=INDEX1(IX,JY-3) INDEX2(IX,JY-2)=INDEX1(IX,JY-3) INDEX2(IX,JY-1)=INDEX1(IX,JY-3) INDEX2(IX,JY+1)=INDEX1(IX,JY-3) INDEX2(IX,JY+2)=INDEX1(IX,JY-3) C ENDIF C ENDIF C ENDIF C ENDIF C ENDIF C ENDIF C 299 CONTINUE 300 CONTINUE C DO 350 JY=1,NY DO 349 IX=1,NX DATA(IX,JY)=HOLD(IX,JY) INDEX1(IX,JY)=INDEX2(IX,JY) 349 CONTINUE 350 CONTINUE C 380 CONTINUE C KCOUNT=1 RETURN END