C $Header: /u/gcmpack/MITgcm/pkg/shelfice/shelfice_forcing_surf.F,v 1.3 2015/02/14 22:28:57 jmc Exp $ C $Name: $ #include "SHELFICE_OPTIONS.h" C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----| CBOP C !ROUTINE: SHELFICE_FORCING_SURF C !INTERFACE: SUBROUTINE SHELFICE_FORCING_SURF( I bi, bj, iMin, iMax, jMin, jMax, I myTime, myIter, myThid ) C !DESCRIPTION: \bv C *==========================================================* C | S/R SHELFICE_FORCING_SURF C | o Contains problem specific surface forcing C *==========================================================* C \ev C !USES: IMPLICIT NONE C == Global data == #include "SIZE.h" #include "EEPARAMS.h" #include "PARAMS.h" #include "GRID.h" c#include "DYNVARS.h" #include "SURFACE.h" #include "FFIELDS.h" #include "SHELFICE.h" C !INPUT/OUTPUT PARAMETERS: C == Routine arguments == C bi,bj :: Current tile indices C iMin,iMax :: Working range of x-index for applying forcing. C jMin,jMax :: Working range of y-index for applying forcing. C myTime :: Current time in simulation C myIter :: Current iteration number in simulation C myThid :: Thread Id number INTEGER bi, bj INTEGER iMin, iMax, jMin, jMax _RL myTime INTEGER myIter INTEGER myThid #ifdef ALLOW_SHELFICE C !LOCAL VARIABLES: C == Local variables == C i,j :: Loop counters INTEGER i, j CEOP c DO bj=myByLo(myThid),myByHi(myThid) c DO bi=myBxLo(myThid),myBxHi(myThid) C-- Zero out surface forcing terms below ice-shelf DO j=1-OLy,sNy+OLy DO i=1-OLx,sNx+OLx IF ( kTopC(i,j,bi,bj).NE.0 ) THEN surfaceForcingT(i,j,bi,bj) = 0. surfaceForcingS(i,j,bi,bj) = 0. EmPmR(i,j,bi,bj) = 0. ENDIF ENDDO ENDDO DO j=1-OLy,sNy+OLy DO i=2-OLx,sNx+OLx IF ( MAX( kTopC(i-1,j,bi,bj), kTopC(i,j,bi,bj) ).NE.0 ) THEN surfaceForcingU(i,j,bi,bj) = 0. ENDIF ENDDO ENDDO DO j=2-OLy,sNy+OLy DO i=1-OLx,sNx+OLx IF ( MAX( kTopC(i,j-1,bi,bj), kTopC(i,j,bi,bj) ).NE.0 ) THEN surfaceForcingV(i,j,bi,bj) = 0. ENDIF ENDDO ENDDO C-- Forcing term IF ( .NOT.SHELFICEboundaryLayer ) THEN C- for now, forcing using SHELFICEboundaryLayer is done separately C (calling SHELFICE_FORCING_T & _S from APPLY_FORCING_T & _S) DO j=1,sNy DO i=1,sNx IF ( kTopC(i,j,bi,bj).NE.0 ) THEN surfaceForcingT(i,j,bi,bj) = shelficeForcingT(i,j,bi,bj) surfaceForcingS(i,j,bi,bj) = shelficeForcingS(i,j,bi,bj) ENDIF ENDDO ENDDO IF ( useRealFreshWaterFlux ) THEN #ifdef ALLOW_AUTODIFF STOP 'RealFreshWaterFlux disabled in SHELFICE_FORCING_SURF' #else /* ALLOW_AUTODIFF */ DO j=1-OLy,sNy+OLy DO i=1-OLx,sNx+OLx c IF ( kTopC(i,j,bi,bj).NE.0 ) THEN EmPmR(i,j,bi,bj) = EmPmR(i,j,bi,bj) & + shelfIceFreshWaterFlux(i,j,bi,bj) c ENDIF ENDDO ENDDO #endif /* ALLOW_AUTODIFF */ ENDIF C-- end if not SHELFICEboundaryLayer ENDIF #ifdef EXACT_CONSERV IF ( staggerTimeStep ) THEN DO j=1-OLy,sNy+OLy DO i=1-OLx,sNx+OLx PmEpR(i,j,bi,bj) = -EmPmR(i,j,bi,bj) ENDDO ENDDO ENDIF #endif /* EXACT_CONSERV */ IF ( usingZCoords ) THEN DO j = jMin, jMax DO i = iMin, iMax phi0surf(i,j,bi,bj) = phi0surf(i,j,bi,bj) & + shelficeLoadAnomaly(i,j,bi,bj)*recip_rhoConst ENDDO ENDDO ENDIF c ENDDO c ENDDO #endif /* ALLOW_SHELFICE */ RETURN END