C $Header: /u/gcmpack/MITgcm/pkg/thsice/thsice_do_advect.F,v 1.6 2015/11/20 22:56:52 jmc Exp $ C $Name: $ #include "THSICE_OPTIONS.h" CBOP C !ROUTINE: THSICE_DO_ADVECT C !INTERFACE: SUBROUTINE THSICE_DO_ADVECT( I biArg, bjArg, myTime, myIter, myThid ) C !DESCRIPTION: \bv C *==========================================================* C | SUBROUTINE THSICE_DO_ADVECT C | o wraper for pkg/thSIce advection-diffusion calls C *==========================================================* C \ev C !USES: IMPLICIT NONE C === Global variables === #include "SIZE.h" #include "EEPARAMS.h" #include "PARAMS.h" #include "FFIELDS.h" #include "THSICE_SIZE.h" #include "THSICE_PARAMS.h" #include "THSICE_VARS.h" #ifdef ALLOW_AUTODIFF_TAMC # include "tamc.h" #endif C !INPUT/OUTPUT PARAMETERS: C === Routine arguments === C biArg :: Tile 1rst index argument C bjArg :: Tile 2nd index argument C myTime :: Current time in simulation (s) C myIter :: Current iteration number C myThid :: My Thread Id. number INTEGER biArg, bjArg _RL myTime INTEGER myIter INTEGER myThid CEOP C !LOCAL VARIABLES: C === Local variables === C bi, bj :: Tile indices C uIce/vIce :: ice velocity on C-grid [m/s] INTEGER bi, bj #ifndef OLD_THSICE_CALL_SEQUENCE INTEGER i, j INTEGER iMin, iMax, jMin, jMax #endif _RL uIce(1-OLx:sNx+OLx,1-OLy:sNy+OLy) _RL vIce(1-OLx:sNx+OLx,1-OLy:sNy+OLy) IF ( thSIceAdvScheme.GT.0 .AND. biArg.EQ.0 .AND. bjArg.EQ.0 ) THEN #ifndef OLD_THSICE_CALL_SEQUENCE c iMin = 1 c iMax = sNx c jMin = 1 c jMax = sNy iMin = 1-OLx iMax = sNx+OLx-1 jMin = 1-OLy jMax = sNy+OLy-1 DO bj = myByLo(myThid), myByHi(myThid) DO bi = myBxLo(myThid), myBxHi(myThid) #ifdef ALLOW_AUTODIFF_TAMC act1 = bi - myBxLo(myThid) max1 = myBxHi(myThid) - myBxLo(myThid) + 1 act2 = bj - myByLo(myThid) max2 = myByHi(myThid) - myByLo(myThid) + 1 act3 = myThid - 1 max3 = nTx*nTy act4 = ikey_dynamics - 1 ticekey = (act1 + 1) + act2*max1 & + act3*max1*max2 & + act4*max1*max2*max3 #endif /* ALLOW_AUTODIFF_TAMC */ CALL THSICE_GET_VELOCITY( O uIce, vIce, I bi,bj, myTime, myIter, myThid ) #ifdef ALLOW_AUTODIFF_TAMC CADJ STORE icemask(:,:,bi,bj) = CADJ & comlev1_bibj, key=ticekey, byte=isbyte CADJ STORE qice1(:,:,bi,bj) = CADJ & comlev1_bibj, key=ticekey, byte=isbyte CADJ STORE hOceMxL(:,:,bi,bj) = CADJ & comlev1_bibj, key=ticekey, byte=isbyte #endif CALL THSICE_ADVDIFF( U uIce, vIce, I bi,bj, myTime, myIter, myThid ) #ifdef ALLOW_AUTODIFF_TAMC CADJ STORE hOceMxL(:,:,bi,bj) = CADJ & comlev1_bibj, key=ticekey, byte=isbyte CADJ STORE snowHeight(:,:,bi,bj) = CADJ & comlev1_bibj, key=ticekey, byte=isbyte CADJ STORE iceHeight(:,:,bi,bj) = CADJ & comlev1_bibj, key=ticekey, byte=isbyte CADJ STORE iceMask(:,:,bi,bj) = CADJ & comlev1_bibj, key=ticekey, byte=isbyte #endif DO j = jMin, jMax DO i = iMin, iMax IF ( hOceMxL(i,j,bi,bj).GT.0. _d 0 ) THEN Qnet(i,j,bi,bj) = Qnet(i,j,bi,bj) - oceQnet(i,j,bi,bj) EmPmR(i,j,bi,bj)= EmPmR(i,j,bi,bj)- oceFWfx(i,j,bi,bj) saltFlux(i,j,bi,bj)=saltFlux(i,j,bi,bj) - oceSflx(i,j,bi,bj) ENDIF C-- Compute Sea-Ice Loading (= mass of sea-ice + snow / area unit) sIceLoad(i,j,bi,bj) = ( snowHeight(i,j,bi,bj)*rhos & + iceHeight(i,j,bi,bj)*rhoi & )*iceMask(i,j,bi,bj) ENDDO ENDDO C-- cumulate time-averaged fields and also fill-up flux diagnostics CALL THSICE_AVE( I bi,bj, myTime, myIter, myThid ) ENDDO ENDDO IF ( stressReduction.GT. 0. _d 0 ) & _EXCH_XY_RL( iceMask, myThid ) IF ( useRealFreshWaterFlux ) & _EXCH_XY_RS( sIceLoad, myThid ) #endif /* ndef OLD_THSICE_CALL_SEQUENCE */ C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----| #ifdef OLD_THSICE_CALL_SEQUENCE ELSEIF ( thSIceAdvScheme.GT.0 ) THEN bi = biArg bj = bjArg CALL THSICE_GET_VELOCITY( O uIce, vIce, I bi,bj, myTime, myIter, myThid ) CALL THSICE_ADVDIFF( U uIce, vIce, I bi,bj, myTime, myIter, myThid ) #endif /* OLD_THSICE_CALL_SEQUENCE */ ENDIF RETURN END