Subversion Repositories public iLand

Rev

Rev 554 | Rev 562 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 554 Rev 561
Line 352... Line 352...
352
{
352
{
353
    double vpd_mbar = climate->vpd * 10.; // convert from kPa to mbar
353
    double vpd_mbar = climate->vpd * 10.; // convert from kPa to mbar
354
    double temperature = climate->temperature; // average temperature of the day (°C)
354
    double temperature = climate->temperature; // average temperature of the day (°C)
355
    double daylength = daylength_h * 3600.; // daylength in seconds (convert from length in hours)
355
    double daylength = daylength_h * 3600.; // daylength in seconds (convert from length in hours)
356
    double rad = climate->radiation / daylength * 1000000; //convert from MJ/m2 (day sum) to average radiation flow W/m2 [MJ=MWs -> /s * 1,000,000
356
    double rad = climate->radiation / daylength * 1000000; //convert from MJ/m2 (day sum) to average radiation flow W/m2 [MJ=MWs -> /s * 1,000,000
-
 
357
-
 
358
    // the radiation: based on linear empirical function
-
 
359
    const double qa = -90.;
-
 
360
    const double qb = 0.8;
-
 
361
    double net_rad = qa + qb*rad;
357
362
358
    //: Landsberg original: const double e20 = 2.2;  //rate of change of saturated VP with T at 20C
363
    //: Landsberg original: const double e20 = 2.2;  //rate of change of saturated VP with T at 20C
359
    const double VPDconv = 0.000622; //convert VPD to saturation deficit = 18/29/1000
364
    const double VPDconv = 0.000622; //convert VPD to saturation deficit = 18/29/1000
360
    const double latent_heat = 2460000.; // Latent heat of vaporization. Energy required per unit mass of water vaporized [J kg-1]
365
    const double latent_heat = 2460000.; // Latent heat of vaporization. Energy required per unit mass of water vaporized [J kg-1]
361
366
Line 367... Line 372...
367
    // current response: see calculateSoilAtmosphereResponse(). This is basically a weighted average of min(water_response, vpd_response) for each species
372
    // current response: see calculateSoilAtmosphereResponse(). This is basically a weighted average of min(water_response, vpd_response) for each species
368
    double gC = mAvgMaxCanopyConductance * combined_response;
373
    double gC = mAvgMaxCanopyConductance * combined_response;
369
374
370
375
371
    double defTerm = mAirDensity * latent_heat * (vpd_mbar * VPDconv) * gBL;
376
    double defTerm = mAirDensity * latent_heat * (vpd_mbar * VPDconv) * gBL;
372
        // saturation vapor pressure (Running 1988, Eq. 1) in mbar
-
 
373
    double svp = 6.1078 * exp((17.269 * temperature) / (237.3 + temperature) );
-
 
374
    // the slope of svp is, thanks to http://www.wolframalpha.com/input/?i=derive+y%3D6.1078+exp+((17.269x)/(237.3%2Bx))
-
 
375
    double svp_slope = svp * ( 17.269/(237.3+temperature) - 17.269*temperature/((237.3+temperature)*(237.3+temperature)) );
-
 
-
 
377
-
 
378
    //  with temperature-dependent  slope of  vapor pressure saturation curve
-
 
379
    // (following  Allen et al. (1998),  http://www.fao.org/docrep/x0490e/x0490e07.htm#atmospheric%20parameters)
-
 
380
    // svp_slope in mbar.
-
 
381
    double svp_slope = 4098. * (6.1078 * exp(17.269 * temperature / (temperature + 237.3))) / ((237.3+temperature)*(237.3+temperature));
376
382
377
    double div = (1. + svp_slope + gBL / gC);
383
    double div = (1. + svp_slope + gBL / gC);
378
    double Etransp = (svp_slope * rad + defTerm) / div;
-
 
-
 
384
    double Etransp = (svp_slope * net_rad + defTerm) / div;
379
    double canopy_transpiration = Etransp / latent_heat * daylength;
385
    double canopy_transpiration = Etransp / latent_heat * daylength;
380
386
381
    // calculate PET
387
    // calculate PET
382
    double div_evap = 2. + svp_slope;
-
 
383
    double pet_day = (svp_slope*rad + defTerm) / div_evap / latent_heat * daylength;
-
 
-
 
388
    double div_evap = 1. + svp_slope;
-
 
389
    double pet_day = (svp_slope*net_rad + defTerm) / div_evap / latent_heat * daylength;
384
    mPET[climate->month-1] += pet_day;
390
    mPET[climate->month-1] += pet_day;
385
391
386
    if (mInterception>0.) {
392
    if (mInterception>0.) {
387
        // we assume that for evaporation from leaf surface gBL/gC -> 0
393
        // we assume that for evaporation from leaf surface gBL/gC -> 0
388
        pet_day = qMin(pet_day, mInterception);
394
        pet_day = qMin(pet_day, mInterception);