Mercurial > dive4elements > river
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); |