Mercurial > dive4elements > river
comparison flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/Calculation6.java @ 2315:c0dfa36add96
Some bugfixes and improvements in the calculation of historical discharge curves.
flys-artifacts/trunk@3996 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author | Ingo Weinzierl <ingo.weinzierl@intevation.de> |
---|---|
date | Thu, 09 Feb 2012 11:47:25 +0000 |
parents | b8df8d1476ba |
children | 899ca89f497e |
comparison
equal
deleted
inserted
replaced
2314:f4ca234ba214 | 2315:c0dfa36add96 |
---|---|
105 } | 105 } |
106 | 106 |
107 | 107 |
108 protected boolean isDischargeTableRelevant(DischargeTable dt) { | 108 protected boolean isDischargeTableRelevant(DischargeTable dt) { |
109 TimeInterval ti = dt.getTimeInterval(); | 109 TimeInterval ti = dt.getTimeInterval(); |
110 | |
111 if (dt.getKind() == Gauge.MASTER_DISCHARGE_TABLE) { | |
112 return false; | |
113 } | |
110 | 114 |
111 Date start = ti.getStartTime(); | 115 Date start = ti.getStartTime(); |
112 long startTime = start.getTime(); | 116 long startTime = start.getTime(); |
113 | 117 |
114 if (startTime >= timerange[0] && startTime <= timerange[1]) { | 118 if (startTime >= timerange[0] && startTime <= timerange[1]) { |
144 | 148 |
145 protected WQTimerange[] prepareSimpleData(List<DischargeTable> dts) { | 149 protected WQTimerange[] prepareSimpleData(List<DischargeTable> dts) { |
146 List<WQTimerange> wqts = | 150 List<WQTimerange> wqts = |
147 new ArrayList<WQTimerange>(values.length); | 151 new ArrayList<WQTimerange>(values.length); |
148 | 152 |
149 boolean debug = logger.isDebugEnabled(); | |
150 | |
151 for (double value: values) { | 153 for (double value: values) { |
152 logger.debug("Prepare data for value: " + value); | 154 logger.debug("Prepare data for value: " + value); |
153 | 155 |
154 String name = mode == MODE_W ? "W=" + value : "Q=" + value; | 156 String name = mode == MODE_W ? "W=" + value : "Q=" + value; |
155 WQTimerange wqt = null; | 157 WQTimerange wqt = null; |
156 | 158 |
157 for (DischargeTable dt: dts) { | 159 for (DischargeTable dt: dts) { |
158 TimeInterval ti = dt.getTimeInterval(); | 160 Date[] ti = prepareTimeInterval(dt); |
159 | 161 Timerange t = new Timerange(ti[0], ti[1]); |
160 Date start = ti.getStartTime(); | |
161 Date end = ti.getStopTime(); | |
162 | |
163 if (end == null) { | |
164 logger.warn("TimeInterval has no stop time set!"); | |
165 | |
166 end = new Date(); | |
167 } | |
168 | |
169 Timerange t = new Timerange(ti.getStartTime(),ti.getStopTime()); | |
170 double w; | 162 double w; |
171 double q; | 163 double q; |
172 | 164 |
173 if (mode == MODE_W) { | 165 if (mode == MODE_W) { |
174 w = value; | 166 w = value; |
175 q = findValueForW(dt, w); | 167 q = findValueForW(dt, w); |
176 | 168 |
177 if (Double.isNaN(q)) { | 169 if (Double.isNaN(q)) { |
178 logger.warn("Cannot find Q for W: " + w); | 170 logger.warn("Cannot find Q for W: " + w); |
179 addProblem("cannot.find.hist.q.for.w", w, start, end); | 171 addProblem("cannot.find.hist.q.for.w", w, ti[0], ti[1]); |
180 continue; | 172 continue; |
181 } | 173 } |
182 } | 174 } |
183 else { | 175 else { |
184 q = value; | 176 q = value; |
185 w = findValueForQ(dt, q); | 177 w = findValueForQ(dt, q); |
186 } | 178 } |
187 | 179 |
188 if (debug) { | 180 logger.debug("Q=" + q + " | W=" + w); |
189 logger.debug("Q=" + q + " | W=" + w); | |
190 } | |
191 | 181 |
192 if (wqt == null) { | 182 if (wqt == null) { |
193 wqt = new WQTimerange(name); | 183 wqt = new WQTimerange(name); |
194 } | 184 } |
195 | 185 |
210 List<DischargeTable> dts | 200 List<DischargeTable> dts |
211 ) { | 201 ) { |
212 List<HistoricalWQTimerange> wqts = | 202 List<HistoricalWQTimerange> wqts = |
213 new ArrayList<HistoricalWQTimerange>(values.length); | 203 new ArrayList<HistoricalWQTimerange>(values.length); |
214 | 204 |
215 boolean debug = logger.isDebugEnabled(); | |
216 | |
217 for (double value: values) { | 205 for (double value: values) { |
218 logger.debug("Prepare data plus diff for value: " + value); | 206 logger.debug("Prepare data plus diff for value: " + value); |
219 | 207 |
220 String name = mode == MODE_W ? "W=" + value : "Q=" + value; | 208 String name = mode == MODE_W ? "W=" + value : "Q=" + value; |
221 HistoricalWQTimerange wqt = null; | 209 HistoricalWQTimerange wqt = null; |
222 | 210 |
223 double ref; | 211 double ref; |
212 double diff; | |
224 | 213 |
225 if (refTable != null && mode == MODE_W) { | 214 if (refTable != null && mode == MODE_W) { |
226 ref = findValueForW(refTable, value); | 215 ref = findValueForW(refTable, value); |
227 } | 216 } |
228 else if (refTable != null) { | 217 else if (refTable != null) { |
231 else { | 220 else { |
232 ref = Double.NaN; | 221 ref = Double.NaN; |
233 } | 222 } |
234 | 223 |
235 for (DischargeTable dt: dts) { | 224 for (DischargeTable dt: dts) { |
236 TimeInterval ti = dt.getTimeInterval(); | 225 Date[] ti = prepareTimeInterval(dt); |
237 | 226 |
238 Date start = ti.getStartTime(); | 227 Timerange t = new Timerange(ti[0] ,ti[1]); |
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; | 228 double w; |
249 double q; | 229 double q; |
250 | 230 |
251 if (mode == MODE_W) { | 231 if (mode == MODE_W) { |
252 w = value; | 232 w = value; |
253 q = findValueForW(dt, w); | 233 q = findValueForW(dt, w); |
254 | 234 |
255 if (Double.isNaN(q)) { | 235 if (Double.isNaN(q)) { |
256 logger.warn("Cannot find Q for W: " + w); | 236 logger.warn("Cannot find Q for W: " + w); |
257 addProblem("cannot.find.hist.q.for.w", w, start, end); | 237 addProblem("cannot.find.hist.q.for.w", w, ti[0], ti[1]); |
258 continue; | 238 continue; |
259 } | 239 } |
240 | |
241 diff = ref-q; | |
260 } | 242 } |
261 else { | 243 else { |
262 q = value; | 244 q = value; |
263 w = findValueForQ(dt, q); | 245 w = findValueForQ(dt, q); |
264 } | 246 diff = ref-w; |
265 | 247 } |
266 if (debug) { | 248 |
267 logger.debug("Q=" + q + " | W=" + w); | 249 logger.debug("Q=" + q + " | W=" + w + " | Ref = " + ref); |
268 } | |
269 | 250 |
270 if (wqt == null) { | 251 if (wqt == null) { |
271 wqt = new HistoricalWQTimerange(name); | 252 wqt = new HistoricalWQTimerange(name); |
272 } | 253 } |
273 | 254 |
274 wqt.add(w, q, ref-value, t); | 255 wqt.add(w, q, diff, t); |
275 } | 256 } |
276 | 257 |
277 if (wqt != null) { | 258 if (wqt != null) { |
278 wqts.add(wqt); | 259 wqts.add(wqt); |
279 } | 260 } |
280 } | 261 } |
281 | 262 |
282 return (HistoricalWQTimerange[]) | 263 return (HistoricalWQTimerange[]) |
283 wqts.toArray(new HistoricalWQTimerange[wqts.size()]); | 264 wqts.toArray(new HistoricalWQTimerange[wqts.size()]); |
265 } | |
266 | |
267 | |
268 protected Date[] prepareTimeInterval(DischargeTable dt) { | |
269 TimeInterval ti = dt.getTimeInterval(); | |
270 | |
271 Date start = ti.getStartTime(); | |
272 Date end = ti.getStopTime(); | |
273 | |
274 if (end == null) { | |
275 logger.warn("TimeInterval has no stop time set!"); | |
276 | |
277 end = new Date(); | |
278 } | |
279 | |
280 return new Date[] { start, end }; | |
284 } | 281 } |
285 | 282 |
286 | 283 |
287 protected double findValueForW(DischargeTable dt, double w) { | 284 protected double findValueForW(DischargeTable dt, double w) { |
288 double[][] vs = DischargeTables.loadDischargeTableValues(dt,SCALE,true); | 285 double[][] vs = DischargeTables.loadDischargeTableValues(dt,SCALE,true); |