C $Header: /u/gcmpack/MITgcm/pkg/down_slope/dwnslp_calc_flow.F,v 1.4 2011/06/07 21:05:13 jmc Exp $ C $Name: $ #include "DWNSLP_OPTIONS.h" CBOP C !ROUTINE: DWNSLP_CALC_FLOW C !INTERFACE: SUBROUTINE DWNSLP_CALC_FLOW( I bi, bj, kBottom, rho3d, I myTime, myIter, myThid ) C !DESCRIPTION: \bv C *==========================================================* C | SUBROUTINE DWNSLP_CALC_FLOW C | o Detect active site of Down-Sloping flow and compute C | the corresponding volume transport C *==========================================================* C \ev C !USES: IMPLICIT NONE C === Global variables === #include "SIZE.h" #include "EEPARAMS.h" #include "PARAMS.h" #include "DWNSLP_SIZE.h" #include "DWNSLP_PARAMS.h" #include "DWNSLP_VARS.h" C !INPUT/OUTPUT PARAMETERS: C === Routine arguments === C bi,bj :: Tile indices C kBottom :: Vertical index of bottom grid cell. C rho3d :: In-situ density [kg/m3] computed at z=rC ; C myTime :: Current time in simulation C myIter :: Current time-step number C myThid :: my Thread Id number INTEGER bi, bj INTEGER kBottom( xySize, nSx,nSy ) _RL rho3d ( xySize, Nr,nSx,nSy ) _RL myTime INTEGER myIter, myThid #ifdef ALLOW_DOWN_SLOPE C !LOCAL VARIABLES: C === Local variables === C msgBuf :: Informational/error message buffer C ijd :: horiz. index of deep water column receiving dense water flow C ijs :: horiz. index of shallow water column (e.g. shelf) C from which dense water flow originates c CHARACTER*(MAX_LEN_MBUF) msgBuf INTEGER k INTEGER n, ijd, ijr, ijs INTEGER kdeep, ishelf, jshelf, kshelf _RL dRhoH INTEGER downward #ifdef ALLOW_DIAGNOSTICS LOGICAL doDiagDwnSlpFlow INTEGER ij _RL sgnFac _RL uFlow( xySize ) _RL vFlow( xySize ) C- Functions: LOGICAL DIAGNOSTICS_IS_ON EXTERNAL #endif /* ALLOW_DIAGNOSTICS */ CEOP C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----| c downward = rkSign*NINT(gravitySign) downward = 1 IF ( usingPCoords ) downward = -1 #ifdef ALLOW_DIAGNOSTICS IF ( useDiagnostics ) THEN doDiagDwnSlpFlow = DIAGNOSTICS_IS_ON( 'DSLPuFlw', myThid ) & .OR. DIAGNOSTICS_IS_ON( 'DSLPvFlw', myThid ) IF ( doDiagDwnSlpFlow ) THEN DO ij=1,xySize uFlow(ij) = 0. _d 0 vFlow(ij) = 0. _d 0 ENDDO ENDIF ELSE doDiagDwnSlpFlow = .FALSE. ENDIF #endif /* ALLOW_DIAGNOSTICS */ DO n=1,DWNSLP_NbSite(bi,bj) DWNSLP_deepK(n,bi,bj) = 0 C- detect density gradient along the slope => Downsloping flow ijd = DWNSLP_ijDeep(n,bi,bj) ijr = DWNSLP_shVsD(n,bi,bj) ijs = ijd + ijr kshelf = kBottom(ijs,bi,bj) dRhoH = rho3d(ijs,kshelf,bi,bj) & -rho3d(ijd,kshelf,bi,bj) c IF ( dRhoH.GT.0. _d 0 ) THEN IF ( rho3d(ijs,kshelf+1,bi,bj).GT.rho3d(ijd,kshelf+1,bi,bj) & .AND. dRhoH.GT.0. _d 0 ) THEN C- search for deepest level where Rho_shelf > Rho_deep kdeep = kshelf DO k=kshelf+1,kBottom(ijd,bi,bj),downward IF ( rho3d(ijs,k,bi,bj).GT.rho3d(ijd,k,bi,bj) ) kdeep = k ENDDO DWNSLP_deepK(n,bi,bj) = kdeep C- Compute the Volume Transport : C- same formulation as described in the paper: c downslpFlow = DWNSLP_gamma/mu *gravity*dRhoH*recip_rhoConst C with DWNSLP_Gamma = slope * effective cross-section area DWNSLP_Transp(n,bi,bj) = DWNSLP_Gamma(n,bi,bj) & *DWNSLP_rec_mu*gravity*dRhoH*recip_rhoConst #ifdef ALLOW_DIAGNOSTICS IF ( doDiagDwnSlpFlow ) THEN ij = MAX( ijd, ijs ) sgnFac = SIGN(1,-ijr) IF ( ABS(ijr).EQ.1 ) THEN uFlow(ij) = sgnFac*DWNSLP_Transp(n,bi,bj) ELSE vFlow(ij) = sgnFac*DWNSLP_Transp(n,bi,bj) ENDIF ENDIF #endif /* ALLOW_DIAGNOSTICS */ ENDIF C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----| ENDDO IF ( DWNSLP_ioUnit.GT.0 ) THEN _BEGIN_MASTER(myThid) WRITE(DWNSLP_ioUnit,'(A,I8,2I4)') & ' DWNSLP_CALC_FLOW: iter,bi,bj=',myIter,bi,bj WRITE(DWNSLP_ioUnit,'(A)') & ' bi bj n : ijd ijr is js ; ks kd-s Transp :' DO n=1,DWNSLP_NbSite(bi,bj) IF (DWNSLP_deepK(n,bi,bj).NE.0) THEN ijs = DWNSLP_ijDeep(n,bi,bj) + DWNSLP_shVsD(n,bi,bj) ishelf = 1-OLx + mod(ijs-1,xSize) jshelf = 1-OLy + (ijs-1)/xSize kshelf = kBottom(ijs,bi,bj) WRITE(DWNSLP_ioUnit,'(2I4,I6,A,I8,I6,2I4,A,2I4,1PE14.6)') & bi,bj,n,' :', DWNSLP_ijDeep(n,bi,bj), & DWNSLP_shVsD(n,bi,bj), ishelf,jshelf, & ' ;', kshelf, DWNSLP_deepK(n,bi,bj)-kshelf, & DWNSLP_Transp(n,bi,bj) ENDIF ENDDO WRITE(DWNSLP_ioUnit,*) _END_MASTER(myThid) ENDIF #ifdef ALLOW_DIAGNOSTICS IF ( doDiagDwnSlpFlow ) THEN CALL DIAGNOSTICS_FILL( uFlow, 'DSLPuFlw', 0,1,2,bi,bj,myThid ) CALL DIAGNOSTICS_FILL( vFlow, 'DSLPvFlw', 0,1,2,bi,bj,myThid ) ENDIF #endif /* ALLOW_DIAGNOSTICS */ #endif /* ALLOW_DOWN_SLOPE */ RETURN END