C $Header: /u/gcmpack/MITgcm/pkg/seaice/seaice_get_dynforcing.F,v 1.9 2009/09/10 16:05:26 jmc Exp $ C $Name: $ #include "SEAICE_OPTIONS.h" CStartOfInterface SUBROUTINE SEAICE_GET_DYNFORCING( I uIce, vIce, O taux, tauy, I myTime, myIter, myThid ) C *================================================================* C | SUBROUTINE SEAICE_GET_DYNFORCING C | compute surface stress from atmopheric forcing fields C *================================================================* C | started by Martin Losch, April 2007 C *================================================================* IMPLICIT NONE C === Global variables === #include "SIZE.h" #include "EEPARAMS.h" #include "PARAMS.h" #include "GRID.h" #include "FFIELDS.h" #include "DYNVARS.h" #include "SEAICE_PARAMS.h" #ifdef ALLOW_EXF # include "EXF_OPTIONS.h" # include "EXF_FIELDS.h" # include "EXF_PARAM.h" #endif C === Routine arguments === C INPUT: C uIce - zonal ice velocity (currently not used) C vIce - meridional ice velocity (currently not used) C taux - zonal wind stress over ice at U point C tauy - meridional wind stress over ice at V point C myTime - Simulation time C myIter - Simulation timestep number C myThid - Thread no. that called this routine. _RL uIce (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy) _RL vIce (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy) _RL taux (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy) _RL tauy (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy) _RL myTime INTEGER myIter INTEGER myThid CEndOfInterface #ifdef SEAICE_CGRID C === Local variables === C i,j - Loop counters C k - vertical index of surface layer INTEGER bi, bj, i, j INTEGER k _RL U1, V1, AAA _RL COSWIN _RS SINWIN C CDAIR :: local wind stress coefficient (used twice) C oceTauX :: wind-stress over open-ocean (on Arakawa A-grid), X direction C oceTauY :: wind-stress over open-ocean (on Arakawa A-grid), Y direction _RL CDAIR (1-OLx:sNx+OLx,1-OLy:sNy+OLy) #ifndef SEAICE_EXTERNAL_FLUXES _RL oceTauX (1-OLx:sNx+OLx,1-OLy:sNy+OLy) _RL oceTauY (1-OLx:sNx+OLx,1-OLy:sNy+OLy) #endif C-- surrface level k = 1 C-- introduce turning angle (default is zero) SINWIN=SIN(SEAICE_airTurnAngle*deg2rad) COSWIN=COS(SEAICE_airTurnAngle*deg2rad) C-- NOW SET UP FORCING FIELDS #if !defined(SEAICE_EXTERNAL_FLUXES) || defined(ALLOW_ATM_WIND) C-- Wind stress is computed on center of C-grid cell C and interpolated to U and V points later DO bj=myByLo(myThid),myByHi(myThid) DO bi=myBxLo(myThid),myBxHi(myThid) #ifndef SEAICE_EXTERNAL_FLUXES C-- First compute wind-stress over open ocean: this will results in C over-writing fu and fv that were computed or read-in by pkg/exf. DO j=1-Oly,sNy+Oly DO i=1-Olx,sNx+Olx U1=UWIND(I,J,bi,bj) V1=VWIND(I,J,bi,bj) AAA=U1**2+V1**2 IF ( AAA .LE. SEAICE_EPS_SQ ) THEN AAA=SEAICE_EPS ELSE AAA=SQRT(AAA) ENDIF CDAIR(I,J)=SEAICE_rhoAir*OCEAN_drag & *(2.70 _d 0+0.142 _d 0*AAA+0.0764 _d 0*AAA*AAA) oceTauX(I,J)=CDAIR(I,J)* & (COSWIN*U1-SIGN(SINWIN, _fCori(I,J,bi,bj))*V1) oceTauY(I,J)=CDAIR(I,J)* & (SIGN(SINWIN, _fCori(I,J,bi,bj))*U1+COSWIN*V1) ENDDO ENDDO C-- Interpolate wind stress over open ocean (N/m^2) C from A-grid to U and V points of C-grid DO j=1-Oly+1,sNy+Oly DO i=1-Olx+1,sNx+Olx fu(I,J,bi,bj) = 0.5 _d 0*( oceTauX(I,J) + oceTauX(I-1,J) ) fv(I,J,bi,bj) = 0.5 _d 0*( oceTauY(I,J) + oceTauY(I,J-1) ) ENDDO ENDDO #endif /* ndef SEAICE_EXTERNAL_FLUXES */ C-- Now compute ice surface stress IF (useRelativeWind) THEN DO j=1-Oly,sNy+Oly DO i=1-Olx,sNx+Olx U1=UWIND(I,J,bi,bj) & + 0.5 _d 0 * (uVel(i,j,k,bi,bj)+uVel(i+1,j,k,bi,bj)) & - 0.5 _d 0 * (uice(i,j,bi,bj)+uice(i+1,j,bi,bj)) V1=VWIND(I,J,bi,bj) & + 0.5 _d 0 * (vVel(i,j,k,bi,bj)+vVel(i,j+1,k,bi,bj)) & - 0.5 _d 0 * (vice(i,j,bi,bj)+vice(i,j+1,bi,bj)) AAA=U1**2+V1**2 IF ( AAA .LE. SEAICE_EPS_SQ ) THEN AAA=SEAICE_EPS ELSE AAA=SQRT(AAA) ENDIF IF ( YC(I,J,bi,bj) .LT. ZERO ) THEN CDAIR(I,J) = SEAICE_rhoAir*SEAICE_drag_south*AAA ELSE CDAIR(I,J) = SEAICE_rhoAir*SEAICE_drag*AAA ENDIF ENDDO ENDDO ELSE DO j=1-Oly,sNy+Oly DO i=1-Olx,sNx+Olx U1=UWIND(I,J,bi,bj) V1=VWIND(I,J,bi,bj) AAA=U1**2+V1**2 IF ( AAA .LE. SEAICE_EPS_SQ ) THEN AAA=SEAICE_EPS ELSE AAA=SQRT(AAA) ENDIF IF ( YC(I,J,bi,bj) .LT. ZERO ) THEN CDAIR(I,J) = SEAICE_rhoAir*SEAICE_drag_south*AAA ELSE CDAIR(I,J) = SEAICE_rhoAir*SEAICE_drag*AAA ENDIF ENDDO ENDDO ENDIF IF (useRelativeWind) THEN DO j=1-Oly+1,sNy+Oly DO i=1-Olx+1,sNx+Olx C interpolate to U points taux(I,J,bi,bj)= 0.5 _d 0 * & (CDAIR(I,J)*(COSWIN* & (uWind(I,J,bi,bj) & +0.5 _d 0*(uVel(i,j,k,bi,bj)+uVel(i+1,j,k,bi,bj)) & -0.5 _d 0*(uice(i,j,bi,bj)+uice(i+1,j,bi,bj))) & -SIGN(SINWIN, _fCori(I,J,bi,bj))* & (vWind(I,J,bi,bj) & +0.5 _d 0*(vVel(i,j,k,bi,bj)+vVel(i,j+1,k,bi,bj)) & -0.5 _d 0*(vice(i,j,bi,bj)+vice(i,j+1,bi,bj)))) & +CDAIR(I-1,J)*(COSWIN* & (uWind(I-1,J,bi,bj) & +0.5 _d 0*(uVel(i-1,j,k,bi,bj)+uVel(i,j,k,bi,bj)) & -0.5 _d 0*(uice(i-1,j,bi,bj)+uice(i,j,bi,bj))) & -SIGN(SINWIN, _fCori(I-1,J,bi,bj))* & (vWind(I-1,J,bi,bj) & +0.5 _d 0*(vVel(i-1,j,k,bi,bj)+vVel(i-1,j+1,k,bi,bj)) & -0.5 _d 0*(vice(i-1,j,bi,bj)+vice(i-1,j+1,bi,bj))))) C interpolate to V points tauy(I,J,bi,bj)= 0.5 _d 0 * & (CDAIR(I,J)*(SIGN(SINWIN, _fCori(I,J,bi,bj))* & (uWind(I,J,bi,bj) & +0.5 _d 0*(uVel(i,j,k,bi,bj)+uVel(i+1,j,k,bi,bj)) & -0.5 _d 0*(uice(i,j,bi,bj)+uice(i+1,j,bi,bj))) & +COSWIN* & (vWind(I,J,bi,bj) & +0.5 _d 0*(vVel(i,j,k,bi,bj)+vVel(i,j+1,k,bi,bj)) & -0.5 _d 0*(vice(i,j,bi,bj)+vice(i,j+1,bi,bj)))) & +CDAIR(I,J-1)*(SIGN(SINWIN, _fCori(I,J-1,bi,bj))* & (uWind(I,J-1,bi,bj) & +0.5 _d 0*(uVel(i,j-1,k,bi,bj)+uVel(i+1,j-1,k,bi,bj)) & -0.5 _d 0*(uice(i,j-1,bi,bj)+uice(i+1,j-1,bi,bj))) & +COSWIN* & (vWind(I,J-1,bi,bj) & +0.5 _d 0*(vVel(i,j-1,k,bi,bj)+vVel(i,j,k,bi,bj)) & -0.5 _d 0*(vice(i,j-1,bi,bj)+vice(i,j,bi,bj))))) ENDDO ENDDO ELSE DO j=1-Oly+1,sNy+Oly DO i=1-Olx+1,sNx+Olx C interpolate to U points taux(I,J,bi,bj)=0.5 _d 0 * & ( CDAIR(I ,J)*( & COSWIN *uWind(I ,J,bi,bj) & -SIGN(SINWIN, _fCori(I ,J,bi,bj))*vWind(I ,J,bi,bj) ) & + CDAIR(I-1,J)*( & COSWIN *uWind(I-1,J,bi,bj) & -SIGN(SINWIN, _fCori(I-1,J,bi,bj))*vWind(I-1,J,bi,bj) ) & ) C interpolate to V points tauy(I,J,bi,bj)=0.5 _d 0 * & ( CDAIR(I,J )*( & SIGN(SINWIN, _fCori(I,J ,bi,bj))*uWind(I,J ,bi,bj) & +COSWIN*vWind(I,J ,bi,bj) ) & + CDAIR(I,J-1)*( & SIGN(SINWIN, _fCori(I,J-1,bi,bj))*uWind(I,J-1,bi,bj) & +COSWIN*vWind(I,J-1,bi,bj) ) & ) ENDDO ENDDO ENDIF ENDDO ENDDO #else /* not SEAICE_EXTERNAL_FLUXES or ALLOW_ATM_WIND */ C-- Wind stress is available on U and V points, copy it to seaice variables. DO bj=myByLo(myThid),myByHi(myThid) DO bi=myBxLo(myThid),myBxHi(myThid) DO j=1-Oly,sNy+Oly DO i=1-Olx,sNx+Olx C now ice surface stress IF ( YC(I,J,bi,bj) .LT. ZERO ) THEN CDAIR(I,J) = SEAICE_drag_south/OCEAN_drag ELSE CDAIR(I,J) = SEAICE_drag /OCEAN_drag ENDIF taux (I,J,bi,bj) = CDAIR(I,J)*FU(I,J,bi,bj) tauy (I,J,bi,bj) = CDAIR(I,J)*FV(I,J,bi,bj) ENDDO ENDDO ENDDO ENDDO #endif /* not SEAICE_EXTERNAL_FLUXES or ALLOW_ATM_WIND */ #endif /* SEAICE_CGRID */ RETURN END