SURFEX v7.3
General documentation of Surfex
|
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