SURFEX v7.3
General documentation of Surfex
 All Classes Files Functions Variables Typedefs
/home/dasprezs/EXPORT_v7_3/src/SURFEX/carbon_soil.F90
Go to the documentation of this file.
00001 !     #########
00002 SUBROUTINE CARBON_SOIL (PTSTEP, PSAND,                                      &
00003                           PSOILCARBON_INPUT, PCONTROL_TEMP, PCONTROL_MOIST, &
00004                           PSOILCARB, PRESP_HETERO_SOIL)  
00005 
00006 !   ###############################################################
00007 !!**  CARBON_SOIL 
00008 !!
00009 !!    PURPOSE
00010 !!    -------
00011 !!    Calculates soil carbon pools evolution.
00012 !!
00013 !!**  METHOD
00014 !!    ------
00015 !!
00016 !!    EXTERNAL
00017 !!    --------
00018 !!    none
00019 !!
00020 !!    IMPLICIT ARGUMENTS
00021 !!    ------------------
00022 !!      
00023 !!    none
00024 !!
00025 !!    REFERENCE
00026 !!    ---------
00027 !!
00028 !!      Parton et al., Biogeochemestry, 1988
00029 !!      Krinner et al., Global Biochemical Cycles, 2005
00030 !!      Gibelin et al. 2008, AFM
00031 !!      
00032 !!    AUTHOR
00033 !!    ------
00034 !!
00035 !!      A.-L. Gibelin           * Meteo-France *
00036 !!
00037 !!    MODIFICATIONS
00038 !!    -------------
00039 !!      Original    23/06/09
00040 !!      B. Decharme 05/2012 : Optimization
00041 !!
00042 !-------------------------------------------------------------------------------
00043 !
00044 !*       0.     DECLARATIONS
00045 !               ------------
00046 !
00047 USE MODD_CO2V_PAR,       ONLY : XTAU_SOILCARB
00048 USE MODD_CSTS,           ONLY : XDAY
00049 !
00050 !
00051 USE YOMHOOK   ,ONLY : LHOOK,   DR_HOOK
00052 USE PARKIND1  ,ONLY : JPRB
00053 !
00054 IMPLICIT NONE
00055 
00056 
00057 !*       0.1 input
00058 
00059 ! time step in s
00060 REAL, INTENT(IN)                                                  :: PTSTEP
00061 ! sand fraction (between 0 and 1)
00062 REAL, DIMENSION(:), INTENT(IN)                                    :: PSAND
00063 ! quantity of carbon going into carbon pools from litter decomposition
00064 !   (gC/m**2/day)
00065 REAL, DIMENSION(:,:), INTENT(IN)                                  :: PSOILCARBON_INPUT
00066 ! temperature control of heterotrophic respiration
00067 REAL, DIMENSION(:,:), INTENT(IN)                                  :: PCONTROL_TEMP
00068 ! moisture control of heterotrophic respiration
00069 REAL, DIMENSION(:,:), INTENT(IN)                                  :: PCONTROL_MOIST
00070 
00071 !*       0.2 modified fields
00072 
00073 ! carbon pool: active, slow, or passive (gC/m**2)
00074 REAL, DIMENSION(:,:), INTENT(INOUT)                               :: PSOILCARB
00075 
00076 !*       0.3 output
00077 
00078 ! soil heterotrophic respiration (in gC/day/m**2)
00079 REAL, DIMENSION(:), INTENT(OUT)                                   :: PRESP_HETERO_SOIL
00080 
00081 !*       0.4 local
00082 
00083 ! time step in days
00084 REAL                                                              :: ZDT
00085 ! flux fractions within carbon pools
00086 REAL, DIMENSION(SIZE(PSOILCARB,1),SIZE(PSOILCARB,2),SIZE(PSOILCARB,2)) :: ZFRAC_CARB
00087 ! fraction of carbon flux which goes into heterotrophic respiration
00088 REAL, DIMENSION(SIZE(PSOILCARB,1),SIZE(PSOILCARB,2))                   :: ZFRAC_RESP
00089 ! total flux out of carbon pools (gC/m**2)
00090 REAL, DIMENSION(SIZE(PSOILCARB,1),SIZE(PSOILCARB,2))                   :: ZFLUXTOT
00091 ! fluxes between carbon pools (gC/m**2)
00092 REAL, DIMENSION(SIZE(PSOILCARB,1),SIZE(PSOILCARB,2),SIZE(PSOILCARB,2)) :: ZFLUX
00093 !
00094 REAL, DIMENSION(SIZE(PSOILCARB,1))                                     :: ZWORK ! Work array
00095 !
00096 ! dimensions
00097 INTEGER                                                           :: INI, INSOILCARB
00098 ! indices
00099 INTEGER                                                           :: JI, JL
00100 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00101 !
00102 ! correspondence between array indices and litter levels
00103 ! LT_ABOVE = 1
00104 ! LT_BELOW = 2
00105 ! correspondence between array indices and soil carbon pools
00106 ! SL_ACTIVE = 1
00107 ! SL_SLOW = 2
00108 ! SL_PASSIVE = 3
00109 !-------------------------------------------------------------------------------
00110 
00111 !
00112 !*       1 Initialisations
00113 !
00114 !
00115 !*       1.1 dimensions
00116 !
00117 IF (LHOOK) CALL DR_HOOK('CARBON_SOIL',0,ZHOOK_HANDLE)
00118 !
00119 INI        = SIZE(PSOILCARB,1)
00120 INSOILCARB = SIZE(PSOILCARB,2)
00121 !
00122 !*       1.2 get soil "constants"
00123 !
00124 !*       1.2.1 flux fractions between carbon pools: depend on soil texture, recalculated each time
00125 !
00126 !*       1.2.1.1 from active pool: depends on soil texture
00127 !
00128 ZFRAC_CARB(:,1,1) = 0.0
00129 ZFRAC_CARB(:,1,3) = 0.004
00130 ZFRAC_CARB(:,1,2) = 1. - ( .85 - .68 * (1.-PSAND(:)) ) - ZFRAC_CARB(:,1,3)
00131 !
00132 !*       1.2.1.2 from slow pool
00133 !
00134 ZFRAC_CARB(:,2,2) = .0
00135 ZFRAC_CARB(:,2,1) = .42
00136 ZFRAC_CARB(:,2,3) = .03
00137 !
00138 !*       1.2.1.3 from passive pool
00139 !
00140 ZFRAC_CARB(:,3,3) = .0
00141 ZFRAC_CARB(:,3,1) = .45
00142 ZFRAC_CARB(:,3,2) = .0
00143 !
00144 !*       1.3 set output to zero
00145 !
00146 PRESP_HETERO_SOIL(:) = 0.0
00147 !
00148 !
00149 !*       2 input into carbon pools
00150 !
00151 ZDT = PTSTEP/XDAY
00152 !
00153 PSOILCARB(:,:) = PSOILCARB(:,:) + PSOILCARBON_INPUT(:,:) * ZDT
00154 !
00155 !
00156 !*       3 fluxes within carbon reservoirs + respiration
00157 !
00158 !*       3.1 determine fraction of flux that is respiration
00159 !     diagonal elements of frac_carb are zero
00160 !
00161 ZFRAC_RESP(:,:) = 1. - ZFRAC_CARB(:,:,1) - ZFRAC_CARB(:,:,2) - ZFRAC_CARB(:,:,3)   
00162 !
00163 !*       3.2 calculate fluxes
00164 !
00165 !*       3.2.1 flux out of pools
00166 !
00167 !soil property dependance (1.0-0.75*(1.0-PSAND(:)))
00168 ZWORK(:)=0.25+0.75*PSAND(:)
00169 !
00170 ! determine total flux out of pool
00171 ZFLUXTOT(:,1) = PTSTEP/XTAU_SOILCARB(1)*PSOILCARB(:,1)*PCONTROL_MOIST(:,2)*PCONTROL_TEMP(:,2)*ZWORK(:) 
00172 ZFLUXTOT(:,2) = PTSTEP/XTAU_SOILCARB(2)*PSOILCARB(:,2)*PCONTROL_MOIST(:,2)*PCONTROL_TEMP(:,2) 
00173 ZFLUXTOT(:,3) = PTSTEP/XTAU_SOILCARB(3)*PSOILCARB(:,3)*PCONTROL_MOIST(:,2)*PCONTROL_TEMP(:,2) 
00174 !
00175 !decrease this carbon pool
00176 PSOILCARB(:,:) = PSOILCARB(:,:) - ZFLUXTOT(:,:)
00177 !
00178 !fluxes towards the other pools (k -> kk)
00179 DO JL=1,INSOILCARB
00180    DO JI=1,INI
00181       ZFLUX(JI,1,JL) = ZFRAC_CARB(JI,1,JL) * ZFLUXTOT(JI,1)
00182       ZFLUX(JI,2,JL) = ZFRAC_CARB(JI,2,JL) * ZFLUXTOT(JI,2)
00183       ZFLUX(JI,3,JL) = ZFRAC_CARB(JI,3,JL) * ZFLUXTOT(JI,3)
00184    ENDDO
00185 ENDDO
00186 !
00187 !*       3.2.2 respiration
00188 !
00189 PRESP_HETERO_SOIL(:) = ( ZFRAC_RESP(:,1) * ZFLUXTOT(:,1) +         &
00190                          ZFRAC_RESP(:,2) * ZFLUXTOT(:,2) +         &
00191                          ZFRAC_RESP(:,3) * ZFLUXTOT(:,3)  ) / ZDT  
00192 !
00193 !*       3.2.3 add fluxes to active, slow, and passive pools
00194 !
00195 PSOILCARB(:,1) = PSOILCARB(:,1) + ZFLUX(:,1,1) + ZFLUX(:,2,1) + ZFLUX(:,3,1)  
00196 PSOILCARB(:,2) = PSOILCARB(:,2) + ZFLUX(:,1,2) + ZFLUX(:,2,2) + ZFLUX(:,3,2)  
00197 PSOILCARB(:,3) = PSOILCARB(:,3) + ZFLUX(:,1,3) + ZFLUX(:,2,3) + ZFLUX(:,3,3)  
00198 !
00199 IF (LHOOK) CALL DR_HOOK('CARBON_SOIL',1,ZHOOK_HANDLE)
00200 !
00201 END SUBROUTINE CARBON_SOIL