SURFEX v7.3
General documentation of Surfex
 All Classes Files Functions Variables Typedefs
/home/dasprezs/EXPORT_v7_3/src/SURFEX/prep_ver_snow.F90
Go to the documentation of this file.
00001 !     #########
00002 SUBROUTINE PREP_VER_SNOW(TPSNOW,PZS_LS,PZS,PTG_LS,PTG,KDEEP_SOIL)
00003 !          ###########################################
00004 !
00005 !
00006 !!****  *PREP_VER_SNOW* - change in snow variables due to altitude change
00007 !!
00008 !!    PURPOSE
00009 !!    -------
00010 !
00011 !!**  METHOD
00012 !!    ------
00013 !!
00014 !!    REFERENCE
00015 !!    ---------
00016 !!      
00017 !!
00018 !!    AUTHOR
00019 !!    ------
00020 !!     V. Masson 
00021 !!
00022 !!    MODIFICATIONS
00023 !!    -------------
00024 !!      Original    01/2004
00025 !!------------------------------------------------------------------
00026 !
00027 
00028 USE MODD_TYPE_SNOW
00029 USE MODD_CSTS,       ONLY : XTT
00030 USE MODD_PREP,       ONLY : XT_CLIM_GRAD
00031 USE MODD_PREP_SNOW,  ONLY : XWSNOW_CLIM_GRAD
00032 USE MODD_SURF_PAR,   ONLY : XUNDEF
00033 !
00034 USE MODI_SNOW_HEAT_TO_T_WLIQ
00035 USE MODI_SNOW_T_WLIQ_TO_HEAT
00036 USE MODI_MKFLAG_SNOW
00037 !
00038 !
00039 USE YOMHOOK   ,ONLY : LHOOK,   DR_HOOK
00040 USE PARKIND1  ,ONLY : JPRB
00041 !
00042 IMPLICIT NONE
00043 !
00044 !*      0.1    declarations of arguments
00045 !
00046 TYPE(SURF_SNOW), INTENT(INOUT) :: TPSNOW ! snow mantel characteristics
00047 REAL, DIMENSION(:), INTENT(IN) :: PZS_LS ! initial orography
00048 REAL, DIMENSION(:), INTENT(IN) :: PZS    ! final   orography
00049 REAL, DIMENSION(:,:,:),INTENT(IN),OPTIONAL:: PTG_LS ! soil temperature on initial orography
00050 REAL, DIMENSION(:,:,:),INTENT(IN),OPTIONAL:: PTG    ! soil temperature on final   orography
00051 INTEGER,               INTENT(IN),OPTIONAL:: KDEEP_SOIL ! index of deep soil temperature
00052 !
00053 !*      0.2    declarations of local variables
00054 !
00055 INTEGER                             :: IPATCH    ! number of patches
00056 INTEGER                             :: JPATCH    ! loop counter on patches
00057 INTEGER                             :: JLAYER    ! loop counter on snow layers
00058 REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZWSNOW_LS ! snow reservoir   on initial orography
00059 REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZTSNOW_LS ! snow temperature on initial orography
00060 REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZWSNOW    ! snow content     on final   orography
00061 REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZTSNOW    ! snow temperature on final   orography
00062 REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZWSNOW2   ! snow content     on final   orography
00063 REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZTSNOW2   ! snow temperature on final   orography
00064 REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZWLIQ     ! snow liquid water content
00065 REAL, DIMENSION(:,:),   ALLOCATABLE :: ZZSFREEZE ! altitude where deep soil freezes
00066 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00067 !
00068 !-------------------------------------------------------------------------------------
00069 !
00070 IF (LHOOK) CALL DR_HOOK('PREP_VER_SNOW',0,ZHOOK_HANDLE)
00071 IPATCH = SIZE(TPSNOW%WSNOW,3)
00072 !
00073 !*       1.    Snow reservoir on initial orography
00074 !              -----------------------------------
00075 !
00076 ALLOCATE(ZWSNOW_LS(SIZE(TPSNOW%WSNOW,1),SIZE(TPSNOW%WSNOW,2),IPATCH))
00077 ZWSNOW_LS(:,:,:) =  TPSNOW%WSNOW(:,:,:)
00078 !
00079 !-------------------------------------------------------------------------------------
00080 !
00081 !*       2.    temperature of snow on initial orography
00082 !              ----------------------------------------
00083 !
00084 ALLOCATE(ZTSNOW_LS(SIZE(TPSNOW%WSNOW,1),SIZE(TPSNOW%WSNOW,2),IPATCH))
00085 SELECT CASE(TPSNOW%SCHEME)
00086   CASE ('D95','EBA')
00087     IF (PRESENT(PTG_LS)) THEN
00088       DO JPATCH=1,IPATCH
00089         ZTSNOW_LS(:,1,JPATCH) =  MIN(PTG_LS(:,1,JPATCH),XTT)
00090       END DO
00091     ELSE
00092       ZTSNOW_LS = XUNDEF
00093     END IF
00094   CASE ('1-L')
00095     ZTSNOW_LS(:,:,:) =  TPSNOW%T(:,:,:)
00096   CASE ('3-L','CRO')
00097     CALL SNOW_HEAT_TO_T_WLIQ(TPSNOW%HEAT(:,:,:),TPSNOW%RHO(:,:,:),ZTSNOW_LS(:,:,:))
00098 END SELECT
00099 !
00100 !-------------------------------------------------------------------------------------
00101 !
00102 !*       3.    vertical shift of temperature
00103 !              -----------------------------
00104 !
00105 ALLOCATE(ZTSNOW(SIZE(TPSNOW%WSNOW,1),SIZE(TPSNOW%WSNOW,2),IPATCH))
00106 DO JPATCH=1,IPATCH
00107   DO JLAYER=1,TPSNOW%NLAYER
00108     ZTSNOW(:,JLAYER,JPATCH) = ZTSNOW_LS(:,JLAYER,JPATCH) + XT_CLIM_GRAD  * (PZS(:) - PZS_LS(:))  
00109   END DO
00110 END DO
00111 !
00112 !-------------------------------------------------------------------------------------
00113 !
00114 !*       4.    vertical shift of snow content where snow already exists
00115 !              ------------------------------
00116 !
00117 !* use of climatological snow content gradient
00118 !
00119 ALLOCATE(ZWSNOW(SIZE(TPSNOW%WSNOW,1),SIZE(TPSNOW%WSNOW,2),IPATCH))
00120 !
00121 ZWSNOW(:,:,:) = ZWSNOW_LS(:,:,:) 
00122 !
00123 IF (PRESENT(PTG)) THEN
00124   DO JPATCH=1,IPATCH
00125     DO JLAYER=1,TPSNOW%NLAYER
00126       WHERE(ZWSNOW_LS(:,JLAYER,JPATCH)>0..AND.((PTG(:,KDEEP_SOIL,JPATCH)-XTT >= 2.).OR.(PZS(:) > PZS_LS(:))))
00127         ZWSNOW(:,JLAYER,JPATCH) = ZWSNOW_LS(:,JLAYER,JPATCH) + XWSNOW_CLIM_GRAD  * (PZS(:) - PZS_LS(:))  
00128         ZWSNOW(:,JLAYER,JPATCH) = MAX(ZWSNOW(:,JLAYER,JPATCH),0.)
00129       END WHERE
00130     END DO
00131   END DO
00132 ELSE
00133   DO JPATCH=1,IPATCH
00134     DO JLAYER=1,TPSNOW%NLAYER
00135       WHERE(ZWSNOW_LS(:,JLAYER,JPATCH)>0.)
00136         ZWSNOW(:,JLAYER,JPATCH) = ZWSNOW_LS(:,JLAYER,JPATCH) + XWSNOW_CLIM_GRAD  * (PZS(:) - PZS_LS(:))
00137         ZWSNOW(:,JLAYER,JPATCH) = MAX(ZWSNOW(:,JLAYER,JPATCH),0.)
00138       END WHERE
00139     END DO
00140   END DO
00141 ENDIF
00142 !
00143 WHERE(TPSNOW%WSNOW(:,:,:)/=XUNDEF) TPSNOW%WSNOW = ZWSNOW
00144 !
00145 !-------------------------------------------------------------------------------------
00146 !
00147 !        5.    Where snow did not exist on initial orography
00148 !              ---------------------------------------------
00149 !
00150 !* in this case, new snow can appear only if orography differences in larger
00151 !  than 1000m, and starts at an altitude where the deep soil temperature becomes negative
00152 !
00153 !* the same climatological gradient is used, but the value zero for the snow
00154 !  content is defined as the altitude where deep soil freezes.
00155 !
00156 !*       5.1   Altitude where deep soil freezes (only if soil temperatures are provided)
00157 !              --------------------------------
00158 !
00159 IF (PRESENT(PTG)) THEN
00160   ALLOCATE(ZZSFREEZE(SIZE(TPSNOW%WSNOW,1),IPATCH))
00161   DO JPATCH=1,IPATCH
00162     ZZSFREEZE(:,JPATCH) = PZS &
00163                           + (XTT - PTG(:,KDEEP_SOIL,JPATCH)) / XT_CLIM_GRAD  
00164   END DO
00165 !
00166 !*       5.2   Amount and Temperature of new snow (only if soil temperatures are provided)
00167 !              ----------------------------------
00168 !
00169 !* Snow temperature is then defined as the deep soil temperature at the final
00170 !  altitude.
00171 !
00172   ALLOCATE(ZWSNOW2(SIZE(TPSNOW%WSNOW,1),TPSNOW%NLAYER,IPATCH))
00173   ALLOCATE(ZTSNOW2(SIZE(TPSNOW%WSNOW,1),TPSNOW%NLAYER,IPATCH))
00174   DO JPATCH=1,IPATCH
00175     DO JLAYER=1,TPSNOW%NLAYER
00176       ZWSNOW2(:,JLAYER,JPATCH) =  XWSNOW_CLIM_GRAD  * (PZS(:) - ZZSFREEZE(:,JPATCH))
00177       ZWSNOW2(:,JLAYER,JPATCH) = MAX(ZWSNOW2(:,JLAYER,JPATCH),0.)
00178       ZTSNOW2      (:,JLAYER,JPATCH) = PTG(:,KDEEP_SOIL,JPATCH)
00179     END DO
00180   END DO
00181 !
00182 !*       5.3   Apply maximum between this value and the shifted one
00183 !              ----------------------------------------------------
00184 !
00185   DO JPATCH=1,IPATCH
00186     DO JLAYER=1,TPSNOW%NLAYER
00187       WHERE(TPSNOW%WSNOW(:,JLAYER,JPATCH)/=XUNDEF .AND. ZWSNOW_LS(:,JLAYER,JPATCH)==0. &
00188                                                     .AND. (PZS(:)-PZS_LS(:))>1000. )  
00189         TPSNOW%WSNOW(:,JLAYER,JPATCH) = ZWSNOW2(:,JLAYER,JPATCH)
00190         ZTSNOW      (:,JLAYER,JPATCH) = ZTSNOW2(:,JLAYER,JPATCH)
00191       END WHERE
00192     END DO
00193   END DO
00194 
00195   DEALLOCATE(ZZSFREEZE)
00196   DEALLOCATE(ZWSNOW2  )
00197   DEALLOCATE(ZTSNOW2  )
00198 END IF
00199 !
00200 !-------------------------------------------------------------------------------------
00201 !
00202 !*       6.    Coherence between temperature and snow content
00203 !              ----------------------------------------------
00204 !
00205 SELECT CASE(TPSNOW%SCHEME)
00206   CASE('1-L')
00207     !* snow temperature cannot be larger than 0 C
00208     TPSNOW%T (:,:,:) = MIN ( ZTSNOW(:,:,:), XTT ) 
00209   CASE('3-L','CRO')
00210     ALLOCATE(ZWLIQ(SIZE(TPSNOW%WSNOW,1),SIZE(TPSNOW%WSNOW,2),IPATCH))
00211     CALL SNOW_T_WLIQ_TO_HEAT(TPSNOW%HEAT,TPSNOW%RHO,ZTSNOW)
00212     CALL SNOW_HEAT_TO_T_WLIQ(TPSNOW%HEAT,TPSNOW%RHO,ZTSNOW,ZWLIQ)
00213     CALL SNOW_T_WLIQ_TO_HEAT(TPSNOW%HEAT,TPSNOW%RHO,ZTSNOW,ZWLIQ)
00214     DEALLOCATE(ZWLIQ)
00215 END SELECT
00216 !
00217 !-------------------------------------------------------------------------------------
00218 !
00219 !*       7.    Masking where there is no snow
00220 !              ------------------------------
00221 !
00222  CALL MKFLAG_SNOW(TPSNOW)
00223 !
00224 !-------------------------------------------------------------------------------------
00225 DEALLOCATE(ZWSNOW_LS)
00226 DEALLOCATE(ZTSNOW_LS)
00227 DEALLOCATE(ZWSNOW   )
00228 DEALLOCATE(ZTSNOW   )
00229 IF (LHOOK) CALL DR_HOOK('PREP_VER_SNOW',1,ZHOOK_HANDLE)
00230 !-------------------------------------------------------------------------------------
00231 !
00232 END SUBROUTINE PREP_VER_SNOW