C $Header: /home/ubuntu/mnt/e9_copy/MITgcm/pkg/seaice/seaice_calc_viscosities.F,v 1.3 2006/03/20 21:36:12 mlosch Exp $ C $Name: $ #include "SEAICE_OPTIONS.h" CStartOfInterface SUBROUTINE SEAICE_CALC_VISCOSITIES( I uFld, vFld, zMin, zMax, hEffM, press0, O eta, zeta, press, #ifdef SEAICE_ALLOW_EVP O seaice_div, seaice_tension, seaice_shear, #endif /* SEAICE_ALLOW_EVP */ I myThid ) C /==========================================================\ C | SUBROUTINE SEAICE_CALC_VISCOSITIES | C | o compute shear and bulk viscositites eta, zeta and the | C | ice strength P | C | (see Zhang and Hibler, JGR, 102, 8691-8702, 1997) | C |==========================================================| C | written by Martin Losch, Mar 2006 | C \==========================================================/ IMPLICIT NONE C === Global variables === #include "SIZE.h" #include "EEPARAMS.h" #include "PARAMS.h" #include "GRID.h" #include "SEAICE_PARAMS.h" #ifdef ALLOW_AUTODIFF_TAMC # include "tamc.h" #endif C === Routine arguments === C myThid - Thread no. that called this routine. INTEGER myThid _RL uFld (1-Olx:sNx+Olx,1-Oly:sNy+Oly,nSx,nSy) _RL vFld (1-Olx:sNx+Olx,1-Oly:sNy+Oly,nSx,nSy) _RL zMin (1-Olx:sNx+Olx,1-Oly:sNy+Oly,nSx,nSy) _RL zMax (1-Olx:sNx+Olx,1-Oly:sNy+Oly,nSx,nSy) _RL hEffM (1-Olx:sNx+Olx,1-Oly:sNy+Oly,nSx,nSy) _RL press0(1-Olx:sNx+Olx,1-Oly:sNy+Oly,nSx,nSy) _RL press (1-Olx:sNx+Olx,1-Oly:sNy+Oly,nSx,nSy) _RL eta (1-Olx:sNx+Olx,1-Oly:sNy+Oly,nSx,nSy) _RL zeta (1-Olx:sNx+Olx,1-Oly:sNy+Oly,nSx,nSy) #ifdef SEAICE_ALLOW_EVP _RL seaice_div (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy) _RL seaice_tension(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy) _RL seaice_shear (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy) #endif /* SEAICE_ALLOW_EVP */ CEndOfInterface #ifdef SEAICE_CGRID #ifdef SEAICE_ALLOW_DYNAMICS C === Local variables === C i,j,bi,bj - Loop counters C e11, e12, e22 - components of strain rate tensor C ecm2 - inverse of square of eccentricity of yield curve INTEGER i, j, bi, bj _RL e11, e12, e22 _RL ECM2, DELT1, DELT2 #ifdef SEAICE_ALLOW_EVP _RL delta (1-OLx:sNx+OLx,1-OLy:sNy+OLy) #endif C-- FIRST SET UP BASIC CONSTANTS ecm2=0. _d 0 IF ( SEAICE_eccen .NE. 0. _d 0 ) ecm2=ONE/(SEAICE_eccen**2) C DO bj=myByLo(myThid),myByHi(myThid) DO bi=myBxLo(myThid),myBxHi(myThid) DO j=1-Oly+1,sNy+Oly-1 DO i=1-Olx+1,sNx+Olx-1 C NOW EVALUATE STRAIN RATES e11= _recip_dxF(I,J,bi,bj) * & (uFld(I+1,J,bi,bj)-uFld(I,J,bi,bj)) & -HALF* & (vFld(I,J,bi,bj)+vFld(I,J+1,bi,bj)) & * _tanPhiAtU(I,J,bi,bj)*recip_rSphere e22= _recip_dyF(I,J,bi,bj) * & (vFld(I,J+1,bi,bj)-vFld(I,J,bi,bj)) C one metric term is missing e12=HALF*( & (uFld(I,J+1,bi,bj)+uFld(I+1,J+1,bi,bj) & -uFld(I,J-1,bi,bj)-uFld(I+1,J-1,bi,bj)) & * 1. _d 0 / (dyC(I,J,bi,bj) + dyC(I,J-1,bi,bj)) & + & (vFld(I+1,J+1,bi,bj)+vFld(I+1,J,bi,bj) & -vFld(I-1,J+1,bi,bj)-vFld(I-1,J,bi,bj)) & * 1. _d 0 / (dxC(I,J,bi,bj) + dxC(I-1,J,bi,bj)) & +HALF* & (uFld(I, J, bi,bj)+uFld(I+1,J, bi,bj)) & * _tanPhiAtU(I,J,bi,bj)*recip_rSphere) C NOW EVALUATE VISCOSITIES DELT1=(e11**2+e22**2)*(ONE+ECM2) & +4. _d 0*ECM2*e12**2 & +TWO*e11*e22*(ONE-ECM2) IF ( DELT1 .LE. SEAICE_EPS_SQ ) THEN DELT2=SEAICE_EPS ELSE DELT2=SQRT(DELT1) ENDIF zeta(I,J,bi,bj)=HALF*PRESS0(I,J,bi,bj)/DELT2 C NOW PUT MIN AND MAX VISCOSITIES IN zeta(I,J,bi,bj)=MIN(ZMAX(I,J,bi,bj),zeta(I,J,bi,bj)) zeta(I,J,bi,bj)=MAX(ZMIN(I,J,bi,bj),zeta(I,J,bi,bj)) C NOW SET VISCOSITIES TO ZERO AT HEFFMFLOW PTS zeta (I,J,bi,bj) = zeta(I,J,bi,bj)*HEFFM(I,J,bi,bj) eta (I,J,bi,bj) = ECM2*zeta(I,J,bi,bj) press(I,J,bi,bj) = TWO*zeta(I,J,bi,bj)*DELT2 #ifdef SEAICE_ALLOW_EVP delta(I,J) = DELT2 seaice_div (I,J,bi,bj) = (e11+e22)/DELT2*hEffM(I,J,bi,bj) seaice_tension(I,J,bi,bj) = (e11-e22)/DELT2*hEffM(I,J,bi,bj) C recompute e12 on Z point so that seaice_shear and seaice_sigma12 C are also defined on Z points (one half and two drop out) seaice_shear (I,J,bi,bj) = ( & (uFld(I ,J ,bi,bj) * _dxC(I ,J ,bi,bj) & -uFld(I ,J-1,bi,bj) * _dxC(I ,J-1,bi,bj) & +vFld(I ,J ,bi,bj) * _dyC(I ,J ,bi,bj) & -vFld(I-1,J ,bi,bj) * _dyC(I-1,J ,bi,bj)) & * recip_rAz(I,J,bi,bj) & + & 0.25 _d 0 * (uFld(I,J,bi,bj)+uFld(I ,J-1,bi,bj)) & * ( _tanPhiAtU(I,J,bi,bj) + _tanPhiAtU(I,J-1,bi,bj) ) & *recip_rSphere & ) C one metric term is missing #endif /* SEAICE_ALLOW_EVP */ ENDDO ENDDO #ifdef SEAICE_ALLOW_EVP DO j=1,sNy DO i=1,sNx DELT2 = 0.25 * ( delta(I,J ) + delta(I-1,J ) & + delta(I,J-1) + delta(I-1,J-1) ) seaice_shear(I,J,bi,bj) = & seaice_shear(I,J,bi,bj)/DELT2 & *hEffM(I ,J ,bi,bj)*hEffM(I-1,J ,bi,bj) & *hEffM(I ,J-1,bi,bj)*hEffM(I-1,J-1,bi,bj) ENDDO ENDDO #endif /* SEAICE_ALLOW_EVP */ ENDDO ENDDO C-- Update overlap regions _EXCH_XY_R8( eta, myThid) _EXCH_XY_R8( zeta, myThid) _EXCH_XY_R8(press, myThid) #ifdef SEAICE_ALLOW_EVP _EXCH_XY_R8(seaice_div , myThid) _EXCH_XY_R8(seaice_tension, myThid) _EXCH_XY_R8(seaice_shear , myThid) #endif /* SEAICE_ALLOW_EVP */ #endif /* SEAICE_ALLOW_DYNAMICS */ #endif /* SEAICE_CGRID */ RETURN END