SURFEX v7.3
General documentation of Surfex
|
00001 ! ######### 00002 SUBROUTINE PREP_ISBA(HPROGRAM,HATMFILE,HATMFILETYPE,HPGDFILE,HPGDFILETYPE) 00003 ! ################################################################################# 00004 ! 00005 !!**** *PREP_ISBA* - Prepares ISBA fields 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 P. Le Moigne (11/2004): AGS fields 00025 !! Modified by B. Decharme (2008) : Floodplains 00026 !! Modified by B. Decharme (01/2009): Consistency with Arpege deep soil 00027 !! temperature 00028 !! Modified by B. Decharme (03/2009): Consistency with Arpege permanent 00029 !! snow/ice treatment 00030 !! A.L. Gibelin 04/2009 : BIOMASS and RESP_BIOMASS arrays 00031 !! A.L. Gibelin 06/2009 : Soil carbon variables for CNT option 00032 !! Modified by S. Riette (06/2009): PREP_ISBA_CANOPY has no more arg. 00033 !! Modified by S. Riette (04/2010): ecmwf ice content is computed during 00034 !! grib reading (no longer here) 00035 !! B. Decharme (10/2012): coherence between soil temp and liquid/solid water with DIF 00036 !! bug in biomass prognostic fields calculation 00037 !! 00038 !!------------------------------------------------------------------ 00039 ! 00040 ! 00041 USE MODI_PREP_HOR_ISBA_FIELD 00042 USE MODI_PREP_VER_ISBA 00043 USE MODI_PREP_OUTPUT_GRID 00044 USE MODI_GET_LUOUT 00045 USE MODI_PREP_ISBA_CANOPY 00046 ! 00047 USE MODD_READ_NAMELIST, ONLY : LNAM_READ 00048 USE MODD_SURF_ATM, ONLY : LVERTSHIFT 00049 USE MODD_DATA_COVER_PAR, ONLY : NVT_SNOW 00050 ! 00051 USE MODD_ISBA_n, ONLY : TSNOW, XRESA, XTSRAD_NAT, XEMIS, XLAI, XVEG, & 00052 XZ0, XALBNIR_VEG, XALBVIS_VEG, XALBUV_VEG, & 00053 CPHOTO, CRESPSL, XAN, XANFM, XANDAY, XLE, & 00054 NNBIOMASS, NNLITTER, NNLITTLEVS, NNSOILCARB, & 00055 XBSLAI, XBSLAI_NITRO, XBIOMASS, XRESP_BIOMASS, & 00056 XLITTER, XSOILCARB, XLIGNIN_STRUC, & 00057 NPATCH, XWSAT, XWG, XWGI, CISBA, XTG, LCANOPY, & 00058 LFLOOD, XZ0_FLOOD, XPATCH, CALBEDO, & 00059 XVEGTYPE_PATCH, LGLACIER, XICE_STO, & 00060 XPSN, XPSNG, XPSNV, XDIR_ALB_WITH_SNOW, & 00061 XSCA_ALB_WITH_SNOW, NGROUND_LAYER, XMPOTSAT, & 00062 XBCOEF 00063 ! 00064 USE MODD_DEEPSOIL, ONLY : LPHYSDOMC 00065 USE MODD_CSTS, ONLY : XTT, XG, XLMTT 00066 USE MODD_SNOW_PAR, ONLY : XZ0SN, XEMISSN 00067 USE MODD_ISBA_PAR, ONLY : XWGMIN 00068 ! 00069 USE MODD_ISBA_GRID_n, ONLY : CGRID, XGRID_PAR, XLAT, XLON 00070 USE MODD_CO2V_PAR, ONLY : XANFMINIT, XCA_NIT, XCC_NIT 00071 USE MODD_SURF_PAR, ONLY : XUNDEF 00072 USE MODD_PREP, ONLY : XZS_LS 00073 ! 00074 USE MODN_PREP_ISBA 00075 ! 00076 USE MODI_VEGTYPE_TO_PATCH 00077 USE MODI_PREP_PERM_SNOW 00078 USE MODI_INIT_SNOW_LW 00079 USE MODI_AVERAGED_ALBEDO_EMIS_ISBA 00080 ! 00081 ! 00082 USE YOMHOOK ,ONLY : LHOOK, DR_HOOK 00083 USE PARKIND1 ,ONLY : JPRB 00084 ! 00085 USE MODI_CLEAN_PREP_OUTPUT_GRID 00086 ! 00087 IMPLICIT NONE 00088 ! 00089 !* 0.1 declarations of arguments 00090 ! 00091 CHARACTER(LEN=6), INTENT(IN) :: HPROGRAM ! program calling surf. schemes 00092 CHARACTER(LEN=28), INTENT(IN) :: HATMFILE ! name of the Atmospheric file 00093 CHARACTER(LEN=6), INTENT(IN) :: HATMFILETYPE! type of the Atmospheric file 00094 CHARACTER(LEN=28), INTENT(IN) :: HPGDFILE ! name of the Atmospheric file 00095 CHARACTER(LEN=6), INTENT(IN) :: HPGDFILETYPE! type of the Atmospheric file 00096 ! 00097 !* 0.2 declarations of local variables 00098 ! 00099 INTEGER :: ILUOUT, INI 00100 INTEGER :: JP, JL, JJ 00101 INTEGER :: ISNOW ! patch number where permanent snow is 00102 REAL :: ZWORK, ZLOG, ZWTOT, ZMATPOT 00103 ! 00104 REAL, DIMENSION(1) :: ZSW_BANDS ! middle wavelength of each band 00105 REAL, DIMENSION(SIZE(XLAI,1),SIZE(XLAI,2)) :: ZDIR_ALB ! direct albedo for each band 00106 REAL, DIMENSION(SIZE(XLAI,1),SIZE(XLAI,2)) :: ZSCA_ALB ! diffuse albedo for each band 00107 REAL, DIMENSION(SIZE(XLAI,1)) :: ZEMIS ! emissivity 00108 REAL, DIMENSION(SIZE(XLAI,1)) :: ZZENITH ! solar zenithal angle 00109 REAL, DIMENSION(SIZE(XLAI,1),SIZE(XLAI,2)) :: ZALBNIR ! near-infra-red albedo (-) 00110 REAL, DIMENSION(SIZE(XLAI,1),SIZE(XLAI,2)) :: ZALBVIS ! visible albedo (-) 00111 REAL, DIMENSION(SIZE(XLAI,1),SIZE(XLAI,2)) :: ZALBUV ! UV albedo (-) 00112 REAL, DIMENSION(SIZE(XLAI,1),SIZE(XLAI,2)) :: ZALBNIR_SOIL ! soil near-infra-red albedo (-) 00113 REAL, DIMENSION(SIZE(XLAI,1),SIZE(XLAI,2)) :: ZALBVIS_SOIL ! soil visible albedo (-) 00114 REAL, DIMENSION(SIZE(XLAI,1),SIZE(XLAI,2)) :: ZALBUV_SOIL ! soil UV albedo (-) 00115 ! 00116 REAL(KIND=JPRB) :: ZHOOK_HANDLE 00117 ! 00118 !------------------------------------------------------------------------------------- 00119 ! 00120 !* 1. Default of configuration 00121 ! 00122 !* 1.1 Default 00123 ! 00124 ! 00125 IF (LHOOK) CALL DR_HOOK('PREP_ISBA',0,ZHOOK_HANDLE) 00126 CALL GET_LUOUT(HPROGRAM,ILUOUT) 00127 ! 00128 CALL PREP_OUTPUT_GRID(ILUOUT,CGRID,XGRID_PAR,XLAT,XLON) 00129 ! 00130 !------------------------------------------------------------------------------------- 00131 ! 00132 !* 2. Reading and horizontal interpolations 00133 ! 00134 ! 00135 !* 2.0 Large scale orography 00136 ! 00137 CALL PREP_HOR_ISBA_FIELD(HPROGRAM,'ZS ',HATMFILE,HATMFILETYPE,HPGDFILE,HPGDFILETYPE) 00138 ! 00139 !* 2.1 Soil Water reservoirs 00140 ! 00141 CALL PREP_HOR_ISBA_FIELD(HPROGRAM,'WG ',HATMFILE,HATMFILETYPE,HPGDFILE,HPGDFILETYPE) 00142 ! 00143 !* 2.2 Soil ice reservoirs 00144 ! 00145 CALL PREP_HOR_ISBA_FIELD(HPROGRAM,'WGI ',HATMFILE,HATMFILETYPE,HPGDFILE,HPGDFILETYPE) 00146 ! 00147 !* 2.3 Leaves interception water reservoir 00148 ! 00149 CALL PREP_HOR_ISBA_FIELD(HPROGRAM,'WR ',HATMFILE,HATMFILETYPE,HPGDFILE,HPGDFILETYPE) 00150 ! 00151 !* 2.4 Temperature profile 00152 ! 00153 CALL PREP_HOR_ISBA_FIELD(HPROGRAM,'TG ',HATMFILE,HATMFILETYPE,HPGDFILE,HPGDFILETYPE) 00154 ! 00155 !* 2.5 Snow variables 00156 ! 00157 CALL PREP_HOR_ISBA_FIELD(HPROGRAM,'SN_VEG ',HATMFILE,HATMFILETYPE,HPGDFILE,HPGDFILETYPE) 00158 ! 00159 !* 2.6 LAI 00160 ! 00161 CALL PREP_HOR_ISBA_FIELD(HPROGRAM,'LAI ',HATMFILE,HATMFILETYPE,HPGDFILE,HPGDFILETYPE) 00162 ! 00163 !------------------------------------------------------------------------------------- 00164 CALL CLEAN_PREP_OUTPUT_GRID 00165 !------------------------------------------------------------------------------------- 00166 ! 00167 !* 3. Physical limitation: 00168 ! 00169 ! No ice for force restore third layer: 00170 IF (CISBA == '3-L') THEN 00171 DO JP=1,NPATCH 00172 WHERE(XWG(:,3,JP) /= XUNDEF) 00173 XWG(:,3,JP) = MIN(XWG(:,3,JP)+XWGI(:,3,JP),XWSAT(:,3)) 00174 XWGI(:,3,JP) = 0. 00175 END WHERE 00176 ENDDO 00177 ENDIF 00178 ! 00179 ! Total water content should not exceed saturation: 00180 DO JP=1,NPATCH 00181 WHERE(XWG(:,:,JP) /= XUNDEF .AND. (XWG(:,:,JP) + XWGI(:,:,JP)) > XWSAT(:,:) ) 00182 XWGI(:,:,JP) = XWSAT(:,:) - XWG(:,:,JP) 00183 END WHERE 00184 ENDDO 00185 ! 00186 !------------------------------------------------------------------------------------- 00187 ! 00188 !* 3. Vertical interpolations of all variables 00189 ! 00190 IF(LVERTSHIFT)THEN 00191 CALL PREP_VER_ISBA 00192 ENDIF 00193 ! 00194 DEALLOCATE(XZS_LS) 00195 !------------------------------------------------------------------------------------- 00196 ! 00197 !* 4. Treatment of permanent snow 00198 ! 00199 IF(LGLACIER)THEN 00200 ALLOCATE(XICE_STO(SIZE(XLAI,1),SIZE(XLAI,2))) 00201 XICE_STO(:,:) = 0.0 00202 ENDIF 00203 ! 00204 ISNOW = VEGTYPE_TO_PATCH(NVT_SNOW,NPATCH) 00205 CALL PREP_PERM_SNOW(TSNOW,XTG(:,:,ISNOW),XVEGTYPE_PATCH(:,:,ISNOW),ISNOW) 00206 CALL INIT_SNOW_LW(XEMISSN,TSNOW) 00207 ! 00208 IF (LPHYSDOMC) THEN 00209 TSNOW%WSNOW(:,:,:)=0. 00210 ENDIF 00211 ! 00212 !------------------------------------------------------------------------------------- 00213 ! 00214 !* 5. coherence between soil temperature and liquid/solid water 00215 ! 00216 IF (CISBA == 'DIF') THEN 00217 INI=SIZE(XWSAT,1) 00218 DO JP=1,NPATCH 00219 DO JL=1,NGROUND_LAYER 00220 DO JJ=1,INI 00221 IF(XWG(JJ,JL,JP)/=XUNDEF)THEN 00222 ! 00223 ! total soil moisture 00224 ZWTOT = XWG(JJ,JL,JP)+XWGI(JJ,JL,JP) 00225 ZWTOT = MIN(ZWTOT,XWSAT(JJ,JL)) 00226 ! 00227 ! total matric potential 00228 ! psi=mpotsat*(w/wsat)**(-bcoef) 00229 ZWORK = ZWTOT/XWSAT(JJ,JL) 00230 ZLOG = XBCOEF(JJ,JL)*LOG(ZWORK) 00231 ZMATPOT = XMPOTSAT(JJ,JL)*EXP(-ZLOG) 00232 ! 00233 ! soil liquid water content computation 00234 ! w=wsat*(psi/mpotsat)**(-1/bcoef) 00235 ZMATPOT = ZMATPOT + XLMTT*MIN(0.0,XTG(JJ,JL,JP)-XTT)/(XG*XTG(JJ,JL,JP)) 00236 ZWORK = MAX(1.0,ZMATPOT/XMPOTSAT(JJ,JL)) 00237 ZLOG = LOG(ZWORK) 00238 XWG(JJ,JL,JP) = XWSAT(JJ,JL)*EXP(-ZLOG/XBCOEF(JJ,JL)) 00239 XWG(JJ,JL,JP) = MAX(XWGMIN,XWG(JJ,JL,JP)) 00240 ! 00241 ! soil ice computation 00242 XWGI(JJ,JL,JP) = MAX(0.0,ZWTOT-XWG(JJ,JL,JP)) 00243 ! 00244 ! supress numerical artefact 00245 IF(XTG(JJ,JL,JP)>=XTT)THEN 00246 XWG (JJ,JL,JP) = MIN(XWG(JJ,JL,JP)+XWGI(JJ,JL,JP),XWSAT(JJ,JL)) 00247 XWGI(JJ,JL,JP) = 0.0 00248 ENDIF 00249 ! 00250 ENDIF 00251 ENDDO 00252 ENDDO 00253 ENDDO 00254 ENDIF 00255 ! 00256 !------------------------------------------------------------------------------------- 00257 ! 00258 !* 6. Half prognostic fields 00259 ! 00260 ALLOCATE(XRESA(SIZE(XLAI,1),SIZE(XLAI,2))) 00261 XRESA = 100. 00262 ! 00263 ALLOCATE(XTSRAD_NAT(SIZE(XLAI,1))) 00264 ZALBNIR_SOIL(:,:)=0. 00265 ZALBVIS_SOIL(:,:)=0. 00266 ZALBUV_SOIL(:,:)=0. 00267 ZZENITH(:)=0. 00268 ZSW_BANDS(:)=0. 00269 ALLOCATE(XPSN (SIZE(XLAI,1),SIZE(XLAI,2))) 00270 ALLOCATE(XPSNG(SIZE(XLAI,1),SIZE(XLAI,2))) 00271 ALLOCATE(XPSNV(SIZE(XLAI,1),SIZE(XLAI,2))) 00272 XPSN = 0.0 00273 XPSNG = 0.0 00274 XPSNV = 0.0 00275 ALLOCATE(XDIR_ALB_WITH_SNOW(SIZE(XLAI,1),1,SIZE(XLAI,2))) 00276 ALLOCATE(XSCA_ALB_WITH_SNOW(SIZE(XLAI,1),1,SIZE(XLAI,2))) 00277 XDIR_ALB_WITH_SNOW = 0.0 00278 XSCA_ALB_WITH_SNOW = 0.0 00279 CALL AVERAGED_ALBEDO_EMIS_ISBA(.FALSE., CALBEDO, ZZENITH, & 00280 XVEG,XZ0,XLAI,XTG(:,1,:), & 00281 XPATCH, ZSW_BANDS, & 00282 XALBNIR_VEG,XALBVIS_VEG,XALBUV_VEG, & 00283 ZALBNIR_SOIL,ZALBVIS_SOIL,ZALBUV_SOIL, & 00284 XEMIS, & 00285 TSNOW, & 00286 ZALBNIR,ZALBVIS,ZALBUV, & 00287 ZDIR_ALB, ZSCA_ALB, & 00288 ZEMIS,XTSRAD_NAT ) 00289 DEALLOCATE(XPSN) 00290 DEALLOCATE(XPSNG) 00291 DEALLOCATE(XPSNV) 00292 DEALLOCATE(XDIR_ALB_WITH_SNOW) 00293 DEALLOCATE(XSCA_ALB_WITH_SNOW) 00294 ! 00295 !------------------------------------------------------------------------------------- 00296 ! 00297 !* 7. Isba-Ags prognostic fields 00298 ! 00299 IF (CPHOTO /= 'NON') THEN 00300 ! 00301 ALLOCATE(XAN(SIZE(XLAI,1),SIZE(XLAI,2))) 00302 XAN = 0. 00303 ! 00304 ALLOCATE(XANDAY(SIZE(XLAI,1),SIZE(XLAI,2))) 00305 XANDAY = 0. 00306 ! 00307 ALLOCATE(XANFM(SIZE(XLAI,1),SIZE(XLAI,2))) 00308 XANFM = XANFMINIT 00309 ! 00310 ALLOCATE(XLE(SIZE(XLAI,1),SIZE(XLAI,2))) 00311 XLE = 0. 00312 ! 00313 ENDIF 00314 ! 00315 IF (CPHOTO == 'AGS' .OR. CPHOTO == 'AST') THEN 00316 ! 00317 ALLOCATE(XBIOMASS(SIZE(XLAI,1),NNBIOMASS,SIZE(XLAI,2))) 00318 XBIOMASS(:,1,:) = 0. 00319 ! 00320 ALLOCATE(XRESP_BIOMASS(SIZE(XLAI,1),NNBIOMASS,SIZE(XLAI,2))) 00321 XRESP_BIOMASS(:,:,:) = 0. 00322 ! 00323 ELSEIF (CPHOTO == 'LAI' .OR. CPHOTO == 'LST') THEN 00324 ! 00325 ALLOCATE(XBIOMASS(SIZE(XLAI,1),NNBIOMASS,SIZE(XLAI,2))) 00326 WHERE(XLAI(:,:)/=XUNDEF) 00327 XBIOMASS(:,1,:) = XLAI(:,:) * XBSLAI(:,:) 00328 ELSEWHERE 00329 XBIOMASS(:,1,:) = 0.0 00330 ENDWHERE 00331 ! 00332 ALLOCATE(XRESP_BIOMASS(SIZE(XLAI,1),NNBIOMASS,SIZE(XLAI,2))) 00333 XRESP_BIOMASS(:,:,:) = 0. 00334 ! 00335 ELSEIF (CPHOTO == 'NIT' .OR. CPHOTO == 'NCB') THEN 00336 ! 00337 ALLOCATE(XBIOMASS(SIZE(XLAI,1),NNBIOMASS,SIZE(XLAI,2))) 00338 WHERE(XLAI(:,:)/=XUNDEF) 00339 XBIOMASS(:,1,:) = XLAI(:,:) * XBSLAI_NITRO(:,:) 00340 ELSEWHERE 00341 XBIOMASS(:,1,:) = 0.0 00342 ENDWHERE 00343 XBIOMASS(:,2,:) = MAX( 0., (XBIOMASS(:,1,:)/ (XCC_NIT/10.**XCA_NIT)) & 00344 **(1.0/(1.0-XCA_NIT)) - XBIOMASS(:,1,:) ) 00345 XBIOMASS(:,3:NNBIOMASS,:) = 0. 00346 ! 00347 ALLOCATE(XRESP_BIOMASS(SIZE(XLAI,1),NNBIOMASS,SIZE(XLAI,2))) 00348 XRESP_BIOMASS(:,:,:) = 0. 00349 ! 00350 ENDIF 00351 ! 00352 !------------------------------------------------------------------------------------- 00353 ! 00354 !* 8. Isba-CC prognostic fields 00355 ! 00356 IF (CRESPSL == 'CNT') THEN 00357 ! 00358 ALLOCATE(XLITTER(SIZE(XLAI,1),NNLITTER,NNLITTLEVS,SIZE(XLAI,2))) 00359 XLITTER(:,:,:,:) = 0. 00360 ! 00361 ALLOCATE(XSOILCARB(SIZE(XLAI,1),NNSOILCARB,SIZE(XLAI,2))) 00362 XSOILCARB(:,:,:) = 0. 00363 ! 00364 ALLOCATE(XLIGNIN_STRUC(SIZE(XLAI,1),NNLITTLEVS,SIZE(XLAI,2))) 00365 XLIGNIN_STRUC(:,:,:) = 0. 00366 ! 00367 ENDIF 00368 ! 00369 !------------------------------------------------------------------------------------- 00370 ! 00371 !* 9. Floodplains scheme 00372 ! 00373 IF(LFLOOD)THEN 00374 ALLOCATE(XZ0_FLOOD(SIZE(XLAI,1),SIZE(XLAI,2))) 00375 XZ0_FLOOD(:,:) = XZ0SN 00376 ENDIF 00377 ! 00378 !------------------------------------------------------------------------------------- 00379 ! 00380 !* 10. Preparation of canopy air variables 00381 ! 00382 ! 00383 LCANOPY = LISBA_CANOPY 00384 IF (LCANOPY) CALL PREP_ISBA_CANOPY() 00385 IF (LHOOK) CALL DR_HOOK('PREP_ISBA',1,ZHOOK_HANDLE) 00386 ! 00387 !------------------------------------------------------------------------------------- 00388 ! 00389 END SUBROUTINE PREP_ISBA