SURFEX  V8_0
Surfex V8_0 release
 All Classes Files Functions Variables
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(HISBA, HRESPSL, HPHOTO, PTSTEP, KSPINS, &
7  prhoa, ptg, pwg, pwfc, pwwilt, pwsat, psand, &
8  pdg, pdzg, kwg_layer, &
9  pre25, plai, presp_biomass_inst, pturnover, &
10  plitter, plignin_struc, psoilcarb, &
11  presp_auto, presp_eco )
12 ! ###############################################################
13 !!**** *CARBON EVOL*
14 !!
15 !! PURPOSE
16 !! -------
17 !!
18 !! Diagnoses respiration carbon fluxes and performs the time evolution of
19 !! carbon pools in the case of 'CNT' option (ISBA-CC)
20 !!
21 !!** METHOD
22 !! ------
23 !!
24 !! EXTERNAL
25 !! --------
26 !! none
27 !!
28 !! IMPLICIT ARGUMENTS
29 !! ------------------
30 !!
31 !! none
32 !!
33 !! REFERENCE
34 !! ---------
35 !!
36 !! Gibelin et al. 2008, AFM
37 !! Modelling energy and CO2 fluxes with an interactive vegetation land surface model -
38 !! Evaluation at high and middle latitudes.
39 !!
40 !! AUTHOR
41 !! ------
42 !!
43 !! A.L. Gibelin * Meteo-France *
44 !!
45 !! MODIFICATIONS
46 !! -------------
47 !! Original 22/06/09
48 !! S.QUEGUINER 09/2011 Cas 'DEF'- condition si LAI=UNDEF->ZRESP_SOIL_TOT=0
49 !! C. Delire 04/2012 : spinup soil carbon
50 !! B. Decharme 05/2012 : Optimization and ISBA-DIF coupling
51 !!
52 !-------------------------------------------------------------------------------
53 !
54 !* 0. DECLARATIONS
55 ! ------------
56 !
57 USE modd_co2v_par, ONLY : xmc, xmco2, xpcco2
58 USE modd_csts, ONLY : xday, xtt
59 USE modd_surf_par, ONLY : xundef
60 !
61 USE modi_control_moist_func
62 USE modi_control_temp_func
63 USE modi_carbon_litter
64 USE modi_carbon_soil
65 
66 !
67 !
68 USE yomhook ,ONLY : lhook, dr_hook
69 USE parkind1 ,ONLY : jprb
70 !
71 IMPLICIT NONE
72 !
73 !* 0.1 declarations of arguments
74 !
75  CHARACTER(LEN=3),INTENT(IN) :: hisba ! type of ISBA version:
76 ! ! '2-L' (default)
77 ! ! '3-L'
78 ! ! 'DIF'
79  CHARACTER(LEN=3), INTENT(IN) :: hrespsl ! Soil Respiration
80 ! ! 'DEF' = Norman 1992
81 ! ! 'PRM' = Rivalland PhD Thesis (2003)
82 ! ! 'CNT' = CENTURY model (Gibelin 2008)
83  CHARACTER(LEN=3), INTENT(IN) :: hphoto ! type of photosynthesis
84 !
85 REAL, INTENT(IN) :: ptstep ! time step
86 INTEGER, INTENT(IN) :: kspins ! (spinup) number of times CARBON_SOIL subroutine
87  ! is called for each time step
88 !
89 REAL, DIMENSION(:), INTENT(IN) :: prhoa ! air density (kg/m3)
90 REAL, DIMENSION(:,:), INTENT(IN) :: ptg ! soil layer average temperatures (K)
91 REAL, DIMENSION(:,:), INTENT(IN) :: pwg ! soil liquid volumetric water content (m3/m3)
92 REAL, DIMENSION(:,:), INTENT(IN) :: pwfc ! field capacity profile (m3/m3)
93 REAL, DIMENSION(:,:), INTENT(IN) :: pwwilt ! wilting point profile (m3/m3)
94 REAL, DIMENSION(:,:), INTENT(IN) :: pwsat ! porosity profile (m3/m3)
95 REAL, DIMENSION(:,:), INTENT(IN) :: psand ! profile of sand fraction
96 REAL, DIMENSION(:,:), INTENT(IN) :: pdg ! Depth of Bottom of Soil layers (m)
97 REAL, DIMENSION(:,:), INTENT(IN) :: pdzg ! soil layers thicknesses (DIF option) (m)
98 INTEGER, DIMENSION(:),INTENT(IN) :: kwg_layer ! Number of soil moisture layers (DIF option)
99 !
100 REAL,DIMENSION(:), INTENT(IN) :: pre25 ! Ecosystem respiration parameter (kg m-2 s-1)
101 REAL, DIMENSION(:), INTENT(IN) :: plai ! leaf area index
102 REAL, DIMENSION(:,:), INTENT(IN) :: presp_biomass_inst ! instantaneous respiration of biomass (kgCO2/kgair m/s)
103 REAL, DIMENSION(:,:), INTENT(IN) :: pturnover ! biomass turnover going into litter (gC m-2 s-1)
104 REAL, DIMENSION(:,:,:), INTENT(INOUT) :: plitter ! litter pools (gC m-2)
105 REAL, DIMENSION(:,:), INTENT(INOUT) :: plignin_struc ! L/C ratio in structural litter
106 REAL, DIMENSION(:,:), INTENT(INOUT) :: psoilcarb ! soil carbon pools (gC m-2)
107 REAL, DIMENSION(:), INTENT(OUT) :: presp_auto ! autotrophic respiration (kgCO2/kgair m/s)
108 REAL, DIMENSION(:), INTENT(OUT) :: presp_eco ! total ecosystem respiration (kgCO2/kgair m/s)
109 !
110 !* 0.2 declarations of local variables
111 !
112 REAL, PARAMETER :: zcoef1 = 4.4e-8
113 REAL, PARAMETER :: zcoef2 = 13.5
114 REAL, PARAMETER :: zcoef3 = 5.4
115 REAL, PARAMETER :: zcoef4 = 0.1
116 REAL, PARAMETER :: zcoef5 = 25.0
117 !
118 REAL, PARAMETER :: zdtop = 0.1 !Top depth m
119 REAL, PARAMETER :: zdsub = 1.0 !Sub depth m
120 !
121 REAL, DIMENSION(SIZE(PTG,1)) :: zresp_soil_tot ! total soil respiration (kgCO2/kgair m/s)
122 REAL, DIMENSION(SIZE(PTG,1)) :: zresp_auto_above ! total above ground biomass respiration (kgCO2/kgair m/s)
123 REAL, DIMENSION(SIZE(PTG,1)) :: zresp_hetero ! total heterotrophic respiration (kgCO2/kgair m/s)
124 !
125 !
126 REAL, DIMENSION(SIZE(PSOILCARB,1),SIZE(PSOILCARB,2)) :: zsoilcarbon_input
127 ! quantity of carbon going into carbon pools
128 ! from litter decomposition (gC/m2/day)
129 !
130 REAL, DIMENSION(SIZE(PSOILCARB,1)) :: zresp_hetero_day_litter
131 ! litter heterotrophic respiration (gC/m2/day)
132 REAL, DIMENSION(SIZE(PSOILCARB,1)) :: zresp_hetero_day_soil
133 ! soil heterotrophic respiration (gC/m2/day)
134 !
135 REAL, DIMENSION(SIZE(PLIGNIN_STRUC,1),SIZE(PLIGNIN_STRUC,2)) :: zcontrol_moist, &
136  zcontrol_temp
137 ! ZCONTROL_MOIST = moisture control of heterotrophic respiration
138 ! ZCONTROL_TEMP = temperature control of heterotrophic respiration
139 !
140 REAL, DIMENSION(SIZE(PTG,1)) :: ztg_top ! Top soil temperature (C)
141 REAL, DIMENSION(SIZE(PTG,1)) :: ztg_sub ! Sub soil temperature (C)
142 REAL, DIMENSION(SIZE(PTG,1)) :: zsand_sub ! Sub soil sand fraction (-)
143 !
144 REAL, DIMENSION(SIZE(PTG,1)) :: zmoist_top ! Top soil moisture index (-)
145 REAL, DIMENSION(SIZE(PTG,1)) :: zmoist_sub ! Sub soil moisture index (-)
146 REAL, DIMENSION(SIZE(PTG,1)) :: zsat_top ! Top soil saturated index(-)
147 REAL, DIMENSION(SIZE(PTG,1)) :: zsat_sub ! Sub soil saturated index(-)
148 !
149 REAL, DIMENSION(SIZE(PTG,1)) :: zdg_top ! Top soil depth for DIF (m)
150 REAL, DIMENSION(SIZE(PTG,1)) :: zdg_sub ! Sub soil depth for DIF (m)
151 !
152 REAL, DIMENSION(SIZE(PTG,1),SIZE(PTG,2)) :: zwght_top ! Weight top for DIF (m)
153 REAL, DIMENSION(SIZE(PTG,1),SIZE(PTG,2)) :: zwght_sub ! Weight sub for DIF (m)
154 !
155 REAL, DIMENSION(SIZE(PTG,1)) :: zwork ! work array
156 !
157 REAL :: zmoistl, zsatl, zlog2
158 !
159 INTEGER :: jnbiomass
160 INTEGER :: itcspin
161 !
162 INTEGER :: ini, inl, ji, jl, idepth, inbiomass
163 !
164 REAL(KIND=JPRB) :: zhook_handle
165 !
166 !-------------------------------------------------------------------------------
167 !
168 !* 1. Preliminaries
169 ! -------------
170 !
171 IF (lhook) CALL dr_hook('CARBON_EVOL',0,zhook_handle)
172 !
173 presp_auto = 0.0
174 presp_eco = 0.0
175 !
176 ini=SIZE(ptg,1)
177 inl=SIZE(ptg,2)
178 inbiomass=SIZE(presp_biomass_inst,2)
179 !
180 zresp_soil_tot(:) = xundef
181 zresp_auto_above(:) = xundef
182 zresp_hetero(:) = xundef
183 zsoilcarbon_input(:,:) = xundef
184 zresp_hetero_day_litter(:) = xundef
185 zresp_hetero_day_soil(:) = xundef
186 zcontrol_moist(:,:) = xundef
187 zcontrol_temp(:,:) = xundef
188 zwght_top(:,:) = xundef
189 zwght_sub(:,:) = xundef
190 !
191 ztg_top(:) = 0.0
192 ztg_sub(:) = 0.0
193 !
194 zlog2 = log(2.0)
195 !
196 ! convert soil temperature from K to C (over 1m depth for DIF)
197 !
198 IF(hisba/='DIF')THEN
199  ztg_top(:) = ptg(:,1)-xtt
200  ztg_sub(:) = ptg(:,2)-xtt
201 ELSE
202  DO ji=1,ini
203  idepth=kwg_layer(ji)
204  zdg_top(ji)=min(zdtop,pdg(ji,idepth))
205  zdg_sub(ji)=min(zdsub,pdg(ji,idepth))
206  ENDDO
207  DO jl=1,inl
208  DO ji=1,ini
209  zwght_top(ji,jl)=min(pdzg(ji,jl),max(0.0,zdg_top(ji)-pdg(ji,jl)+pdzg(ji,jl)))
210  zwght_sub(ji,jl)=min(pdzg(ji,jl),max(0.0,zdg_sub(ji)-pdg(ji,jl)+pdzg(ji,jl)))
211  ztg_top(ji)=ztg_top(ji)+(ptg(ji,jl)-xtt)*zwght_top(ji,jl)/zdg_top(ji)
212  ztg_sub(ji)=ztg_sub(ji)+(ptg(ji,jl)-xtt)*zwght_sub(ji,jl)/zdg_sub(ji)
213  ENDDO
214  ENDDO
215 ENDIF
216 !
217 !
218 !* 2. Autotrophic respiration
219 ! -----------------------
220 !
221 zresp_auto_above(:)=0.
222 !
223 IF (hphoto=='NIT') THEN
224 !
225  DO jnbiomass=1,2
226  zresp_auto_above(:) = zresp_auto_above(:) + presp_biomass_inst(:,jnbiomass)
227  ENDDO
228 !
229 ELSE IF (hphoto=='NCB') THEN
230 !
231  DO jnbiomass=1,3
232  zresp_auto_above(:) = zresp_auto_above(:) + presp_biomass_inst(:,jnbiomass)
233  ENDDO
234 !
235 ELSE IF (hphoto=='AGS' .OR. hphoto=='AST' .OR. hphoto=='LAI' .OR. hphoto=='LST') THEN
236 !
237  zresp_auto_above(:) = presp_biomass_inst(:,1)
238 !
239 ENDIF
240 !
241 DO jnbiomass=1,inbiomass
242  presp_auto(:) = presp_auto(:) + presp_biomass_inst(:,jnbiomass)
243 ENDDO
244 !
245 !
246 !* 3. Soil and ecosystem respiration
247 ! ------------------------------
248 !
249 IF (hrespsl == 'DEF') THEN
250 !
251  zwork(:)=0.0
252 !
253  IF(hisba/='DIF')THEN
254  zwork(:) = pwg(:,1)
255  ELSE
256  DO jl=1,inl
257  DO ji=1,ini
258  zwork(ji)=zwork(ji)+pwg(ji,jl)*zwght_top(ji,jl)/zdg_top(ji)
259  ENDDO
260  ENDDO
261  ENDIF
262 !
263 ! Soil respiration from Norman et al 1992 (kgCO2/kgair m/s)
264 !
265  WHERE (plai(:) == xundef)
266  zresp_soil_tot(:) = 0.0
267  ELSEWHERE
268 ! Before optimization = (ZCOEF1/PRHOA)*(ZCOEF2+ZCOEF3*PLAI(:))*PWG(:,1)*2.**(ZCOEF4*(ZT2(:)-ZCOEF5))
269  zresp_soil_tot(:) = (zcoef1/prhoa)*(zcoef2+zcoef3*plai(:))*zwork(:)*exp(zlog2*(zcoef4*(ztg_sub(:)-zcoef5)))
270  ENDWHERE
271 !
272 ! RESP_ECO is diagnosed from RESP_SOIL_TOT and RESP_AUTO_ABOVE
273 !
274  presp_eco(:) = zresp_soil_tot(:) + zresp_auto_above(:)
275 !
276 ELSE IF (hrespsl == 'PRM') THEN
277 !
278  zwork(:)=0.0
279 !
280  IF(hisba/='DIF')THEN
281  zwork(:) = pwg(:,1)
282  ELSE
283  DO jl=1,inl
284  DO ji=1,ini
285  zwork(ji)=zwork(ji)+min(1.0,pwg(ji,jl)/pwfc(ji,jl))*zwght_top(ji,jl)/zdg_top(ji)
286  ENDDO
287  ENDDO
288  ENDIF
289 !
290 ! Ecosystem respiration : Q10 model following Albergel et al. 2009 for SMOSREX
291 ! (kgCO2/kgair m/s)
292 ! RESP_ECO is directly calculated by the parameterization
293 !
294 ! Before optimization
295 ! PRESP_ECO(:) = PRE25(:)/PRHOA(:) * MIN(PWG(:,1)/PWFC(:,1),1.)*2.**(ZCOEF4*(ZT2(:)-ZCOEF5))
296  presp_eco(:) = pre25(:)/prhoa(:) * zwork(:)*exp(zlog2*(zcoef4*(ztg_sub(:)-zcoef5)))
297 !
298 ELSE IF (hrespsl == 'CNT') THEN
299 !
300 ! Heterotrophic respiration following CENTURY model from Gibelin et al. 2008
301 !
302  zmoist_top(:)=0.0
303  zsat_top(:)=0.0
304  zmoist_sub(:)=0.0
305  zsat_sub(:)=0.0
306  zsand_sub(:)=0.0
307 !
308  IF(hisba/='DIF')THEN
309 !
310  zmoist_top(:) = min(1.0,max(0.0,(pwg(:,1)-pwwilt(:,1))/(pwfc(:,1)-pwwilt(:,1))))
311  zsat_top(:) = min(1.0,max(0.0,(pwg(:,1)-pwfc(:,1))/(pwsat(:,1)-pwfc(:,1))))
312  zmoist_sub(:) = min(1.0,max(0.0,(pwg(:,2)-pwwilt(:,2))/(pwfc(:,2)-pwwilt(:,2))))
313  zsat_sub(:) = min(1.0,max(0.0,(pwg(:,2)-pwfc(:,2))/(pwsat(:,2)-pwfc(:,2))))
314 !
315  zsand_sub(:) = psand(:,2)
316 !
317  ELSE
318 !
319  DO jl=1,inl
320  DO ji=1,ini
321 !
322  zmoistl=min(1.0,max(0.0,(pwg(ji,jl)-pwwilt(ji,jl))/(pwfc(ji,jl)-pwwilt(ji,jl))))
323  zsatl =min(1.0,max(0.0,(pwg(ji,jl)-pwfc(ji,jl))/(pwsat(ji,jl)-pwfc(ji,jl))))
324 !
325  zmoist_top(ji)=zmoist_top(ji)+zmoistl*zwght_top(ji,jl)/zdg_top(ji)
326  zsat_top(ji)=zsat_top(ji)+zsatl *zwght_top(ji,jl)/zdg_top(ji)
327  zmoist_sub(ji)=zmoist_sub(ji)+zmoistl*zwght_sub(ji,jl)/zdg_sub(ji)
328  zsat_sub(ji)=zsat_sub(ji)+zsatl *zwght_sub(ji,jl)/zdg_sub(ji)
329 !
330  zsand_sub(ji)=zsand_sub(ji)+psand(ji,jl)*zwght_sub(ji,jl)/zdg_sub(ji)
331 !
332  ENDDO
333  ENDDO
334 !
335  ENDIF
336 !
337  zcontrol_temp(:,1) = control_temp_func(ztg_top(:))
338  zcontrol_temp(:,2) = control_temp_func(ztg_sub(:))
339  zcontrol_moist(:,1) = control_moist_func(zmoist_top(:),zsat_top(:))
340  zcontrol_moist(:,2) = control_moist_func(zmoist_sub(:),zsat_sub(:))
341 !
342  CALL carbon_litter(ptstep,pturnover,plitter,plignin_struc, &
343  zcontrol_temp,zcontrol_moist, &
344  zresp_hetero_day_litter,zsoilcarbon_input)
345 !
346  DO itcspin = 1,kspins
347  CALL carbon_soil(ptstep,zsand_sub,zsoilcarbon_input,zcontrol_temp,&
348  zcontrol_moist,psoilcarb,zresp_hetero_day_soil )
349  ENDDO
350 !
351 ! Transform units : gC/m2/day -> kgCO2/kgair m/s
352 !
353  zresp_hetero(:) = (zresp_hetero_day_litter(:) + zresp_hetero_day_soil(:)) &
354  * (xmco2/xmc) / (1000. * prhoa(:)* xday)
355 !
356 ! RESP_ECO is diagnosed from RESP_HETERO and RESP_AUTO
357 !
358  presp_eco(:) = zresp_hetero(:) + presp_auto(:)
359 !
360 ENDIF
361 !
362 IF (lhook) CALL dr_hook('CARBON_EVOL',1,zhook_handle)
363 !
364 !-----------------------------------------------------------------
365 !
366 END SUBROUTINE carbon_evol
real function, dimension(size(ptemp_in)) control_temp_func(PTEMP_IN)
subroutine carbon_litter(PTSTEP, PTURNOVER, PLITTER, PLIGNIN_STRUC, PCONTROL_TEMP, PCONTROL_MOIST, PRESP_HETERO_LITTER, PSOILCARBON_INPUT)
subroutine carbon_soil(PTSTEP, PSAND, PSOILCARBON_INPUT, PCONTROL_TEMP, PCONTROL_MOIST, PSOILCARB, PRESP_HETERO_SOIL)
Definition: carbon_soil.F90:6
real function, dimension(size(pmoist)) control_moist_func(PMOIST, PSAT)
subroutine carbon_evol(HISBA, HRESPSL, HPHOTO, PTSTEP, KSPINS, PRHOA, PTG, PWG, PWFC, PWWILT, PWSAT, PSAND, PDG, PDZG, KWG_LAYER, PRE25, PLAI, PRESP_BIOMASS_INST, PTURNOVER, PLITTER, PLIGNIN_STRUC, PSOILCARB, PRESP_AUTO, PRESP_ECO)
Definition: carbon_evol.F90:6