source: branches/publications/ORCHIDEE-PEAT_r5488/src_stomate/stomate_data.f90 @ 5491

Last change on this file since 5491 was 5488, checked in by chunjing.qiu, 6 years ago

C balance checked

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