Subversion Repositories public iLand

Rev

Rev 483 | Rev 513 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
1
 
113 Werner 2
#include "global.h"
3
#include "production3pg.h"
4
 
189 iland 5
#include "resourceunit.h"
113 Werner 6
#include "species.h"
226 werner 7
#include "speciesresponse.h"
8
#include "model.h"
113 Werner 9
 
10
Production3PG::Production3PG()
11
{
226 werner 12
    mResponse=0;
440 werner 13
    mEnvYear = 0.;
113 Werner 14
}
15
 
226 werner 16
/**
17
  This is based on the utilizable photosynthetic active radiation.
18
  @sa http://iland.boku.ac.at/primary+production
227 werner 19
  The resulting radiation is MJ/m2       */
20
inline double Production3PG::calculateUtilizablePAR(const int month) const
226 werner 21
{
327 werner 22
    // calculate the available radiation. This is done at SpeciesResponse-Level
226 werner 23
    // see Equation (3)
273 werner 24
    // multiplicative approach: responses are averaged one by one and multiplied on a monthly basis
25
//    double response = mResponse->absorbedRadiation()[month] *
26
//                      mResponse->vpdResponse()[month] *
27
//                      mResponse->soilWaterResponse()[month] *
28
//                      mResponse->tempResponse()[month];
29
    // minimum approach: for each day the minimum aof vpd, temp, soilwater is calculated, then averaged for each month
327 werner 30
    //double response = mResponse->absorbedRadiation()[month] *
31
    //                  mResponse->minimumResponses()[month];
32
    double response = mResponse->utilizableRadiation()[month];
273 werner 33
 
226 werner 34
    return response;
35
}
36
/** calculate the alphac (=photosynthetic efficiency) for the given month.
37
   this is based on a global efficiency, and modified per species.
227 werner 38
   epsilon is in gC/MJ Radiation
226 werner 39
  */
227 werner 40
inline double Production3PG::calculateEpsilon(const int month) const
226 werner 41
{
42
    double epsilon = Model::settings().epsilon; // maximum radiation use efficiency
43
    epsilon *= mResponse->nitrogenResponse() *
300 werner 44
               mResponse->co2Response()[month];
226 werner 45
    return epsilon;
46
}
47
 
227 werner 48
inline double Production3PG::abovegroundFraction() const
49
{
50
    double harsh =  1 - 0.8/(1 + 2.5 * mResponse->nitrogenResponse());
51
    return harsh;
52
}
53
 
369 werner 54
void Production3PG::clear()
55
{
56
    for (int i=0;i<12;i++) {
57
        mGPP[i] = 0.; mUPAR[i]=0.;
58
    }
440 werner 59
    mEnvYear = 0.;
369 werner 60
}
61
 
62
/** calculate the GPP
226 werner 63
  @sa http://iland.boku.ac.at/primary+production */
115 Werner 64
double Production3PG::calculate()
113 Werner 65
{
226 werner 66
    Q_ASSERT(mResponse!=0);
67
    // Radiation: sum over all days of each month with foliage
230 werner 68
    double year_raw_gpp = 0.;
369 werner 69
    clear();
226 werner 70
    double utilizable_rad, epsilon;
230 werner 71
    // conversion from gC to kg Biomass: C/Biomass=0.5
485 werner 72
    const double gC_to_kg_biomass = 1. / (biomassCFraction * 1000.);
226 werner 73
    for (int i=0;i<12;i++) {
230 werner 74
        utilizable_rad = calculateUtilizablePAR(i); // utilizable radiation of the month times ...
226 werner 75
        epsilon = calculateEpsilon(i); // ... photosynthetic efficiency ...
230 werner 76
        mUPAR[i] = utilizable_rad ;
77
        mGPP[i] =utilizable_rad * epsilon * gC_to_kg_biomass; // ... results in GPP of the month kg Biomass/m2 (converted from gC/m2)
251 werner 78
        year_raw_gpp += mGPP[i]; // kg Biomass/m2
113 Werner 79
    }
436 werner 80
 
81
    // calculate f_env,yr: see http://iland.boku.ac.at/sapling+growth+and+competition
82
    double f_sum = 0.;
83
    for (int i=0;i<12;i++)
437 werner 84
        f_sum += mGPP[i] / gC_to_kg_biomass; // == uAPar * epsilon_eff
436 werner 85
 
467 werner 86
    //  the factor f_ref: parameter that scales response values to the range 0..1 (1 for best growth conditions) (species parameter)
87
    const double perf_factor = mResponse->species()->saplingGrowthParameters().referenceRatio;
485 werner 88
    // f_env,yr=(uapar*epsilon_eff) / (APAR * epsilon_0 * fref)
436 werner 89
    mEnvYear = f_sum / (Model::settings().epsilon * mResponse->yearlyRadiation() * perf_factor);
480 werner 90
    if (mEnvYear > 1.) {
483 werner 91
        qDebug() << "ERROR: fEnvYear > 1 for " << mResponse->species()->id() << mEnvYear << "f_sum, epsilon, yearlyRad, perf_factor" <<  f_sum << Model::settings().epsilon <<  mResponse->yearlyRadiation() << perf_factor;
485 werner 92
        mEnvYear = 1.;
480 werner 93
    }
436 werner 94
 
95
    // calculate fraction for belowground biomass
227 werner 96
    mRootFraction = 1. - abovegroundFraction();
137 Werner 97
 
98
    // global value set?
215 werner 99
    double dbg = GlobalSettings::instance()->settings().paramValue("gpp_per_year",0);
227 werner 100
    if (dbg) {
280 werner 101
        year_raw_gpp = dbg;
227 werner 102
        mRootFraction = 0.4;
103
    }
137 Werner 104
 
230 werner 105
    // year GPP/rad: kg Biomass/m2
106
    mGPPperArea = year_raw_gpp;
107
    return mGPPperArea; // yearly GPP in kg Biomass/m2
113 Werner 108
}