SURFEX v7.3
General documentation of Surfex
 All Classes Files Functions Variables Typedefs
/home/dasprezs/EXPORT_v7_3/src/SURFEX/prep_ver_isba.F90
Go to the documentation of this file.
00001 !     #########
00002 SUBROUTINE PREP_VER_ISBA
00003 !     #################################################################################
00004 !
00005 !!****  *PREP_VER_ISBA* - 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 !!      S. Riette   04/2010 Modification of XTG corrections after freezing
00026 !!------------------------------------------------------------------
00027 !
00028 
00029 !
00030 USE MODD_ISBA_n,          ONLY : XZS, XTG, XWG, XWGI, XWSAT, TSNOW, &
00031                                    CISBA, XDG, NGROUND_LAYER,         &
00032                                    LTEMP_ARP, NTEMPLAYER_ARP  
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_PREP_ISBA,      ONLY : LSNOW_IDEAL
00037 USE MODD_CSTS,           ONLY : XTT, XDAY, XLMTT, XRHOLW
00038 !
00039 USE MODE_THERMOS
00040 USE MODI_PREP_VER_SNOW
00041 !
00042 !
00043 USE YOMHOOK   ,ONLY : LHOOK,   DR_HOOK
00044 USE PARKIND1  ,ONLY : JPRB
00045 !
00046 IMPLICIT NONE
00047 !
00048 !*      0.1    declarations of arguments
00049 !
00050 !
00051 !*      0.2    declarations of local variables
00052 !
00053 INTEGER                         :: JL        ! loop counter on layers
00054 INTEGER                         :: JP        ! loop counter on patches
00055 INTEGER                         :: IWORK     ! Work integer
00056 !
00057 REAL, DIMENSION(:), ALLOCATABLE :: ZWGTOT    ! total water content
00058 REAL, DIMENSION(:), ALLOCATABLE :: ZDW       ! variation of water in soil
00059 REAL, DIMENSION(:), ALLOCATABLE :: ZZSFREEZE ! altitude where soil temperature equals XTT
00060 INTEGER                         :: IDEEP_SOIL! layer corresponding to deep soil temperature
00061 !
00062 REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZWGI_CLIM_GRAD ! ice content vertical gradient
00063 !
00064 REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZTG_LS! temperature on initial orography
00065 !
00066 REAL                            :: ZGRADX = 5.E-4 ! slope of ice content gradient
00067 REAL                            :: ZH0    = 5.E-1 ! constant used to define ice content gradient
00068 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00069 !-------------------------------------------------------------------------------------
00070 !
00071 !*      1.0    Ice content climatologic gradient
00072 !
00073 IF (LHOOK) CALL DR_HOOK('PREP_VER_ISBA',0,ZHOOK_HANDLE)
00074 ALLOCATE(ZWGI_CLIM_GRAD (SIZE(XWG,1),SIZE(XWG,2),SIZE(XWG,3)))
00075 !
00076 ZWGI_CLIM_GRAD(:,:,:) = ZGRADX * EXP( - XDG(:,:,:) / ZH0 )
00077 !-------------------------------------------------------------------------------------
00078 !
00079 !*      1.1    Temperature profile
00080 !
00081 ALLOCATE(ZTG_LS(SIZE(XTG,1),SIZE(XTG,2),SIZE(XTG,3)))
00082 ZTG_LS(:,:,:) = XTG(:,:,:)
00083 !
00084 DO JP=1,SIZE(XTG,3)
00085   DO JL=1,SIZE(XTG,2)
00086     WHERE(XTG(:,JL,JP)/=XUNDEF) &
00087       XTG(:,JL,JP) = XTG(:,JL,JP) + XT_CLIM_GRAD  * (XZS - XZS_LS)  
00088   END DO
00089 END DO
00090 !
00091 !-------------------------------------------------------------------------------------
00092 !
00093 !*      1.2    Water and ice in the soil
00094 !
00095 ALLOCATE(ZZSFREEZE      (SIZE(XWG,1)))
00096 ALLOCATE(ZWGTOT         (SIZE(XWG,1)))
00097 ALLOCATE(ZDW            (SIZE(XWG,1)))
00098 !
00099 !* general case
00100 !
00101 IF(LTEMP_ARP)THEN
00102   IWORK=SIZE(XWG,2)
00103 ELSE
00104   IWORK=SIZE(XTG,2)
00105 ENDIF
00106 !
00107 DO JP=1,SIZE(XWG,3)
00108   !
00109   DO JL=1,IWORK
00110     !
00111     ZDW(:) = 0.
00112     ! altitude where deep soil freezes (diurnal surface response is not treated)
00113     ZZSFREEZE(:) = XZS + (XTT - XTG(:,JL,JP)) / XT_CLIM_GRAD
00114     !
00115     WHERE(XTG(:,JL,JP)/=XUNDEF) 
00116       !
00117       WHERE (ZTG_LS(:,JL,JP) < XTT)
00118         !
00119         WHERE (XZS <= XZS_LS)
00120           !
00121           WHERE (XZS > ZZSFREEZE) 
00122             ZDW(:) = ZWGI_CLIM_GRAD(:,JL,JP) * (XZS - XZS_LS)
00123           ELSEWHERE
00124             ZDW(:) = ZWGI_CLIM_GRAD(:,JL,JP) * (ZZSFREEZE - XZS_LS) + ZGRADX * (XZS - ZZSFREEZE)
00125           ENDWHERE
00126           !
00127         ELSEWHERE
00128           !
00129           ZDW(:) = ZWGI_CLIM_GRAD(:,JL,JP) * (XZS - XZS_LS)
00130           !
00131         ENDWHERE
00132         !
00133       ELSEWHERE
00134         !
00135         WHERE (XZS <= XZS_LS)
00136           !
00137           ZDW(:) = ZGRADX * (XZS - XZS_LS)
00138           !
00139         ELSEWHERE
00140           !
00141           ZDW(:) = ZWGI_CLIM_GRAD(:,JL,JP) * (XZS - ZZSFREEZE)
00142           !
00143         END WHERE
00144         !
00145       END WHERE 
00146       !
00147       ZWGTOT(:) = XUNDEF
00148       !
00149       WHERE(XWG(:,JL,JP)/=XUNDEF)        
00150         ZWGTOT(:) = XWG(:,JL,JP) + XWGI(:,JL,JP)
00151       ENDWHERE
00152       !
00153       WHERE(XWG(:,JL,JP)/=XUNDEF)        
00154         XWGI(:,JL,JP) = XWGI(:,JL,JP) + ZDW(:)
00155         XWG (:,JL,JP) = XWG (:,JL,JP) - ZDW(:)
00156       ENDWHERE
00157       !
00158       WHERE (XWGI(:,JL,JP)<0.0.AND.XWGI(:,JL,JP)/=XUNDEF) 
00159         XWGI(:,JL,JP) = 0.
00160         XWG (:,JL,JP) = ZWGTOT(:)
00161       END WHERE
00162       !
00163       WHERE (XWG(:,JL,JP)<XWGMIN.AND.XWG(:,JL,JP)/=XUNDEF)
00164         XWG (:,JL,JP) = XWGMIN
00165         XWGI(:,JL,JP) = ZWGTOT(:) - XWGMIN
00166       END WHERE
00167       !
00168       WHERE(XWGI(:,JL,JP)>0.0.AND.XWGI(:,JL,JP)/=XUNDEF)
00169         XTG(:,JL,JP) = MIN(XTT,XTG(:,JL,JP))
00170       ELSEWHERE
00171         XTG(:,JL,JP) = MAX(XTT,XTG(:,JL,JP))
00172       ENDWHERE
00173       !
00174     END WHERE
00175     !
00176   END DO
00177   !
00178 END DO
00179 !
00180 !* limits in force-restore case
00181 !
00182 IF (CISBA=='3-L') THEN 
00183   DO JP=1,SIZE(XWG,3)
00184      WHERE (XWGI(:,3,JP) /= XUNDEF)
00185        XWG (:,3,JP) = XWG(:,3,JP)+XWGI(:,3,JP)
00186        XWGI(:,3,JP) = 0.
00187        XTG (:,3,JP) = ZTG_LS(:,3,JP) + XT_CLIM_GRAD  * (XZS - XZS_LS)       
00188      END WHERE
00189      IF(LTEMP_ARP)THEN
00190         XTG (:,4:SIZE(XTG,2),JP) = ZTG_LS(:,4:SIZE(XTG,2),JP)
00191      ENDIF
00192   END DO
00193 ELSEIF(CISBA=='2-L'.AND.LTEMP_ARP) THEN
00194   DO JP=1,SIZE(XWG,3)
00195      XTG (:,3:SIZE(XTG,2),JP) = ZTG_LS(:,3:SIZE(XTG,2),JP)
00196   END DO
00197 END IF
00198 !
00199 DEALLOCATE(ZZSFREEZE)
00200 DEALLOCATE(ZWGI_CLIM_GRAD)
00201 DEALLOCATE(ZWGTOT   )
00202 DEALLOCATE(ZDW      )
00203 !
00204 !* masks where fields are not defined
00205 WHERE (XTG(:,1:SIZE(XWG,2),:) == XUNDEF)
00206   XWG (:,:,:) = XUNDEF
00207   XWGI(:,:,:) = XUNDEF
00208 END WHERE
00209 !
00210 !-------------------------------------------------------------------------------------
00211 !
00212 !*      1.4    Snow variables
00213 !
00214 !* vertical shift
00215 IF (.NOT.LSNOW_IDEAL) THEN
00216   IF (CISBA=='DIF') THEN
00217     IDEEP_SOIL = NGROUND_LAYER
00218   ELSE
00219     IDEEP_SOIL = 2
00220   END IF        
00221   CALL PREP_VER_SNOW(TSNOW,XZS_LS,XZS,ZTG_LS,XTG,IDEEP_SOIL)
00222 ENDIF
00223 !
00224 !-------------------------------------------------------------------------------------
00225 !
00226 !*      2.     Deallocation of large-scale orography
00227 !
00228 DEALLOCATE(ZTG_LS)
00229 IF (LHOOK) CALL DR_HOOK('PREP_VER_ISBA',1,ZHOOK_HANDLE)
00230 !-------------------------------------------------------------------------------------
00231 !
00232 END SUBROUTINE PREP_VER_ISBA