SUBROUTINE SETFG(KFILDO,P,NX,NY,MESH, 1 SEALND,NXE,NYE,MESHE, 2 ISETO,ISETLK,SETLD,ISTOP,IER) C C MAY 2018 GLAHN MDL MOS-2000 C C PURPOSE C C TO SET ONE OR MORE OF THE OCEAN, LAKE, OR LAND C GRIDPOINTS TO A CONSTANT. THE INPUT VARIABLE GUESS C INPUT TO U405A ALLOWS FOR SETTING ALL GRIDPOINTS C TO A CONSTANT. THIS ROUTINE ALLOWS SETTING THE C THREE TYPES OF GRIDPOINTS TO DIFFERENT VALUES, OR C LEAVING THEM ALONE. C C OPEN MP STOP AND IER ARE NOT DECLARED PRIVATE IN OPEN MP. C THEY ARE NOT INVOLVED IN THE OPEN MP LOOPS. 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) = HOLDS A FIELD TO BE SMOOTHED C (IX=1,NX) (JY=1,NY), WHERE NX AND NY ARE THE C SIZE OF THE GRID. (INPUT/OUTPUT) C NX = SIZE OF P( , ) IN X DIRECTION. (INPUT) C NY = SIZE OF P( , ) IN Y DIRECTION. (INPUT) C MESH = NOMINAL MESH LENGTH OF GRID IN P( , ) . C (INPUT) C SEALND(IX,JY) = THE LAND/SEA MASK (IX=1,NX) (JY=1,NY). C 0 = OCEAN WATER GRIDPOINTS; C 3 = INLAND WATER GRIDPOINTS. C 9 = LAND GRIDPOINTS. C (INPUT) C NXE = SIZE OF SEALND( , ) IN X DIRECTION. (INPUT) C NYE = SIZE OF SEALND( , ) IN Y DIRECTION. (INPUT) C MESHE = NOMINAL MESH LENGTH OF GRID IN SEALND( , ). C (INPUT) C ISETO = THE VALUE TO SET THE OCEAN GRIDPOINTS, IF C NOT 9999. (INPUT) C ISETLK = THE VALUE TO SET THE LAKE GRIDPOINTS, IF C NOT 9999. (INPUT) C SETLD = THE VALUE TO SET THE LAND GRIDPOINTS, IF C NOT 9999. (INPUT) C ISTOP = INCREMENTED BY 1 IF THERE IS AN ERROR. C (INPUT/OUTPUT) C IER = RETURN CODE. C 0 = GOOD RETURN. C 777 = MESHE NE MESH OR ARRAY SIZES NOT THE SAME. C (OUTPUT) C 1 2 3 4 5 6 7 X C DIMENSION P(NX,NY) DIMENSION SEALND(NXE,NYE) C CALL TIMPR(KFILDO,KFILDO,'START SETFG ') C D WRITE(KFILDO,103)NX,NY,NXE,NYE,MESH,MESHE,IOSETO,ISETLK,SETLD D103 FORMAT(/' IN SETFG--NX,NY,NXE,NYE,MESH,MESHE,IOSETO,ISETLK,SETLD', D 1 8I8,F8.2) C ISETLD=NINT(SETLD) C MAKES AN INTEGER FOR TESTING. C C CHECK THE SIZE OF P( , ) AND SEALND( , ). C IF(NX.NE.NXE.OR.NY.NE.NYE)THEN WRITE(KFILDO,105)NX,NY,NXE,NYE 105 FORMAT(/' ****THE GRID P( , ) OF SIZE', I6,' X ',I6, 1 ' IS NOT THE SAME SIZE OF SEALND', I6,' X ',I6, 2 '. GRID IS NOT PROCESSED IN SETFG.',/, 3 ' NOT COUNTED AS FATAL. IN SETFG. CONTINUING.') ISTOP=ISTOP+1 IER=777 GO TO 400 ENDIF C C CHECK THE MESH LENGTHS OF P( , ) AND SEALND( , ). C IF(MESH.NE.MESHE)THEN WRITE(KFILDO,107)MESH,MESHE 107 FORMAT(/' ****THE GRID P( , ) HAS A DIFFERENT NOMINAL', 1 ' MESH LENGTH =',I4,' THAN THAT OF SEALND( , ) =',I4,/, 2 '. GRID IS NOT PROCESSED.',/, 3 ' NOT COUNTED AS FATAL. IN SETFG. CONTINUING.') ISTOP=ISTOP+1 IER=777 GO TO 400 ENDIF C SET THE POINTS. C !$OMP PARALLEL DO DEFAULT(SHARED) !$OMP& PRIVATE(IX,JY) C DO 300 JY=1,NY DO 299 IX=1,NX C IF(P(IX,JY).LT.9998.9)THEN C THIS POINT IS NOT MISSING. IF IS WERE, IT IS NOT CHANGED. C IF(SEALND(IX,JY).LE.0.1)THEN C THIS IS AN OCEAN GRIDPOINT. C IF(ISETO.NE.9999)THEN P(IX,JY)=ISETO ENDIF C ELSEIF(SEALND(IX,JY).LE.3.1)THEN C THIS IS AN LAKE GRIDPOINT. C IF(ISETLK.NE.9999)THEN P(IX,JY)=ISETLK ENDIF C ELSE C THIS IS AN LAND GRIDPOINT. C IF(ISETLD.NE.9999)THEN P(IX,JY)=SETLD ENDIF C ENDIF C ENDIF C 299 CONTINUE C 300 CONTINUE C !$OMP END PARALLEL DO CALL TIMPR(KFILDO,KFILDO,'END SETFG ') 400 RETURN END