source: branches/publications/ORCHIDEE_gmd-2018-261/src_stomate/stomate_data.f90 @ 8692

Last change on this file since 8692 was 2914, checked in by nicolas.vuichard, 9 years ago

update

  • Property svn:keywords set to HeadURL Date Author Revision
File size: 24.6 KB
Line 
1! =================================================================================================================================
2! MODULE        : stomate_data
3!
4! CONTACT      : orchidee-help _at_ ipsl.jussieu.fr
5!
6! LICENCE      : IPSL (2006)
7! This software is governed by the CeCILL licence see ORCHIDEE/ORCHIDEE_CeCILL.LIC
8!
9!>\BRIEF         "stomate_data" module defines the values about the PFT parameters. It will print
10!! the values of the parameters for STOMATE in the standard outputs.
11!!
12!!\n DESCRIPTION: None
13!!
14!! RECENT CHANGE(S): Sonke Zaehle: Reich et al, 1992 find no statistically significant differences
15!!                  between broadleaved and coniferous forests, specifically, the assumption that grasses grow
16!!                  needles is not justified. Replacing the function with the one based on Reich et al. 1997.
17!!                  Given that sla=100cm2/gDW at 9 months, sla is:
18!!                  sla=exp(5.615-0.46*ln(leaflon in months))
19!!
20!! REFERENCE(S) : None
21!!
22!! SVN          :
23!! $HeadURL$
24!! $Date$
25!! $Revision$
26!! \n
27!_ ================================================================================================================================
28
29MODULE stomate_data
30
31  ! modules used:
32
33  USE constantes
34  USE pft_parameters
35  USE defprec
36 
37
38  IMPLICIT NONE
39
40  INTEGER(i_std),ALLOCATABLE,SAVE,DIMENSION(:) :: hori_index     !! Move to Horizontal indices
41!$OMP THREADPRIVATE(hori_index)
42
43  INTEGER(i_std),ALLOCATABLE,SAVE,DIMENSION(:) :: horipft_index  !! Horizontal + PFT indices
44!$OMP THREADPRIVATE(horipft_index)
45
46  ! Land cover change
47
48  INTEGER(i_std), ALLOCATABLE, SAVE, DIMENSION(:) :: horip10_index   !! Horizontal + P10 indices
49!$OMP THREADPRIVATE(horip10_index)
50  INTEGER(i_std), ALLOCATABLE, SAVE, DIMENSION(:) :: horip100_index  !! Horizontal + P100 indice
51!$OMP THREADPRIVATE(horip100_index)
52  INTEGER(i_std), ALLOCATABLE, SAVE, DIMENSION(:) :: horip11_index   !! Horizontal + P11 indices
53!$OMP THREADPRIVATE(horip11_index)
54  INTEGER(i_std), ALLOCATABLE, SAVE, DIMENSION(:) :: horip101_index  !! Horizontal + P101 indices
55!$OMP THREADPRIVATE(horip101_index)
56
57  INTEGER(i_std),SAVE :: itime                 !! time step
58!$OMP THREADPRIVATE(itime)
59  INTEGER(i_std),SAVE :: hist_id_stomate       !! STOMATE history file ID
60!$OMP THREADPRIVATE(hist_id_stomate)
61  INTEGER(i_std),SAVE :: hist_id_stomate_IPCC  !! STOMATE history file ID for IPCC output
62!$OMP THREADPRIVATE(hist_id_stomate_IPCC)
63  INTEGER(i_std),SAVE :: rest_id_stomate       !! STOMATE restart file ID
64!$OMP THREADPRIVATE(rest_id_stomate)
65
66  REAL(r_std),PARAMETER :: adapted_crit = 1. - ( 1. / euler ) !! critical value for being adapted (1-1/e) (unitless)
67  REAL(r_std),PARAMETER :: regenerate_crit = 1. / euler       !! critical value for being regenerative (1/e) (unitless)
68
69
70  ! private & public routines
71
72  PUBLIC data
73
74CONTAINS
75
76!! ================================================================================================================================
77!! SUBROUTINE   : data
78!!
79!>\BRIEF         This routine defines the values of the PFT parameters. It will print the values of the parameters for STOMATE
80!!               in the standard outputs of ORCHIDEE.
81!!
82!! DESCRIPTION : This routine defines PFT parameters. It initializes the pheno_crit structure by tabulated parameters.\n
83!!               Some initializations are done for parameters. The SLA is calculated according *to* Reich et al (1992).\n
84!!               Another formulation by Reich et al(1997) could be used for the computation of the SLA.
85!!               The geographical coordinates might be used for defining some additional parameters
86!!               (e.g. frequency of anthropogenic fires, irrigation of agricultural surfaces, etc.). \n
87!!               For the moment, this possibility is not used. \n
88!!               The specifc leaf area (SLA) is calculated according Reich et al, 1992 by :
89!!               \latexonly
90!!               \input{stomate_data_SLA.tex}
91!!               \endlatexonly
92!!               The sapling (young) biomass for trees and for each compartment of biomass is calculated by :
93!!               \latexonly
94!!               \input{stomate_data_sapl_tree.tex}
95!!               \endlatexonly
96!!               The sapling biomass for grasses and for each compartment of biomass is calculated by :
97!!               \latexonly
98!!               \input{stomate_data_sapl_grass.tex}
99!!               \endlatexonly
100!!               The critical stem diameter is given by the following formula :
101!!               \latexonly
102!!               \input{stomate_data_stem_diameter.tex}
103!!               \endlatexonly
104!!
105!! RECENT CHANGE(S): Sonke Zaehle: Reich et al, 1992 find no statistically significant differences
106!!                  between broadleaved and coniferous forests, specifically, the assumption that grasses grow
107!!                  needles is not justified. Replacing the function with the one based on Reich et al. 1997.
108!!                  Given that sla=100cm2/gDW at 9 months, sla is:
109!!                  sla=exp(5.615-0.46*ln(leaflon in months))
110!!                   \latexonly
111!!                   \input{stomate_data_SLA_Reich_97.tex}
112!!                   \endlatexonly
113!!
114!! MAIN OUTPUT VARIABLE(S):
115!!
116!! REFERENCE(S) :
117!! - Reich PB, Walters MB, Ellsworth DS, (1992), Leaf life-span in relation to leaf, plant and
118!! stand characteristics among diverse ecosystems. Ecological Monographs, Vol 62, pp 365-392.
119!! - Reich PB, Walters MB, Ellsworth DS (1997) From tropics to tundra: global convergence in plant
120!!  functioning. Proc Natl Acad Sci USA, 94:13730 13734
121!!
122!! FLOWCHART    :
123!! \n
124!_ ================================================================================================================================
125
126  SUBROUTINE data (npts, lalo)
127
128
129    !! 0. Variables and parameter declaration
130
131
132    !! 0.1 Input variables
133
134    INTEGER(i_std), INTENT(in)                   :: npts    !! [DISPENSABLE] Domain size (unitless)
135    REAL(r_std),DIMENSION (npts,2), INTENT (in)  :: lalo    !! [DISPENSABLE] Geographical coordinates (latitude,longitude)
136
137    !! 0.4 Local variables
138
139    INTEGER(i_std)                               :: i,j     !! Index (unitless)
140    REAL(r_std)                                  :: alpha   !! alpha's : (unitless)
141    REAL(r_std)                                  :: dia     !! stem diameter (m)
142    REAL(r_std)                                  :: csa_sap !! Crown specific area sapling @tex $(m^2.ind^{-1})$ @endtex
143    REAL(r_std)                                  :: cn_leaf         !! C to N ratio of Leaf pool (gC per gN)
144    REAL(r_std)                                  :: cn_wood         !! C to N ratio of Woody pools (gC per gN)
145    REAL(r_std)                                  :: cn_root         !! C to N ratio of Root pool (gC per gN)
146
147!_ ================================================================================================================================
148
149    IF ( printlev>=1 ) WRITE(numout,*) 'data: PFT characteristics'
150
151    !- pheno_gdd_crit
152    pheno_gdd_crit(:,1) = pheno_gdd_crit_c(:)
153    pheno_gdd_crit(:,2) = pheno_gdd_crit_b(:)         
154    pheno_gdd_crit(:,3) = pheno_gdd_crit_a(:) 
155    !
156    !- senescence_temp
157    senescence_temp(:,1) = senescence_temp_c(:)
158    senescence_temp(:,2) = senescence_temp_b(:)
159    senescence_temp(:,3) = senescence_temp_a(:)
160
161    !
162    !-LC
163    LC(:,ileaf) = LC_leaf(:) 
164    LC(:,isapabove) = LC_sapabove(:) 
165    LC(:,isapbelow) = LC_sapbelow(:) 
166    LC(:,iheartabove) = LC_heartabove(:) 
167    LC(:,iheartbelow) = LC_heartbelow(:) 
168    LC(:,iroot) = LC_root(:) 
169    LC(:,ifruit) = LC_fruit(:) 
170    LC(:,icarbres) = LC_carbres(:) 
171    LC(:,ilabile) = LC_labile(:) 
172
173    IF ( printlev >= 1 ) WRITE(numout,*) 'data: PFT characteristics'
174
175    DO j = 2,nvm ! Loop over # PFTS
176
177       IF ( printlev >= 1 ) WRITE(numout,'(a,i3,a,a)') '    > PFT#',j,': ', PFT_name(j)
178
179       !
180       ! 1 tree? (true/false)
181       !
182       IF ( printlev >= 1 ) WRITE(numout,*) '       tree: (::is_tree) ', is_tree(j)
183
184       !
185       ! 2 flamability (0-1, unitless)
186       !
187
188       IF ( printlev >= 1 ) WRITE(numout,*) '       litter flamability (::flam) :', flam(j)
189
190       !
191       ! 3 fire resistance (unitless)
192       !
193
194       IF ( printlev >= 1 ) WRITE(numout,*) '       fire resistance (::resist) :', resist(j)
195
196       !
197       ! 4 specific leaf area per mass carbon = 2 * sla / dry mass (m^2.gC^{-1})
198       !
199
200       ! S. Zaehle: Reich et al, 1992 find no statistically significant differences between broadleaved and coniferous
201       ! forests, specifically, the assumption that grasses grow needles is not justified. Replacing the function
202       ! with the one based on Reich et al. 1997. Given that sla=100cm2/gDW at 9 months, sla is:
203       ! sla=exp(5.615-0.46*ln(leaflon in months))
204
205       ! Oct 2010 : sla values are prescribed by values given by N.Viovy
206
207       ! includes conversion from
208       !!       sla(j) = 2. * 1e-4 * EXP(5.615 - 0.46 * log(12./leaflife_tab(j)))
209       !!\latexonly
210       !!\input{stomate_data_SLA.tex}
211       !!\endlatexonly
212!       IF ( leaf_tab(j) .EQ. 2 ) THEN
213!
214!          ! needle leaved tree
215!          sla(j) = 2. * ( 10. ** ( 2.29 - 0.4 * LOG10(12./leaflife_tab(j)) ) ) *1e-4
216!
217!       ELSE
218!
219!          ! broad leaved tree or grass (Reich et al 1992)
220!          sla(j) = 2. * ( 10. ** ( 2.41 - 0.38 * LOG10(12./leaflife_tab(j)) ) ) *1e-4
221!
222!       ENDIF
223
224!!!$      IF ( leaf_tab(j) .EQ. 1 ) THEN
225!!!$
226!!!$        ! broad leaved tree
227!!!$
228!!!$        sla(j) = 2. * ( 10. ** ( 2.41 - 0.38 * LOG10(12./leaflife_tab(j)) ) ) *1e-4
229!!!$
230!!!$      ELSE
231!!!$
232!!!$        ! needle leaved or grass (Reich et al 1992)
233!!!$
234!!!$        sla(j) = 2. * ( 10. ** ( 2.29 - 0.4 * LOG10(12./leaflife_tab(j)) ) ) *1e-4
235!!!$
236!!!$      ENDIF
237!!!$
238!!!$      IF ( ( leaf_tab(j) .EQ. 2 ) .AND. ( pheno_type_tab(j) .EQ. 2 ) ) THEN
239!!!$
240!!!$        ! summergreen needle leaf
241!!!$
242!!!$        sla(j) = 1.25 * sla(j)
243!!!$
244!!!$      ENDIF
245
246       IF ( printlev >= 1 ) WRITE(numout,*) '       specific leaf area (m**2/gC) (::sla):', sla(j), 12./leaflife_tab(j)
247
248       !
249       ! 5 sapling characteristics
250       !
251
252       IF ( is_tree(j) ) THEN
253
254          !> 5.1 trees
255
256          !!\latexonly
257          !!\input{stomate_data_sapl_tree.tex}
258          !!\endlatexonly
259
260          alpha = alpha_tree
261
262          bm_sapl(j,ileaf,icarbon) = &
263               &     ((bm_sapl_leaf(1)*pipe_tune1(j)*(mass_ratio_heart_sap(j) *bm_sapl_leaf(2)*sla(j)/(pi*pipe_k1(j))) & 
264               &     **bm_sapl_leaf(3))/sla(j))**bm_sapl_leaf(4)
265
266          IF ( pheno_type(j) .NE. 1 ) THEN
267             ! not evergreen
268             bm_sapl(j,icarbres,icarbon) = bm_sapl_carbres * bm_sapl(j,ileaf,icarbon)
269             bm_sapl(j,ilabile,icarbon) = bm_sapl_labile * bm_sapl(j,ileaf,icarbon)
270          ELSE
271             bm_sapl(j,icarbres,icarbon) = zero
272             bm_sapl(j,ilabile,icarbon) = zero
273          ENDIF ! (pheno_type_tab(j) .NE. 1 )
274
275          csa_sap = bm_sapl(j,ileaf,icarbon) / ( pipe_k1(j) / sla(j) )
276
277          dia = (mass_ratio_heart_sap(j) * csa_sap * dia_coeff(1) / pi ) ** dia_coeff(2)
278
279          bm_sapl(j,isapabove,icarbon) = &
280               bm_sapl_sapabove * pipe_density(j) * csa_sap * pipe_tune2(j) * dia ** pipe_tune3(j)
281          bm_sapl(j,isapbelow,icarbon) = bm_sapl(j,isapabove,icarbon)
282
283          bm_sapl(j,iheartabove,icarbon) = bm_sapl_heartabove * bm_sapl(j,isapabove,icarbon)
284          bm_sapl(j,iheartbelow,icarbon) = bm_sapl_heartbelow * bm_sapl(j,isapbelow,icarbon)
285
286       ELSE
287
288          !> 5.2 grasses
289
290          !!\latexonly
291          !!\input{stomate_data_sapl_grass.tex}
292          !!\endlatexonly
293
294          alpha = alpha_grass
295
296          IF ( natural(j) ) THEN
297             bm_sapl(j,ileaf,icarbon) = init_sapl_mass_leaf_nat / sla(j)
298          ELSE
299             bm_sapl(j,ileaf,icarbon) = init_sapl_mass_leaf_agri / sla(j)
300          ENDIF
301
302          bm_sapl(j,icarbres,icarbon) = init_sapl_mass_carbres *bm_sapl(j,ileaf,icarbon)
303          bm_sapl(j,ilabile,icarbon) = init_sapl_mass_labile *bm_sapl(j,ileaf,icarbon)
304
305          bm_sapl(j,isapabove,icarbon) = zero
306          bm_sapl(j,isapbelow,icarbon) = zero
307
308          bm_sapl(j,iheartabove,icarbon) = zero
309          bm_sapl(j,iheartbelow,icarbon) = zero
310
311       ENDIF !( is_tree(j) )
312
313       bm_sapl(j,iroot,icarbon) = init_sapl_mass_root * (1./alpha) * bm_sapl(j,ileaf,icarbon)
314
315       bm_sapl(j,ifruit,icarbon) = init_sapl_mass_fruit  * bm_sapl(j,ileaf,icarbon)
316
317
318       cn_leaf=cn_leaf_init(j)
319       cn_wood=cn_leaf/fcn_wood(j)
320       cn_root=cn_leaf/fcn_root(j)
321       
322       DO i=1,nparts
323          IF (i.EQ.1) THEN
324             bm_sapl(j,i,initrogen) = bm_sapl(j,i,icarbon) / cn_leaf
325          ELSE IF (i.LT.iroot) THEN
326             bm_sapl(j,i,initrogen) = bm_sapl(j,i,icarbon) / cn_wood
327          ELSE
328             bm_sapl(j,i,initrogen) = bm_sapl(j,i,icarbon) / cn_root
329          ENDIF
330       ENDDO
331
332       IF ( printlev >= 1 ) THEN
333          WRITE(numout,*) '       sapling biomass (gC):'
334          WRITE(numout,*) '         leaves: (::bm_sapl(j,ileaf,icarbon))',bm_sapl(j,ileaf,icarbon)
335          WRITE(numout,*) '         sap above ground: (::bm_sapl(j,ispabove,icarbon)):',bm_sapl(j,isapabove,icarbon)
336          WRITE(numout,*) '         sap below ground: (::bm_sapl(j,isapbelow,icarbon))',bm_sapl(j,isapbelow,icarbon)
337          WRITE(numout,*) '         heartwood above ground: (::bm_sapl(j,iheartabove,icarbon))',bm_sapl(j,iheartabove,icarbon)
338          WRITE(numout,*) '         heartwood below ground: (::bm_sapl(j,iheartbelow,icarbon))',bm_sapl(j,iheartbelow,icarbon)
339          WRITE(numout,*) '         roots: (::bm_sapl(j,iroot,icarbon))',bm_sapl(j,iroot,icarbon)
340          WRITE(numout,*) '         fruits: (::bm_sapl(j,ifruit,icarbon))',bm_sapl(j,ifruit,icarbon)
341          WRITE(numout,*) '         carbohydrate reserve: (::bm_sapl(j,icarbres,icarbon))',bm_sapl(j,icarbres,icarbon)
342          WRITE(numout,*) '         labile reserve: (::bm_sapl(j,ilabile,icarbon))',bm_sapl(j,ilabile,icarbon)
343       ENDIF
344
345       !
346       ! 6 migration speed (m/year)
347       !
348
349       IF ( is_tree(j) ) THEN
350
351          migrate(j) = migrate_tree
352
353       ELSE
354
355          ! can be any value as grasses are, per *definition*, everywhere (big leaf).
356          migrate(j) = migrate_grass
357
358       ENDIF !( is_tree(j) )
359
360       IF ( printlev >= 1 ) WRITE(numout,*) '       migration speed (m/year): (::migrate(j))', migrate(j)
361
362       !
363       ! 7 critical stem diameter: beyond this diameter, the crown area no longer
364       !     increases (m)
365       !
366
367       IF ( is_tree(j) ) THEN
368
369          !!\latexonly
370          !!\input{stomate_data_stem_diameter.tex}
371          !!\endlatexonly
372
373          maxdia(j) = ( ( pipe_tune4(j) / ((pipe_tune2(j)*pipe_tune3(j))/(maxdia_coeff(1)**pipe_tune3(j))) ) &
374               ** ( un / ( pipe_tune3(j) - un ) ) ) * maxdia_coeff(2)
375          cn_sapl(j) = cn_sapl_init !crown of individual tree, first year
376
377       ELSE
378
379          maxdia(j) = undef
380          cn_sapl(j)=1
381
382       ENDIF !( is_tree(j) )
383
384       IF ( printlev >= 1 ) WRITE(numout,*) '       critical stem diameter (m): (::maxdia(j))', maxdia(j)
385
386       !
387       ! 8 Coldest tolerable temperature (K)
388       !
389
390       IF ( ABS( tmin_crit(j) - undef ) .GT. min_stomate ) THEN
391          tmin_crit(j) = tmin_crit(j) + ZeroCelsius
392       ELSE
393          tmin_crit(j) = undef
394       ENDIF
395
396       IF ( printlev >= 1 ) &
397            WRITE(numout,*) '       coldest tolerable temperature (K): (::tmin_crit(j))', tmin_crit(j)
398
399       !
400       ! 9 Maximum temperature of the coldest month: need to be below this temperature
401       !      for a certain time to regrow leaves next spring *(vernalization)* (K)
402       !
403
404       IF ( ABS ( tcm_crit(j) - undef ) .GT. min_stomate ) THEN
405          tcm_crit(j) = tcm_crit(j) + ZeroCelsius
406       ELSE
407          tcm_crit(j) = undef
408       ENDIF
409
410       IF ( printlev >= 1 ) &
411            WRITE(numout,*) '       vernalization temperature (K): (::tcm_crit(j))', tcm_crit(j)
412
413       !
414       ! 10 critical values for phenology
415       !
416
417       ! 10.1 model used
418
419       IF ( printlev >= 1 ) &
420            WRITE(numout,*) '       phenology model used: (::pheno_model(j)) ',pheno_model(j)
421
422       ! 10.2 growing degree days. What kind of gdd is meant (i.e. threshold 0 or -5 deg C
423       !        or whatever), depends on how this is used in stomate_phenology.
424
425
426       IF ( ( printlev >= 1 ) .AND. ( ALL(pheno_gdd_crit(j,:) .NE. undef) ) ) THEN
427          WRITE(numout,*) '         critical GDD is a function of long term T (C): (::gdd)'
428          WRITE(numout,*) '          ',pheno_gdd_crit(j,1), &
429               ' + T *',pheno_gdd_crit(j,2), &
430               ' + T^2 *',pheno_gdd_crit(j,3)
431       ENDIF
432
433       ! consistency check
434
435       IF ( ( ( pheno_model(j) .EQ. 'moigdd' ) .OR. &
436            ( pheno_model(j) .EQ. 'humgdd' )       ) .AND. &
437            ( ANY(pheno_gdd_crit(j,:) .EQ. undef) )                      ) THEN
438          CALL ipslerr_p(3,'stomate_data','problem with phenology parameters, critical GDD. (::pheno_model)','','')
439       ENDIF
440
441       ! 10.3 number of growing days
442
443       IF ( ( printlev >= 1 ) .AND. ( ngd_crit(j) .NE. undef ) ) &
444            WRITE(numout,*) '         critical NGD: (::ngd_crit(j))', ngd_crit(j)
445
446       ! 10.4 critical temperature for ncd vs. gdd function in phenology (C)
447
448       IF ( ( printlev >= 1 ) .AND. ( ncdgdd_temp(j) .NE. undef ) ) &
449            WRITE(numout,*) '         critical temperature for NCD vs. GDD (C): (::ncdgdd_temp(j))', &
450            ncdgdd_temp(j)
451
452       ! 10.5 humidity fractions (0-1, unitless)
453
454       IF ( ( printlev >= 1 ) .AND. ( hum_frac(j) .NE. undef ) ) &
455            WRITE(numout,*) '         critical humidity fraction: (::hum_frac(j))', &
456            &  hum_frac(j)
457
458
459       ! 10.6 minimum time elapsed since moisture minimum (days)
460
461       IF ( ( printlev >= 1 ) .AND. ( hum_min_time(j) .NE. undef ) ) &
462            WRITE(numout,*) '         time to wait after moisture min (d): (::hum_min_time(j))', &
463        &    hum_min_time(j)
464
465       !
466       ! 11 critical values for senescence
467       !
468
469       ! 11.1 type of senescence
470
471       IF ( printlev >= 1 ) &
472            WRITE(numout,*) '       type of senescence: (::senescence_type(j))',senescence_type(j)
473
474       ! 11.2 critical temperature for senescence (C)
475
476       IF ( ( printlev >= 1 ) .AND. ( ALL(senescence_temp(j,:) .NE. undef) ) ) THEN
477          WRITE(numout,*) '         critical temperature for senescence (C) is'
478          WRITE(numout,*) '          a function of long term T (C): (::senescence_temp)'
479          WRITE(numout,*) '          ',senescence_temp(j,1), &
480               ' + T *',senescence_temp(j,2), &
481               ' + T^2 *',senescence_temp(j,3)
482       ENDIF
483
484       ! consistency check
485
486       IF ( ( ( senescence_type(j) .EQ. 'cold' ) .OR. &
487            ( senescence_type(j) .EQ. 'mixed' )      ) .AND. &
488            ( ANY(senescence_temp(j,:) .EQ. undef ) )           ) THEN
489          CALL ipslerr_p(3,'stomate_data','Problem with senescence parameters, temperature. (::senescence_type)','','')
490       ENDIF
491
492       ! 11.3 critical relative moisture availability for senescence
493
494       IF ( ( printlev >= 1 ) .AND. ( senescence_hum(j) .NE. undef ) ) &
495            WRITE(numout,*)  ' max. critical relative moisture availability for' 
496            WRITE(numout,*)  ' senescence: (::senescence_hum(j))',  &
497            & senescence_hum(j)
498
499       ! consistency check
500
501       IF ( ( ( senescence_type(j) .EQ. 'dry' ) .OR. &
502            ( senescence_type(j) .EQ. 'mixed' )     ) .AND. &
503            ( senescence_hum(j) .EQ. undef )                   ) THEN
504          CALL ipslerr_p(3,'stomate_data','Problem with senescence parameters, humidity.(::senescence_type)','','')
505       ENDIF
506
507       ! 14.3 relative moisture availability above which there is no moisture-related
508       !      senescence (0-1, unitless)
509
510       IF ( ( printlev >= 1 ) .AND. ( nosenescence_hum(j) .NE. undef ) ) &
511            WRITE(numout,*) '         relative moisture availability above which there is' 
512            WRITE(numout,*) '             no moisture-related senescence: (::nosenescence_hum(j))', &
513            &  nosenescence_hum(j)
514
515       ! consistency check
516
517       IF ( ( ( senescence_type(j) .EQ. 'dry' ) .OR. &
518            ( senescence_type(j) .EQ. 'mixed' )     ) .AND. &
519            ( nosenescence_hum(j) .EQ. undef )                   ) THEN
520          CALL ipslerr_p(3,'stomate_data','Problem with senescence parameters, humidity. (::senescence_type)','','')
521       ENDIF
522
523       !
524       ! 12 sapwood -> heartwood conversion time (days)
525       !
526
527       IF ( printlev >= 1 ) &
528            WRITE(numout,*) '       sapwood -> heartwood conversion time (d): (::tau_sap(j))', tau_sap(j)
529
530       !
531       ! 13 fruit lifetime (days)
532       !
533
534       IF ( printlev >= 1 ) WRITE(numout,*) '       fruit lifetime (d): (::tau_fruit(j))', tau_fruit(j)
535
536       !
537       ! 14 length of leaf death (days)
538       !      For evergreen trees, this variable determines the lifetime of the leaves.
539       !      Note that it is different from the value given in leaflife_tab.
540       !
541
542       IF ( printlev >= 1 ) &
543            WRITE(numout,*) '       length of leaf death (d): (::leaffall(j))', leaffall(j)
544
545       !
546       ! 15 maximum lifetime of leaves (days)
547       !
548
549       IF ( ( printlev >= 1 ) .AND. ( leafagecrit(j) .NE. undef ) ) &
550            WRITE(numout,*) '       critical leaf age (d): (::leafagecrit(j))', leafagecrit(j)
551
552       !
553       ! 16 time constant for leaf age discretisation (days)
554       !
555
556       leaf_timecst(j) = leafagecrit(j) / REAL( nleafages,r_std )
557
558       IF ( printlev >= 1 ) &
559            WRITE(numout,*) '       time constant for leaf age discretisation (d): (::leaf_timecst(j))', &
560            leaf_timecst(j)
561
562       !
563       ! 17 minimum lai, initial (m^2.m^{-2})
564       !
565
566       IF ( is_tree(j) ) THEN
567          lai_initmin(j) = lai_initmin_tree
568       ELSE
569          lai_initmin(j) = lai_initmin_grass
570       ENDIF !( is_tree(j) )
571
572       IF ( printlev >= 1 ) &
573            WRITE(numout,*) '       initial LAI: (::lai_initmin(j))', lai_initmin(j)
574
575       !
576       ! 19 maximum LAI (m^2.m^{-2})
577       !
578
579       IF ( printlev >= 1 ) &
580            WRITE(numout,*) '       critical LAI above which no leaf allocation: (::lai_max(j))', lai_max(j)
581
582       !
583       ! 20 fraction of primary leaf and root allocation put into reserve (0-1, unitless)
584       !
585
586       IF ( printlev >= 1 ) &
587            WRITE(numout,*) '       reserve allocation factor: (::ecureuil(j))', ecureuil(j)
588
589
590       !
591       ! 23 natural ?
592       !
593
594       IF ( printlev >= 1 ) &
595            WRITE(numout,*) '       Natural: (::natural(j))', natural(j)
596
597       !
598       ! 24 Vcmax et Vjmax (umol.m^{-2}.s^{-1})
599       !
600
601       IF ( printlev >= 1 ) &
602            WRITE(numout,*) '       Maximum rate of carboxylation: (::Vcmax_25(j))', vcmax25(j)
603       !
604       ! 25 constants for photosynthesis temperatures
605       !
606
607       IF ( printlev >= 1 ) THEN
608
609
610          !
611          ! 26 Properties
612          !
613
614          WRITE(numout,*) '       C4 photosynthesis: (::is_c4(j))', is_c4(j)
615          WRITE(numout,*) '       Depth constant for root profile (m): (::1./humcste(j))', 1./humcste(j)
616
617       ENDIF
618
619       !
620       ! 27 extinction coefficient of the Monsi and Saeki (1953) relationship
621       !
622       IF ( printlev >= 1 ) THEN
623          WRITE(numout,*) '       extinction coefficient: (::ext_coeff(j))', ext_coeff(j)
624       ENDIF
625
626       !
627       ! 30 fraction of allocatable biomass which is lost as growth respiration (0-1, unitless)
628       !
629       IF ( printlev >= 1 ) &
630            WRITE(numout,*) '       growth respiration fraction: (::frac_growthresp(j))', frac_growthresp(j)
631
632    ENDDO ! Loop over # PFTS
633
634    !
635    ! 29 time scales for phenology and other processes (in days)
636    !
637
638    tau_longterm_max = coeff_tau_longterm * one_year
639
640    IF ( printlev >= 1 ) THEN
641
642       WRITE(numout,*) '   > time scale for ''monthly'' moisture availability (d): (::tau_hum_month)', &
643            tau_hum_month
644       WRITE(numout,*) '   > time scale for ''weekly'' moisture availability (d): (::tau_hum_week)', &
645           tau_hum_week
646       WRITE(numout,*) '   > time scale for ''monthly'' 2 meter temperature (d): (::tau_t2m_month)', &
647            tau_t2m_month
648       WRITE(numout,*) '   > time scale for ''weekly'' 2 meter temperature (d): (::tau_t2m_week)', &
649            tau_t2m_week
650       WRITE(numout,*) '   > time scale for ''weekly'' GPP (d): (::tau_gpp_week)', &
651            tau_gpp_week
652       WRITE(numout,*) '   > time scale for ''monthly'' soil temperature (d): (::tau_tsoil_month)', &
653            tau_tsoil_month
654       WRITE(numout,*) '   > time scale for ''monthly'' soil humidity (d): (::tau_soilhum_month)', &
655            tau_soilhum_month
656       WRITE(numout,*) '   > time scale for vigour calculations (y): (::tau_longterm_max / one_year)', &
657            tau_longterm_max / one_year
658
659    ENDIF
660
661    IF (printlev >= 4) WRITE(numout,*) 'Leaving data'
662
663  END SUBROUTINE data
664
665END MODULE stomate_data
Note: See TracBrowser for help on using the repository browser.