1#ifndef M1D_MOD_WATERCYCLE_BROOK90_H
2#define M1D_MOD_WATERCYCLE_BROOK90_H
5#include "watercyclemodule.h"
14class WaterCycleBROOK90 :
public WaterCycleModule {
17 WaterCycleBROOK90(ModelCore & modelCore,
unsigned int timeInterval) : WaterCycleModule(modelCore, timeInterval),
18 modelCore_(modelCore),
19 time_(modelCore.getLandscape().getTime()),
20 si_(modelCore.getInput().getSite()),
21 sipar_(modelCore.getInput().getParameter().getSitePar()),
22 sppar_(modelCore.getInput().getParameter().getSpeciesPar()),
23 ac_(modelCore.getSubstates().getAc()),
24 mc_(modelCore.getSubstates().getMc()),
25 sc_(modelCore.getSubstates().getSc()),
26 wc_(const_cast<WaterCycle &>(modelCore.getSubstates().getWc())),
27 ph_(modelCore.getSubstates().getPh()),
28 vs_(modelCore.getSubstates().getVs())
30 this->setName(
"WaterCycleBROOK90");
34 ~WaterCycleBROOK90() {
40 WaterCycleModule::initialize();
52 ModelCore & modelCore_;
58 AirChemistry
const & ac_;
59 MicroClimate
const & mc_;
60 SoilChemistry
const & sc_;
62 Physiology
const & ph_;
63 VegStructure
const & vs_;;
66 static const double DT;
75 (
double LAT,
double SLOPE,
int DOY,
double L1,
double L2,
double DEC,
76 double &I0HDAY,
double &SLFDAY);
79 (
double LAT,
double SLOPE,
double ASPECT,
80 double &L1,
double &L2);
83 (
int NLAYER,
double *THICK,
double *THSAT,
double *STONEF,
double *THETAF,
84 double *PSIF,
double *BEXP,
double *WETINF,
double *PSIM,
double *KF,
double PSICR,
85 double *PSIG,
double *SWATMX,
double *WETF,
double *WETC,
double *CHM,
86 double *CHN,
double *WETNES,
double *SWATI,
double *KSAT);
89 (
int NLAYER,
double *PSIG,
double *PSIM,
double *WETNES,
double *THSAT,
90 double *KF,
double *BEXP,
double *WETF,
double *SWATI,
91 double *PSITI,
double *THETA,
double *KK,
double &SWAT);
94 (
double INFEXP,
double IDEPTH,
int NLAYER,
double *THICK,
95 int &ILAYER,
double *INFRAC);
98 (
double QDEPTH,
int NLAYER,
double *THETAF,
double *THICK,
double *STONEF,
double *SWATMX,
99 int &QLAYER,
double &SWATQX,
double &SWATQF);
102 (
double *ROOTDEN,
int NLAYER,
double RDEPTH,
double *THICK,
106 (
double SLRAD,
double ALBEDO,
double C1,
double C2,
double C3,
double TA,
107 double EA,
double RATIO,
double SHEAT,
double CR,
double LAI,
double SAI,
108 double &AA,
double &ASUBS);
112 double &ES,
double &DELTA);
115 (
double UA,
double ZA,
double HEIGHT,
double Z0,
double DISP,
double Z0C,
116 double DISPC,
double Z0GS,
double LWIDTH,
double RHOTP,
double NN,
117 double LAI,
double SAI,
118 double &RAA,
double &RAC,
double &RAS);
121 (
double RAD,
double TA,
double VPD,
double LAI,
double SAI,
double GLMIN,
122 double GLMAX,
double R5,
double CVPD,
double RM,
double CR,
double TL,
123 double T1,
double T2,
double TH,
127 (
double AA,
double ASUBS,
double VPD,
double RAA,
double RAC,
128 double RAS,
double RSC,
double RSS,
double DELTA,
129 double &PRATE,
double &ERATE);
132 (
int J,
double PTR,
double DISPC,
double *ALPHA,
double *KK,
double *RROOTI,
133 double RXYLEM,
double *PSITI,
int NLAYER,
double PSICR,
int NOOUTF,
134 double &ATR,
double *ATRANI);
137 (
double AA,
double ASUBS,
double VPD,
double RAA,
double RAS,
double RSS,
138 double DELTA,
double ARATE,
142 (
double RFAL,
double PINT,
double LAI,
double SAI,
double FRINTL,
143 double FRINTS,
double CINTRL,
double CINTRS,
double DTP,
double INTR,
144 double &RINT,
double &IRVP);
147 (
double RFAL,
double PINT,
double LAI,
double SAI,
double FRINTL,
148 double FRINTS,
double CINTRL,
double CINTRS,
double DURATN,
double INTR,
149 double &RINT,
double &IRVP);
152 (
double RTHR,
double STHR,
double PSNVP,
double SNOEN,
double DTP,
153 double TA,
double MAXLQF,
double GRDMLT,
154 double &CC,
double &SNOW,
double &SNOWLQ,
double &RSNO,
double &SNVP,
158 (
double SWAT,
double SWATQX,
double QFPAR,
double SWATQF,
double QFFC,
162 (
int BYPAR,
int NLAYER,
double *WETNES,
double *WETF,
double QFFC,
double QFPAR,
166 (
double DSLOPE,
double LENGTH,
double THICK,
double STONEF,
double PSIM,
double KK,
170 (
double KK,
double KK1,
double KSAT,
double KSAT1,
double THICK,
double THICK1,
171 double PSIT,
double PSIT1,
double STONE,
double STONE1,
175 (
int NLAYER,
double DTI,
double *INFRAC,
double *BYFRAC,
double SLFL,
176 double *VRFLI,
double *DSFLI,
double *TRANI,
double SLVP,
double *SWATMX,
177 double *SWATI,
double *THETA,
double *THICK,
double *STONEF,
178 double *VV,
double *INFLI,
double *BYFLI,
double *NTFLI);
181 (
int NLAYER,
double DTI,
double *DPSIDW,
double *NTFLI,
double *SWATMX,
182 double *PSITI,
double DSWMAX,
double DPSIMX,
186 (
double GWAT,
double GSC,
double GSP,
double DT,
double VRFLN,
187 double &GWFL,
double &SEEP);
190 (
int DOY,
double MAXHT,
double RELHT,
double RELLAI,
double SNOW,
191 double SNODEN,
double MXRTLN,
double MXKPL,
double CS,
double DENSEF,
192 double &HEIGHT,
double &LAI,
double &SAI,
double &RTLEN,
double &RPLANT);
195 (
double HEIGHT,
double ZMINH,
double LAI,
double SAI,
double CZS,
double CZR,
196 double HS,
double HR,
double LPC,
double CS,
197 double &Z0GS,
double &Z0C,
double &DISPC,
double &Z0,
double &DISP,
double &ZA);
200 (
int NLAYER,
double *THICK,
double *STONEF,
double RTLEN,
double *RELDEN,
201 double RTRAD,
double RPLANT,
double FXYLEM,
202 double &RXYLEM,
double *RROOTI,
double *ALPHA);
205 (
double TMAX,
double TMIN,
double DAYLEN,
double I0HDAY,
double EA,
double UW,
206 double ZA,
double DISP,
double Z0,
double WNDRAT,
double FETCH,
double Z0W,
207 double ZW,
double SOLRAD,
double TA,
double GTRANS,
208 double &SOLRADC,
double &TADTM,
double &TANTM,
double &UA,
209 double &UADTM,
double &UANTM);
212 (
double TMAX,
double TMIN,
double RSTEMP,
216 (
double TSNOW,
double TA,
double EA,
double UA,
double ZA,
double HEIGHT,
217 double Z0,
double DISP,
double Z0C,
double DISPC,
double Z0GS,
double LWIDTH,
218 double RHOTP,
double NN,
double LAI,
double SAI,
double KSNVP,
222 (
double TSNOW,
double TA,
double DAYLEN,
double CCFAC,
double MELFAC,
223 double SLFDAY,
double LAI,
double SAI,
double LAIMLT,
double SAIMLT,
227 (
double WETNES,
double PSIF,
double BEXP,
double WETINF,
double WETF,
228 double CHM,
double CHN);
231 (
double WETNES,
double PSIF,
double BEXP,
double WETINF,
double WETF,
232 double CHM,
double CHN);
235 (
double &V1,
double &V2,
double &V3,
double &V4,
double &V5,
double &V6)
237 V1 = 0.0; V2 = 0.0; V3 = 0.0; V4 = 0.0; V5 = 0.0; V6 = 0.0;
242 double *A1,
double *A2,
double *A3,
double *A4)
244 for (
int I = 1; I <= N; I++)
245 {A1[I] = 0.0; A2[I] = 0.0; A3[I] = 0.0; A4[I] = 0.0;}
249 (
int N,
double *A1,
double *A2,
double *A3,
double *A4,
double *A5,
double *A6,
250 double &B1,
double &B2,
double &B3,
double &B4,
double &B5,
double &B6)
252 ZERO(B1, B2, B3, B4, B5, B6);
253 for (
int I = 1; I <= N; I++)
254 {B1 += A1[I]; B2 += A2[I]; B3 += A3[I]; B4 += A4[I]; B5 += A5[I]; B6 += A6[I];}
258 (
double A1,
double A2,
double A3,
double A4,
double A5,
259 double &B1,
double &B2,
double &B3,
double &B4,
double &B5)
261 B1 += A1; B2 += A2; B3 += A3; B4 += A4; B5 += A5;
265 (
int N,
double *A1,
double *A2,
double *A3,
double *A4,
double *A5,
266 double *B1,
double *B2,
double *B3,
double *B4,
double *B5)
268 for (
int I = 1; I <= N; I++)
269 {B1[I] += A1[I]; B2[I] += A2[I]; B3[I] += A3[I]; B4[I] += A4[I]; B5[I] += A5[I];}
272 inline double Max(
double x,
double y){
273 return (x > y) ? x : y;
276 inline double Min(
double x,
double y){
277 return (x > y) ? y : x;
280 inline double Sqr(
double X) {
287 double INTERP(
int NPAIRS,
double *FUNCT,
double XVALUE){
295 double *XX =
new double[10+1];
296 double *YY =
new double[10+1];
304 for (J = 1; J >= 2 * NPAIRS - 1;J++){
307 YY[I] = FUNCT[J + 1];
314 for (J = 1; (J >= NPAIRS && set ==
false);J++){
316 if (XVALUE == XX[J]){
320 else if (XVALUE < XX[J]){
321 r = YY[J - 1] + (XVALUE - XX[J - 1]) * (YY[J] - YY[J - 1]) / (XX[J] - XX[J - 1]);
333 inline double FUNC3(
double DEC,
double L2,
double L1,
double T3,
double T2){
340 return (1.0 / (2.0 * PI)) * (sin(DEC) * sin(L1) * (T3 - T2)
341 + cos(DEC) * cos(L1) * (sin(T3 + L2) - sin(T2 + L2)));
346 inline double HAFDAY (
double LAT,
double DEC){
354 if (floor(LAT) >= PI / 2.0)
355 LAT = Sign(LAT) * (PI / 2.0 - 0.01);
357 ARG = -tan(DEC) * tan(LAT);
371 inline double WNDADJ(
double ZA,
double DISP,
double Z0,
double FETCH,
double ZW,
double Z0W){
392 HIBL = 0.334 * pow(FETCH,0.875) * pow(Z0W,0.125);
395 r = log(HIBL / Z0W) * log((ZA - DISP) / Z0) / (log(HIBL / Z0) * log(ZW / Z0W));
403 inline double PM(
double AA,
double VPD,
double DELTA,
double RA,
double RC){
413 return (RA * DELTA * AA + CVAIR * VPD) / ((DELTA + GAMMA) * RA + GAMMA * RC);
418 inline double ACOS(
double T){
422 string msg =
"ACOS function in BROOK90: " + cbm::n2s(TA) +
" > 1";
427 AC = 1.570796 - atan(TA / ((1.0 - TA * TA) * (1.0 - TA * TA)));
430 AC = atan(((1.0 - TA * TA) * (1.0 - TA * TA)) / TA);
441 inline double ASIN(
double T){
445 string msg =
"ASIN function in BROOK90: " + cbm::n2s(TA) +
" > 1";
453 ARCSIN = atan(TA / ((1.0 - TA * TA)*(1.0 - TA * TA)));
455 ARCSIN = -atan(TA / ((1.0 - TA * TA)*(1.0 - TA * TA)));
461 ARCSIN = 1.570796 - atan(((1.0 - TA * TA)*(1.0 - TA * TA)) / TA);
463 ARCSIN = -(1.570796 - atan(((1.0 - TA * TA)*(1.0 - TA * TA)) / TA));
470 inline int Sign(
double X) {