-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathCallbacks.h
121 lines (103 loc) · 3.56 KB
/
Callbacks.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
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
#include "SJHydroNetModel.h"
#include <exception>
class SJHydroNetModelSaveAllCells : public SJHydroNetModelStepCallback {
protected:
string allcells;
public:
SJHydroNetModelSaveAllCells(string allcells) {
this->allcells = allcells;
}
virtual void setup(SJHydroNetModel& model) {
ofstream cellfile;
cellfile.open(allcells.c_str(), ios::out);
for (unsigned rr = 1; rr < model.getLatitudes().count() - 1; rr++)
for (unsigned cc = 1; cc < model.getLongitudes().count() - 1; cc++)
cellfile << model.getLatitudes().getCellCenter(rr).getValue() << "\t" << model.getLongitudes().getCellCenter(cc).getValue() << "\t";
cellfile << endl;
cellfile.close();
}
virtual void post(SJHydroNetModel& model) {
ofstream cellfile;
cellfile.open(allcells.c_str(), ios::out | ios::app);
for (unsigned rr = 1; rr < model.getLatitudes().count() - 1; rr++)
for (unsigned cc = 1; cc < model.getLongitudes().count() - 1; cc++) {
double precipVolume, meltVolume;
model.getHydroNet().sumNodeMapVolumes(rr, cc, precipVolume, meltVolume);
cellfile << precipVolume << "\t" << meltVolume << "\t";
}
cellfile << endl;
cellfile.close();
}
};
class SJHydroNetModelSaveSomeCells : public SJHydroNetModelStepCallback {
protected:
string filename;
vector<double> latitudes;
vector<double> longitudes;
public:
SJHydroNetModelSaveSomeCells(string filename) {
this->filename = filename;
}
void addLocation(double lat, double lon) {
latitudes.push_back(lat);
longitudes.push_back(lon);
}
virtual void setup(SJHydroNetModel& model) {
ofstream fp;
fp.open(filename.c_str(), ios::out);
fp << "time,location,variable,value" << endl;
for (unsigned ii = 0; ii < latitudes.size(); ii++) {
fp << "NA," << ii + 1 << ",latitude," << latitudes[ii] << endl;
fp << "NA," << ii + 1 << ",longitude," << longitudes[ii] << endl;
}
fp.close();
}
virtual void post(SJHydroNetModel& model) {
ofstream fp;
fp.open(filename.c_str(), ios::out | ios::app);
for (unsigned ii = 0; ii < latitudes.size(); ii++) {
int rr = model.getLatitudes().inRange(latitudes[ii]);
int cc = model.getLongitudes().inRange(longitudes[ii]);
double precipVolume, meltVolume;
model.getHydroNet().sumNodeMapVolumes(rr, cc, precipVolume, meltVolume);
fp << model.getTime() << "," << ii + 1 << ",precip," << precipVolume << endl;
fp << model.getTime() << "," << ii + 1 << ",melt," << meltVolume << endl;
try {
fp << model.getTime() << "," << ii + 1 << ",volume," << model.getSnowModel().getVolumes().getCell(rr, cc) << endl;
} catch (exception& ex) {}
}
fp.close();
}
};
class SJHydroNetModelStoreSingleVolume : public SJHydroNetModelStepCallback {
protected:
double latitude;
double longitude;
vector<time_t> times;
vector<double> volumes;
public:
SJHydroNetModelStoreSingleVolume(double latitude, double longitude) {
this->latitude = latitude;
this->longitude = longitude;
}
vector<time_t> getTimes() {
return times;
}
vector<double> getVolumes() {
return volumes;
}
virtual void setup(SJHydroNetModel& model) {
times.clear();
volumes.clear();
}
virtual void post(SJHydroNetModel& model) {
int rr = model.getLatitudes().inRange(latitude);
int cc = model.getLongitudes().inRange(longitude);
double volume = 0;
try {
volume = model.getSnowModel().getVolumes().getCell(rr, cc);
} catch (exception& ex) {}
volumes.push_back(volume);
times.push_back(model.getTime());
}
};