Mercurial > dive4elements > river
comparison flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/Calculation4.java @ 686:3dc61e00385e facets-slt
Merged with trunk and introduced hashing of computed values.
flys-artifacts/branches/facets-slt@2126 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author | Ingo Weinzierl <ingo.weinzierl@intevation.de> |
---|---|
date | Wed, 15 Jun 2011 15:28:54 +0000 |
parents | baea7981477a |
children | eab5e5089d77 |
comparison
equal
deleted
inserted
replaced
667:434146596838 | 686:3dc61e00385e |
---|---|
18 import de.intevation.flys.artifacts.math.BackJumpCorrector; | 18 import de.intevation.flys.artifacts.math.BackJumpCorrector; |
19 | 19 |
20 import org.apache.log4j.Logger; | 20 import org.apache.log4j.Logger; |
21 | 21 |
22 public class Calculation4 | 22 public class Calculation4 |
23 extends Calculation | |
23 { | 24 { |
24 private static Logger logger = Logger.getLogger(Calculation4.class); | 25 private static Logger logger = Logger.getLogger(Calculation4.class); |
25 | 26 |
26 public static final double MINIMAL_STEP_WIDTH = 1e-5; | 27 public static final double MINIMAL_STEP_WIDTH = 1e-5; |
27 | 28 |
48 | 49 |
49 int numResults = -1; | 50 int numResults = -1; |
50 | 51 |
51 // assign reference points | 52 // assign reference points |
52 for (Segment segment: segments) { | 53 for (Segment segment: segments) { |
53 Gauge gauge = river.determineGauge( | 54 Gauge gauge = river.determineGaugeByStation( |
54 segment.getFrom(), segment.getTo()); | 55 segment.getFrom(), segment.getTo()); |
55 | 56 |
56 segment.setReferencePoint(gauge != null | 57 segment.setReferencePoint(gauge != null |
57 ? gauge.getStation().doubleValue() | 58 ? gauge.getStation().doubleValue() |
58 : 0.5*(segment.getFrom() + segment.getTo())); | 59 : 0.5*(segment.getFrom() + segment.getTo())); |
91 | 92 |
92 if (debug) { | 93 if (debug) { |
93 logger.debug( | 94 logger.debug( |
94 "calculate from " + from + " to " + to + " step " + step); | 95 "calculate from " + from + " to " + to + " step " + step); |
95 logger.debug("# segments: " + segments.size()); | 96 logger.debug("# segments: " + segments.size()); |
97 for (Segment segment: segments) { | |
98 logger.debug(" " + segment); | |
99 } | |
96 } | 100 } |
97 | 101 |
98 if (segments.isEmpty()) { | 102 if (segments.isEmpty()) { |
99 logger.debug("no segments found"); | 103 logger.debug("no segments found"); |
104 // TODO: I18N | |
105 addProblem("no segments found"); | |
100 return new WQKms[0]; | 106 return new WQKms[0]; |
101 } | 107 } |
102 | 108 |
103 int numResults = segments.get(0).values.length; | 109 int numResults = segments.get(0).values.length; |
104 | 110 |
105 if (numResults < 1) { | 111 if (numResults < 1) { |
106 logger.debug("no values given"); | 112 logger.debug("no values given"); |
113 // TODO: I18N | |
114 addProblem("no values given"); | |
107 return new WQKms[0]; | 115 return new WQKms[0]; |
108 } | 116 } |
109 | 117 |
110 | 118 |
111 WQKms [] results = new WQKms[numResults]; | 119 WQKms [] results = new WQKms[numResults]; |
112 if (debug) { | |
113 logger.debug("after last segment -> gleichwertig"); | |
114 } | |
115 for (int i = 0; i < results.length; ++i) { | 120 for (int i = 0; i < results.length; ++i) { |
116 results[i] = new WQKms(); | 121 results[i] = new WQKms(); |
117 } | 122 } |
118 | 123 |
119 if (Math.abs(step) < MINIMAL_STEP_WIDTH) { | 124 if (Math.abs(step) < MINIMAL_STEP_WIDTH) { |
211 QPosition qi = table.getQPosition( | 216 QPosition qi = table.getQPosition( |
212 anchor.referencePoint, | 217 anchor.referencePoint, |
213 anchor.values[i]); | 218 anchor.values[i]); |
214 | 219 |
215 if ((qPositions[i] = qi) == null) { | 220 if ((qPositions[i] = qi) == null) { |
216 // TODO: error report | 221 // TODO: I18N |
222 addProblem(pos, "cannot find q = " + anchor.values[i]); | |
217 functions[i] = Identity.IDENTITY; | 223 functions[i] = Identity.IDENTITY; |
218 } | 224 } |
219 else { | 225 else { |
220 double qA = table.getQ(qi, anchor.referencePoint); | 226 double qA = table.getQ(qi, anchor.referencePoint); |
221 double qF = table.getQ(qi, free .referencePoint); | 227 double qF = table.getQ(qi, free .referencePoint); |
223 functions[i] = Double.isNaN(qA) || Double.isNaN(qF) | 229 functions[i] = Double.isNaN(qA) || Double.isNaN(qF) |
224 ? Identity.IDENTITY | 230 ? Identity.IDENTITY |
225 : new Linear( | 231 : new Linear( |
226 qA, qF, | 232 qA, qF, |
227 anchor.values[i], free.values[i]); | 233 anchor.values[i], free.values[i]); |
234 | |
235 if (debug) { | |
236 logger.debug( | |
237 anchor.referencePoint + ": " + | |
238 qA + " -> " + functions[i].value(qA) + | |
239 " / " + free.referencePoint + ": " + | |
240 qF + " -> " + functions[i].value(qF)); | |
241 } | |
228 } | 242 } |
229 } // build transforms | 243 } // build transforms |
230 } // "ungleichwertiges" interval | 244 } // "ungleichwertiges" interval |
231 } // find matching interval | 245 } // find matching interval |
232 | 246 |
239 | 253 |
240 if (table.interpolate(pos, out, qPosition, functions[i])) { | 254 if (table.interpolate(pos, out, qPosition, functions[i])) { |
241 results[i].add(out[0], out[1], pos); | 255 results[i].add(out[0], out[1], pos); |
242 } | 256 } |
243 else { | 257 else { |
244 // TODO: error report | 258 // TODO: I18N |
259 addProblem(pos, "cannot interpolate w/q"); | |
245 } | 260 } |
246 } | 261 } |
247 } | 262 } |
248 | 263 |
249 // Backjump correction | 264 // Backjump correction |
251 BackJumpCorrector bjc = new BackJumpCorrector(); | 266 BackJumpCorrector bjc = new BackJumpCorrector(); |
252 | 267 |
253 double [] ws = results[i].getWs(); | 268 double [] ws = results[i].getWs(); |
254 double [] kms = results[i].getKms(); | 269 double [] kms = results[i].getKms(); |
255 | 270 |
256 if (bjc.doCorrection(kms, ws)) { | 271 if (bjc.doCorrection(kms, ws, this)) { |
257 results[i] = new WQCKms(results[i], bjc.getCorrected()); | 272 results[i] = new WQCKms(results[i], bjc.getCorrected()); |
258 } | 273 } |
259 // TODO: error report | |
260 } | 274 } |
261 | 275 |
262 // name the curves | 276 // name the curves |
263 for (int i = 0; i < results.length; ++i) { | 277 for (int i = 0; i < results.length; ++i) { |
264 results[i].setName(createName(i)); | 278 results[i].setName(createName(i)); |
266 | 280 |
267 return results; | 281 return results; |
268 } | 282 } |
269 | 283 |
270 protected String createName(int index) { | 284 protected String createName(int index) { |
271 // TODO: i18n | 285 // TODO: I18N |
272 StringBuilder sb = new StringBuilder(isQ ? "Q" : "W"); | 286 StringBuilder sb = new StringBuilder(isQ ? "Q" : "W"); |
273 sb.append(" benutzerdefiniert ("); | 287 sb.append(" benutzerdefiniert ("); |
274 for (int i = 0, N = segments.size(); i < N; ++i) { | 288 for (int i = 0, N = segments.size(); i < N; ++i) { |
275 if (i > 0) { | 289 if (i > 0) { |
276 sb.append("; "); | 290 sb.append("; "); |