Rev 547 | Rev 554 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 547 | Rev 553 | ||
---|---|---|---|
Line 74... | Line 74... | ||
74 | /// It is important, that species-statistics are valid when this function is called (LAI)!
|
74 | /// It is important, that species-statistics are valid when this function is called (LAI)!
|
75 | void WaterCycle::getStandValues() |
75 | void WaterCycle::getStandValues() |
76 | {
|
76 | {
|
77 | mLAINeedle=mLAIBroadleaved=0.; |
77 | mLAINeedle=mLAIBroadleaved=0.; |
78 | mCanopyConductance=0.; |
78 | mCanopyConductance=0.; |
79 | const double GroundVegetationCC = 0.02; |
- | |
- | 79 | const double ground_vegetationCC = 0.02; |
|
80 | double lai; |
80 | double lai; |
81 | foreach(ResourceUnitSpecies *rus, mRU->ruSpecies()) { |
81 | foreach(ResourceUnitSpecies *rus, mRU->ruSpecies()) { |
82 | lai = rus->constStatistics().leafAreaIndex(); |
82 | lai = rus->constStatistics().leafAreaIndex(); |
83 | if (rus->species()->isConiferous()) |
83 | if (rus->species()->isConiferous()) |
84 | mLAINeedle+=lai; |
84 | mLAINeedle+=lai; |
Line 88... | Line 88... | ||
88 | }
|
88 | }
|
89 | double total_lai = mLAIBroadleaved+mLAINeedle; |
89 | double total_lai = mLAIBroadleaved+mLAINeedle; |
90 | 90 | ||
91 | // handle cases with LAI < 1 (use generic "ground cover characteristics" instead)
|
91 | // handle cases with LAI < 1 (use generic "ground cover characteristics" instead)
|
92 | if (total_lai<1.) { |
92 | if (total_lai<1.) { |
93 | mCanopyConductance+=(GroundVegetationCC)*(1. - total_lai); |
- | |
- | 93 | mCanopyConductance+=(ground_vegetationCC)*(1. - total_lai); |
|
94 | total_lai = 1.; |
94 | total_lai = 1.; |
95 | }
|
95 | }
|
96 | mCanopyConductance /= total_lai; |
96 | mCanopyConductance /= total_lai; |
97 | 97 | ||
98 | if (total_lai < Model::settings().laiThresholdForClosedStands) { |
98 | if (total_lai < Model::settings().laiThresholdForClosedStands) { |
Line 171... | Line 171... | ||
171 | // preparations (once a year)
|
171 | // preparations (once a year)
|
172 | getStandValues(); // fetch canopy characteristics from iLand (including weighted average for mCanopyConductance) |
172 | getStandValues(); // fetch canopy characteristics from iLand (including weighted average for mCanopyConductance) |
173 | mCanopy.setStandParameters(mLAINeedle, |
173 | mCanopy.setStandParameters(mLAINeedle, |
174 | mLAIBroadleaved, |
174 | mLAIBroadleaved, |
175 | mCanopyConductance); |
175 | mCanopyConductance); |
176 | - | ||
177 | 176 | ||
178 | // main loop over all days of the year
|
177 | // main loop over all days of the year
|
179 | double prec_mm, prec_after_interception, prec_to_soil, et, excess; |
178 | double prec_mm, prec_after_interception, prec_to_soil, et, excess; |
180 | const Climate *climate = mRU->climate(); |
179 | const Climate *climate = mRU->climate(); |
181 | const ClimateDay *day = climate->begin(); |
180 | const ClimateDay *day = climate->begin(); |
Line 200... | Line 199... | ||
200 | mContent = mFieldCapacity; |
199 | mContent = mFieldCapacity; |
201 | }
|
200 | }
|
202 | 201 | ||
203 | double current_psi = psiFromHeight(mContent); |
202 | double current_psi = psiFromHeight(mContent); |
204 | mPsi[doy] = current_psi; |
203 | mPsi[doy] = current_psi; |
205 | mWaterDeficit_mm[doy] = mFieldCapacity - mContent; |
- | |
- | 204 | ||
206 | // (5) transpiration of the vegetation (and of water intercepted in canopy)
|
205 | // (5) transpiration of the vegetation (and of water intercepted in canopy)
|
207 | // calculate the LAI-weighted response values for soil water and vpd:
|
206 | // calculate the LAI-weighted response values for soil water and vpd:
|
208 | double combined_response = calculateSoilAtmosphereResponse( current_psi, day->vpd); |
207 | double combined_response = calculateSoilAtmosphereResponse( current_psi, day->vpd); |
209 | et = mCanopy.evapotranspiration3PG(day, climate->daylength_h(doy), combined_response); |
208 | et = mCanopy.evapotranspiration3PG(day, climate->daylength_h(doy), combined_response); |
210 | 209 | ||
Line 337... | Line 336... | ||
337 | {
|
336 | {
|
338 | mLAINeedle = LAIneedle; |
337 | mLAINeedle = LAIneedle; |
339 | mLAIBroadleaved=LAIbroadleave; |
338 | mLAIBroadleaved=LAIbroadleave; |
340 | mLAI=LAIneedle+LAIbroadleave; |
339 | mLAI=LAIneedle+LAIbroadleave; |
341 | mAvgMaxCanopyConductance = maxCanopyConductance; |
340 | mAvgMaxCanopyConductance = maxCanopyConductance; |
- | 341 | ||
- | 342 | // clear aggregation containers
|
|
- | 343 | for (int i=0;i<12;++i) mPET[i]=0.; |
|
- | 344 | ||
342 | }
|
345 | }
|
343 | 346 | ||
344 | 347 | ||
345 | 348 | ||
346 | /** calculate the daily evaporation/transpiration using the Penman-Monteith-Equation.
|
349 | /** calculate the daily evaporation/transpiration using the Penman-Monteith-Equation.
|
Line 373... | Line 376... | ||
373 | double svp_slope = svp * ( 17.269/(237.3+temperature) - 17.269*temperature/((237.3+temperature)*(237.3+temperature)) ); |
376 | double svp_slope = svp * ( 17.269/(237.3+temperature) - 17.269*temperature/((237.3+temperature)*(237.3+temperature)) ); |
374 | 377 | ||
375 | double div = (1. + svp_slope + gBL / gC); |
378 | double div = (1. + svp_slope + gBL / gC); |
376 | double Etransp = (svp_slope * rad + defTerm) / div; |
379 | double Etransp = (svp_slope * rad + defTerm) / div; |
377 | double canopy_transpiration = Etransp / latent_heat * daylength; |
380 | double canopy_transpiration = Etransp / latent_heat * daylength; |
- | 381 | ||
- | 382 | // calculate PET
|
|
- | 383 | double div_evap = 1 + svp_slope; |
|
- | 384 | double pet_day = (svp_slope*rad + defTerm) / div_evap / latent_heat * daylength; |
|
- | 385 | mPET[climate->month-1] += pet_day; |
|
378 | 386 | ||
379 | if (mInterception>0.) { |
387 | if (mInterception>0.) { |
380 | // we assume that for evaporation from leaf surface gBL/gC -> 0
|
388 | // we assume that for evaporation from leaf surface gBL/gC -> 0
|
381 | double div_evap = 1 + svp_slope; |
- | |
382 | double evap = (svp_slope*rad + defTerm) / div_evap / latent_heat * daylength; |
- | |
383 | evap = qMin(evap, mInterception); |
- | |
384 | mInterception -= evap; // reduce interception |
- | |
385 | mEvaporation = evap; // evaporation from intercepted water |
- | |
- | 389 | pet_day = qMin(pet_day, mInterception); |
|
- | 390 | mInterception -= pet_day; // reduce interception |
|
- | 391 | mEvaporation = pet_day; // evaporation from intercepted water |
|
386 | }
|
392 | }
|
387 | return canopy_transpiration; |
393 | return canopy_transpiration; |
388 | }
|
394 | }
|
389 | 395 | ||
390 | } // end namespace |
396 | } // end namespace |