|
SURFEX v7.3
General documentation of Surfex
|
00001 ! ######### 00002 SUBROUTINE CARBON_EVOL(HISBA, HRESPSL, HPHOTO, PTSTEP, KSPINS, & 00003 PRHOA, PTG, PWG, PWFC, PWWILT, PWSAT, PSAND, & 00004 PDG, PDZG, KWG_LAYER, & 00005 PRE25, PLAI, PRESP_BIOMASS_INST, PTURNOVER, & 00006 PLITTER, PLIGNIN_STRUC, PSOILCARB, & 00007 PRESP_AUTO, PRESP_ECO ) 00008 ! ############################################################### 00009 !!**** *CARBON EVOL* 00010 !! 00011 !! PURPOSE 00012 !! ------- 00013 !! 00014 !! Diagnoses respiration carbon fluxes and performs the time evolution of 00015 !! carbon pools in the case of 'CNT' option (ISBA-CC) 00016 !! 00017 !!** METHOD 00018 !! ------ 00019 !! 00020 !! EXTERNAL 00021 !! -------- 00022 !! none 00023 !! 00024 !! IMPLICIT ARGUMENTS 00025 !! ------------------ 00026 !! 00027 !! none 00028 !! 00029 !! REFERENCE 00030 !! --------- 00031 !! 00032 !! Gibelin et al. 2008, AFM 00033 !! Modelling energy and CO2 fluxes with an interactive vegetation land surface model - 00034 !! Evaluation at high and middle latitudes. 00035 !! 00036 !! AUTHOR 00037 !! ------ 00038 !! 00039 !! A.L. Gibelin * Meteo-France * 00040 !! 00041 !! MODIFICATIONS 00042 !! ------------- 00043 !! Original 22/06/09 00044 !! S.QUEGUINER 09/2011 Cas 'DEF'- condition si LAI=UNDEF->ZRESP_SOIL_TOT=0 00045 !! C. Delire 04/2012 : spinup soil carbon 00046 !! B. Decharme 05/2012 : Optimization and ISBA-DIF coupling 00047 !! 00048 !------------------------------------------------------------------------------- 00049 ! 00050 !* 0. DECLARATIONS 00051 ! ------------ 00052 ! 00053 USE MODD_CO2V_PAR, ONLY : XMC, XMCO2, XPCCO2 00054 USE MODD_CSTS, ONLY : XDAY, XTT 00055 USE MODD_SURF_PAR, ONLY : XUNDEF 00056 ! 00057 USE MODI_CONTROL_MOIST_FUNC 00058 USE MODI_CONTROL_TEMP_FUNC 00059 USE MODI_CARBON_LITTER 00060 USE MODI_CARBON_SOIL 00061 00062 ! 00063 ! 00064 USE YOMHOOK ,ONLY : LHOOK, DR_HOOK 00065 USE PARKIND1 ,ONLY : JPRB 00066 ! 00067 IMPLICIT NONE 00068 ! 00069 !* 0.1 declarations of arguments 00070 ! 00071 CHARACTER(LEN=3),INTENT(IN) :: HISBA ! type of ISBA version: 00072 ! ! '2-L' (default) 00073 ! ! '3-L' 00074 ! ! 'DIF' 00075 CHARACTER(LEN=3), INTENT(IN) :: HRESPSL ! Soil Respiration 00076 ! ! 'DEF' = Norman 1992 00077 ! ! 'PRM' = Rivalland PhD Thesis (2003) 00078 ! ! 'CNT' = CENTURY model (Gibelin 2008) 00079 CHARACTER(LEN=3), INTENT(IN) :: HPHOTO ! type of photosynthesis 00080 ! 00081 REAL, INTENT(IN) :: PTSTEP ! time step 00082 INTEGER, INTENT(IN) :: KSPINS ! (spinup) number of times CARBON_SOIL subroutine 00083 ! is called for each time step 00084 ! 00085 REAL, DIMENSION(:), INTENT(IN) :: PRHOA ! air density (kg/m3) 00086 REAL, DIMENSION(:,:), INTENT(IN) :: PTG ! soil layer average temperatures (K) 00087 REAL, DIMENSION(:,:), INTENT(IN) :: PWG ! soil liquid volumetric water content (m3/m3) 00088 REAL, DIMENSION(:,:), INTENT(IN) :: PWFC ! field capacity profile (m3/m3) 00089 REAL, DIMENSION(:,:), INTENT(IN) :: PWWILT ! wilting point profile (m3/m3) 00090 REAL, DIMENSION(:,:), INTENT(IN) :: PWSAT ! porosity profile (m3/m3) 00091 REAL, DIMENSION(:,:), INTENT(IN) :: PSAND ! profile of sand fraction 00092 REAL, DIMENSION(:,:), INTENT(IN) :: PDG ! Depth of Bottom of Soil layers (m) 00093 REAL, DIMENSION(:,:), INTENT(IN) :: PDZG ! soil layers thicknesses (DIF option) (m) 00094 INTEGER, DIMENSION(:),INTENT(IN) :: KWG_LAYER ! Number of soil moisture layers (DIF option) 00095 ! 00096 REAL,DIMENSION(:), INTENT(IN) :: PRE25 ! Ecosystem respiration parameter (kg m-2 s-1) 00097 REAL, DIMENSION(:), INTENT(IN) :: PLAI ! leaf area index 00098 REAL, DIMENSION(:,:), INTENT(IN) :: PRESP_BIOMASS_INST ! instantaneous respiration of biomass (kgCO2/kgair m/s) 00099 REAL, DIMENSION(:,:), INTENT(IN) :: PTURNOVER ! biomass turnover going into litter (gC m-2 s-1) 00100 REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PLITTER ! litter pools (gC m-2) 00101 REAL, DIMENSION(:,:), INTENT(INOUT) :: PLIGNIN_STRUC ! L/C ratio in structural litter 00102 REAL, DIMENSION(:,:), INTENT(INOUT) :: PSOILCARB ! soil carbon pools (gC m-2) 00103 REAL, DIMENSION(:), INTENT(OUT) :: PRESP_AUTO ! autotrophic respiration (kgCO2/kgair m/s) 00104 REAL, DIMENSION(:), INTENT(OUT) :: PRESP_ECO ! total ecosystem respiration (kgCO2/kgair m/s) 00105 ! 00106 !* 0.2 declarations of local variables 00107 ! 00108 REAL, PARAMETER :: ZCOEF1 = 4.4E-8 00109 REAL, PARAMETER :: ZCOEF2 = 13.5 00110 REAL, PARAMETER :: ZCOEF3 = 5.4 00111 REAL, PARAMETER :: ZCOEF4 = 0.1 00112 REAL, PARAMETER :: ZCOEF5 = 25.0 00113 ! 00114 REAL, PARAMETER :: ZDTOP = 0.1 !Top depth m 00115 REAL, PARAMETER :: ZDSUB = 1.0 !Sub depth m 00116 ! 00117 REAL, DIMENSION(SIZE(PTG,1)) :: ZRESP_SOIL_TOT ! total soil respiration (kgCO2/kgair m/s) 00118 REAL, DIMENSION(SIZE(PTG,1)) :: ZRESP_AUTO_ABOVE ! total above ground biomass respiration (kgCO2/kgair m/s) 00119 REAL, DIMENSION(SIZE(PTG,1)) :: ZRESP_HETERO ! total heterotrophic respiration (kgCO2/kgair m/s) 00120 ! 00121 ! 00122 REAL, DIMENSION(SIZE(PSOILCARB,1),SIZE(PSOILCARB,2)) :: ZSOILCARBON_INPUT 00123 ! quantity of carbon going into carbon pools 00124 ! from litter decomposition (gC/m2/day) 00125 ! 00126 REAL, DIMENSION(SIZE(PSOILCARB,1)) :: ZRESP_HETERO_DAY_LITTER 00127 ! litter heterotrophic respiration (gC/m2/day) 00128 REAL, DIMENSION(SIZE(PSOILCARB,1)) :: ZRESP_HETERO_DAY_SOIL 00129 ! soil heterotrophic respiration (gC/m2/day) 00130 ! 00131 REAL, DIMENSION(SIZE(PLIGNIN_STRUC,1),SIZE(PLIGNIN_STRUC,2)) :: ZCONTROL_MOIST, 00132 ZCONTROL_TEMP 00133 ! ZCONTROL_MOIST = moisture control of heterotrophic respiration 00134 ! ZCONTROL_TEMP = temperature control of heterotrophic respiration 00135 ! 00136 REAL, DIMENSION(SIZE(PTG,1)) :: ZTG_TOP ! Top soil temperature (C) 00137 REAL, DIMENSION(SIZE(PTG,1)) :: ZTG_SUB ! Sub soil temperature (C) 00138 REAL, DIMENSION(SIZE(PTG,1)) :: ZSAND_SUB ! Sub soil sand fraction (-) 00139 ! 00140 REAL, DIMENSION(SIZE(PTG,1)) :: ZMOIST_TOP ! Top soil moisture index (-) 00141 REAL, DIMENSION(SIZE(PTG,1)) :: ZMOIST_SUB ! Sub soil moisture index (-) 00142 REAL, DIMENSION(SIZE(PTG,1)) :: ZSAT_TOP ! Top soil saturated index(-) 00143 REAL, DIMENSION(SIZE(PTG,1)) :: ZSAT_SUB ! Sub soil saturated index(-) 00144 ! 00145 REAL, DIMENSION(SIZE(PTG,1)) :: ZDG_TOP ! Top soil depth for DIF (m) 00146 REAL, DIMENSION(SIZE(PTG,1)) :: ZDG_SUB ! Sub soil depth for DIF (m) 00147 ! 00148 REAL, DIMENSION(SIZE(PTG,1),SIZE(PTG,2)) :: ZWGHT_TOP ! Weight top for DIF (m) 00149 REAL, DIMENSION(SIZE(PTG,1),SIZE(PTG,2)) :: ZWGHT_SUB ! Weight sub for DIF (m) 00150 ! 00151 REAL, DIMENSION(SIZE(PTG,1)) :: ZWORK ! work array 00152 ! 00153 REAL :: ZMOISTL, ZSATL, ZLOG2 00154 ! 00155 INTEGER :: JNBIOMASS 00156 INTEGER :: ITCSPIN 00157 ! 00158 INTEGER :: INI, INL, JI, JL, IDEPTH, INBIOMASS 00159 ! 00160 REAL(KIND=JPRB) :: ZHOOK_HANDLE 00161 ! 00162 !------------------------------------------------------------------------------- 00163 ! 00164 !* 1. Preliminaries 00165 ! ------------- 00166 ! 00167 IF (LHOOK) CALL DR_HOOK('CARBON_EVOL',0,ZHOOK_HANDLE) 00168 ! 00169 PRESP_AUTO = 0.0 00170 PRESP_ECO = 0.0 00171 ! 00172 INI=SIZE(PTG,1) 00173 INL=SIZE(PTG,2) 00174 INBIOMASS=SIZE(PRESP_BIOMASS_INST,2) 00175 ! 00176 ZRESP_SOIL_TOT(:) = XUNDEF 00177 ZRESP_AUTO_ABOVE(:) = XUNDEF 00178 ZRESP_HETERO(:) = XUNDEF 00179 ZSOILCARBON_INPUT(:,:) = XUNDEF 00180 ZRESP_HETERO_DAY_LITTER(:) = XUNDEF 00181 ZRESP_HETERO_DAY_SOIL(:) = XUNDEF 00182 ZCONTROL_MOIST(:,:) = XUNDEF 00183 ZCONTROL_TEMP(:,:) = XUNDEF 00184 ZWGHT_TOP(:,:) = XUNDEF 00185 ZWGHT_SUB(:,:) = XUNDEF 00186 ! 00187 ZTG_TOP (:) = 0.0 00188 ZTG_SUB (:) = 0.0 00189 ! 00190 ZLOG2 = LOG(2.0) 00191 ! 00192 ! convert soil temperature from K to C (over 1m depth for DIF) 00193 ! 00194 IF(HISBA/='DIF')THEN 00195 ZTG_TOP (:) = PTG(:,1)-XTT 00196 ZTG_SUB (:) = PTG(:,2)-XTT 00197 ELSE 00198 DO JI=1,INI 00199 IDEPTH=KWG_LAYER(JI) 00200 ZDG_TOP(JI)=MIN(ZDTOP,PDG(JI,IDEPTH)) 00201 ZDG_SUB(JI)=MIN(ZDSUB,PDG(JI,IDEPTH)) 00202 ENDDO 00203 DO JL=1,INL 00204 DO JI=1,INI 00205 ZWGHT_TOP(JI,JL)=MIN(PDZG(JI,JL),MAX(0.0,ZDG_TOP(JI)-PDG(JI,JL)+PDZG(JI,JL))) 00206 ZWGHT_SUB(JI,JL)=MIN(PDZG(JI,JL),MAX(0.0,ZDG_SUB(JI)-PDG(JI,JL)+PDZG(JI,JL))) 00207 ZTG_TOP(JI)=ZTG_TOP(JI)+(PTG(JI,JL)-XTT)*ZWGHT_TOP(JI,JL)/ZDG_TOP(JI) 00208 ZTG_SUB(JI)=ZTG_SUB(JI)+(PTG(JI,JL)-XTT)*ZWGHT_SUB(JI,JL)/ZDG_SUB(JI) 00209 ENDDO 00210 ENDDO 00211 ENDIF 00212 ! 00213 ! 00214 !* 2. Autotrophic respiration 00215 ! ----------------------- 00216 ! 00217 ZRESP_AUTO_ABOVE(:)=0. 00218 ! 00219 IF (HPHOTO=='NIT') THEN 00220 ! 00221 DO JNBIOMASS=1,2 00222 ZRESP_AUTO_ABOVE(:) = ZRESP_AUTO_ABOVE(:) + PRESP_BIOMASS_INST(:,JNBIOMASS) 00223 ENDDO 00224 ! 00225 ELSE IF (HPHOTO=='NCB') THEN 00226 ! 00227 DO JNBIOMASS=1,3 00228 ZRESP_AUTO_ABOVE(:) = ZRESP_AUTO_ABOVE(:) + PRESP_BIOMASS_INST(:,JNBIOMASS) 00229 ENDDO 00230 ! 00231 ELSE IF (HPHOTO=='AGS' .OR. HPHOTO=='AST' .OR. HPHOTO=='LAI' .OR. HPHOTO=='LST') THEN 00232 ! 00233 ZRESP_AUTO_ABOVE(:) = PRESP_BIOMASS_INST(:,1) 00234 ! 00235 ENDIF 00236 ! 00237 DO JNBIOMASS=1,INBIOMASS 00238 PRESP_AUTO(:) = PRESP_AUTO (:) + PRESP_BIOMASS_INST(:,JNBIOMASS) 00239 ENDDO 00240 ! 00241 ! 00242 !* 3. Soil and ecosystem respiration 00243 ! ------------------------------ 00244 ! 00245 IF (HRESPSL == 'DEF') THEN 00246 ! 00247 ZWORK(:)=0.0 00248 ! 00249 IF(HISBA/='DIF')THEN 00250 ZWORK (:) = PWG (:,1) 00251 ELSE 00252 DO JL=1,INL 00253 DO JI=1,INI 00254 ZWORK(JI)=ZWORK(JI)+PWG(JI,JL)*ZWGHT_TOP(JI,JL)/ZDG_TOP(JI) 00255 ENDDO 00256 ENDDO 00257 ENDIF 00258 ! 00259 ! Soil respiration from Norman et al 1992 (kgCO2/kgair m/s) 00260 ! 00261 WHERE (PLAI(:) == XUNDEF) 00262 ZRESP_SOIL_TOT(:) = 0.0 00263 ELSEWHERE 00264 ! Before optimization = (ZCOEF1/PRHOA)*(ZCOEF2+ZCOEF3*PLAI(:))*PWG(:,1)*2.**(ZCOEF4*(ZT2(:)-ZCOEF5)) 00265 ZRESP_SOIL_TOT(:) = (ZCOEF1/PRHOA)*(ZCOEF2+ZCOEF3*PLAI(:))*ZWORK(:)*EXP(ZLOG2*(ZCOEF4*(ZTG_SUB(:)-ZCOEF5))) 00266 ENDWHERE 00267 ! 00268 ! RESP_ECO is diagnosed from RESP_SOIL_TOT and RESP_AUTO_ABOVE 00269 ! 00270 PRESP_ECO(:) = ZRESP_SOIL_TOT(:) + ZRESP_AUTO_ABOVE(:) 00271 ! 00272 ELSE IF (HRESPSL == 'PRM') THEN 00273 ! 00274 ZWORK(:)=0.0 00275 ! 00276 IF(HISBA/='DIF')THEN 00277 ZWORK (:) = PWG (:,1) 00278 ELSE 00279 DO JL=1,INL 00280 DO JI=1,INI 00281 ZWORK(JI)=ZWORK(JI)+MIN(1.0,PWG(JI,JL)/PWFC(JI,JL))*ZWGHT_TOP(JI,JL)/ZDG_TOP(JI) 00282 ENDDO 00283 ENDDO 00284 ENDIF 00285 ! 00286 ! Ecosystem respiration : Q10 model following Albergel et al. 2009 for SMOSREX 00287 ! (kgCO2/kgair m/s) 00288 ! RESP_ECO is directly calculated by the parameterization 00289 ! 00290 ! Before optimization 00291 ! PRESP_ECO(:) = PRE25(:)/PRHOA(:) * MIN(PWG(:,1)/PWFC(:,1),1.)*2.**(ZCOEF4*(ZT2(:)-ZCOEF5)) 00292 PRESP_ECO(:) = PRE25(:)/PRHOA(:) * ZWORK(:)*EXP(ZLOG2*(ZCOEF4*(ZTG_SUB(:)-ZCOEF5))) 00293 ! 00294 ELSE IF (HRESPSL == 'CNT') THEN 00295 ! 00296 ! Heterotrophic respiration following CENTURY model from Gibelin et al. 2008 00297 ! 00298 ZMOIST_TOP(:)=0.0 00299 ZSAT_TOP (:)=0.0 00300 ZMOIST_SUB(:)=0.0 00301 ZSAT_SUB (:)=0.0 00302 ZSAND_SUB (:)=0.0 00303 ! 00304 IF(HISBA/='DIF')THEN 00305 ! 00306 ZMOIST_TOP(:) = MIN(1.0,MAX(0.0,(PWG(:,1)-PWWILT(:,1))/(PWFC (:,1)-PWWILT(:,1)))) 00307 ZSAT_TOP (:) = MIN(1.0,MAX(0.0,(PWG(:,1)-PWFC (:,1))/(PWSAT(:,1)-PWFC (:,1)))) 00308 ZMOIST_SUB(:) = MIN(1.0,MAX(0.0,(PWG(:,2)-PWWILT(:,2))/(PWFC (:,2)-PWWILT(:,2)))) 00309 ZSAT_SUB (:) = MIN(1.0,MAX(0.0,(PWG(:,2)-PWFC (:,2))/(PWSAT(:,2)-PWFC (:,2)))) 00310 ! 00311 ZSAND_SUB (:) = PSAND (:,2) 00312 ! 00313 ELSE 00314 ! 00315 DO JL=1,INL 00316 DO JI=1,INI 00317 ! 00318 ZMOISTL=MIN(1.0,MAX(0.0,(PWG(JI,JL)-PWWILT(JI,JL))/(PWFC (JI,JL)-PWWILT(JI,JL)))) 00319 ZSATL =MIN(1.0,MAX(0.0,(PWG(JI,JL)-PWFC (JI,JL))/(PWSAT(JI,JL)-PWFC (JI,JL)))) 00320 ! 00321 ZMOIST_TOP(JI)=ZMOIST_TOP(JI)+ZMOISTL*ZWGHT_TOP(JI,JL)/ZDG_TOP(JI) 00322 ZSAT_TOP (JI)=ZSAT_TOP (JI)+ZSATL *ZWGHT_TOP(JI,JL)/ZDG_TOP(JI) 00323 ZMOIST_SUB(JI)=ZMOIST_SUB(JI)+ZMOISTL*ZWGHT_SUB(JI,JL)/ZDG_SUB(JI) 00324 ZSAT_SUB (JI)=ZSAT_SUB (JI)+ZSATL *ZWGHT_SUB(JI,JL)/ZDG_SUB(JI) 00325 ! 00326 ZSAND_SUB(JI)=ZSAND_SUB(JI)+PSAND(JI,JL)*ZWGHT_SUB(JI,JL)/ZDG_SUB(JI) 00327 ! 00328 ENDDO 00329 ENDDO 00330 ! 00331 ENDIF 00332 ! 00333 ZCONTROL_TEMP (:,1) = CONTROL_TEMP_FUNC (ZTG_TOP(:)) 00334 ZCONTROL_TEMP (:,2) = CONTROL_TEMP_FUNC (ZTG_SUB(:)) 00335 ZCONTROL_MOIST(:,1) = CONTROL_MOIST_FUNC(ZMOIST_TOP(:),ZSAT_TOP(:)) 00336 ZCONTROL_MOIST(:,2) = CONTROL_MOIST_FUNC(ZMOIST_SUB(:),ZSAT_SUB(:)) 00337 ! 00338 CALL CARBON_LITTER (PTSTEP,PTURNOVER,PLITTER,PLIGNIN_STRUC, & 00339 ZCONTROL_TEMP,ZCONTROL_MOIST, & 00340 ZRESP_HETERO_DAY_LITTER,ZSOILCARBON_INPUT) 00341 ! 00342 DO ITCSPIN = 1,KSPINS 00343 CALL CARBON_SOIL (PTSTEP,ZSAND_SUB,ZSOILCARBON_INPUT,ZCONTROL_TEMP,& 00344 ZCONTROL_MOIST,PSOILCARB,ZRESP_HETERO_DAY_SOIL ) 00345 ENDDO 00346 ! 00347 ! Transform units : gC/m2/day -> kgCO2/kgair m/s 00348 ! 00349 ZRESP_HETERO(:) = (ZRESP_HETERO_DAY_LITTER(:) + ZRESP_HETERO_DAY_SOIL(:)) & 00350 * (XMCO2/XMC) / (1000. * PRHOA(:)* XDAY) 00351 ! 00352 ! RESP_ECO is diagnosed from RESP_HETERO and RESP_AUTO 00353 ! 00354 PRESP_ECO(:) = ZRESP_HETERO(:) + PRESP_AUTO(:) 00355 ! 00356 ENDIF 00357 ! 00358 IF (LHOOK) CALL DR_HOOK('CARBON_EVOL',1,ZHOOK_HANDLE) 00359 ! 00360 !----------------------------------------------------------------- 00361 ! 00362 END SUBROUTINE CARBON_EVOL
1.8.0