SURFEX v7.3
General documentation of Surfex
 All Classes Files Functions Variables Typedefs
/home/dasprezs/EXPORT_v7_3/src/SURFEX/prep_ver_teb_garden.F90
Go to the documentation of this file.
00001 !     #########
00002 SUBROUTINE PREP_VER_TEB_GARDEN
00003 !     #################################################################################
00004 !
00005 !!****  *PREP_VER_TEB_GARDEN* - change in ISBA fields due to altitude change
00006 !!
00007 !!    PURPOSE
00008 !!    -------
00009 !
00010 !!**  METHOD
00011 !!    ------
00012 !!
00013 !!    REFERENCE
00014 !!    ---------
00015 !!      
00016 !!
00017 !!    AUTHOR
00018 !!    ------
00019 !!     V. Masson 
00020 !!
00021 !!    MODIFICATIONS
00022 !!    -------------
00023 !!      Original    01/2004
00024 !!      Modified by B. Decharme  (01/2009), Optional Arpege deep soil temperature initialization
00025 !!------------------------------------------------------------------
00026 !
00027 
00028 !
00029 USE MODD_TEB_n,          ONLY : XZS
00030 USE MODD_TEB_VEG_n,      ONLY : CISBA
00031 USE MODD_TEB_GARDEN_n,   ONLY : XTG, XWG, XWGI, XWSAT, TSNOW, &
00032                                  XDG, NGROUND_LAYER  
00033 USE MODD_ISBA_PAR,       ONLY : XWGMIN
00034 USE MODD_SURF_PAR,       ONLY : XUNDEF
00035 USE MODD_PREP,           ONLY : XZS_LS, XT_CLIM_GRAD
00036 USE MODD_CSTS,           ONLY : XTT, XDAY, XLMTT, XRHOLW
00037 !
00038 USE MODE_THERMOS
00039 USE MODI_PREP_VER_SNOW
00040 !
00041 !
00042 USE YOMHOOK   ,ONLY : LHOOK,   DR_HOOK
00043 USE PARKIND1  ,ONLY : JPRB
00044 !
00045 IMPLICIT NONE
00046 !
00047 !*      0.1    declarations of arguments
00048 !
00049 !
00050 !*      0.2    declarations of local variables
00051 !
00052 INTEGER                         :: JL        ! loop counter on layers
00053 INTEGER                         :: IWORK     ! Work integer
00054 !
00055 REAL, DIMENSION(:), ALLOCATABLE :: ZWGTOT    ! total water content
00056 REAL, DIMENSION(:), ALLOCATABLE :: ZDW       ! variation of water in soil
00057 REAL, DIMENSION(:), ALLOCATABLE :: ZZSFREEZE ! altitude where soil temperature equals XTT
00058 INTEGER                         :: IDEEP_SOIL! layer corresponding to deep soil temperature
00059 !
00060 REAL, DIMENSION(:,:), ALLOCATABLE :: ZWGI_CLIM_GRAD ! ice content vertical gradient
00061 !
00062 REAL, DIMENSION(:,:), ALLOCATABLE :: ZTG_LS! temperature on initial orography
00063 !
00064 REAL                            :: ZGRADX = 5.E-4 ! slope of ice content gradient
00065 REAL                            :: ZH0    = 5.E-1 ! constant used to define ice content gradient
00066 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00067 !-------------------------------------------------------------------------------------
00068 !
00069 !*      1.0    Ice content climatologic gradient
00070 !
00071 IF (LHOOK) CALL DR_HOOK('PREP_VER_TEB_GARDEN',0,ZHOOK_HANDLE)
00072 ALLOCATE(ZWGI_CLIM_GRAD (SIZE(XWG,1),SIZE(XWG,2)))
00073 !
00074 ZWGI_CLIM_GRAD(:,:) = ZGRADX * EXP( - XDG(:,:) / ZH0 )
00075 !-------------------------------------------------------------------------------------
00076 !
00077 !*      1.1    Temperature profile
00078 !
00079 ALLOCATE(ZTG_LS(SIZE(XTG,1),SIZE(XTG,2)))
00080 ZTG_LS(:,:) = XTG(:,:)
00081 !
00082 DO JL=1,SIZE(XTG,2)
00083   WHERE(XTG(:,JL)/=XUNDEF) &
00084     XTG(:,JL) = XTG(:,JL) + XT_CLIM_GRAD  * (XZS - XZS_LS)  
00085 END DO
00086 !
00087 !-------------------------------------------------------------------------------------
00088 !
00089 !*      1.2    Water and ice in the soil
00090 !
00091 ALLOCATE(ZZSFREEZE      (SIZE(XWG,1)))
00092 ALLOCATE(ZWGTOT         (SIZE(XWG,1)))
00093 ALLOCATE(ZDW            (SIZE(XWG,1)))
00094 !
00095 !* general case
00096 !
00097 IWORK=SIZE(XTG,2)
00098 !
00099 DO JL=1,IWORK
00100   !
00101   ZDW(:) = 0.
00102   ! altitude where deep soil freezes (diurnal surface response is not treated)
00103   ZZSFREEZE(:) = XZS + (XTT - XTG(:,JL)) / XT_CLIM_GRAD
00104   !
00105   WHERE(XTG(:,JL)/=XUNDEF) 
00106     !
00107     WHERE (ZTG_LS(:,JL) < XTT)
00108       !
00109       WHERE (XZS <= XZS_LS)
00110         !
00111         WHERE (XZS > ZZSFREEZE) 
00112           ZDW(:) = ZWGI_CLIM_GRAD(:,JL) * (XZS - XZS_LS)
00113         ELSEWHERE
00114           ZDW(:) = ZWGI_CLIM_GRAD(:,JL) * (ZZSFREEZE - XZS_LS) + ZGRADX * (XZS - ZZSFREEZE)
00115         ENDWHERE
00116         !
00117       ELSEWHERE
00118         !
00119         ZDW(:) = ZWGI_CLIM_GRAD(:,JL) * (XZS - XZS_LS)
00120         !
00121       ENDWHERE
00122       !
00123     ELSEWHERE
00124       !
00125       WHERE (XZS <= XZS_LS)
00126         !
00127         ZDW(:) = ZGRADX * (XZS - XZS_LS)
00128         !
00129       ELSEWHERE
00130         !
00131         ZDW(:) = ZWGI_CLIM_GRAD(:,JL) * (XZS - ZZSFREEZE)
00132         !
00133       END WHERE
00134       !
00135     END WHERE
00136     !
00137     ZWGTOT(:) = XUNDEF
00138     !
00139     WHERE(XWG(:,JL)/=XUNDEF)         
00140       ZWGTOT(:) = XWG(:,JL) + XWGI(:,JL)
00141     ENDWHERE        
00142     !
00143     WHERE(XWG(:,JL)/=XUNDEF)      
00144       XWGI(:,JL) = XWGI(:,JL) + ZDW(:)
00145       XWG (:,JL) = XWG (:,JL) - ZDW(:)
00146     ENDWHERE
00147     !
00148     WHERE (XWGI(:,JL) < 0..AND.XWGI(:,JL)/=XUNDEF) 
00149       XWGI(:,JL) = 0.
00150       XWG (:,JL) = ZWGTOT(:)
00151     END WHERE
00152     !
00153     WHERE (XWG(:,JL) < XWGMIN.AND.XWG(:,JL)/=XUNDEF)
00154       XWG (:,JL) = XWGMIN
00155       XWGI(:,JL) = ZWGTOT(:) - XWGMIN
00156     END WHERE
00157     !
00158     WHERE(XWGI(:,JL) > 0..AND.XWGI(:,JL)/=XUNDEF)
00159       XTG(:,JL) = MIN(XTT,XTG(:,JL))
00160     ELSEWHERE
00161       XTG(:,JL) = MAX(XTT,XTG(:,JL))
00162     ENDWHERE
00163     !
00164   ENDWHERE
00165   !
00166 END DO
00167 !
00168 !* limits in force-restore case
00169 !
00170 IF (CISBA=='3-L') THEN 
00171   WHERE (XWGI(:,3) /= XUNDEF)
00172     XWG (:,3) = XWG(:,3)+XWGI(:,3)
00173     XWGI(:,3) = 0.
00174     XTG (:,3) = ZTG_LS(:,3)
00175   END WHERE
00176 END IF
00177 !
00178 DEALLOCATE(ZZSFREEZE)
00179 DEALLOCATE(ZWGI_CLIM_GRAD)
00180 DEALLOCATE(ZWGTOT   )
00181 DEALLOCATE(ZDW      )
00182 !
00183 !* masks where fields are not defined
00184 WHERE (XTG(:,1:SIZE(XWG,2)) == XUNDEF)
00185   XWG (:,:) = XUNDEF
00186   XWGI(:,:) = XUNDEF
00187 END WHERE
00188 !
00189 !-------------------------------------------------------------------------------------
00190 !
00191 !*      1.4    Snow variables
00192 !
00193 !* vertical shift
00194 IF (CISBA=='DIF') THEN
00195   IDEEP_SOIL = NGROUND_LAYER
00196 ELSE
00197   IDEEP_SOIL = 2
00198 END IF
00199  CALL PREP_VER_SNOW(TSNOW,XZS_LS,XZS,SPREAD(ZTG_LS,3,1),SPREAD(XTG,3,1),IDEEP_SOIL)
00200 !
00201 !-------------------------------------------------------------------------------------
00202 !
00203 !*      2.     Deallocation of large-scale orography
00204 !
00205 DEALLOCATE(ZTG_LS)
00206 IF (LHOOK) CALL DR_HOOK('PREP_VER_TEB_GARDEN',1,ZHOOK_HANDLE)
00207 !-------------------------------------------------------------------------------------
00208 !
00209 END SUBROUTINE PREP_VER_TEB_GARDEN