SUBROUTINE WNDCOR(KFILDO,P,IX,JY,NX,NY,MESH,IWINDX,IWINDY,F)
C
C        APRIL     2001   GLAHN   TDL   LAMP-2000
C        MAY       2001   GLAHN   TESTED FOR 1013 UP FRONT; COMMENTS
C        APRIL     2002   GLAHN   CHANGED A FORMAT REFERENCE FROM 
C                                 110 TO 120
C        DECEMBER  2002   RUDACK  MODIFIED FORMAT STATEMENTS TO ADHERE
C                                 TO THE F90 COMPILER STANDARDS FOUND
C                                 ON THE IBM SYSTEM
C        MARCH     2010   GLAHN   INITIALAIZED F = 0.
C        OCTOBER   2012   ENGLE   MODIFIED FORMAT STATEMENT
C                                 100 FOR INTEL COMPILER
C        JUNE      2014   GLAHN   INSERTED CALL TO W3TAGE BEFORE STOPS
C        NOVEMBER  2014   GLAHN   REVISED W3TAG PER JUDY
C
C        PURPOSE
C            TO DETERMINE WHICH POINTS IN THE GRID P( , ) SHOULD
C            HAVE A WIND CORRECTION.  THIS IS DEFINED TO BE
C            A GRID POINT LE 1013 MB, IS LOWER THAN ALL POINTS
C            WITHIN 240 KM ON EITHER SIDE, AND THE MINIMUM OF THE TWO
C            END POINTS MINUS THE GRIDPOINT IN QUESTION IS TGRAD MB/KM 
C            (CURRENTLY SET AT .012 MB/KM).  IF A POINT IS A MINIMUM
C            IN EITHER THE IX OR JY DIRECTION, IT WILL HAVE A WIND
C            CORRECTION.  ALSO, THE ADJACENT TWO POINTS IN EITHER/AND
C            THE IX OR JY DIRECTIONS WILL HAVE A FRACTIONAL 
C            CORRECTION (SEE F BELOW).
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            P(IX,JY) = FIELD TO SMOOTH (IX=1,NX) (JY=1,NY).
C                       (INPUT-OUTPUT)
C              IX, JY = THE POINT IN P( , ) BEING DEALT WITH.  (INPUT)
C              NX, NY = DIMENSIONS OF P( , ).  (INPUT)
C                MESH = MESH LENGTH OF GRID IN P( , ).  (INPUT)
C              IWINDX = 1 WHEN WIND CORRECTION IS TO BE MADE AND 
C                       POSSIBLY TO ADJACENT POINTS IN X DIRECTION.
C                       0 OTHERWISE.  (OUTPUT)
C              IWINDY = 1 WHEN WIND CORRECTION IS TO BE MADE AND 
C                       POSSIBLY TO ADJACENT POINTS IN Y DIRECTION.
C                       0 OTHERWISE.  (OUTPUT)
C                   F = FACTOR BY WHICH CORRECTION IS APPLIED TO POINTS 
C                       ADJACENT TO MINIMUM.  (OUTPUT)
C               TGRAD = THE GRADIENT IN MB THAT MUST BE MET FOR THE
C                       WIND CORRECTION TO BE MADE.  (INTERNAL)
C              IFIRST = CONTROLS PRINTING OF F AND TGRAD.  (INTERNAL)
C        1         2         3         4         5         6         7 X
C
C        NONSYSTEM SUBROUTINES CALLED
C            NONE.
C
      DIMENSION P(NX,NY)
C
      DATA IFIRST/0/
      SAVE IFIRST
C
      F=0
C        THIS IS FOR SAFETY.  IT IS NOT INITIALIZED IN CALLING PROGRAM.
C        I DOUBT THIS ROUTINE AND USE OF WINDS IN SEA LEVEL PRESSURE
C        ANALYSIS HAS EVER BEEN USED IN THIS VERSION.  IT CAME FROM LAMP.
C
      IF(P(IX,JY).GT.1013.)GO TO 140
C        WIND CORRECTIONS ONLY APPLY WHEN PRESSURE GT 1013 MB.
C        TEST IS HERE FOR SAFETY; TEST IS ALSO MADE IN CALLING ROUTINE.
      F=.75
C        F = 0 MEANS THE ADJACENT POINTS WILL NOT BE CORRECTED.
C        F = 1 MEANS THE ADJACENT POINTS WILL BE CORRECTED.
C        INTERMEDIATE VALUES ARE POSSIBLE FOR A LIGHT CORRECTION.
      TGRAD=.012
C        TGRAD IS IN MB PER KM.
      IF(IFIRST.EQ.0)THEN
         WRITE(KFILDO,100)F,TGRAD
 100     FORMAT(/' FOR WIND CORRECTION, ADJACENT GRIDPOINTS ARE',
     1           ' CORRECTED',F5.2,' OF A FULL CORRECTON.'/
     2           ' THE THRESHOLD GRADIENT FOR CORRECTION IS',F6.3,
     3           ' MB PER KM.')
         IFIRST=1
      ENDIF
C
      IF(MESH.GT.160)THEN
         WRITE(KFILDO,101)MESH
 101     FORMAT(/'****MESH =',I8,' IN WNDCOR TOO LARGE.',
     1           '  STOP IN WNDCOR AT 101.')
         CALL W3TAGE('WNDCOR')
         STOP 101
      ENDIF
C
C        OBTAIN MAX OF THE ENDPOINTS ALONG JY'TH ROW.
C        THIS LOOKS MESH*3 GRIDLENGTHS OUT FOR AN 80 KM GRID AND
C        LOOKS MESH*6 GRIDLENGTHS OUT FOR A 40 KM GRID.  THIS
C        WILL ALWAYS GET A MIN UNLESS THE GRID IS UNREALISTICALLY
C        SMALL.  IF THE GRIDPOINT IS LT 240 KM FROM AN EDGE,
C        THE OPPOSITE DIRECTION IS USED FOR THE MIN.
C       
      XMAX=99999999.
C      
      IF(IX-(240/MESH).GE.1)THEN
         XMAX=P(IX-(240/MESH),JY)
      ENDIF
C
      IF(IX+(240/MESH).LE.NX)THEN
C
         IF(XMAX.EQ.99999999.)THEN
            XMAX=P(IX+(240/MESH),JY)
         ELSE
            XMAX=MIN(XMAX,P(IX+(240/MESH),JY))
         ENDIF
C
      ENDIF    
C      
      IF(XMAX.EQ.99999999.)THEN
         WRITE(KFILDO,110)NX,NY
 110     FORMAT(/' ****GRID UNREALISTICALLY SMALL.',
     1           '  NX =',I5,'    NY =',I5/
     2           '     STOP AT 110 IN WNDCOR')
         CALL W3TAGE('WNDCOR')
         STOP 110
      ENDIF
C
C        OBTAIN MAX OF THE ENDPOINTS ALONG IX'TH COLUMN.
C        THIS LOOKS MESH*3 GRIDLENGTHS OUT FOR AN 80 KM GRID AND
C        LOOKS MESH*6 GRIDLENGTHS OUT FOR A 40 KM GRID.  THIS
C        WILL ALWAYS GET A MIN UNLESS THE GRID IS UNREALISTICALLY
C        SMALL.  IF THE GRIDPOINT IS LT 240 KM FROM AN EDGE,
C        THE OPPOSITE DIRECTION IS USED FOR THE MIN.
C       
      YMAX=99999999.
C
      IF(JY-(240/MESH).GE.1)THEN
         YMAX=P(IX,JY-(240/MESH))
      ENDIF
C
      IF(JY+(240/MESH).LE.NY)THEN
C
         IF(YMAX.EQ.99999999.)THEN
            YMAX=P(IX,JY+(240/MESH))
         ELSE
            YMAX=MIN(YMAX,P(IX,JY+(240/MESH)))
         ENDIF
C
      ENDIF    
C
      IF(YMAX.EQ.99999999.)THEN
         WRITE(KFILDO,120)NX,NY
 120     FORMAT(/' ****GRID UNREALISTICALLY SMALL.',
     1           '  NX =',I5,'    NY =',I5/
     2           '     STOP AT 120 IN WNDCOR')
         CALL W3TAGE('WNDCOR')
         STOP 120
      ENDIF
C
      XRANGE=XMAX-P(IX,JY)
      YRANGE=YMAX-P(IX,JY)
      IWINDX=0
      IWINDY=0
C
C        CHECK THE GRADIENT AND MINIMUM IN X DIRECTION.
C
      IF(XRANGE/240..GT.TGRAD)THEN
C           THE RANGE IS ALWAYS OVER 240 KM.
         GRAD=XRANGE/240.
C***         WRITE(KFILDO,125)IX,JY,GRAD,TGRAD
C*** 125     FORMAT(/' WIND CORRECTION IN X-DIRECTION--',
C***     1           'IX,JY,GRAD,TGRAD',2I5,3F8.3)
C
C           THIS LOOP USED WHEN THE ANALYSIS LINES ARE ORIENTED MORE
C           VERTICALLY THAN HORIZONTALLY.  THEREFORE, LOOK ACROSS
C           THE X AXIS FOR MINIMA TO NOT SMOOTH.
C
         DO 130 M=-240/MESH,+240/MESH
            IF(IX+M.LT.1.OR.IX+M.GT.NX)GO TO 130
            IF(P(IX+M,JY).LT.P(IX,JY))GO TO 132
C              POINT NOT A MINIMUN IN X DIRECTION, CHECK Y DIRECTION.
 130     CONTINUE
C    
C           DROP THROUGH HERE MEANS THE POINT WAS A MINIMUM IN THE 
C           X DIRECTION AND THE GRADIENT MET THE CRITERIA IN THAT
C           DIRECTION.
C
         IWINDX=1
C
      ENDIF
C
C        CHECK THE GRADIENT AND MINIMUM IN Y DIRECTION.
C     
 132  IF(YRANGE/240..GT.TGRAD)THEN
C           THE RANGE IS ALWAYS OVER 240 KM.
         GRAD=YRANGE/240.
C***         WRITE(KFILDO,134)IX,JY,GRAD,TGRAD
C*** 134     FORMAT(/' WIND CORRECTION IN Y-DIRECTION--',
C***     1           'IX,JY,GRAD,TGRAD',2I5,3F8.3)
C
C           THIS LOOP USED WHEN THE ANALYSIS LINES ARE ORIENTED MORE
C           HORIZONTALLY THAN VERTICALLY.  THEREFORE, LOOK ALONG
C           THE Y AXIS FOR MINIMA TO NOT SMOOTH.
C
         DO 135 M=-240/MESH,+240/MESH
            IF(JY+M.LT.1.OR.JY+M.GT.NY)GO TO 135
            IF(P(IX,JY+M).LT.P(IX,JY))GO TO 140
C              POINT NOT A MINIMUM.
 135     CONTINUE
C    
C           DROP THROUGH HERE MEANS THE POINT WAS A MINIMUM IN THE 
C           Y DIRECTION AND THE GRADIENT MET THE CRITERIA IN THAT
C           DIRECTION.
C
         IWINDY=1
C     
      ENDIF
C
 140  RETURN
      END