-
Notifications
You must be signed in to change notification settings - Fork 0
/
SJHydroModel.h
91 lines (69 loc) · 2.53 KB
/
SJHydroModel.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
#ifndef HYDROMODEL_H
#define HYDROMODEL_H
#include <datastr/TimeSeries.h>
#include <datastr/DividedRange.h>
#include "SnowModel.h"
#define ZERO_CELSIUS 273.15
#define RAIN_ALL_TEMPERATURE (ZERO_CELSIUS + 2)
#define SNOW_ALL_TEMPERATURE ZERO_CELSIUS
using namespace openworld;
template <class TBase, class TNumeric, class TLogical>
class SJHydroModel {
protected:
Indicator timeind;
int verbose;
double precipMult;
double tempAdd;
double snowDiff;
// Results of internalStepDay
// Updated sequentially
TNumeric& currentGroundRainVolume;
TNumeric& currentGroundMeltVolume;
TNumeric& currentGroundConf;
// Refreshed every step
TNumeric& newRainVolume;
TNumeric& newMeltVolume;
TNumeric& newVolumeConf;
list<double> outFlowRain;
list<double> outFlowMelt;
Measure now;
public:
SJHydroModel(Indicator timeind, double meltDegreeDayFactor, double meltDegreeDaySlope, double rainRunoffCoefficient, double meltRunoffCoefficient, double groundCoefficient, double groundToBaseflowDay, double rainOnSnowCoefficient, double surfaceEvaporationFactor, double riverEvaporationFactor, TNumeric& initialGroundRainVolume, TNumeric& initialGroundMeltVolume, TNumeric& initialGroundConf);
SJHydroModel(SJHydroModel& copy);
virtual ~SJHydroModel();
double meltDegreeDayFactor;
double meltDegreeDaySlope;
double rainRunoffCoefficient;
double meltRunoffCoefficient;
double groundCoefficient;
double groundToBaseflowDay;
double rainOnSnowCoefficient;
double surfaceEvaporationFactor;
double riverEvaporationFactor;
void setPrecipitationScaling(double precipMult = 1);
void setTemperatureAddition(double tempAdd = 0);
void setSnowCoverDifference(double snowDiff = 0);
virtual time_t getTime();
virtual void runTo(time_t time);
virtual void stepDay() = NULL;
virtual void internalStepDay() = NULL;
list<double> getOutFlowsRain();
list<double> getOutFlowsMelt();
unsigned getOutFlowsCount();
// Serializable protocol
friend istream& operator>>(istream& in, SJHydroModel& sink) {
sink.timeind = Indicator::streamExtract(in);
in >> sink.precipMult >> sink.tempAdd >> sink.snowDiff;
// DO NOT INPUT CURRENT STATE
return in;
}
friend ostream& operator<<(ostream& os, SJHydroModel& source) {
source.timeind.streamInsert(os);
os << source.precipMult << " " << source.tempAdd << " " << source.snowDiff;
// DO NOT OUTPUT CURRENT STATE
return os;
}
protected:
TNumeric& weightedFraction(TNumeric& weights1, TNumeric& values1, TNumeric& weights2, TNumeric& values2);
};
#endif