isba_snow_frac.F90 Source File


Contents

Source Code


Source Code

!SFX_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier
!SFX_LIC This is part of the SURFEX software governed by the CeCILL version 2.1
!SFX_LIC version 1. See LICENSE, Licence_CeCILL_V2.1-en.txt and Licence_CeCILL_V2.1-fr.txt  
!SFX_LIC for details. version 1.
!     #########
      SUBROUTINE ISBA_SNOW_FRAC(HSNOW, PWSNOW, PRSNOW, PASNOW,       &
                                PVEG, PLAI, PZ0, PPSN, PPSNV_A, PPSNG, PPSNV )  
!     ##########################################################################
!
!!****  *ISBA_SNOW_FRAC*  
!!
!!    PURPOSE
!!    -------
!
!     Calculates grid-averaged albedo and emissivity (according to snow scheme)
!         
!!    EXTERNAL
!!    --------
!!
!!    none
!!
!!    IMPLICIT ARGUMENTS
!!    ------------------ 
!!      
!!    AUTHOR
!!    ------
!!
!!      S. Belair           * Meteo-France *
!-------------------------------------------------------------------------------
!
!*       0.     DECLARATIONS
!               ------------
!
USE MODD_SNOW_PAR   , ONLY : XEMISSN, XEMCRIN, XSNOWDMIN, &
                             XRHOSMAX_ES, XRHOSMIN_ES, &
                             XWCRN_EXPL, XDCRN_EXPL
!
USE MODD_PREP_SNOW, ONLY : LSNOW_FRAC_TOT
!
USE MODE_SURF_SNOW_FRAC
!
!
USE YOMHOOK   ,ONLY : LHOOK,   DR_HOOK
USE PARKIND1  ,ONLY : JPRB
!
IMPLICIT NONE
!
!*      0.1    declarations of arguments
!
 CHARACTER(LEN=*)    , INTENT(IN)   :: HSNOW      ! ISBA snow scheme
!
REAL, DIMENSION(:,:), INTENT(IN)   :: PWSNOW     ! snow reservoir
REAL, DIMENSION(:,:), INTENT(IN)   :: PRSNOW     ! snow density
REAL, DIMENSION(:)  , INTENT(IN)   :: PASNOW     ! snow albedo
REAL, DIMENSION(:)  , INTENT(IN)   :: PVEG
REAL, DIMENSION(:)  , INTENT(IN)   :: PLAI
REAL, DIMENSION(:)  , INTENT(IN)   :: PZ0
REAL, DIMENSION(:)  , INTENT(INOUT):: PPSN
REAL, DIMENSION(:)  , INTENT(INOUT):: PPSNV_A
REAL, DIMENSION(:)  , INTENT(INOUT):: PPSNG
REAL, DIMENSION(:)  , INTENT(INOUT):: PPSNV
!                                     PVEG = fraction of vegetation
!                                     PLAI = leaf area index
!                                     PZ0  = roughness length for momentum
!                                     PPSN = grid fraction covered by snow
!                                     PPSNG = fraction of the ground covered by snow 
!                                     PPSNV = fraction of the veg covered by snow 
!
!-------------------------------------------------------------------------------
!
!*      0.     Local variables
!              ---------------
!
INTEGER                          :: JLAYER
REAL, DIMENSION(SIZE(PVEG))      :: ZSNOWSWE
REAL, DIMENSION(SIZE(PVEG))      :: ZSNOWD
REAL, DIMENSION(SIZE(PVEG))      :: ZSNOWRHO
REAL(KIND=JPRB) :: ZHOOK_HANDLE
!
!-------------------------------------------------------------------------------
!
IF (LHOOK) CALL DR_HOOK('ISBA_SNOW_FRAC',0,ZHOOK_HANDLE)
!
!*      1.     Compute Total SWE (kg m-2) and snowpack average density (kg m-3)
!              ----------------------------------------------------------------
!
ZSNOWSWE(:) = 0.
!
DO JLAYER=1,SIZE(PWSNOW,2)
  ZSNOWSWE(:) = ZSNOWSWE(:) + PWSNOW(:,JLAYER)
END DO
!
IF (HSNOW == '3-L' .OR. HSNOW == 'CRO') THEN                  
   ZSNOWD  (:) = 0.
   DO JLAYER=1,SIZE(PWSNOW,2)
     ZSNOWD  (:) = ZSNOWD(:) + PWSNOW(:,JLAYER) / PRSNOW(:,JLAYER)
   END DO
   ZSNOWRHO(:) = ZSNOWSWE(:)/MAX(XSNOWDMIN,ZSNOWD(:))
   ZSNOWRHO(:) = MAX(XRHOSMIN_ES,MIN(XRHOSMAX_ES,ZSNOWRHO(:)))
ELSE
   ZSNOWRHO(:) = PRSNOW(:,1)
END IF
!
!*      2.     Snow fraction over ground
!              -------------------------
!
IF (HSNOW == 'CRO' .OR. HSNOW == '3-L') THEN
   PPSNG(:) = MIN(1.0, ZSNOWD(:)/XDCRN_EXPL)
ELSE
   PPSNG(:) = SNOW_FRAC_GROUND(ZSNOWSWE)
ENDIF
!
!*      3.     Snow fraction over vegetation
!              -----------------------------
!
IF (HSNOW == 'EBA' ) THEN
   PPSNV_A(:) = SNOW_FRAC_VEG_A (PPSNG,PLAI,PASNOW)
   PPSNV  (:) = PPSNV_A(:)
ELSE
   PPSNV  (:) = SNOW_FRAC_VEG   (PPSNG,ZSNOWSWE,PZ0,ZSNOWRHO)
ENDIF
!
!*      4.     Total snow fraction
!              -------------------
!
PPSN(:)       = SNOW_FRAC_NAT(ZSNOWSWE,PPSNG,PPSNV,PVEG)
!
IF (LSNOW_FRAC_TOT) THEN
  PPSN (:) = MIN(1.0, ZSNOWSWE(:)/XWCRN_EXPL)      
  PPSNG(:) = PPSN(:)
  PPSNV(:) = PPSN(:)
ENDIF
!
IF (LHOOK) CALL DR_HOOK('ISBA_SNOW_FRAC',1,ZHOOK_HANDLE)
!
!-------------------------------------------------------------------------------
!
END SUBROUTINE ISBA_SNOW_FRAC