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