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 | |
---|
29 | MODULE 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 | |
---|
74 | CONTAINS |
---|
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 | |
---|
665 | END MODULE stomate_data |
---|