iLand
watercycle.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 WATERCYCLE_H
21#define WATERCYCLE_H
22#include <QHash>
23
24class ResourceUnit;
25struct ClimateDay;
26class WaterCycle; // forward
27class WaterOut; // forward
29namespace Water
30{
31
32class Permafrost; // forward
33
39{
40 friend class ::WaterCycle;
41public:
42 SnowPack(): mSnowPack(0.) {}
43 void setSnow(double snow_mm) { mSnowPack = snow_mm; }
45 double flow(const double &preciptitation_mm, const double &temperature);
47 inline double add(const double &preciptitation_mm, const double &temperature);
49 double snowPack() const { return mSnowPack; }
51 double snowDepth() const { return mSnowPack / mSnowDensity; /* mm = kg/m2, density=kg/m3, mm / density = m */ }
52private:
53 double mSnowPack;
54 // parameters of snow class
55 static double mSnowTemperature;
56 static double mSnowDensity;
57
58};
59
66class Canopy
67{
68
69public:
70 // setup
71 void setup();
72 void setStandParameters(const double LAIneedle, const double LAIbroadleave, const double maxCanopyConductance);
73 // actions
75 double flow(const double &preciptitation_mm);
76 double evapotranspirationBGC(const ClimateDay *climate, const double daylength_h);
77 double evapotranspiration3PG(const ClimateDay *climate, const double daylength_h, const double combined_response);
78 // properties
79 double interception() const { return mInterception; }
80 double evaporationCanopy() const { return mEvaporation; }
81 double avgMaxCanopyConductance() const { return mAvgMaxCanopyConductance; }
82 const double *referenceEvapotranspiration() const { return mET0; }
83
84private:
85 double mLAINeedle; // leaf area index of coniferous species
86 double mLAIBroadleaved; // leaf area index of broadlevaed species
87 double mLAI; // total leaf area index
88 double mAvgMaxCanopyConductance; // maximum weighted canopy conductance (m/s)
89 double mInterception;
90 double mEvaporation;
91 // Penman-Monteith parameters
92 double mAirDensity; // density of air [kg / m3]
93 double mET0[12];
94 // parameters for interception
95 static double mNeedleFactor;
96 static double mDecidousFactor;
97 friend class ::WaterCycle;
98 // GCC problems with friend class and namespaces: http://www.ogre3d.org/forums/viewtopic.php?f=10&t=47540
99};
100
101
102} // end namespace Water
103
104
106{
107public:
108 WaterCycle();
109 ~WaterCycle();
110 void setup(const ResourceUnit *ru);
111 void setContent(double content, double snow_mm) { mContent = content; mSnowPack.setSnow(snow_mm); }
112 // actions
113 void run();
114 static void resetPsiMin();
115 // properties
116 double fieldCapacity() const { return mFieldCapacity; }
118 double waterHoldingCapacity() const { return mFieldCapacity - mPermanentWiltingPoint; }
119 const double &psi_kPa(const int doy) const { return mPsi[doy]; }
120 double soilDepth() const { return mSoilDepth; }
121 double currentContent() const { return mContent; }
122 double currentSnowPack() const { return mSnowPack.snowPack(); }
123 double canopyConductance() const { return mCanopyConductance; }
124 double effectiveLAI() const { return mEffectiveLAI; }
125 double meanSoilWaterContent() const {return mMeanSoilWaterContent; }
126 double meanGrowingSeasonSWC() const { return mMeanGrowingSeasonSWC; }
128 const double *referenceEvapotranspiration() const { return mCanopy.referenceEvapotranspiration(); }
130 double estPsiMin(int phenologyGroup) const;
131 // elements
132 const Water::Permafrost *permafrost() const { return mPermafrost; }
133
134private:
135 struct RUSpeciesShares {
138 RUSpeciesShares(const int n_species):ground_vegetation_share(0.), adult_trees_share(0.) { lai_share.resize(n_species); }
139 QVector<double> lai_share; // for each species a share [0..1]
140 double ground_vegetation_share; // the share of ground vegetation; sum(lai_share)+ground_vegetation_share = 1
141 double adult_trees_share; // share of adult trees (>4m) on total LAI (relevant for aging)
142 double total_lai; // total effective LAI
143 };
146 void calculatePsiMin() const;
147
148 int mLastYear;
149 inline double psiFromHeight(const double mm) const; // kPa for water height "mm"
150 inline double heightFromPsi(const double psi_kpa) const; // water height (mm) at water potential psi (kilopascal)
151 inline double calculateBaseSoilAtmosphereResponse(const double psi_kpa, const double vpd_kpa, const double psi_min, const double vpd_exp);
152 double mPsi_koeff_b;
153 double mPsi_sat;
154 double mTheta_sat;
155 const ResourceUnit *mRU;
156 Water::Canopy mCanopy;
157 Water::SnowPack mSnowPack;
158 Water::Permafrost *mPermafrost;
159 double mSoilDepth;
160 double mContent;
161 double mFieldCapacity;
162 double mPermanentWiltingPoint;
163 double mPsi[366];
164 void getStandValues(RUSpeciesShares &species_shares);
165 inline double calculateSoilAtmosphereResponse(RUSpeciesShares &species_share, const double psi_kpa, const double vpd_kpa);
166 double mLAINeedle;
167 double mLAIBroadleaved;
168 double mCanopyConductance;
169 double mEffectiveLAI;
170 // ground vegetation
171 double mGroundVegetationLAI;
172 double mGroundVegetationPsiMin;
173 // annual sums
174 double mTotalET;
175 double mTotalExcess;
176 double mSnowRad;
177 int mSnowDays;
178 double mMeanSoilWaterContent;
179 double mMeanGrowingSeasonSWC;
180
183 static QHash<int, double> mEstPsi;
184
185 friend class ::WaterOut;
186 friend class Water::Permafrost;
187};
188
191{
192public:
194 double water_to_ground[366];
196 double snow_cover[366];
197};
198
199#endif // WATERCYCLE_H
ResourceUnit is the spatial unit that encapsulates a forest stand and links to several environmental ...
Definition: resourceunit.h:49
Canopy handles the the throughfall and evaporation from the forest canopy.
Definition: watercycle.h:67
double avgMaxCanopyConductance() const
averaged maximum canopy conductance of current species distribution (m/s)
Definition: watercycle.h:81
double evapotranspiration3PG(const ClimateDay *climate, const double daylength_h, const double combined_response)
evapotranspiration from soil (mm). returns
Definition: watercycle.cpp:610
void setStandParameters(const double LAIneedle, const double LAIbroadleave, const double maxCanopyConductance)
Definition: watercycle.cpp:593
double flow(const double &preciptitation_mm)
process the canopy layer. returns the amount of precipitation that leaves the canopy-layer.
Definition: watercycle.cpp:543
double evapotranspirationBGC(const ClimateDay *climate, const double daylength_h)
evapotranspiration from soil
const double * referenceEvapotranspiration() const
monthly reference ET (see Adair et al 2008)
Definition: watercycle.h:82
double evaporationCanopy() const
evaporation from canopy (mm)
Definition: watercycle.h:80
void setup()
setup and load parameter values
Definition: watercycle.cpp:588
double interception() const
mm water that is intercepted by the crown
Definition: watercycle.h:79
The Permafrost class simulates the permafrost layer of a resource unit.
Definition: permafrost.h:20
SnowPack handles the snow layer.
Definition: watercycle.h:39
double add(const double &preciptitation_mm, const double &temperature)
additional precipitation (e.g. non evaporated water of canopy interception).
Definition: watercycle.cpp:527
double snowDepth() const
depth of snow (m)
Definition: watercycle.h:51
void setSnow(double snow_mm)
Definition: watercycle.h:43
double snowPack() const
current snowpack (mm water)
Definition: watercycle.h:49
SnowPack()
Definition: watercycle.h:42
double flow(const double &preciptitation_mm, const double &temperature)
process the snow layer. Returns the mm of preciptitation/melt water that leaves the snow layer.
Definition: watercycle.cpp:506
WaterCycleData is a data transfer container for water-related details.
Definition: watercycle.h:191
double snow_cover[366]
height of snow cover [mm water column]
Definition: watercycle.h:196
double water_to_ground[366]
daily amount of water that actually reaches the ground (i.e., after interception)
Definition: watercycle.h:194
simulates the water cycle on a ResourceUnit.
Definition: watercycle.h:106
void setContent(double content, double snow_mm)
Definition: watercycle.h:111
const double & psi_kPa(const int doy) const
soil water potential for the day 'doy' (0-index) in kPa
Definition: watercycle.h:119
void run()
run the current year
Definition: watercycle.cpp:289
static void resetPsiMin()
reset/clear the psi-min values for establishment
Definition: watercycle.cpp:420
double effectiveLAI() const
effective LAI (including saplings and ground vegetation)
Definition: watercycle.h:124
double meanGrowingSeasonSWC() const
mean soil water content (mm) during the growing season (fixed: april - september)
Definition: watercycle.h:126
double waterHoldingCapacity() const
water holding capacity from (default) -15kpa to -4000 kpa (permanent wilting point)
Definition: watercycle.h:118
WaterCycle()
Definition: watercycle.cpp:53
const Water::Permafrost * permafrost() const
Definition: watercycle.h:132
double currentSnowPack() const
current water stored as snow (mm water)
Definition: watercycle.h:122
double soilDepth() const
soil depth in mm
Definition: watercycle.h:120
double fieldCapacity() const
field capacity (mm)
Definition: watercycle.h:116
const double * referenceEvapotranspiration() const
monthly values for PET (mm sum)
Definition: watercycle.h:128
~WaterCycle()
Definition: watercycle.cpp:63
void setup(const ResourceUnit *ru)
Definition: watercycle.cpp:69
double canopyConductance() const
current canopy conductance (LAI weighted CC of available tree species) (m/s)
Definition: watercycle.h:123
double estPsiMin(int phenologyGroup) const
psi min values for establishment for a phenology type
Definition: watercycle.cpp:437
double currentContent() const
current water content in mm
Definition: watercycle.h:121
double meanSoilWaterContent() const
mean of annual soil water content (mm)
Definition: watercycle.h:125
Definition: waterout.h:26
Water contains helper classes for the water cycle calculations.
Definition: permafrost.cpp:13
current climate variables of a day.
Definition: climate.h:28