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