SURFEX v7.3
General documentation of Surfex
 All Classes Files Functions Variables Typedefs
/home/dasprezs/EXPORT_v7_3/src/SURFEX/carbon_evol.F90
Go to the documentation of this file.
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