--- trunk/libf/phylmd/calbeta.f 2008/02/27 13:16:39 3 +++ trunk/Sources/phylmd/Interface_surf/calbeta.f 2015/04/29 15:47:56 134 @@ -1,75 +1,58 @@ - SUBROUTINE calbeta(dtime,indice,knon,snow,qsol, - . vbeta,vcal,vdif) - use dimens_m - use indicesol - use dimphy - use iniprint - use YOMCST - IMPLICIT none -c====================================================================== -c Auteur(s): Z.X. Li (LMD/CNRS) (adaptation du GCM du LMD) -c date: 19940414 -c====================================================================== -c -c Calculer quelques parametres pour appliquer la couche limite -c ------------------------------------------------------------ - REAL tau_gl ! temps de relaxation pour la glace de mer -ccc PARAMETER (tau_gl=86400.0*30.0) - PARAMETER (tau_gl=86400.0*5.0) - REAL mx_eau_sol - PARAMETER (mx_eau_sol=150.0) -c - REAL calsol, calsno, calice ! epaisseur du sol: 0.15 m - PARAMETER (calsol=1.0/(2.5578E+06*0.15)) - PARAMETER (calsno=1.0/(2.3867E+06*0.15)) - PARAMETER (calice=1.0/(5.1444E+06*0.15)) -C - INTEGER i -c - REAL dtime - REAL snow(klon), qsol(klon) - INTEGER indice, knon -C - REAL vbeta(klon) - REAL vcal(klon) - REAL vdif(klon) -C - - IF (indice.EQ.is_oce) THEN - DO i = 1, knon - vcal(i) = 0.0 - vbeta(i) = 1.0 - vdif(i) = 0.0 - ENDDO - ENDIF -c - IF (indice.EQ.is_sic) THEN - DO i = 1, knon - vcal(i) = calice - IF (snow(i) .GT. 0.0) vcal(i) = calsno - vbeta(i) = 1.0 - vdif(i) = 1.0/tau_gl -ccc vdif(i) = calice/tau_gl ! c'etait une erreur - ENDDO - ENDIF -c - IF (indice.EQ.is_ter) THEN - DO i = 1, knon - vcal(i) = calsol - IF (snow(i) .GT. 0.0) vcal(i) = calsno - vbeta(i) = MIN(2.0*qsol(i)/mx_eau_sol, 1.0) - vdif(i) = 0.0 - ENDDO - ENDIF -c - IF (indice.EQ.is_lic) THEN - DO i = 1, knon - vcal(i) = calice - IF (snow(i) .GT. 0.0) vcal(i) = calsno - vbeta(i) = 1.0 - vdif(i) = 0.0 - ENDDO - ENDIF -c - RETURN - END +module calbeta_m + + IMPLICIT NONE + +contains + + SUBROUTINE calbeta(indice, snow, qsol, vbeta, vcal, vdif) + + ! Author: Z. X. Li (LMD/CNRS) + ! Date: April 14th, 1994 + + ! Calcul de quelques paramètres pour appliquer la couche limite. + + USE indicesol, ONLY: is_lic, is_oce, is_sic, is_ter + + INTEGER, intent(in):: indice + REAL, intent(in):: snow(:), qsol(:) ! (knon) + REAL, intent(out):: vbeta(:), vcal(:), vdif(:) ! (knon) + + ! Local: + + REAL, PARAMETER:: tau_gl = 86400. * 5. + ! temps de relaxation pour la glace de mer + + REAL, PARAMETER:: max_eau_sol = 150. ! in kg m-2 + + ! Pour une épaisseur du sol de 15 cm : + REAL, PARAMETER:: calsol = 1. / (2.5578E6 * 0.15) + REAL, PARAMETER:: calsno = 1. / (2.3867E6 * 0.15) + REAL, PARAMETER:: calice = 1. / (5.1444E6 * 0.15) + + !------------------------------------------------------------ + + select case (indice) + case(is_oce) + vbeta = 1. + vcal = 0. + vdif = 0. + + case (is_sic) + vbeta = 1. + vcal = merge(calsno, calice, snow > 0.) + vdif = 1. / tau_gl + + case (is_ter) + vbeta = min(2. * qsol / max_eau_sol, 1.) + vcal = merge(calsno, calsol, snow > 0.) + vdif = 0. + + case (is_lic) + vbeta = 1. + vcal = merge(calsno, calice, snow > 0.) + vdif = 0. + END select + + END SUBROUTINE calbeta + +end module calbeta_m