1 | ! Light competition |
---|
2 | ! |
---|
3 | ! If canopy is almost closed (fpc > fpc_crit), then trees outcompete grasses. |
---|
4 | ! fpc_crit is normally fpc_crit. |
---|
5 | ! Here, fpc ("foilage protected cover") also takes into account the minimum fraction |
---|
6 | ! of space covered by trees through branches etc. This is done to prevent strong relative |
---|
7 | ! changes of fpc from one day to another for deciduous trees at the beginning of their |
---|
8 | ! growing season, which would yield to strong cutbacks (see 3.2.1.1.2) |
---|
9 | ! No competition between woody pfts (height of individuals is not considered) ! |
---|
10 | ! Exception: when one woody pft is overwhelming (i.e. fpc > fpc_crit). In that |
---|
11 | ! case, eliminate all other woody pfts and reduce dominant pft to fpc_crit. |
---|
12 | ! Age of individuals is not considered. In reality, light competition would more |
---|
13 | ! easily kill young individuals, thus increasing the mean age of the stand. |
---|
14 | ! Exclude agricultural pfts from competition |
---|
15 | ! |
---|
16 | ! SZ: added light competition for the static case if the mortality is not |
---|
17 | ! assumed to be constant. |
---|
18 | ! other modifs: |
---|
19 | ! -1 FPC is now always calculated from lm_lastyearmax*sla, since the aim of this DGVM is |
---|
20 | ! to represent community ecology effects; seasonal variations in establishment related to phenology |
---|
21 | ! may be relevant, but beyond the scope of a 1st generation DGVM |
---|
22 | ! -2 problem, if agriculture is present, fpc can never reach 1.0 since natural veget_max < 1.0. To |
---|
23 | ! correct for this, ind must be recalculated to correspond to the natural density... |
---|
24 | ! since ind is 1/m2 grid cell, this can be achived by dividing ind by the agricultural fraction |
---|
25 | |
---|
26 | ! |
---|
27 | ! $Header: /home/ssipsl/CVSREP/ORCHIDEE/src_stomate/lpj_light.f90,v 1.8 2009/01/06 15:01:25 ssipsl Exp $ |
---|
28 | ! IPSL (2006) |
---|
29 | ! This software is governed by the CeCILL licence see ORCHIDEE/ORCHIDEE_CeCILL.LIC |
---|
30 | ! |
---|
31 | MODULE lpj_light |
---|
32 | |
---|
33 | ! modules used: |
---|
34 | |
---|
35 | USE ioipsl |
---|
36 | USE stomate_constants |
---|
37 | USE constantes_veg |
---|
38 | |
---|
39 | IMPLICIT NONE |
---|
40 | |
---|
41 | ! private & public routines |
---|
42 | |
---|
43 | PRIVATE |
---|
44 | PUBLIC light, light_clear |
---|
45 | |
---|
46 | ! first call |
---|
47 | LOGICAL, SAVE :: firstcall = .TRUE. |
---|
48 | |
---|
49 | CONTAINS |
---|
50 | |
---|
51 | SUBROUTINE light_clear |
---|
52 | firstcall=.TRUE. |
---|
53 | END SUBROUTINE light_clear |
---|
54 | |
---|
55 | SUBROUTINE light (npts, dt, & |
---|
56 | veget_max, fpc_max, PFTpresent, cn_ind, lai, maxfpc_lastyear, & |
---|
57 | lm_lastyearmax, ind, biomass, veget_lastlight, bm_to_litter, mortality) |
---|
58 | |
---|
59 | ! |
---|
60 | ! 0 declarations |
---|
61 | ! |
---|
62 | |
---|
63 | ! 0.1 input |
---|
64 | |
---|
65 | ! Domain size |
---|
66 | INTEGER(i_std), INTENT(in) :: npts |
---|
67 | ! Time step (days) |
---|
68 | REAL(r_std), INTENT(in) :: dt |
---|
69 | ! Is pft there |
---|
70 | LOGICAL, DIMENSION(npts,nvm), INTENT(in) :: PFTpresent |
---|
71 | ! crown area of individuals (m**2) |
---|
72 | REAL(r_std), DIMENSION(npts,nvm), INTENT(in) :: cn_ind |
---|
73 | ! leaf area index OF AN INDIVIDUAL PLANT |
---|
74 | REAL(r_std), DIMENSION(npts,nvm), INTENT(in) :: lai |
---|
75 | ! last year's maximum fpc for each natural PFT, on ground |
---|
76 | REAL(r_std), DIMENSION(npts,nvm), INTENT(in) :: maxfpc_lastyear |
---|
77 | ! last year's maximum leafmass for each natural PFT, on ground |
---|
78 | REAL(r_std), DIMENSION(npts,nvm), INTENT(in) :: lm_lastyearmax |
---|
79 | ! last year's maximum fpc for each natural PFT, on ground |
---|
80 | REAL(r_std), DIMENSION(npts,nvm), INTENT(in) :: veget_max |
---|
81 | ! last year's maximum fpc for each natural PFT, on ground |
---|
82 | REAL(r_std), DIMENSION(npts,nvm), INTENT(in) :: fpc_max |
---|
83 | |
---|
84 | ! 0.2 modified fields |
---|
85 | |
---|
86 | ! Number of individuals / m2 |
---|
87 | REAL(r_std), DIMENSION(npts,nvm), INTENT(inout) :: ind |
---|
88 | ! biomass (gC/(m**2 of ground)) |
---|
89 | REAL(r_std), DIMENSION(npts,nvm,nparts), INTENT(inout) :: biomass |
---|
90 | ! Vegetation cover after last light competition |
---|
91 | REAL(r_std), DIMENSION(npts,nvm), INTENT(inout) :: veget_lastlight |
---|
92 | ! biomass taken away (gC/m**2) |
---|
93 | REAL(r_std), DIMENSION(npts,nvm,nparts), INTENT(inout) :: bm_to_litter |
---|
94 | ! fraction of individuals that died this time step |
---|
95 | REAL(r_std), DIMENSION(npts,nvm), INTENT(inout) :: mortality |
---|
96 | |
---|
97 | ! 0.3 local |
---|
98 | |
---|
99 | ! maximum total number of grass individuals in a closed canopy |
---|
100 | REAL(r_std), PARAMETER :: grass_mercy = 0.01 |
---|
101 | ! minimum fraction of trees that survive even in a closed canopy |
---|
102 | REAL(r_std), PARAMETER :: tree_mercy = 0.01 |
---|
103 | ! for diagnosis of fpc increase, compare today's fpc to last year's maximum (T) or |
---|
104 | ! to fpc of last time step (F)? |
---|
105 | LOGICAL, PARAMETER :: annual_increase = .TRUE. |
---|
106 | ! index |
---|
107 | INTEGER(i_std) :: i,j,k,m |
---|
108 | ! total natural fpc |
---|
109 | REAL(r_std), DIMENSION(npts) :: sumfpc |
---|
110 | ! fraction of natural vegetation at grid cell level |
---|
111 | REAL(r_std), DIMENSION(npts) :: fracnat |
---|
112 | ! total natural woody fpc |
---|
113 | REAL(r_std) :: sumfpc_wood |
---|
114 | ! change in total woody fpc |
---|
115 | REAL(r_std) :: sumdelta_fpc_wood |
---|
116 | ! maximum wood fpc |
---|
117 | REAL(r_std) :: maxfpc_wood |
---|
118 | ! which woody pft is maximum |
---|
119 | INTEGER(i_std) :: optpft_wood |
---|
120 | ! total natural grass fpc |
---|
121 | REAL(r_std) :: sumfpc_grass |
---|
122 | ! this year's foliage protected cover on natural part of the grid cell |
---|
123 | REAL(r_std), DIMENSION(npts,nvm) :: fpc_nat |
---|
124 | ! fpc change within last year |
---|
125 | REAL(r_std), DIMENSION(nvm) :: deltafpc |
---|
126 | ! Relative change of number of individuals for trees |
---|
127 | REAL(r_std) :: reduct |
---|
128 | ! Fraction of plants that survive |
---|
129 | REAL(r_std), DIMENSION(nvm) :: survive |
---|
130 | ! FPC for static mode |
---|
131 | REAL(r_std), DIMENSION(npts) :: fpc_real |
---|
132 | ! FPC mortality for static mode |
---|
133 | REAL(r_std), DIMENSION(npts) :: lai_ind |
---|
134 | ! number of grass PFTs present in the grid box |
---|
135 | ! INTEGER(i_std) :: num_grass |
---|
136 | ! New total grass fpc |
---|
137 | REAL(r_std) :: sumfpc_grass2 |
---|
138 | ! fraction of plants that dies each day (1/day) |
---|
139 | REAL(r_std), DIMENSION(npts,nvm) :: light_death |
---|
140 | ! Relative change of number of individuals for trees |
---|
141 | REAL(r_std) :: fpc_dec |
---|
142 | |
---|
143 | ! ========================================================================= |
---|
144 | |
---|
145 | IF (bavard.GE.3) WRITE(numout,*) 'Entering light' |
---|
146 | |
---|
147 | ! |
---|
148 | ! 1 first call |
---|
149 | ! |
---|
150 | |
---|
151 | IF ( firstcall ) THEN |
---|
152 | |
---|
153 | WRITE(numout,*) 'light:' |
---|
154 | |
---|
155 | WRITE(numout,*) ' > Maximum total number of grass individuals in' |
---|
156 | WRITE(numout,*) ' a closed canopy: ', grass_mercy |
---|
157 | |
---|
158 | WRITE(numout,*) ' > Minimum fraction of trees that survive even in' |
---|
159 | WRITE(numout,*) ' a closed canopy: ', tree_mercy |
---|
160 | |
---|
161 | WRITE(numout,*) ' > For trees, minimum fraction of crown area covered' |
---|
162 | WRITE(numout,*) ' (due to its branches etc.)', min_cover |
---|
163 | |
---|
164 | WRITE(numout,*) ' > for diagnosis of fpc increase, compare today''s fpc' |
---|
165 | IF ( annual_increase ) THEN |
---|
166 | WRITE(numout,*) ' to last year''s maximum.' |
---|
167 | ELSE |
---|
168 | WRITE(numout,*) ' to fpc of the last time step.' |
---|
169 | ENDIF |
---|
170 | |
---|
171 | firstcall = .FALSE. |
---|
172 | |
---|
173 | ENDIF |
---|
174 | |
---|
175 | IF (control%ok_dgvm) THEN |
---|
176 | ! |
---|
177 | ! 2 fpc characteristics |
---|
178 | ! |
---|
179 | |
---|
180 | ! 2.0 Only natural part of the grid cell: |
---|
181 | ! calculate fraction of natural and agricultural (1-fracnat) surface |
---|
182 | |
---|
183 | fracnat(:) = 1. |
---|
184 | DO j = 2,nvm |
---|
185 | IF ( .NOT. natural(j) ) THEN |
---|
186 | fracnat(:) = fracnat(:) - veget_max(:,j) |
---|
187 | ENDIF |
---|
188 | ENDDO |
---|
189 | ! |
---|
190 | ! 2.1 calculate fpc on natural part of grid cell. |
---|
191 | ! |
---|
192 | fpc_nat(:,:)=zero |
---|
193 | fpc_nat(:,ibare_sechiba)=un |
---|
194 | |
---|
195 | DO j = 2, nvm |
---|
196 | |
---|
197 | IF ( natural(j) ) THEN |
---|
198 | |
---|
199 | ! 2.1.1 natural PFTs |
---|
200 | |
---|
201 | IF ( tree(j) ) THEN |
---|
202 | |
---|
203 | ! 2.1.1.1 trees: minimum cover due to stems, branches etc. |
---|
204 | |
---|
205 | ! DO i = 1, npts |
---|
206 | ! IF (lai(i,j) == val_exp) THEN |
---|
207 | ! fpc_nat(i,j) = cn_ind(i,j) * ind(i,j) |
---|
208 | ! ELSE |
---|
209 | ! fpc_nat(i,j) = cn_ind(i,j) * ind(i,j) * & |
---|
210 | ! MAX( ( 1._r_std - exp( -lai(i,j) * ext_coeff(j) ) ), min_cover ) |
---|
211 | ! ENDIF |
---|
212 | ! ENDDO |
---|
213 | |
---|
214 | !NV : modif from SZ version : fpc is based on veget_max, not veget. |
---|
215 | WHERE(fracnat(:).GE.min_stomate) |
---|
216 | ! WHERE(LAI(:,j) == val_exp) |
---|
217 | ! fpc_nat(:,j) = cn_ind(:,j) * ind(:,j) / fracnat(:) |
---|
218 | ! ELSEWHERE |
---|
219 | ! fpc_nat(:,j) = cn_ind(:,j) * ind(:,j) / fracnat(:) * & |
---|
220 | ! MAX( ( 1._r_std - exp( - lm_lastyearmax(:,j) * sla(j) * ext_coeff(j) ) ), min_cover ) |
---|
221 | ! ENDWHERE |
---|
222 | fpc_nat(:,j) = cn_ind(:,j) * ind(:,j) / fracnat(:) |
---|
223 | ENDWHERE |
---|
224 | |
---|
225 | ELSE |
---|
226 | |
---|
227 | !NV : modif from SZ version : fpc is based on veget_max, not veget. |
---|
228 | WHERE(fracnat(:).GE.min_stomate) |
---|
229 | ! WHERE(LAI(:,j) == val_exp) |
---|
230 | ! fpc_nat(:,j) = cn_ind(:,j) * ind(:,j) / fracnat(:) |
---|
231 | ! ELSEWHERE |
---|
232 | ! fpc_nat(:,j) = cn_ind(:,j) * ind(:,j) / fracnat(:) * & |
---|
233 | ! ( 1._r_std - exp( - lm_lastyearmax(:,j) * sla(j) * ext_coeff(j) ) ) |
---|
234 | ! ENDWHERE |
---|
235 | fpc_nat(:,j) = cn_ind(:,j) * ind(:,j) / fracnat(:) |
---|
236 | ENDWHERE |
---|
237 | |
---|
238 | !!$ ! 2.1.1.2 bare ground |
---|
239 | !!$ IF (j == ibare_sechiba) THEN |
---|
240 | !!$ fpc_nat(:,j) = cn_ind(:,j) * ind(:,j) |
---|
241 | !!$ |
---|
242 | !!$ ! 2.1.1.3 grasses |
---|
243 | !!$ ELSE |
---|
244 | !!$ DO i = 1, npts |
---|
245 | !!$ IF (lai(i,j) == val_exp) THEN |
---|
246 | !!$ fpc_nat(i,j) = cn_ind(i,j) * ind(i,j) |
---|
247 | !!$ ELSE |
---|
248 | !!$ fpc_nat(i,j) = cn_ind(i,j) * ind(i,j) * & |
---|
249 | !!$ ( 1._r_std - exp( -lai(i,j) * ext_coeff(j) ) ) |
---|
250 | !!$ ENDIF |
---|
251 | !!$ ENDDO |
---|
252 | !!$ ENDIF |
---|
253 | |
---|
254 | ENDIF ! tree/grass |
---|
255 | |
---|
256 | ELSE |
---|
257 | |
---|
258 | ! 2.1.2 agricultural PFTs: not present on natural part |
---|
259 | |
---|
260 | fpc_nat(:,j) = zero |
---|
261 | |
---|
262 | ENDIF ! natural/agricultural |
---|
263 | |
---|
264 | ENDDO |
---|
265 | |
---|
266 | ! |
---|
267 | ! 2.2 sum natural fpc for every grid point |
---|
268 | ! |
---|
269 | |
---|
270 | sumfpc(:) = zero |
---|
271 | DO j = 2,nvm |
---|
272 | !SZ bug correction MERGE: need to subtract agricultural area! |
---|
273 | sumfpc(:) = sumfpc(:) + fpc_nat(:,j) |
---|
274 | ENDDO |
---|
275 | |
---|
276 | ! |
---|
277 | ! 3 Light competition |
---|
278 | ! |
---|
279 | |
---|
280 | light_death(:,:) = zero |
---|
281 | |
---|
282 | DO i = 1, npts ! SZ why this loop and not a vector statement ? |
---|
283 | |
---|
284 | ! Only if vegetation cover is dense |
---|
285 | |
---|
286 | IF ( sumfpc(i) .GT. fpc_crit ) THEN |
---|
287 | |
---|
288 | ! fpc change for each pft |
---|
289 | ! There are two possibilities: either we compare today's fpc with the fpc after the last |
---|
290 | ! time step, or we compare it to last year's maximum fpc of that PFT. In the first case, |
---|
291 | ! the fpc increase will be strong for seasonal PFTs at the beginning of the growing season. |
---|
292 | ! As for trees, the cutback is proportional to this increase, this means that seasonal trees |
---|
293 | ! will be disadvantaged compared to evergreen trees. In the original LPJ model, with its |
---|
294 | ! annual time step, the second method was used (this corresponds to annual_increase=.TRUE.) |
---|
295 | |
---|
296 | IF ( annual_increase ) THEN |
---|
297 | deltafpc(:) = MAX( (fpc_nat(i,:)-maxfpc_lastyear(i,:)), 0._r_std ) |
---|
298 | ELSE |
---|
299 | deltafpc(:) = MAX( (fpc_nat(i,:)-veget_lastlight(i,:)), 0._r_std ) |
---|
300 | ENDIF |
---|
301 | |
---|
302 | ! default: survive |
---|
303 | |
---|
304 | survive(:) = 1.0 |
---|
305 | |
---|
306 | ! |
---|
307 | ! 3.1 determine some characteristics of the fpc distribution |
---|
308 | ! |
---|
309 | |
---|
310 | sumfpc_wood = zero |
---|
311 | sumdelta_fpc_wood = zero |
---|
312 | maxfpc_wood = zero |
---|
313 | optpft_wood = 0 |
---|
314 | sumfpc_grass = zero |
---|
315 | ! num_grass = 0 |
---|
316 | |
---|
317 | DO j = 2,nvm |
---|
318 | |
---|
319 | ! only natural pfts |
---|
320 | |
---|
321 | IF ( natural(j) ) THEN |
---|
322 | |
---|
323 | IF ( tree(j) ) THEN |
---|
324 | |
---|
325 | ! trees |
---|
326 | |
---|
327 | ! total woody fpc |
---|
328 | |
---|
329 | sumfpc_wood = sumfpc_wood + fpc_nat(i,j) |
---|
330 | |
---|
331 | ! how much did the woody fpc increase |
---|
332 | |
---|
333 | sumdelta_fpc_wood = sumdelta_fpc_wood + deltafpc(j) |
---|
334 | |
---|
335 | ! which woody pft is preponderant |
---|
336 | |
---|
337 | IF ( fpc_nat(i,j) .GT. maxfpc_wood ) THEN |
---|
338 | |
---|
339 | optpft_wood = j |
---|
340 | |
---|
341 | maxfpc_wood = fpc_nat(i,j) |
---|
342 | |
---|
343 | ENDIF |
---|
344 | |
---|
345 | ELSE |
---|
346 | |
---|
347 | ! grasses |
---|
348 | |
---|
349 | ! total (natural) grass fpc |
---|
350 | |
---|
351 | sumfpc_grass = sumfpc_grass + fpc_nat(i,j) |
---|
352 | |
---|
353 | ! number of grass PFTs present in the grid box |
---|
354 | |
---|
355 | ! IF ( PFTpresent(i,j) ) THEN |
---|
356 | ! num_grass = num_grass + 1 |
---|
357 | ! ENDIF |
---|
358 | |
---|
359 | ENDIF ! tree or grass |
---|
360 | |
---|
361 | ENDIF ! natural |
---|
362 | |
---|
363 | ENDDO ! loop over pfts |
---|
364 | |
---|
365 | ! |
---|
366 | ! 3.2 light competition: assume wood outcompetes grass |
---|
367 | ! |
---|
368 | !SZ |
---|
369 | !!$ IF (sumfpc_wood .GE. fpc_crit ) THEN |
---|
370 | |
---|
371 | ! |
---|
372 | ! 3.2.1 all allowed natural space is covered by wood: |
---|
373 | ! cut back trees to fpc_crit. |
---|
374 | ! Original DGVM: kill grasses. Modified: we let a very |
---|
375 | ! small fraction of grasses survive. |
---|
376 | ! |
---|
377 | |
---|
378 | DO j = 2,nvm |
---|
379 | |
---|
380 | ! only present and natural pfts compete |
---|
381 | |
---|
382 | IF ( PFTpresent(i,j) .AND. natural(j) ) THEN |
---|
383 | |
---|
384 | IF ( tree(j) ) THEN |
---|
385 | |
---|
386 | ! |
---|
387 | ! 3.2.1.1 tree |
---|
388 | ! |
---|
389 | |
---|
390 | ! no single woody pft is overwhelming |
---|
391 | ! (original DGVM: tree_mercy = 0.0 ) |
---|
392 | ! The reduction rate is proportional to the ratio deltafpc/fpc. |
---|
393 | |
---|
394 | IF (sumfpc_wood .GE. fpc_crit .AND. fpc_nat(i,j) .GT. min_stomate .AND. & |
---|
395 | sumdelta_fpc_wood .GT. min_stomate) THEN |
---|
396 | |
---|
397 | ! reduct = MIN( ( ( deltafpc(j)/sumdelta_fpc_wood * & |
---|
398 | ! (sumfpc_wood-fpc_crit) ) / fpc_nat(i,j) ), & |
---|
399 | ! ( 1._r_std - tree_mercy ) ) |
---|
400 | reduct = un - MIN((fpc_nat(i,j)-(sumfpc_wood-fpc_crit) & |
---|
401 | * deltafpc(j)/sumdelta_fpc_wood)/fpc_nat(i,j), un ) |
---|
402 | |
---|
403 | ELSE |
---|
404 | |
---|
405 | ! tree fpc didn't icrease or it started from nothing |
---|
406 | |
---|
407 | reduct = zero |
---|
408 | |
---|
409 | ENDIF |
---|
410 | |
---|
411 | survive(j) = un - reduct |
---|
412 | |
---|
413 | ELSE |
---|
414 | |
---|
415 | ! |
---|
416 | ! 3.2.1.2 grass: let a very small fraction survive (the sum of all |
---|
417 | ! grass individuals may make up a maximum cover of |
---|
418 | ! grass_mercy [for lai -> infinity]). |
---|
419 | ! In the original DGVM, grasses were killed in that case, |
---|
420 | ! corresponding to grass_mercy = 0. |
---|
421 | ! |
---|
422 | |
---|
423 | ! survive(j) = ( grass_mercy / REAL( num_grass,r_std ) ) / ind(i,j) |
---|
424 | |
---|
425 | ! survive(j) = MIN( 1._r_std, survive(j) ) |
---|
426 | |
---|
427 | IF(sumfpc_grass .GE. 1.0-MIN(fpc_crit,sumfpc_wood).AND. & |
---|
428 | sumfpc_grass.GE.min_stomate) THEN |
---|
429 | |
---|
430 | fpc_dec=(sumfpc_grass-1.+MIN(fpc_crit,sumfpc_wood))*fpc_nat(i,j)/sumfpc_grass |
---|
431 | |
---|
432 | reduct=fpc_dec |
---|
433 | ELSE |
---|
434 | reduct = zero |
---|
435 | ENDIF |
---|
436 | survive(j) = ( un - reduct ) |
---|
437 | ENDIF ! tree or grass |
---|
438 | |
---|
439 | ENDIF ! pft there and natural |
---|
440 | |
---|
441 | ENDDO ! loop over pfts |
---|
442 | |
---|
443 | !SZ |
---|
444 | !!$ ELSE |
---|
445 | !!$ |
---|
446 | !!$ ! |
---|
447 | !!$ ! 3.2.2 not too much wood so that grasses can subsist |
---|
448 | !!$ ! |
---|
449 | !!$ |
---|
450 | !!$ ! new total grass fpc |
---|
451 | !!$ sumfpc_grass2 = fpc_crit - sumfpc_wood |
---|
452 | !!$ |
---|
453 | !!$ DO j = 2,nvm |
---|
454 | !!$ |
---|
455 | !!$ ! only present and natural PFTs compete |
---|
456 | !!$ |
---|
457 | !!$ IF ( PFTpresent(i,j) .AND. natural(j) ) THEN |
---|
458 | !!$ |
---|
459 | !!$ IF ( tree(j) ) THEN |
---|
460 | !!$ |
---|
461 | !!$ ! no change for trees |
---|
462 | !!$ |
---|
463 | !!$ survive(j) = 1.0 |
---|
464 | !!$ |
---|
465 | !!$ ELSE |
---|
466 | !!$ |
---|
467 | !!$ ! grass: fractional loss is the same for all grasses |
---|
468 | !!$ |
---|
469 | !!$ IF ( sumfpc_grass .GT. min_stomate ) THEN |
---|
470 | !!$ survive(j) = sumfpc_grass2 / sumfpc_grass |
---|
471 | !!$ ELSE |
---|
472 | !!$ survive(j)= zero |
---|
473 | !!$ ENDIF |
---|
474 | !!$ |
---|
475 | !!$ ENDIF |
---|
476 | !!$ |
---|
477 | !!$ ENDIF ! pft there and natural |
---|
478 | !!$ |
---|
479 | !!$ ENDDO ! loop over pfts |
---|
480 | !!$ |
---|
481 | !!$ ENDIF ! sumfpc_wood > fpc_crit |
---|
482 | |
---|
483 | ! |
---|
484 | ! 3.3 update output variables |
---|
485 | ! |
---|
486 | |
---|
487 | DO j = 2,nvm |
---|
488 | |
---|
489 | IF ( PFTpresent(i,j) .AND. natural(j) ) THEN |
---|
490 | |
---|
491 | bm_to_litter(i,j,:) = bm_to_litter(i,j,:) + & |
---|
492 | biomass(i,j,:) * ( un - survive(j) ) |
---|
493 | |
---|
494 | biomass(i,j,:) = biomass(i,j,:) * survive(j) |
---|
495 | |
---|
496 | IF ( control%ok_dgvm ) THEN |
---|
497 | ind(i,j) = ind(i,j) * survive(j) |
---|
498 | ENDIF |
---|
499 | |
---|
500 | ! fraction of plants that dies each day. |
---|
501 | ! exact formulation: light_death(i,j) = un - survive(j) / dt |
---|
502 | light_death(i,j) = ( un - survive(j) ) / dt |
---|
503 | |
---|
504 | ENDIF ! pft there and natural |
---|
505 | |
---|
506 | ENDDO ! loop over pfts |
---|
507 | |
---|
508 | ENDIF ! sumfpc > fpc_crit |
---|
509 | |
---|
510 | ENDDO ! loop over grid points |
---|
511 | |
---|
512 | ! |
---|
513 | ! 4 recalculate fpc on natural part of grid cell (for next light competition) |
---|
514 | ! |
---|
515 | |
---|
516 | DO j = 2,nvm |
---|
517 | |
---|
518 | IF ( natural(j) ) THEN |
---|
519 | |
---|
520 | ! |
---|
521 | ! 4.1 natural PFTs |
---|
522 | ! |
---|
523 | |
---|
524 | IF ( tree(j) ) THEN |
---|
525 | |
---|
526 | ! 4.1.1 trees: minimum cover due to stems, branches etc. |
---|
527 | |
---|
528 | DO i = 1, npts |
---|
529 | !NVMODIF |
---|
530 | ! IF (lai(i,j) == val_exp) THEN |
---|
531 | ! veget_lastlight(i,j) = cn_ind(i,j) * ind(i,j) |
---|
532 | ! ELSE |
---|
533 | ! veget_lastlight(i,j) = & |
---|
534 | ! cn_ind(i,j) * ind(i,j) * & |
---|
535 | ! MAX( ( un - exp( -lai(i,j) * ext_coeff(j) ) ), min_cover ) |
---|
536 | ! ENDIF |
---|
537 | !! veget_lastlight(i,j) = cn_ind(i,j) * ind(i,j) |
---|
538 | IF (lai(i,j) == val_exp) THEN |
---|
539 | veget_lastlight(i,j) = cn_ind(i,j) * ind(i,j) |
---|
540 | ELSE |
---|
541 | veget_lastlight(i,j) = & |
---|
542 | cn_ind(i,j) * ind(i,j) * & |
---|
543 | MAX( ( un - EXP( - lm_lastyearmax(i,j) * sla(j) * ext_coeff(j) ) ), min_cover ) |
---|
544 | ENDIF |
---|
545 | ENDDO |
---|
546 | |
---|
547 | ELSE |
---|
548 | |
---|
549 | ! 4.1.2 grasses |
---|
550 | DO i = 1, npts |
---|
551 | !NVMODIF |
---|
552 | ! IF (lai(i,j) == val_exp) THEN |
---|
553 | ! veget_lastlight(i,j) = cn_ind(i,j) * ind(i,j) |
---|
554 | ! ELSE |
---|
555 | ! veget_lastlight(i,j) = cn_ind(i,j) * ind(i,j) * & |
---|
556 | ! ( un - exp( -lai(i,j) * ext_coeff(j) ) ) |
---|
557 | ! ENDIF |
---|
558 | !!veget_lastlight(i,j) = cn_ind(i,j) * ind(i,j) |
---|
559 | IF (lai(i,j) == val_exp) THEN |
---|
560 | veget_lastlight(i,j) = cn_ind(i,j) * ind(i,j) |
---|
561 | ELSE |
---|
562 | veget_lastlight(i,j) = cn_ind(i,j) * ind(i,j) * & |
---|
563 | ( un - exp( - lm_lastyearmax(i,j) * sla(j) * ext_coeff(j) ) ) |
---|
564 | ENDIF |
---|
565 | ENDDO |
---|
566 | ENDIF ! tree/grass |
---|
567 | |
---|
568 | ELSE |
---|
569 | |
---|
570 | ! |
---|
571 | ! 4.2 agricultural PFTs: not present on natural part |
---|
572 | ! |
---|
573 | |
---|
574 | veget_lastlight(:,j) = zero |
---|
575 | |
---|
576 | ENDIF ! natural/agricultural |
---|
577 | |
---|
578 | ENDDO |
---|
579 | |
---|
580 | ELSE ! static |
---|
581 | |
---|
582 | light_death(:,:)=0.0 |
---|
583 | |
---|
584 | DO j = 2, nvm |
---|
585 | |
---|
586 | IF ( natural(j) ) THEN |
---|
587 | |
---|
588 | ! 2.1.1 natural PFTs, in the one PFT only case there needs to be no special case for grasses, |
---|
589 | ! neither a redistribution of mortality (delta fpc) |
---|
590 | |
---|
591 | WHERE( ind(:,j)*cn_ind(:,j) .GT. min_stomate ) |
---|
592 | lai_ind(:)=sla(j) * lm_lastyearmax(:,j) / ( ind(:,j) * cn_ind(:,j) ) |
---|
593 | ELSEWHERE |
---|
594 | lai_ind(:)=zero |
---|
595 | ENDWHERE |
---|
596 | |
---|
597 | fpc_nat(:,j) = cn_ind(:,j) * ind(:,j) * & |
---|
598 | MAX( ( 1._r_std - exp( - ext_coeff(j) * lai_ind(:) ) ), min_cover ) |
---|
599 | |
---|
600 | WHERE(fpc_nat(:,j).GT.fpc_max(:,j)) |
---|
601 | |
---|
602 | light_death(:,j)=MIN(1.0,1.0-fpc_max(:,j)/fpc_nat(:,j)) |
---|
603 | |
---|
604 | ENDWHERE |
---|
605 | |
---|
606 | DO k=1,nparts |
---|
607 | |
---|
608 | bm_to_litter(:,j,k)=bm_to_litter(:,j,k)+light_death(:,j)*biomass(:,j,k) |
---|
609 | biomass(:,j,k)=biomass(:,j,k)-light_death(:,j)*biomass(:,j,k) |
---|
610 | |
---|
611 | ENDDO |
---|
612 | ind(:,j)=ind(:,j)-light_death(:,j)*ind(:,j) |
---|
613 | ! if (j==10) print *,'ind10bis=',ind(:,j),light_death(:,j)*ind(:,j) |
---|
614 | ENDIF |
---|
615 | ENDDO |
---|
616 | |
---|
617 | light_death(:,:)=light_death(:,:)/dt |
---|
618 | |
---|
619 | ENDIF |
---|
620 | |
---|
621 | ! |
---|
622 | ! 5 history |
---|
623 | ! |
---|
624 | |
---|
625 | CALL histwrite (hist_id_stomate, 'LIGHT_DEATH', itime, & |
---|
626 | light_death, npts*nvm, horipft_index) |
---|
627 | |
---|
628 | IF (bavard.GE.4) WRITE(numout,*) 'Leaving light' |
---|
629 | |
---|
630 | END SUBROUTINE light |
---|
631 | |
---|
632 | END MODULE lpj_light |
---|