C $Header: /u/gcmpack/MITgcm/pkg/atm_ocn_coupler/set_runoffmap.F,v 1.4 2013/12/02 22:03:08 jmc Exp $ C $Name: $ #include "CPP_OPTIONS.h" CBOP 0 C !ROUTINE: SET_RUNOFFMAP C !INTERFACE: SUBROUTINE SET_RUNOFFMAP( msgUnit ) C !DESCRIPTION: C *==========================================================* C | SUBROUTINE SET_RUNOFFMAP C | o define runoff mapping from atmos. grid (land) to C | ocean grid C *==========================================================* C !USES: IMPLICIT NONE C == Global variables == #include "ATMSIZE.h" #include "OCNSIZE.h" #include "CPL_PARAMS.h" #include "CPL_MAP2GRIDS.h" C !INPUT/OUTPUT PARAMETERS: C msgUnit :: log-file I/O unit INTEGER msgUnit C !LOCAL VARIABLES: INTEGER n, ijo, ija INTEGER lengthName, lengthRec, iRec Real*8 r8seg(3) Real*8 tmpfld(3,ROsize), rAc(Nx_ocn*Ny_ocn) CEOP WRITE(msgUnit,'(2A)') 'SET_RUNOFFMAP: ','entering' C- Initialize to zero : DO n=1,ROsize ijROocn(n)=0 ijROatm(n)=0 arROmap(n)=0. ENDDO nROmap = runOffMapSize c lengthName=ILNBLNK( runOffMapFile ) ! eesup/src/utils.F not compiled here lengthName=0 DO n=1,LEN( runOffMapFile ) IF ( runOffMapFile(n:n).NE.' ' ) lengthName=n ENDDO WRITE(msgUnit,'(3A,I6)') & ' runOffMapFile =>>', runOffMapFile(1:lengthName), & '<<= , runOffMapSize=', runOffMapSize IF ( lengthName.EQ.0 ) nROmap=0 IF ( nROmap.EQ.0 ) THEN WRITE(msgUnit,'(2A,I9,A)') 'SET_RUNOFFMAP: ', & 'nothing to set (nROmap=', nROmap, ' )' RETURN ENDIF IF ( nROmap.GT.ROsize ) THEN WRITE(msgUnit,'(2A)') '*** ERROR *** SET_RUNOFFMAP: ', & 'runOffMapSize exceeds ROsize' STOP 'ABNORMAL END: S/R SET_RUNOFFMAP' ENDIF C- Read area catchment from file ; WRITE(msgUnit,'(2A)') 'SET_RUNOFFMAP: ','reading runOffMapFile' c lengthRec=3*nROmap*WORDLENGTH*2 c OPEN(88, FILE=runOffMapFile(1:lengthName), STATUS='OLD', c & ACCESS='direct', RECL=lengthRec ) c READ(88,rec=1) tmpfld lengthRec=3*WORDLENGTH*2 OPEN(88, FILE=runOffMapFile(1:lengthName), STATUS='OLD', & ACCESS='direct', RECL=lengthRec ) DO n=1,nROmap iRec = n READ(88,rec=iRec) r8seg tmpfld(1,n) = r8seg(1) tmpfld(2,n) = r8seg(2) tmpfld(3,n) = r8seg(3) ENDDO CLOSE(88) #ifdef _BYTESWAPIO CALL MDS_BYTESWAPR8( 3*nROmap, tmpfld ) #endif c n=nROmap c WRITE(msgUnit,'(A,3I5,F11.6)') 'ROmap:',n,nint(tmpfld(1,n)), c & NINT(tmpfld(2,n)),tmpfld(3,n)*1.d-9 C- Read (ocean) grid cell area from file ; WRITE(msgUnit,'(2A)') 'SET_RUNOFFMAP: ','reading OCN grid area' lengthRec=Nx_ocn*Ny_ocn*WORDLENGTH*2 OPEN(88, FILE='RA.bin', STATUS='OLD', & ACCESS='direct', RECL=lengthRec ) iRec = 1 READ(88,rec=iRec) rAc CLOSE(88) #ifdef _BYTESWAPIO CALL MDS_BYTESWAPR8( Nx_ocn*Ny_ocn, rAc ) #endif c WRITE(msgUnit,*) 'rAc=', rAc(1), rAc(17), rAc(17+16*Nx_ocn) C---------------------------------------------------------- C- Define mapping : DO n=1,nROmap ija = NINT(tmpfld(1,n)) ijo = NINT(tmpfld(2,n)) IF ( ija.LT.1 .OR. ija.GT.Nx_atm*Ny_atm ) THEN WRITE(msgUnit,'(2A)') '*** ERROR *** SET_RUNOFFMAP: ', & 'ijROatm out of range !' STOP 'ABNORMAL END: S/R SET_RUNOFFMAP' ENDIF ijROatm(n) = ija IF ( ijo.LT.1 .OR. ijo.GT.Nx_ocn*Ny_ocn ) THEN WRITE(msgUnit,'(2A)') '*** ERROR *** SET_RUNOFFMAP: ', & 'ijROocn out of range !' STOP 'ABNORMAL END: S/R SET_RUNOFFMAP' ELSEIF ( rAc(ijo).GT.0. ) THEN arROmap(n) = tmpfld(3,n)/rAc(ijo); ELSE arROmap(n) = 0. ENDIF ijROocn(n) = ijo ENDDO C- print to check : n = 1 WRITE(msgUnit,'(A,3I5,F9.6)') ' check ROmap:', & n,ijROatm(n),ijROocn(n),arROmap(n) n = nROmap WRITE(msgUnit,'(A,3I5,F9.6)') ' check ROmap:', & n,ijROatm(n),ijROocn(n),arROmap(n) WRITE(msgUnit,'(2A,I9,A)') 'SET_RUNOFFMAP: ', & 'done (nROmap=', nROmap, ' )' RETURN END