Subversion Repositories public iLand

Rev

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