SURFEX v8.1
General documentation of Surfex
nitro_decline.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 nitro_decline(IO, PK, PEK, OWOOD, PBSLAI_NITRO, PLAT, PBIOMASS_LEAF )
7 !
8 ! ###############################################################
9 !!** NITRO_DECLINE
10 !!
11 !! PURPOSE
12 !! -------
13 !!
14 !!** METHOD
15 !! ------
16 !! Calvet and Soussana (2001) and Gibelin et al. (2006) for nitrogen dilution.
17 !! Gibelin et al. (2008) : New biomass reservoirs, and new method for allocation,
18 !! mortality and respiration.
19 !!
20 !! EXTERNAL
21 !! --------
22 !! none
23 !!
24 !! IMPLICIT ARGUMENTS
25 !! ------------------
26 !!
27 !! none
28 !!
29 !! REFERENCE
30 !! ---------
31 !!
32 !! Calvet and Soussana (2001), "Modelling CO2-enrichment effects using an
33 !! interactive vegetation SVAT scheme", Agricultural and Forest Meteorology, Vol. 108
34 !! pp. 129-152
35 !! Gibelin et al. (2008), "Modelling energy and CO2 fluxes with an interactive vegetation
36 !! land surface model - Evaluation at high and middle latitudes",
37 !! Agricultural and Forest Meteorology, Vol. 148 , pp. 1611-1628
38 !!
39 !! AUTHOR
40 !! ------
41 !!
42 !! A.-L. Gibelin * Meteo-France *
43 !! (following Belair)
44 !!
45 !! MODIFICATIONS
46 !! -------------
47 !! Original 27/01/03
48 !!
49 !! P Le Moigne 09/2005 : AGS modifs of L. Jarlan
50 !! A.L. Gibelin 04/2009 : BIOMASS and RESP_BIOMASS arrays
51 !! A.L. Gibelin 04/2009 : Suppress unused arguments
52 !! A.L. Gibelin 04/2009 : Suppress unused modules and add ONLY
53 !! A.L. Gibelin 04/2009 : adaptation to SURFEX environment
54 !! A. Barbu 01/2011 : modification of active biomass,leaf reservoir (see nitro_decline.f90)
55 !! C. Delire 04/2012 : spinup wood carbon
56 !! R. Alkama 04/2012 : 19 vegtype rather than 12
57 !! B. Decharme 05/2012: Optimization
58 !! ZCC_NITRO and ZBIOMASST_LIM in modd_co2v_par.F90
59 !! C. Delire 01/2014 : sapwood respiration from IBIS
60 
61 !
62 !-------------------------------------------------------------------------------
63 !
64 !* 0. DECLARATIONS
65 ! ------------
66 !
68 USE modd_isba_n, ONLY : isba_p_t, isba_pe_t
69 !
70 USE modd_csts, ONLY : xpi, xday
71 USE modd_co2v_par, ONLY : xpcco2, xcc_nit, xca_nit, xmc, &
72  xmco2, xcc_nitro, xbiomasst_lim
73 USE modd_data_cover_par, ONLY : nvt_tebd, nvt_bone, nvt_trbe, nvt_trbd, &
74  nvt_tebe, nvt_tene, nvt_bobd, nvt_bond, &
75  nvt_shrb
76 !
77 USE yomhook ,ONLY : lhook, dr_hook
78 USE parkind1 ,ONLY : jprb
79 !
80 IMPLICIT NONE
81 !
82 TYPE(isba_options_t), INTENT(INOUT) :: IO
83 TYPE(isba_p_t), INTENT(INOUT) :: PK
84 TYPE(isba_pe_t), INTENT(INOUT) :: PEK
85 !
86 !* 0.1 declarations of arguments
87 !
88 LOGICAL, DIMENSION(:), INTENT(IN) :: OWOOD
89 !
90 REAL, DIMENSION(:), INTENT(IN) :: PBSLAI_NITRO ! ratio of biomass to LAI
91 REAL, DIMENSION(:), INTENT(IN) :: PLAT ! latitude of each grid point
92 !
93 REAL, DIMENSION(:), INTENT(OUT) :: PBIOMASS_LEAF ! temporary leaf biomass
94 !
95 !* 0.2 declarations of local variables
96 !
97 REAL :: ZBMCOEF
98 REAL, DIMENSION(SIZE(PEK%XLAI,1)) :: ZXSEFOLD ! e-folding time for senescence corrected (days)
99 REAL, DIMENSION(SIZE(PEK%XLAI,1)) :: ZLAIB_NITRO ! LAI correction parameter used in sefold calculation
100 REAL, DIMENSION(SIZE(PEK%XLAI,1)) :: ZASSIM ! assimilation
101 REAL, DIMENSION(SIZE(PEK%XLAI,1)) :: ZBIOMASST ! leaf + active structural biomass
102 !
103 REAL, DIMENSION(SIZE(PEK%XLAI,1),SIZE(PEK%XBIOMASS,2)) :: ZINCREASE
104 REAL, DIMENSION(SIZE(PEK%XLAI,1),SIZE(PEK%XBIOMASS,2)) :: ZBIOMASS ! temporary biomass reservoirs
105 REAL, DIMENSION(SIZE(PEK%XLAI,1),SIZE(PEK%XBIOMASS,2)) :: ZDECLINE ! biomass decline (storage+mortality) (kgDM m-2 day-1)
106 REAL, DIMENSION(SIZE(PEK%XLAI,1),SIZE(PEK%XBIOMASS,2)) :: ZSTORAGE ! storage (part of decline kgDM m-2 day-1)
107 REAL, DIMENSION(SIZE(PEK%XLAI,1)) :: ZMORT_LEAF ! leaf mortality
108 !
109 REAL, DIMENSION(SIZE(PEK%XLAI,1)) :: ZWORK,ZRESP
110 LOGICAL, DIMENSION(SIZE(PEK%XLAI,1)) :: GMASK_ASSIM
111 !
112 REAL(KIND=JPRB) :: ZHOOK_HANDLE
113 !
114 INTEGER :: JSPIN, JI, INI
115 !
116 ! correspondence between array indices and biomass compartments
117 ! LEAF = 1
118 ! STRUCT_ACT = 2
119 ! STRUCT_PAS = 3
120 ! STRUCT_BELOW = 4
121 ! WOOD_ABOVE = 5
122 ! WOOD_BELOW = 6
123 !
124 !-------------------------------------------------------------------------------
125 !
126 ! 1 - Initialisations
127 ! -------------------
128 !
129 IF (lhook) CALL dr_hook('NITRO_DECLINE',0,zhook_handle)
130 !
131 ini = SIZE(pek%XLAI,1)
132 !
133 zxsefold(:) = 0.0
134 zlaib_nitro(:) = 0.0
135 zbiomasst(:) = 0.0
136 zassim(:) = 0.0
137 zbiomass(:,:) = 0.0
138 zdecline(:,:) = 0.0
139 zincrease(:,:) = 0.0
140 zstorage(:,:) = 0.0
141 zmort_leaf(:) = 0.0
142 !---------------------------------------------------
143 !
144 zbmcoef = xmc/(xmco2*xpcco2)
145 !
146 !-----------------------------------------------------------------
147 !avoid possible but unlikely negative values for biomass:
148 !
149 pek%XBIOMASS(:,1) = max(pek%XBIOMASS(:,1),0.0)
150 !
151 ! current leaf biomass value:
152 !
153 pbiomass_leaf(:) = pek%XBIOMASS(:,1)
154 !
155 !-------------------------------------------------------------------------------
156 !
157 ! Once a day (at midnight),repartition of net assimilation and mortality
158 ! into different biomass compartments.
159 !
160 ! 2 - Evolution of leaf biomass and senescence calculations
161 ! ---------------------------------------------------------
162 !
163 ! coef c for biomass in kg/m2 now in modd_co2v_par.F90 (XCC_NITRO)
164 !
165 ! LAI correction for shadow effect
166 IF (io%LTR_ML) THEN
167  zlaib_nitro(:) = 5.30
168 ELSE
169  zlaib_nitro(:) = max( 5.76-0.64*atan(abs(plat(:))*xpi/180.),3.8 )
170 ENDIF
171 !
172 !
173 ! leaf life expectancy
174 !
175 zwork(:) = 0.0
176 WHERE(pek%XGMES(:)>0.0)
177  zwork(:) = 0.321*log(pek%XGMES(:)*1000.)
178  zwork(:) = exp(zwork(:))*pek%XLAI(:)/zlaib_nitro(:)
179 ENDWHERE
180 ! before optimization
181 !ZXSEFOLD(:)= PEK%XSEFOLD(:) * MAX(((PEK%XGMES(:)*1000.)**0.321)*PEK%XLAI(:)/ZLAIB_NITRO(:), 1.) * ...
182 zxsefold(:) = pek%XSEFOLD(:) * max(1.0,zwork(:)) * min(1.0,pek%XANFM(:)/pk%XANMAX(:)) / xday
183 !
184 ! avoid possible but unlikely division by zero
185 !
186 zxsefold(:) = max(1.0e-8,zxsefold(:))
187 !
188 ! limitation of leaf life expectancy
189 !
190 ! OLD ZXSEFOLD(:) = MAX(5.,ZXSEFOLD(:))
191 ! Following Marita's work limitation of the senesence
192 zxsefold(:) = max(pek%XSEFOLD(:)/xday/10.0,zxsefold(:))
193 !
194 ! senesence of active biomass
195 !
196 zdecline(:,1) = min(pbiomass_leaf(:)-pek%XLAIMIN(:)*pbslai_nitro(:), &
197  pbiomass_leaf(:)*(1.0-exp(-1.0/zxsefold(:))))
198 !
199 ! avoid negative values due to computation precision
200 !
201 zdecline(:,1) = max(zdecline(:,1),0.0)
202 !
203 ! current leaf biomass with assimilation and senescence
204 !
205 pbiomass_leaf(:) = pbiomass_leaf(:) - zdecline(:,1)
206 !
207 ! daily active biomass assimilation
208 !
209 zassim(:) = pek%XANDAY(:)*zbmcoef
210 !
211 !-------------------------------------------------------------------------------
212 !
213 ! 3 - Evolution of active structural biomass
214 ! ------------------------------------------
215 !
216 zwork(:) = 0.0
217 WHERE(pbiomass_leaf(:)>0.0)
218  zwork(:) = (1.0/(1.0-xca_nit))*log(pbiomass_leaf(:)/xcc_nitro)
219  zwork(:) = exp(zwork(:))
220 ENDWHERE
221 !
222 WHERE (zassim(:) >= zdecline(:,1))
223  !
224  ! 3.1 - Growing phase : plant nitrogen decline theory
225  !
226  ! the growth allometric law is applied
227  ! repartition of total biomass
228  !
229  !before optimization
230  !ZBIOMASST(:)= MAX(PBIOMASS_LEAF(:), (PBIOMASS_LEAF(:)/XCC_NITRO)**(1.0/(1.0-XCA_NIT)))
231  zbiomasst(:) = max(pbiomass_leaf(:), zwork(:))
232  !
233  ! active structural biomass increment and storage
234  !
235  zbiomass(:,2) = zbiomasst(:) - pbiomass_leaf(:)
236  zdecline(:,2) = zbiomass(:,2) * (1.0-exp(-1.0*xday/pek%XSEFOLD(:)))
237  zstorage(:,1) = zbiomass(:,2) - pek%XBIOMASS(:,2) + zdecline(:,2) + pek%XRESP_BIOMASS(:,2)
238  !
239 ELSE WHERE
240  !
241  ! 3.2 - Senescence phase
242  !
243  ! the active structural biomass dies exponentially at the lowest rate
244  !
245  zstorage(:,1) = 0.0
246  zdecline(:,2) = pek%XBIOMASS(:,2) * (1.0-exp(-1.0*xday/pek%XSEFOLD(:)))
247  zbiomass(:,2) = pek%XBIOMASS(:,2) - zdecline(:,2) - pek%XRESP_BIOMASS(:,2)
248  !
249  ! Avoid negative values of biomass
250  ! No test on ZDECLINE(:,2) as it is not used after, or recalculated
251  ! No test on PEK%XRESP_BIOMASS(:,2,1) as it should be smaller than PEK%XBIOMASS(:,2,1)
252  ! otherwise there are irrealistic values of temperature
253  !
254  zbiomass(:,2) = max(zbiomass(:,2),0.0)
255  !
256  zbiomasst(:) = pbiomass_leaf(:) + zbiomass(:,2)
257  !
258 END WHERE
259 !
260 ! 3.3 - Flow to the passive structural biomass: cut or growth after senescence
261 ! Biomass is taken from active structural biomass, not from senescence of leaves
262 !
263 zincrease(:,1) = zassim(:)
264 zincrease(:,2) = zstorage(:,1)
265 zincrease(:,3) = -min(zstorage(:,1),0.0)
266 !
267 zstorage(:,1) = max(0.0,zstorage(:,1))
268 !
269 ! 3.4 - Mass conservation : leaf biomass sensecence must be >= structural storage
270 !
271 WHERE( zstorage(:,1) > zdecline(:,1))
272  zdecline(:,2) = pek%XBIOMASS(:,2) * (1.0 - exp(-1.0*xday/pek%XSEFOLD(:)))
273  zbiomasst(:) = pek%XBIOMASS(:,1) + pek%XBIOMASS(:,2) - zdecline(:,2) - pek%XRESP_BIOMASS(:,2)
274 END WHERE
275 !
276 zwork(:) = 0.0
277 WHERE( zbiomasst(:) > 0.0)
278  zwork(:) = (1.0-xca_nit)*log(zbiomasst(:))
279  zwork(:) = exp(zwork(:))
280 ENDWHERE
281 !
282 WHERE( zstorage(:,1) > zdecline(:,1))
283  !
284  !before optimization
285  !PBIOMASS_LEAF(:)= ZCC_NITRO * (ZBIOMASST(:)**(1.0-XCA_NIT))
286  pbiomass_leaf(:) = xcc_nitro * zwork(:)
287  zbiomass(:,2) = zbiomasst(:) - pbiomass_leaf(:)
288  zdecline(:,1) = pek%XBIOMASS(:,1) - pbiomass_leaf(:)
289  zstorage(:,1) = zbiomass(:,2) - pek%XBIOMASS(:,2) + zdecline(:,2) + pek%XRESP_BIOMASS(:,2)
290  !
291  zincrease(:,2) = zstorage(:,1)
292  !
293 END WHERE
294 !
295 !-------------------------------------------------------------------------------
296 !
297 ! 4 - Evolution of other biomass pools and final calculations
298 ! -----------------------------------------------------------
299 !
300 ! 4.1 - Mortality of leaf biomass
301 !
302 zmort_leaf(:) = max(0.0, zdecline(:,1) - zstorage(:,1))
303 !
304 zbiomass(:,3) = pek%XBIOMASS(:,3)
305 !
306 IF (io%CPHOTO=='NIT') THEN
307  !
308  ! senesence of deep-structural biomass
309  !
310  zdecline(:,3) = zbiomass(:,3)*(1.0-exp(-1.0*xday/pek%XSEFOLD(:)))
311  !
312  ! threshold value for leaf biomass and total above ground biomass in nitrogen
313  ! dilution theory now in modd_co2v_par.F90 (XBIOMASST_LIM)
314  !
315  ! emergency deep structural biomass
316  WHERE((zbiomasst(:) <= xbiomasst_lim) .AND. (zxsefold(:) > 1.0))
317  zbiomass(:,3) = zbiomass(:,3) + zmort_leaf(:)
318  END WHERE
319  !
320 ELSEIF (io%CPHOTO=='NCB') THEN
321  !
322  ! 4.2 - Evolution of the other reservoirs
323  ! 4.2.1 - senesence, avoiding negative values of biomass
324  !
325  zdecline(:,3) = min(pek%XBIOMASS(:,3)*(1.0-exp(-1.0*xday/(pek%XSEFOLD(:)/4.))), &
326  pek%XBIOMASS(:,3)-pek%XRESP_BIOMASS(:,3))
327  zdecline(:,4) = min(pek%XBIOMASS(:,4)*(1.0-exp(-1.0*xday/pek%XSEFOLD(:))), &
328  pek%XBIOMASS(:,4)-pek%XRESP_BIOMASS(:,4))
329  !
330  WHERE (owood(:))
331  ! Woody
332  zdecline(:,5) = min(pek%XBIOMASS(:,5)*(1.0-exp(-1.0*xday/pk%XTAU_WOOD(:))), &
333  pek%XBIOMASS(:,5)-pek%XRESP_BIOMASS(:,5))
334  zdecline(:,6) = pek%XBIOMASS(:,6)*(1.0-exp(-1.0*xday/pk%XTAU_WOOD(:)))
335  ELSEWHERE
336  ! Herbaceous
337  zdecline(:,5) = 0.
338  zdecline(:,6) = 0.
339  END WHERE
340  !
341  ! 4.2.2 - storage (part of decline used as input for other reservoirs)
342  !
343  gmask_assim(:)=(zassim(:) >= zdecline(:,1))
344  !
345  WHERE (gmask_assim(:))
346  !
347  ! Remaining mortality is stored in roots.
348  zincrease(:,4) = zmort_leaf(:)
349  !
350  ! Growing phase, all leaf decline is used as storage.
351  zstorage(:,1) = zstorage(:,1) + zincrease(:,4)
352  zmort_leaf(:) = zmort_leaf(:) - zincrease(:,4)
353  !
354  zstorage(:,2) = zdecline(:,2)
355  zstorage(:,3) = zdecline(:,3)
356  !
357  ELSEWHERE
358  !
359  ! Senescence, a part of mortality is stored in roots, limited by assimilation rate.
360  zincrease(:,4) = min(max(0.5*zassim(:),0.) , 0.5*zmort_leaf(:))
361  !
362  zstorage(:,1) = zstorage(:,1) + zincrease(:,4)
363  zmort_leaf(:) = zmort_leaf(:) - zincrease(:,4)
364  !
365  END WHERE
366  !
367  WHERE(gmask_assim(:).AND.owood(:))
368  ! Woody
369  zstorage(:,4) = zdecline(:,4)
370  !
371  zincrease(:,4) = zincrease(:,4) + 0.3* (zstorage(:,2) + zstorage(:,3))
372  zincrease(:,5) = 0.7* (zstorage(:,2) + zstorage(:,3))
373  zincrease(:,6) = zstorage(:,4)
374  !
375  ELSEWHERE(gmask_assim(:).AND..NOT.owood(:))
376  ! Herbaceous
377  zstorage(:,4) = 0.
378  !
379  zincrease(:,4) = zincrease(:,4) + zstorage(:,2) + zstorage(:,3)
380  !
381  END WHERE
382  !
383  WHERE (.NOT.gmask_assim(:).AND.owood(:))
384  ! Woody
385  ! Senescence, only a part of decline is used as storage
386  zstorage(:,2) = 0.5*zdecline(:,2)
387  zstorage(:,3) = 0.5*zdecline(:,3)
388  zstorage(:,4) = 0.5*zdecline(:,4)
389  !
390  zincrease(:,5) = zstorage(:,2) + zstorage(:,3)
391  zincrease(:,6) = zstorage(:,4)
392  !
393  ELSEWHERE(.NOT.gmask_assim(:).AND..NOT.owood(:))
394  ! Herbaceous
395  ! Senescence, no storage
396  zstorage(:,2) = 0.
397  zstorage(:,3) = 0.
398  zstorage(:,4) = 0.
399  !
400  END WHERE
401  !
402  zstorage(:,5) = 0.
403  zstorage(:,6) = 0.
404  !
405  ! 4.2.3 - mortality (senescence - storage) and turnover
406  !
407  IF (io%CRESPSL=='CNT') THEN
408  pk%XTURNOVER(:,1) = zmort_leaf(:)*1000.*xpcco2/xday
409  pk%XTURNOVER(:,2) = (zdecline(:,2) - zstorage(:,2))*1000.*xpcco2/xday
410  pk%XTURNOVER(:,3) = (zdecline(:,3) - zstorage(:,3))*1000.*xpcco2/xday
411  pk%XTURNOVER(:,4) = (zdecline(:,4) - zstorage(:,4))*1000.*xpcco2/xday
412  pk%XTURNOVER(:,5) = (zdecline(:,5) - zstorage(:,5))*1000.*xpcco2/xday
413  pk%XTURNOVER(:,6) = (zdecline(:,6) - zstorage(:,6))*1000.*xpcco2/xday
414  ENDIF
415  !
416 ENDIF
417 !
418 !
419 ! 4.3 - Re-initialisations for next time step
420 !
421 zbiomass(:,3) = zbiomass(:,3) + zincrease(:,3) - zdecline(:,3) - pek%XRESP_BIOMASS(:,3)
422 !
423 ! Add net accumulated CO2 assimilation
424 pbiomass_leaf(:) = pbiomass_leaf(:) + zassim(:)
425 !
426 ! re-initialisation of biomass compartments values: X(day) <-- X(day-1)
427 pek%XBIOMASS(:,1) = pbiomass_leaf(:)
428 pek%XBIOMASS(:,2) = zbiomass(:,2)
429 pek%XBIOMASS(:,3) = zbiomass(:,3)
430 !
431 ! re-initialisation of respiration and assimilation terms
432 pek%XRESP_BIOMASS(:,2) = 0.0
433 pek%XRESP_BIOMASS(:,3) = 0.0
434 pek%XANFM(:) = 0.0
435 !
436 !
437 ! 4.2.4 - evolution of reservoirs
438 !
439 IF (io%CPHOTO=='NIT') THEN
440  !
441  pek%XBIOMASS(:,3) = max(pek%XBIOMASS(:,3),0.0)
442  !
443 ELSEIF (io%CPHOTO=='NCB') THEN
444  !
445  zbiomass(:,4) = pek%XBIOMASS(:,4) + zincrease(:,4) - zdecline(:,4) - pek%XRESP_BIOMASS(:,4)
446  !
447 !
448  zbiomass(:,5) = pek%XBIOMASS(:,5)
449  zbiomass(:,6) = pek%XBIOMASS(:,6)
450  zresp(:) = pek%XRESP_BIOMASS(:,5)
451 !
452  DO jspin = 1, io%NSPINW
453  DO ji = 1,ini
454  IF(owood(ji))THEN
455  !Woody
456  zbiomass(ji,5) = zbiomass(ji,5) + zincrease(ji,5) - zdecline(ji,5) - zresp(ji)
457  zbiomass(ji,6) = zbiomass(ji,6) + zincrease(ji,6) - zdecline(ji,6)
458  zdecline(ji,5) = zbiomass(ji,5)*(1.0-exp((-1.0*xday)/pk%XTAU_WOOD(ji)))
459  zdecline(ji,6) = zbiomass(ji,6)*(1.0-exp((-1.0*xday)/pk%XTAU_WOOD(ji)))
460  IF (pek%XBIOMASS(ji,5).GT.0.0) &
461  zresp(ji) = pek%XRESP_BIOMASS(ji,5)/pek%XBIOMASS(ji,5) * zbiomass(ji,5)
462  ELSE
463  !Herbaceous
464  zbiomass(ji,5) = 0.
465  zbiomass(ji,6) = 0.
466  ENDIF
467  ENDDO
468  ENDDO
469 !
470  pek%XBIOMASS(:,4) = zbiomass(:,4)
471  pek%XBIOMASS(:,5) = zbiomass(:,5)
472  pek%XBIOMASS(:,6) = zbiomass(:,6)
473  !
474  pek%XRESP_BIOMASS(:,4) = 0.0
475  pek%XRESP_BIOMASS(:,5) = 0.0
476  !
477  pk%XINCREASE(:,:) = zincrease(:,:)
478 
479 ENDIF
480 !
481 IF (lhook) CALL dr_hook('NITRO_DECLINE',1,zhook_handle)
482 !
483 END SUBROUTINE nitro_decline
real, save xpi
Definition: modd_csts.F90:43
integer, parameter jprb
Definition: parkind1.F90:32
real, save xday
Definition: modd_csts.F90:45
logical lhook
Definition: yomhook.F90:15
subroutine nitro_decline(IO, PK, PEK, OWOOD, PBSLAI_NITRO, PLAT, PBIOMASS_LEAF)