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);

http://dive4elements.wald.intevation.org