iLand
species.h
Go to the documentation of this file.
1/********************************************************************************************
2** iLand - an individual based forest landscape and disturbance model
3** http://iland-model.org
4** Copyright (C) 2009- Werner Rammer, Rupert Seidl
5**
6** This program is free software: you can redistribute it and/or modify
7** it under the terms of the GNU General Public License as published by
8** the Free Software Foundation, either version 3 of the License, or
9** (at your option) any later version.
10**
11** This program is distributed in the hope that it will be useful,
12** but WITHOUT ANY WARRANTY; without even the implied warranty of
13** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14** GNU General Public License for more details.
15**
16** You should have received a copy of the GNU General Public License
17** along with this program. If not, see <http://www.gnu.org/licenses/>.
18********************************************************************************************/
19
20#ifndef SPECIES_H
21#define SPECIES_H
22#ifdef ILAND_GUI
23#include <QColor>
24#endif
25
26#include "expression.h"
27#include "globalsettings.h"
28#include "speciesset.h"
29
30class StampContainer; // forwards
31class Stamp;
32class Tree;
33
34
37{
38 double min_temp;
45 double psi_min;
48 bud_birst(255), frost_free(65), frost_tolerance(0.5), psi_min(0.), SOL_thickness(0.) {}
49};
50
53{
57 float hdSapling;
58 double ReinekesR;
62 double representedStemNumberH(const double height) const { return mRepresentedClasses[limit(qRound(height*100.),0,mRepresentedClasses.size()-1)]; }
64 double representedStemNumber(const double dbh) const { return ReinekesR*pow(dbh/25., -1.605) / double(cPxPerHectare); }
67 double sproutGrowth;
69 QVector<double> mRepresentedClasses;
70 void setupReinekeLookup();
71};
72
73
75{
76public:
77 Species(SpeciesSet *set) { mSet = set; mIndex=set->count(); mSeedDispersal=nullptr; }
78 ~Species();
79 // maintenance
80 void setup();
81 void newYear();
82
83 const SpeciesSet *speciesSet() const { return mSet; }
84 // properties
85 SeedDispersal *seedDispersal() const { return mSeedDispersal; }
87 const QString &id() const { return mId; }
89 const QString &name() const { return mName; }
90#ifdef ILAND_GUI
91 const QColor displayColor() const { return mDisplayColor; }
92#endif
93 int index() const { return mIndex; }
94 bool active() const { return true; }
95 int phenologyClass() const { return mPhenologyClass; }
96 bool isConiferous() const { return mConiferous; }
97 bool isEvergreen() const { return mEvergreen; }
98 bool isSeedYear() const { return mIsSeedYear; }
99
100
101 // calculations: allometries for the tree compartments (stem, branches, foliage, fineroots, coarse roots)
102 inline double biomassFoliage(const double dbh) const { return mFoliage_a * pow(dbh, mFoliage_b); }
103 inline double biomassStem(const double dbh) const { return mStem_a * pow(dbh, mStem_b); }
104 inline double biomassRoot(const double dbh) const { return mRoot_a * pow(dbh, mRoot_b); }
105 inline double biomassBranch(const double dbh) const { return mBranch_a * pow(dbh, mBranch_b); }
106 // inline double allometricRatio_wf() const { return mStem_b / mFoliage_b; }
107 inline double allometricExponentStem() const { return mStem_b; }
108 inline double allometricExponentBranch() const { return mBranch_b; }
109 inline double allometricExponentFoliage() const { return mFoliage_b; }
110 double allometricFractionStem(const double dbh) const;
111 double finerootFoliageRatio() const { return mFinerootFoliageRatio; }
112 double barkThickness(const double dbh) const { return dbh * mBarkThicknessFactor; }
113 // cn ratios
114 double cnFoliage() const { return mCNFoliage; }
115 double cnFineroot() const { return mCNFineroot; }
116 double cnWood() const { return mCNWood; }
117 // turnover rates
118 double turnoverLeaf() const { return mTurnoverLeaf; }
119 double turnoverRoot() const { return mTurnoverRoot; }
120 // snags
121 double snagKsw() const { return mSnagKSW; }
122 double snagHalflife() const { return mSnagHalflife; }
123 double snagKyl() const { return mSnagKYL; }
124 double snagKyr() const { return mSnagKYR; }
125
126 // hd-values
127 void hdRange(const double dbh, double &rMinHD, double &rMaxHD) const;
128 // growth
129 double volumeFactor() const { return mVolumeFactor; }
130 double density() const { return mWoodDensity; }
131 double specificLeafArea() const { return mSpecificLeafArea; }
132 // mortality
133 double deathProb_intrinsic() const { return mDeathProb_intrinsic; }
134 inline double deathProb_stress(const double &stress_index) const;
135 // aging
136 double aging(const float height, const int age) const;
137 int estimateAge(const float height) const;
138 // regeneration
140 void seedProduction(const Tree *tree);
141 void setSeedDispersal(SeedDispersal *seed_dispersal) {mSeedDispersal=seed_dispersal; }
142 // environmental responses
143 double vpdResponse(const double &vpd) const;
144 inline double temperatureResponse(const double &delayed_temp) const;
145 double nitrogenResponse(const double &availableNitrogen) const { return mSet->nitrogenResponse(availableNitrogen, mRespNitrogenClass); }
146 double canopyConductance() const { return mMaxCanopyConductance; }
147 inline double soilwaterResponse(const double &psi_kPa) const;
148 double lightResponse(const double lightResourceIndex) const {return mSet->lightResponse(lightResourceIndex, mLightResponseClass); }
149 double psiMin() const { return mPsiMin; }
150 double vpdResponseExponent() const { return mRespVpdExponent; }
151 // parameters for seed dispersal
152 int maturityAge() const { return mMaturityYears; }
153 void treeMigKernel(double &ras1, double &ras2, double &ks) const { ras1=mTM_as1; ras2=mTM_as2; ks=mTM_ks; }
154 double fecundity_m2() const { return mFecundity_m2; }
155 double nonSeedYearFraction() const { return mNonSeedYearFraction; }
156 double fecunditySerotiny() const { return mSerotinyFecundity; }
158 bool isTreeSerotinous(const int age) const;
159
160 const EstablishmentParameters &establishmentParameters() const { return mEstablishmentParams; }
161 const SaplingGrowthParameters &saplingGrowthParameters() const { return mSaplingGrowthParams; }
162
163 const Stamp* stamp(const float dbh, const float height) const { return mLIPs.stamp(dbh, height);}
164private:
165 Q_DISABLE_COPY(Species)
166 // helpers during setup
167 bool boolVar(const QString s) { return mSet->var(s).toBool(); }
168 double doubleVar(const QString s) { return mSet->var(s).toDouble(); }
169 int intVar(const QString s) { return mSet->var(s).toInt(); }
170 QString stringVar(const QString s) { return mSet->var(s).toString(); }
171 SpeciesSet *mSet;
172 StampContainer mLIPs;
173 QString mId;
174 QString mName;
175
176 int mIndex;
177 bool mConiferous;
178 bool mEvergreen;
179 // biomass allometries:
180 double mFoliage_a, mFoliage_b;
181 double mStem_a, mStem_b;
182 double mRoot_a, mRoot_b;
183 double mBranch_a, mBranch_b;
184 // cn-ratios
185 double mCNFoliage, mCNFineroot, mCNWood;
186 double mBarkThicknessFactor;
187
188 double mSpecificLeafArea;
189 // turnover rates
190 double mTurnoverLeaf;
191 double mTurnoverRoot;
192 double mFinerootFoliageRatio;
193 // height-diameter-relationships
194 Expression mHDlow;
195 Expression mHDhigh;
196 // stem density and taper
197 double mWoodDensity;
198 double mFormFactor;
199 double mVolumeFactor;
200 // snag dynamics
201 double mSnagKSW;
202 double mSnagKYL;
203 double mSnagKYR;
204 double mSnagHalflife;
205 // mortality
206 double mDeathProb_intrinsic;
207 double mDeathProb_stress;
208 // Aging
209 double mMaximumAge;
210 double mMaximumHeight;
211 Expression mAging;
212 // environmental responses
213 double mRespVpdExponent;
214 double mRespTempMin;
215 double mRespTempMax;
216 double mRespNitrogenClass;
217 double mPsiMin;
218 // water
219 double mMaxCanopyConductance;
220 int mPhenologyClass;
221 double mLightResponseClass;
222 // regeneration
223 SeedDispersal *mSeedDispersal;
224 int mMaturityYears;
225 double mSeedYearProbability;
226 bool mIsSeedYear;
227 double mNonSeedYearFraction;
228 // regeneration - seed dispersal
229 double mFecundity_m2;
230 double mTM_as1;
231 double mTM_as2;
232 double mTM_ks;
233 EstablishmentParameters mEstablishmentParams;
234 SaplingGrowthParameters mSaplingGrowthParams;
235 Expression mSerotiny;
236 double mSerotinyFecundity;
237
238#ifdef ILAND_GUI
239 QColor mDisplayColor;
240#else
241 int mDisplayColor;
242#endif
243};
244
245
246// inlined functions...
247inline void Species::hdRange(const double dbh, double &rLowHD, double &rHighHD) const
248{
249 rLowHD = mHDlow.calculate(dbh);
250 rHighHD = mHDhigh.calculate(dbh);
251}
254inline double Species::vpdResponse(const double &vpd) const
255{
256 return exp(mRespVpdExponent * vpd);
257}
258
264inline double Species::temperatureResponse(const double &delayed_temp) const
265{
266 double x = qMax(delayed_temp-mRespTempMin, 0.);
267 x = qMin(x/(mRespTempMax-mRespTempMin), 1.);
268 return x;
269}
273inline double Species::soilwaterResponse(const double &psi_kPa) const
274{
275 const double psi_mpa = psi_kPa / 1000.; // convert to MPa
276 double result = limit( (psi_mpa - mPsiMin) / (-0.015 - mPsiMin) , 0., 1.);
277 return result;
278}
279
281inline double Species::deathProb_stress(const double &stress_index) const
282{
283 if (stress_index==0.)
284 return 0.;
285 double result = 1. - exp(-mDeathProb_stress*stress_index);
286 return result;
287}
288
289#endif // SPECIES_H
An expression engine for mathematical expressions provided as strings.
Definition: expression.h:29
double calculate(const double Val1=0., const double Val2=0., const bool forceExecution=false) const
calculate formula.
Definition: expression.cpp:487
The class encapsulates the dispersal of seeds of one species over the whole landscape.
Definition: seeddispersal.h:28
The behavior and general properties of tree species.
Definition: species.h:75
int estimateAge(const float height) const
estimate age for a tree with the current age
Definition: species.cpp:268
double density() const
density of stem wood [kg/m3]
Definition: species.h:130
double biomassStem(const double dbh) const
Definition: species.h:103
double allometricExponentStem() const
Definition: species.h:107
double cnFineroot() const
Definition: species.h:115
int index() const
unique index of species within current set
Definition: species.h:93
double soilwaterResponse(const double &psi_kPa) const
input: matrix potential (kPa) (e.g. -15)
Definition: species.h:273
void setSeedDispersal(SeedDispersal *seed_dispersal)
Definition: species.h:141
const SaplingGrowthParameters & saplingGrowthParameters() const
Definition: species.h:161
double volumeFactor() const
factor for volume calculation: V = factor * D^2*H (incorporates density and the form of the bole)
Definition: species.h:129
void seedProduction(const Tree *tree)
check the maturity of the tree and flag the position as seed source appropriately
Definition: species.cpp:278
double snagHalflife() const
Definition: species.h:122
double barkThickness(const double dbh) const
Definition: species.h:112
double nitrogenResponse(const double &availableNitrogen) const
Definition: species.h:145
const Stamp * stamp(const float dbh, const float height) const
Definition: species.h:163
void hdRange(const double dbh, double &rMinHD, double &rMaxHD) const
Definition: species.h:247
bool isConiferous() const
Definition: species.h:96
double biomassBranch(const double dbh) const
Definition: species.h:105
void setup()
main setup routine for tree species.
Definition: species.cpp:52
double snagKyl() const
decomposition rate for labile matter (litter) used in soil model
Definition: species.h:123
Species(SpeciesSet *set)
Definition: species.h:77
bool isSeedYear() const
Definition: species.h:98
double deathProb_intrinsic() const
Definition: species.h:133
double nonSeedYearFraction() const
Definition: species.h:155
int phenologyClass() const
phenology class defined in project file. class 0 = evergreen
Definition: species.h:95
double biomassFoliage(const double dbh) const
Definition: species.h:102
double cnFoliage() const
Definition: species.h:114
void treeMigKernel(double &ras1, double &ras2, double &ks) const
Definition: species.h:153
int maturityAge() const
Definition: species.h:152
bool isTreeSerotinous(const int age) const
returns true of a tree with given age/height is serotinous (i.e. seed release after fire)
Definition: species.cpp:294
bool isEvergreen() const
Definition: species.h:97
double vpdResponse(const double &vpd) const
vpdResponse calculates response on vpd.
Definition: species.h:254
double temperatureResponse(const double &delayed_temp) const
temperatureResponse calculates response on delayed daily temperature.
Definition: species.h:264
const QString & name() const
the full name (e.g. Picea Abies) of the species
Definition: species.h:89
double psiMin() const
Definition: species.h:149
double canopyConductance() const
maximum canopy conductance in m/s
Definition: species.h:146
const SpeciesSet * speciesSet() const
Definition: species.h:83
double specificLeafArea() const
Definition: species.h:131
double cnWood() const
Definition: species.h:116
double allometricFractionStem(const double dbh) const
calculate fraction of stem wood increment base on dbh.
Definition: species.cpp:240
const QString & id() const
Definition: species.h:87
double vpdResponseExponent() const
Definition: species.h:150
const EstablishmentParameters & establishmentParameters() const
Definition: species.h:160
double biomassRoot(const double dbh) const
Definition: species.h:104
double fecunditySerotiny() const
Definition: species.h:156
double turnoverRoot() const
Definition: species.h:119
double snagKsw() const
Definition: species.h:121
double finerootFoliageRatio() const
ratio of fineroot mass (kg) to foliage mass (kg)
Definition: species.h:111
double allometricExponentBranch() const
Definition: species.h:108
double deathProb_stress(const double &stress_index) const
calculate probabilty of death based on the current stress index.
Definition: species.h:281
SeedDispersal * seedDispersal() const
Definition: species.h:85
~Species()
Definition: species.cpp:41
double snagKyr() const
decomposition rate for refractory matter (woody) used in soil model
Definition: species.h:124
double fecundity_m2() const
Definition: species.h:154
bool active() const
active??? todo!
Definition: species.h:94
double allometricExponentFoliage() const
Definition: species.h:109
void newYear()
newYear is called by the SpeciesSet at the beginning of a year before any growth occurs.
Definition: species.cpp:310
double turnoverLeaf() const
Definition: species.h:118
double aging(const float height, const int age) const
Aging formula.
Definition: species.cpp:255
double lightResponse(const double lightResourceIndex) const
Definition: species.h:148
A SpeciesSet acts as a container for individual Species objects.
Definition: speciesset.h:30
double lightResponse(const double lightResourceIndex, const double lightResponseClass) const
calculates the lightResponse based on a value for LRI and the species lightResponseClass.
Definition: speciesset.cpp:320
QVariant var(const QString &varName)
return variable as QVariant
Definition: speciesset.cpp:211
double nitrogenResponse(const double availableNitrogen, const double &responseClass) const
calculate nitrogen response for a given amount of available nitrogen and a respone class for fraction...
Definition: speciesset.cpp:266
int count() const
Definition: speciesset.h:42
Collection of Stamp for one tree species.
Definition: stampcontainer.h:33
const Stamp * stamp(const float bhd_cm, const float height_m) const
fast access for an individual stamp using a lookup table.
Definition: stampcontainer.cpp:198
Stamp is the basic class for the LIP field of a individual tree.
Definition: stamp.h:32
A tree is the basic simulation entity of iLand and represents a single tree.
Definition: tree.h:44
const int cPxPerHectare
Definition: globalsettings.h:12
double limit(const double value, const double lower, const double upper)
Definition: global.h:82
parameters for establishment
Definition: species.h:37
int frost_free
minimum number of annual frost-free days required
Definition: species.h:43
double GDD_baseTemperature
for GDD-calc: GDD=sum(T - baseTemp)
Definition: species.h:41
int chill_requirement
days of chilling requirement
Definition: species.h:39
double psi_min
minimum soil water potential for establishment
Definition: species.h:45
double frost_tolerance
factor in growing season frost tolerance calculation
Definition: species.h:44
EstablishmentParameters()
Definition: species.h:47
int GDD_min
Definition: species.h:40
double SOL_thickness
effect of thick soil organic layer (0: no effect)
Definition: species.h:46
int GDD_max
GDD thresholds.
Definition: species.h:40
double min_temp
degC
Definition: species.h:38
int bud_birst
GDDs needed until bud burst.
Definition: species.h:42
parameters for sapling growth
Definition: species.h:53
int maxStressYears
trees die, if they are "stressed" for this number of consectuive years
Definition: species.h:55
double ReinekesR
Reinekes R, i.e. maximum stem number for a dg of 25cm.
Definition: species.h:58
void setupReinekeLookup()
Definition: species.cpp:323
SaplingGrowthParameters()
Definition: species.h:60
double adultSproutProbability
annual chance of creating a sprouting sapling cell from an adult tree of resprouting species
Definition: species.h:68
float hdSapling
fixed height-diameter ratio used for saplings
Definition: species.h:57
double referenceRatio
f_ref (eq. 3) -> ratio reference site / optimum site
Definition: species.h:59
double browsingProbability
browsing probability
Definition: species.h:66
double representedStemNumber(const double dbh) const
represented stem number by one cohort (using Reinekes Law):
Definition: species.h:64
double sproutGrowth
multiplier of growth for saplings regenerated by sprouts (0: no sprouts)
Definition: species.h:67
QVector< double > mRepresentedClasses
lookup table for represented trees
Definition: species.h:69
Expression heightGrowthPotential
formula that expresses height growth potential
Definition: species.h:54
double stressThreshold
tree is considered as "stressed" if f_env_yr is below that threhold
Definition: species.h:56
double representedStemNumberH(const double height) const
represented stem number by height of one cohort (using Reinekes Law): this uses a lookup table to imp...
Definition: species.h:62