SURFEX v8.1
General documentation of Surfex
carbon_evol.F90
Go to the documentation of this file.
1 !SFX_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier
2 !SFX_LIC This is part of the SURFEX software governed by the CeCILL-C licence
3 !SFX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
4 !SFX_LIC for details. version 1.
5 ! #########
6  SUBROUTINE carbon_evol(IO, KK, PK, PEK, DEK, PTSTEP, PRHOA, PRESP_BIOMASS_INST )
7 ! ###############################################################
8 !!**** *CARBON EVOL*
9 !!
10 !! PURPOSE
11 !! -------
12 !!
13 !! Diagnoses respiration carbon fluxes and performs the time evolution of
14 !! carbon pools in the case of 'CNT' option (ISBA-CC)
15 !!
16 !!** METHOD
17 !! ------
18 !!
19 !! EXTERNAL
20 !! --------
21 !! none
22 !!
23 !! IMPLICIT ARGUMENTS
24 !! ------------------
25 !!
26 !! none
27 !!
28 !! REFERENCE
29 !! ---------
30 !!
31 !! Gibelin et al. 2008, AFM
32 !! Modelling energy and CO2 fluxes with an interactive vegetation land surface model -
33 !! Evaluation at high and middle latitudes.
34 !!
35 !! AUTHOR
36 !! ------
37 !!
38 !! A.L. Gibelin * Meteo-France *
39 !!
40 !! MODIFICATIONS
41 !! -------------
42 !! Original 22/06/09
43 !! S.QUEGUINER 09/2011 Cas 'DEF'- condition si LAI=UNDEF->ZRESP_SOIL_TOT=0
44 !! C. Delire 04/2012 : spinup soil carbon
45 !! B. Decharme 05/2012 : Optimization and ISBA-DIF coupling
46 !!
47 !-------------------------------------------------------------------------------
48 !
49 !* 0. DECLARATIONS
50 ! ------------
51 !
55 !
56 USE modd_co2v_par, ONLY : xmc, xmco2, xpcco2
57 USE modd_csts, ONLY : xday, xtt
58 USE modd_surf_par, ONLY : xundef
59 !
60 USE modi_control_moist_func
61 USE modi_control_temp_func
62 USE modi_carbon_litter
63 USE modi_carbon_soil
64 
65 !
66 !
67 USE yomhook ,ONLY : lhook, dr_hook
68 USE parkind1 ,ONLY : jprb
69 !
70 IMPLICIT NONE
71 !
72 !* 0.1 declarations of arguments
73 !
74 TYPE(isba_options_t), INTENT(INOUT) :: IO
75 TYPE(isba_k_t), INTENT(INOUT) :: KK
76 TYPE(isba_p_t), INTENT(INOUT) :: PK
77 TYPE(isba_pe_t), INTENT(INOUT) :: PEK
78 TYPE(diag_evap_isba_t), INTENT(INOUT) :: DEK
79 !
80 REAL, INTENT(IN) :: PTSTEP ! time step
81 REAL, DIMENSION(:), INTENT(IN) :: PRHOA ! air density (kg/m3)
82 REAL, DIMENSION(:,:), INTENT(IN) :: PRESP_BIOMASS_INST ! instantaneous respiration of biomass (kgCO2/kgair m/s)
83 !
84 !* 0.2 declarations of local variables
85 !
86 REAL, PARAMETER :: ZCOEF1 = 4.4e-8
87 REAL, PARAMETER :: ZCOEF2 = 13.5
88 REAL, PARAMETER :: ZCOEF3 = 5.4
89 REAL, PARAMETER :: ZCOEF4 = 0.1
90 REAL, PARAMETER :: ZCOEF5 = 25.0
91 !
92 REAL, PARAMETER :: ZDTOP = 0.1 !Top depth m
93 REAL, PARAMETER :: ZDSUB = 1.0 !Sub depth m
94 !
95 REAL, DIMENSION(SIZE(PEK%XTG,1)) :: ZRESP_SOIL_TOT ! total soil respiration (kgCO2/kgair m/s)
96 REAL, DIMENSION(SIZE(PEK%XTG,1)) :: ZRESP_AUTO_ABOVE ! total above ground biomass respiration (kgCO2/kgair m/s)
97 REAL, DIMENSION(SIZE(PEK%XTG,1)) :: ZRESP_HETERO ! total heterotrophic respiration (kgCO2/kgair m/s)
98 !
99 !
100 REAL, DIMENSION(SIZE(PEK%XSOILCARB,1),SIZE(PEK%XSOILCARB,2)) :: ZSOILCARBON_INPUT
101 ! quantity of carbon going into carbon pools
102 ! from litter decomposition (gC/m2/day)
103 !
104 REAL, DIMENSION(SIZE(PEK%XSOILCARB,1)) :: ZRESP_HETERO_DAY_LITTER
105 ! litter heterotrophic respiration (gC/m2/day)
106 REAL, DIMENSION(SIZE(PEK%XSOILCARB,1)) :: ZRESP_HETERO_DAY_SOIL
107 ! soil heterotrophic respiration (gC/m2/day)
108 !
109 REAL, DIMENSION(SIZE(PEK%XLIGNIN_STRUC,1),SIZE(PEK%XLIGNIN_STRUC,2)) :: ZCONTROL_MOIST, &
110  ZCONTROL_TEMP
111 ! ZCONTROL_MOIST = moisture control of heterotrophic respiration
112 ! ZCONTROL_TEMP = temperature control of heterotrophic respiration
113 !
114 REAL, DIMENSION(SIZE(PEK%XTG,1)) :: ZTG_TOP ! Top soil temperature (C)
115 REAL, DIMENSION(SIZE(PEK%XTG,1)) :: ZTG_SUB ! Sub soil temperature (C)
116 REAL, DIMENSION(SIZE(PEK%XTG,1)) :: ZSAND_SUB ! Sub soil sand fraction (-)
117 !
118 REAL, DIMENSION(SIZE(PEK%XTG,1)) :: ZMOIST_TOP ! Top soil moisture index (-)
119 REAL, DIMENSION(SIZE(PEK%XTG,1)) :: ZMOIST_SUB ! Sub soil moisture index (-)
120 REAL, DIMENSION(SIZE(PEK%XTG,1)) :: ZSAT_TOP ! Top soil saturated index(-)
121 REAL, DIMENSION(SIZE(PEK%XTG,1)) :: ZSAT_SUB ! Sub soil saturated index(-)
122 !
123 REAL, DIMENSION(SIZE(PEK%XTG,1)) :: ZDG_TOP ! Top soil depth for DIF (m)
124 REAL, DIMENSION(SIZE(PEK%XTG,1)) :: ZDG_SUB ! Sub soil depth for DIF (m)
125 !
126 REAL, DIMENSION(SIZE(PEK%XTG,1),SIZE(PEK%XTG,2)) :: ZWGHT_TOP ! Weight top for DIF (m)
127 REAL, DIMENSION(SIZE(PEK%XTG,1),SIZE(PEK%XTG,2)) :: ZWGHT_SUB ! Weight sub for DIF (m)
128 !
129 REAL, DIMENSION(SIZE(PEK%XTG,1)) :: ZWORK ! work array
130 !
131 REAL :: ZMOISTL, ZSATL, ZLOG2
132 !
133 INTEGER :: JNBIOMASS
134 INTEGER :: ITCSPIN
135 !
136 INTEGER :: INI, INL, JI, JL, IDEKTH, INBIOMASS
137 !
138 REAL(KIND=JPRB) :: ZHOOK_HANDLE
139 !
140 !-------------------------------------------------------------------------------
141 !
142 !* 1. Preliminaries
143 ! -------------
144 !
145 IF (lhook) CALL dr_hook('CARBON_EVOL',0,zhook_handle)
146 !
147 dek%XRESP_AUTO = 0.0
148 dek%XRESP_ECO = 0.0
149 !
150 ini=SIZE(pek%XTG,1)
151 inl=SIZE(pek%XTG,2)
152 inbiomass=SIZE(presp_biomass_inst,2)
153 !
154 zresp_soil_tot(:) = xundef
155 zresp_auto_above(:) = xundef
156 zresp_hetero(:) = xundef
157 zsoilcarbon_input(:,:) = xundef
158 zresp_hetero_day_litter(:) = xundef
159 zresp_hetero_day_soil(:) = xundef
160 zcontrol_moist(:,:) = xundef
161 zcontrol_temp(:,:) = xundef
162 zwght_top(:,:) = xundef
163 zwght_sub(:,:) = xundef
164 !
165 ztg_top(:) = 0.0
166 ztg_sub(:) = 0.0
167 !
168 zlog2 = log(2.0)
169 !
170 ! convert soil temperature from K to C (over 1m depth for DIF)
171 !
172 IF(io%CISBA/='DIF')THEN
173  ztg_top(:) = pek%XTG(:,1)-xtt
174  ztg_sub(:) = pek%XTG(:,2)-xtt
175 ELSE
176  DO ji=1,ini
177  idekth=pk%NWG_LAYER(ji)
178  zdg_top(ji)=min(zdtop,pk%XDG(ji,idekth))
179  zdg_sub(ji)=min(zdsub,pk%XDG(ji,idekth))
180  ENDDO
181  DO jl=1,inl
182  DO ji=1,ini
183  zwght_top(ji,jl)=min(pk%XDZG(ji,jl),max(0.0,zdg_top(ji)-pk%XDG(ji,jl)+pk%XDZG(ji,jl)))
184  zwght_sub(ji,jl)=min(pk%XDZG(ji,jl),max(0.0,zdg_sub(ji)-pk%XDG(ji,jl)+pk%XDZG(ji,jl)))
185  ztg_top(ji)=ztg_top(ji)+(pek%XTG(ji,jl)-xtt)*zwght_top(ji,jl)/zdg_top(ji)
186  ztg_sub(ji)=ztg_sub(ji)+(pek%XTG(ji,jl)-xtt)*zwght_sub(ji,jl)/zdg_sub(ji)
187  ENDDO
188  ENDDO
189 ENDIF
190 !
191 !
192 !* 2. Autotrophic respiration
193 ! -----------------------
194 !
195 zresp_auto_above(:)=0.
196 !
197 IF (io%CPHOTO=='NIT') THEN
198 !
199  DO jnbiomass=1,2
200  zresp_auto_above(:) = zresp_auto_above(:) + presp_biomass_inst(:,jnbiomass)
201  ENDDO
202 !
203 ELSE IF (io%CPHOTO=='NCB') THEN
204 !
205  DO jnbiomass=1,3
206  zresp_auto_above(:) = zresp_auto_above(:) + presp_biomass_inst(:,jnbiomass)
207  ENDDO
208 !
209 ELSE IF (io%CPHOTO=='AST') THEN
210 !
211  zresp_auto_above(:) = presp_biomass_inst(:,1)
212 !
213 ENDIF
214 !
215 DO jnbiomass=1,inbiomass
216  dek%XRESP_AUTO(:) = dek%XRESP_AUTO (:) + presp_biomass_inst(:,jnbiomass)
217 ENDDO
218 !
219 !
220 !* 3. Soil and ecosystem respiration
221 ! ------------------------------
222 !
223 IF (io%CRESPSL == 'DEF') THEN
224 !
225  zwork(:)=0.0
226 !
227  IF(io%CISBA/='DIF')THEN
228  zwork(:) = pek%XWG(:,1)
229  ELSE
230  DO jl=1,inl
231  DO ji=1,ini
232  zwork(ji)=zwork(ji)+pek%XWG(ji,jl)*zwght_top(ji,jl)/zdg_top(ji)
233  ENDDO
234  ENDDO
235  ENDIF
236 !
237 ! Soil respiration from Norman et al 1992 (kgCO2/kgair m/s)
238 !
239  WHERE (pek%XLAI(:) == xundef)
240  zresp_soil_tot(:) = 0.0
241  ELSEWHERE
242 ! Before optimization = (ZCOEF1/PRHOA)*(ZCOEF2+ZCOEF3*PEK%XLAI(:))*PEK%XWG(:,1)*2.**(ZCOEF4*(ZT2(:)-ZCOEF5))
243  zresp_soil_tot(:) = (zcoef1/prhoa)*(zcoef2+zcoef3*pek%XLAI(:)) * &
244  zwork(:)*exp(zlog2*(zcoef4*(ztg_sub(:)-zcoef5)))
245  ENDWHERE
246 !
247 ! RESP_ECO is diagnosed from RESP_SOIL_TOT and RESP_AUTO_ABOVE
248 !
249  dek%XRESP_ECO(:) = zresp_soil_tot(:) + zresp_auto_above(:)
250 !
251 ELSE IF (io%CRESPSL == 'PRM') THEN
252 !
253  zwork(:)=0.0
254 !
255  IF(io%CISBA/='DIF')THEN
256  zwork(:) = pek%XWG(:,1)
257  ELSE
258  DO jl=1,inl
259  DO ji=1,ini
260  zwork(ji)=zwork(ji)+min(1.0,pek%XWG(ji,jl)/kk%XWFC(ji,jl))*zwght_top(ji,jl)/zdg_top(ji)
261  ENDDO
262  ENDDO
263  ENDIF
264 !
265 ! Ecosystem respiration : Q10 model following Albergel et al. 2009 for SMOSREX
266 ! (kgCO2/kgair m/s)
267 ! RESP_ECO is directly calculated by the parameterization
268 !
269 ! Before optimization
270 ! DEK%XRESP_ECO(:) = PK%XRE25(:)/PRHOA(:) * MIN(PEK%XWG(:,1)/KK%XWFC(:),1.)*2.**(ZCOEF4*(ZT2(:)-ZCOEF5))
271  dek%XRESP_ECO(:) = pk%XRE25(:)/prhoa(:) * zwork(:)*exp(zlog2*(zcoef4*(ztg_sub(:)-zcoef5)))
272 !
273 ELSE IF (io%CRESPSL == 'CNT') THEN
274 !
275 ! Heterotrophic respiration following CENTURY model from Gibelin et al. 2008
276 !
277  zmoist_top(:)=0.0
278  zsat_top(:)=0.0
279  zmoist_sub(:)=0.0
280  zsat_sub(:)=0.0
281  zsand_sub(:)=0.0
282 !
283  IF(io%CISBA/='DIF')THEN
284 !
285  zmoist_top(:) = min(1.0,max(0.0,(pek%XWG(:,1)-kk%XWWILT(:,1))/(kk%XWFC (:,1)-kk%XWWILT(:,1))))
286  zsat_top(:) = min(1.0,max(0.0,(pek%XWG(:,1)-kk%XWFC (:,1))/(kk%XWSAT(:,1)-kk%XWFC (:,1))))
287  zmoist_sub(:) = min(1.0,max(0.0,(pek%XWG(:,2)-kk%XWWILT(:,2))/(kk%XWFC (:,2)-kk%XWWILT(:,2))))
288  zsat_sub(:) = min(1.0,max(0.0,(pek%XWG(:,2)-kk%XWFC (:,2))/(kk%XWSAT(:,2)-kk%XWFC (:,2))))
289 !
290  zsand_sub(:) = kk%XSAND (:,2)
291 !
292  ELSE
293 !
294  DO jl=1,inl
295  DO ji=1,ini
296 !
297  zmoistl=min(1.0,max(0.0,(pek%XWG(ji,jl)-kk%XWWILT(ji,jl))/(kk%XWFC (ji,jl)-kk%XWWILT(ji,jl))))
298  zsatl =min(1.0,max(0.0,(pek%XWG(ji,jl)-kk%XWFC (ji,jl))/(kk%XWSAT(ji,jl)-kk%XWFC (ji,jl))))
299 !
300  zmoist_top(ji)=zmoist_top(ji)+zmoistl*zwght_top(ji,jl)/zdg_top(ji)
301  zsat_top(ji)=zsat_top(ji)+zsatl *zwght_top(ji,jl)/zdg_top(ji)
302  zmoist_sub(ji)=zmoist_sub(ji)+zmoistl*zwght_sub(ji,jl)/zdg_sub(ji)
303  zsat_sub(ji)=zsat_sub(ji)+zsatl *zwght_sub(ji,jl)/zdg_sub(ji)
304 !
305  zsand_sub(ji)=zsand_sub(ji)+kk%XSAND(ji,jl)*zwght_sub(ji,jl)/zdg_sub(ji)
306 !
307  ENDDO
308  ENDDO
309 !
310  ENDIF
311 !
312  zcontrol_temp(:,1) = control_temp_func(ztg_top(:))
313  zcontrol_temp(:,2) = control_temp_func(ztg_sub(:))
314  zcontrol_moist(:,1) = control_moist_func(zmoist_top(:),zsat_top(:))
315  zcontrol_moist(:,2) = control_moist_func(zmoist_sub(:),zsat_sub(:))
316 !
317  CALL carbon_litter (ptstep, pk%XTURNOVER, pek%XLITTER, pek%XLIGNIN_STRUC, &
318  zcontrol_temp, zcontrol_moist, zresp_hetero_day_litter,zsoilcarbon_input)
319 !
320  DO itcspin = 1,io%NSPINS
321  CALL carbon_soil (ptstep, zsand_sub, zsoilcarbon_input, zcontrol_temp,&
322  zcontrol_moist, pek%XSOILCARB, zresp_hetero_day_soil )
323  ENDDO
324 !
325 ! Transform units : gC/m2/day -> kgCO2/kgair m/s
326 !
327  zresp_hetero(:) = (zresp_hetero_day_litter(:) + zresp_hetero_day_soil(:)) &
328  * (xmco2/xmc) / (1000. * prhoa(:)* xday)
329 !
330 ! RESP_ECO is diagnosed from RESP_HETERO and RESP_AUTO
331 !
332  dek%XRESP_ECO(:) = zresp_hetero(:) + dek%XRESP_AUTO(:)
333 !
334 ENDIF
335 !
336 IF (lhook) CALL dr_hook('CARBON_EVOL',1,zhook_handle)
337 !
338 !-----------------------------------------------------------------
339 !
340 END SUBROUTINE carbon_evol
real function, dimension(size(ptemp_in)) control_temp_func(PTEMP_IN)
real, parameter xundef
integer, parameter jprb
Definition: parkind1.F90:32
real, save xday
Definition: modd_csts.F90:45
subroutine carbon_litter(PTSTEP, PTURNOVER, PLITTER, PLIGNIN_STRUC, PCONTROL_TEMP, PCONTROL_MOIST, PRESP_HETERO_LITTER, PSOILCARBON_INPUT)
logical lhook
Definition: yomhook.F90:15
subroutine carbon_soil(PTSTEP, PSAND, PSOILCARBON_INPUT, PCONTROL_TEMP, PCONTROL_MOIST, PSOILCARB, PRESP_HETERO_SOIL)
Definition: carbon_soil.F90:9
subroutine carbon_evol(IO, KK, PK, PEK, DEK, PTSTEP, PRHOA, PRESP_BIOMASS_INST)
Definition: carbon_evol.F90:7
real, save xtt
Definition: modd_csts.F90:66
real function, dimension(size(pmoist)) control_moist_func(PMOIST, PSAT)