C $Header: /u/gcmpack/MITgcm/pkg/longstep/longstep_forcing_surf.F,v 1.1 2010/01/12 23:55:48 jahn Exp $ C $Name: $ #include "LONGSTEP_OPTIONS.h" CBOP C !ROUTINE: LONGSTEP_FORCING_SURF C !INTERFACE: ========================================================== SUBROUTINE LONGSTEP_FORCING_SURF( I bi, bj, iMin, iMax, jMin, jMax, I myTime,myIter,myThid ) C !DESCRIPTION: C Precomputes surface forcing term for pkg/ptracers. C Precomputation is needed because of non-local KPP transport term, C routine KPP_TRANSPORT_PTR. C !USES: =============================================================== IMPLICIT NONE #include "SIZE.h" #include "EEPARAMS.h" #include "PARAMS.h" #include "GRID.h" #include "SURFACE.h" #include "FFIELDS.h" c #include "DYNVARS.h" #include "PTRACERS_SIZE.h" #include "PTRACERS_PARAMS.h" #include "PTRACERS_FIELDS.h" #include "LONGSTEP.h" C !INPUT PARAMETERS: =================================================== C bi,bj :: tile indices C myTime :: model time C myIter :: time-step number C myThid :: thread number INTEGER bi, bj, iMin, iMax, jMin, jMax _RL myTime INTEGER myIter INTEGER myThid #ifdef ALLOW_LONGSTEP C !LOCAL VARIABLES: ==================================================== C i,j :: loop indices C iTrc :: tracer index C ks :: surface level index INTEGER i, j INTEGER iTrc, ks CEOP IF ( usingPCoords ) THEN ks = Nr ELSE ks = 1 ENDIF C Example of how to add forcing at the surface DO iTrc=1,PTRACERS_numInUse DO j = jMin, jMax DO i = iMin, iMax surfaceForcingPTr(i,j,bi,bj,iTrc) = & 0. _d 0 c & surfaceForcingS(i,j,bi,bj) ENDDO ENDDO ENDDO #ifdef EXACT_CONSERV IF ( (nonlinFreeSurf.GT.0 .OR. usingPCoords) & .AND. useRealFreshWaterFlux ) THEN DO iTrc=1,PTRACERS_numInUse c- NonLin_FrSurf and RealFreshWaterFlux : PmEpR effectively changes c the water column height ; temp., salt, (tracer) flux associated c with this input/output of water is added here to the surface tendency. c c NB: LS_fwflux is PmEpR c IF (PTRACERS_EvPrRn(iTrc).NE.UNSET_RL) THEN DO j = jMin, jMax DO i = iMin, iMax surfaceForcingPTr(i,j,bi,bj,iTrc) = & surfaceForcingPTr(i,j,bi,bj,iTrc) & + LS_fwFlux(i,j,bi,bj) & *( PTRACERS_EvPrRn(iTrc) - pTracer(i,j,ks,bi,bj,iTrc) ) & *mass2rUnit ENDDO ENDDO ENDIF ENDDO C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----| ELSE #else /* EXACT_CONSERV */ IF (.TRUE.) THEN #endif /* EXACT_CONSERV */ C-- EmPmR does not really affect the water column height (for tracer budget) C and is converted to a salt tendency. IF (convertFW2Salt .EQ. -1.) THEN C- use local surface tracer field to calculate forcing term: DO iTrc=1,PTRACERS_numInUse IF (PTRACERS_EvPrRn(iTrc).NE.UNSET_RL) THEN C account for Rain/Evap tracer content (PTRACERS_EvPrRn) using C local surface tracer c c NB: LS_fwflux is EmPmR DO j = jMin, jMax DO i = iMin, iMax surfaceForcingPTr(i,j,bi,bj,iTrc) = & surfaceForcingPTr(i,j,bi,bj,iTrc) & + LS_fwFlux(i,j,bi,bj) & *( pTracer(i,j,ks,bi,bj,iTrc) - PTRACERS_EvPrRn(iTrc) ) & *mass2rUnit ENDDO ENDDO ENDIF ENDDO ELSE C- use uniform tracer value to calculate forcing term: DO iTrc=1,PTRACERS_numInUse IF (PTRACERS_EvPrRn(iTrc).NE.UNSET_RL) THEN C account for Rain/Evap tracer content (PTRACERS_EvPrRn) assuming uniform C surface tracer (=PTRACERS_ref) c c NB: LS_fwflux is EmPmR DO j = jMin, jMax DO i = iMin, iMax surfaceForcingPTr(i,j,bi,bj,iTrc) = & surfaceForcingPTr(i,j,bi,bj,iTrc) & + LS_fwFlux(i,j,bi,bj) & *( PTRACERS_ref(ks,iTrc) - PTRACERS_EvPrRn(iTrc) ) & *mass2rUnit ENDDO ENDDO ENDIF ENDDO C- end local-surface-tracer / uniform-value distinction ENDIF ENDIF C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----| #endif /* ALLOW_LONGSTEP */ RETURN END