C $Header: /u/gcmpack/MITgcm/pkg/thsice/thsice_get_precip.F,v 1.4 2013/06/11 01:48:22 jmc Exp $ C $Name: $ #include "THSICE_OPTIONS.h" #ifdef ALLOW_BULK_FORCE # include "BULK_FORCE_OPTIONS.h" #endif #ifdef ALLOW_CHEAPAML # include "CHEAPAML_OPTIONS.h" #endif CBOP C !ROUTINE: THSICE_GET_PRECIP C !INTERFACE: SUBROUTINE THSICE_GET_PRECIP( I iceMsk, locSST, O precip, snowPrc, qPrcRnO, flxSW, I iMin,iMax,jMin,jMax, bi,bj, myThid ) C !DESCRIPTION: \bv C *==========================================================* C | S/R THSICE_GET_PRECIP C | Interface S/R : get Precip, Snow-precip C | and downward short-wave from pkg BULK_FORCE C | - or - get Precip, Snow-precip from pkg cheapAML C *==========================================================* C \ev C !USES: IMPLICIT NONE C == Global data == #include "SIZE.h" #include "EEPARAMS.h" #include "PARAMS.h" #ifdef ALLOW_BULK_FORCE # include "BULKF_PARAMS.h" # include "BULKF.h" #elif defined(ALLOW_CHEAPAML) # include "CHEAPAML.h" #endif C !INPUT/OUTPUT PARAMETERS: C === Routine arguments === C iceMsk :: sea-ice fraction: no ice=0, grid all ice 1 [] C locSST :: local Sea-Surface Temperature [deg.C] C precip :: Total Precipitation (including run-off) [kg/m2/s] C snowPrc :: Snow Precipitation [kg/m2/s] C qPrcRnO :: Energy content of Precip+RunOff (+=down) [W/m2] C flxSW :: Downward short-wave surface flux (+=down) [W/m2] C iMin,iMax :: range of indices of computation domain C jMin,jMax :: range of indices of computation domain C bi,bj :: current tile indices C myThid :: Thread no. that called this routine. _RL iceMsk (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy) _RL locSST (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy) _RL precip (1-OLx:sNx+OLx,1-OLy:sNy+OLy) _RL snowPrc(1-OLx:sNx+OLx,1-OLy:sNy+OLy) _RL qPrcRnO(1-OLx:sNx+OLx,1-OLy:sNy+OLy) _RL flxSW (1-OLx:sNx+OLx,1-OLy:sNy+OLy) INTEGER iMin,iMax INTEGER jMin,jMax INTEGER bi,bj INTEGER myThid CEOP #ifdef ALLOW_THSICE #if defined(ALLOW_BULK_FORCE) defined(ALLOW_CHEAPAML) C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----| C === Local variables === C i,j :: current grid point indices INTEGER i,j #ifdef ALLOW_BULK_FORCE IF ( useBulkforce ) THEN DO j = jMin, jMax DO i = iMin, iMax precip(i,j) = ( rain(i,j,bi,bj)+runoff(i,j,bi,bj) )*rhofw flxSW (i,j) = solar(i,j,bi,bj) ENDDO ENDDO c IF ( SnowFile .NE. ' ' ) THEN c ELSE C If specific snow precipitiation is not available, use C precipitation when ever the air temperature is below 0 degC DO j = jMin, jMax DO i = iMin, iMax IF ( iceMsk(i,j,bi,bj).GT.0. _d 0 & .AND. Tair(i,j,bi,bj).LE.Tf0kel ) THEN snowPrc(i,j) = rain(i,j,bi,bj)*rhofw ENDIF ENDDO ENDDO c ENDIF IF ( temp_EvPrRn .NE. UNSET_RL ) THEN C-- Account for energy content of Precip + RunOff : C assume 1) rain has same temp as Air (higher altitude, e.g., 850.mb would C be better); 2) Snow has no heat capacity (+ is counted separately) C 3) no distinction between sea-water Cp and fresh-water Cp C 4) Run-Off comes at the temp of surface water (with same Cp) DO j = jMin, jMax DO i = iMin, iMax qPrcRnO(i,j) = HeatCapacity_Cp*( & ( Tair(i,j,bi,bj) - Tf0kel - temp_EvPrRn ) & *( rain(i,j,bi,bj)*rhofw - snowPrc(i,j) ) & + ( locSST(i,j,bi,bj) - temp_EvPrRn ) & *runoff(i,j,bi,bj)*rhofw ) ENDDO ENDDO ENDIF C- end if useBulkforce ENDIF IF ( useCheapAML ) & STOP 'cannot use thsIce and CheapAML with BULK_FORCE compiled' #elif defined(ALLOW_CHEAPAML) IF ( useCheapAML ) THEN DO j = jMin, jMax DO i = iMin, iMax precip(i,j) = cheapPrecip(i,j,bi,bj) c & + runoff(i,j,bi,bj)*rhofw ENDDO ENDDO c IF ( SnowFile .NE. ' ' ) THEN c ELSE C If specific snow precipitiation is not available, use C precipitation when ever the air temperature is below 0 degC DO j = jMin, jMax DO i = iMin, iMax IF ( iceMsk(i,j,bi,bj).GT.0. _d 0 & .AND. Tair(i,j,bi,bj).LT.zeroRL ) THEN snowPrc(i,j) = cheapPrecip(i,j,bi,bj) ENDIF ENDDO ENDDO c ENDIF IF ( temp_EvPrRn .NE. UNSET_RL ) THEN C-- Account for energy content of Precip + RunOff : C assume 1) rain has same temp as Air (higher altitude, e.g., 850.mb would C be better); 2) Snow has no heat capacity (+ is counted separately) C 3) no distinction between sea-water Cp and fresh-water Cp DO j = jMin, jMax DO i = iMin, iMax qPrcRnO(i,j) = HeatCapacity_Cp* & ( Tair(i,j,bi,bj) - temp_EvPrRn ) & *( cheapPrecip(i,j,bi,bj) - snowPrc(i,j) ) c + HeatCapacity_Cp* c & ( locSST(i,j,bi,bj) - temp_EvPrRn ) c & *runoff(i,j,bi,bj)*rhofw ENDDO ENDDO ENDIF C- end if useCheapAML ENDIF #endif /* if ALLOW_BULK_FORCE elif ALLOW_CHEAPAML */ C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----| #endif /* ALLOW_BULK_FORCE or ALLOW_CHEAPAML */ #endif /* ALLOW_THSICE */ RETURN END