comparison flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/Calculation6.java @ 2311:b8df8d1476ba

Compute differences between discharge table values and reference discharge table values in historical discharge curve calculation. flys-artifacts/trunk@3991 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author Ingo Weinzierl <ingo.weinzierl@intevation.de>
date Thu, 09 Feb 2012 10:57:35 +0000
parents abb390101595
children c0dfa36add96
comparison
equal deleted inserted replaced
2310:ecb76933362f 2311:b8df8d1476ba
45 45
46 if (logger.isDebugEnabled()) { 46 if (logger.isDebugEnabled()) {
47 debug(); 47 debug();
48 } 48 }
49 49
50 DischargeTable refTable = fetchReferenceTable(gauge);
50 List<DischargeTable> dts = fetchDischargeTables(gauge); 51 List<DischargeTable> dts = fetchDischargeTables(gauge);
51 52
52 int numTables = dts.size(); 53 int numTables = dts.size();
53 54
54 logger.debug("Take " + numTables + " into account."); 55 logger.debug("Take " + numTables + " into account.");
55 56
56 if (numTables == 0) { 57 if (numTables == 0) {
57 addProblem("cannot.find.hist.q.tables"); 58 addProblem("cannot.find.hist.q.tables");
58 } 59 }
59 60
60 WQTimerange[] wqt = prepareCalculationData(dts); 61 WQTimerange[] wqt = prepareCalculationData(refTable, dts);
61 62
62 logger.debug("Number of calculation results: " + wqt.length); 63 logger.debug("Number of calculation results: " + wqt.length);
63 64
64 return new CalculationResult(wqt, this); 65 return new CalculationResult(wqt, this);
65 } 66 }
83 84
84 return true; 85 return true;
85 } 86 }
86 87
87 88
89 protected DischargeTable fetchReferenceTable(Gauge gauge) {
90 return gauge.fetchMasterDischargeTable();
91 }
92
93
88 protected List<DischargeTable> fetchDischargeTables(Gauge gauge) { 94 protected List<DischargeTable> fetchDischargeTables(Gauge gauge) {
89 List<DischargeTable> relevant = new ArrayList<DischargeTable>(); 95 List<DischargeTable> relevant = new ArrayList<DischargeTable>();
90 List<DischargeTable> all = gauge.getDischargeTables(); 96 List<DischargeTable> all = gauge.getDischargeTables();
91 97
92 for (DischargeTable dt: all) { 98 for (DischargeTable dt: all) {
120 126
121 return false; 127 return false;
122 } 128 }
123 129
124 130
125 protected WQTimerange[] prepareCalculationData(List<DischargeTable> dts) { 131 protected WQTimerange[] prepareCalculationData(
126 List<WQTimerange> wqts = new ArrayList<WQTimerange>(values.length); 132 DischargeTable refTable,
133 List<DischargeTable> dts
134 ) {
135 if (refTable == null) {
136 addProblem("cannot.find.hist.q.reftable");
137 return prepareSimpleData(dts);
138 }
139 else {
140 return prepareData(refTable, dts);
141 }
142 }
143
144
145 protected WQTimerange[] prepareSimpleData(List<DischargeTable> dts) {
146 List<WQTimerange> wqts =
147 new ArrayList<WQTimerange>(values.length);
127 148
128 boolean debug = logger.isDebugEnabled(); 149 boolean debug = logger.isDebugEnabled();
129 150
130 for (double value: values) { 151 for (double value: values) {
131 logger.debug("Prepare data for value: " + value); 152 logger.debug("Prepare data for value: " + value);
132 153
133 String name = mode == MODE_W ? "W=" + value : "Q=" + value; 154 String name = mode == MODE_W ? "W=" + value : "Q=" + value;
134 WQTimerange wqt = null; 155 WQTimerange wqt = null;
135 156
136 for (DischargeTable dt: dts) { 157 for (DischargeTable dt: dts) {
137 TimeInterval ti = dt.getTimeInterval(); 158 TimeInterval ti = dt.getTimeInterval();
138 159
179 wqts.add(wqt); 200 wqts.add(wqt);
180 } 201 }
181 } 202 }
182 203
183 return (WQTimerange[]) wqts.toArray(new WQTimerange[wqts.size()]); 204 return (WQTimerange[]) wqts.toArray(new WQTimerange[wqts.size()]);
205 }
206
207
208 protected HistoricalWQTimerange[] prepareData(
209 DischargeTable refTable,
210 List<DischargeTable> dts
211 ) {
212 List<HistoricalWQTimerange> wqts =
213 new ArrayList<HistoricalWQTimerange>(values.length);
214
215 boolean debug = logger.isDebugEnabled();
216
217 for (double value: values) {
218 logger.debug("Prepare data plus diff for value: " + value);
219
220 String name = mode == MODE_W ? "W=" + value : "Q=" + value;
221 HistoricalWQTimerange wqt = null;
222
223 double ref;
224
225 if (refTable != null && mode == MODE_W) {
226 ref = findValueForW(refTable, value);
227 }
228 else if (refTable != null) {
229 ref = findValueForQ(refTable, value);
230 }
231 else {
232 ref = Double.NaN;
233 }
234
235 for (DischargeTable dt: dts) {
236 TimeInterval ti = dt.getTimeInterval();
237
238 Date start = ti.getStartTime();
239 Date end = ti.getStopTime();
240
241 if (end == null) {
242 logger.warn("TimeInterval has no stop time set!");
243
244 end = new Date();
245 }
246
247 Timerange t = new Timerange(ti.getStartTime(),ti.getStopTime());
248 double w;
249 double q;
250
251 if (mode == MODE_W) {
252 w = value;
253 q = findValueForW(dt, w);
254
255 if (Double.isNaN(q)) {
256 logger.warn("Cannot find Q for W: " + w);
257 addProblem("cannot.find.hist.q.for.w", w, start, end);
258 continue;
259 }
260 }
261 else {
262 q = value;
263 w = findValueForQ(dt, q);
264 }
265
266 if (debug) {
267 logger.debug("Q=" + q + " | W=" + w);
268 }
269
270 if (wqt == null) {
271 wqt = new HistoricalWQTimerange(name);
272 }
273
274 wqt.add(w, q, ref-value, t);
275 }
276
277 if (wqt != null) {
278 wqts.add(wqt);
279 }
280 }
281
282 return (HistoricalWQTimerange[])
283 wqts.toArray(new HistoricalWQTimerange[wqts.size()]);
184 } 284 }
185 285
186 286
187 protected double findValueForW(DischargeTable dt, double w) { 287 protected double findValueForW(DischargeTable dt, double w) {
188 double[][] vs = DischargeTables.loadDischargeTableValues(dt,SCALE,true); 288 double[][] vs = DischargeTables.loadDischargeTableValues(dt,SCALE,true);

http://dive4elements.wald.intevation.org