Mercurial > dive4elements > river
comparison flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/Calculation4.java @ 4821:bcf25d8c183e
Moved NaN removal code from W to DoubleUtil. Create QKms when calculating the 'Umhuellende'.
author | Sascha L. Teichmann <teichmann@intevation.de> |
---|---|
date | Mon, 21 Jan 2013 14:03:22 +0100 |
parents | 65bfb6faa538 |
children | 8e72777c961c |
comparison
equal
deleted
inserted
replaced
4820:26c849cf54e7 | 4821:bcf25d8c183e |
---|---|
1 package de.intevation.flys.artifacts.model; | 1 package de.intevation.flys.artifacts.model; |
2 | |
3 import de.intevation.flys.artifacts.access.Calculation4Access; | |
2 | 4 |
3 import de.intevation.flys.artifacts.math.BackJumpCorrector; | 5 import de.intevation.flys.artifacts.math.BackJumpCorrector; |
4 import de.intevation.flys.artifacts.math.Function; | 6 import de.intevation.flys.artifacts.math.Function; |
5 import de.intevation.flys.artifacts.math.Identity; | 7 import de.intevation.flys.artifacts.math.Identity; |
6 import de.intevation.flys.artifacts.math.Linear; | 8 import de.intevation.flys.artifacts.math.Linear; |
7 | 9 |
8 import de.intevation.flys.artifacts.model.RiverFactory; | 10 import de.intevation.flys.artifacts.model.RiverFactory; |
11 | |
9 import de.intevation.flys.artifacts.model.WstValueTable.QPosition; | 12 import de.intevation.flys.artifacts.model.WstValueTable.QPosition; |
10 | 13 |
11 import de.intevation.flys.model.River; | 14 import de.intevation.flys.model.River; |
12 | 15 |
13 import de.intevation.flys.utils.DoubleUtil; | 16 import de.intevation.flys.utils.DoubleUtil; |
14 | 17 |
15 import de.intevation.flys.artifacts.access.Calculation4Access; | 18 import gnu.trove.TDoubleArrayList; |
16 | 19 |
17 import java.util.ArrayList; | 20 import java.util.ArrayList; |
18 import java.util.Arrays; | 21 import java.util.Arrays; |
19 import java.util.List; | 22 import java.util.List; |
20 | 23 |
271 for (int i = 0; i < results.length; ++i) { | 274 for (int i = 0; i < results.length; ++i) { |
272 results[i].setName(createName(i)); | 275 results[i].setName(createName(i)); |
273 } | 276 } |
274 | 277 |
275 // Generate the "Umhuellende". | 278 // Generate the "Umhuellende". |
276 results = generateInfolding(table, results, from, to, step); | 279 QKms [] qkms = generateInfolding(table, results, from, to, step); |
280 | |
281 // TODO: Use qkms in a new result type. | |
277 | 282 |
278 return new CalculationResult(results, this); | 283 return new CalculationResult(results, this); |
279 } | 284 } |
280 | 285 |
281 protected WQKms [] generateInfolding( | 286 protected QKms [] generateInfolding( |
282 WstValueTable wst, | 287 WstValueTable wst, |
283 WQKms [] results, | 288 WQKms [] results, |
284 double from, | 289 double from, |
285 double to, | 290 double to, |
286 double step | 291 double step |
288 WstValueTable.Column [] columns = wst.getColumns(); | 293 WstValueTable.Column [] columns = wst.getColumns(); |
289 | 294 |
290 InfoldingColumns ic = new InfoldingColumns(columns); | 295 InfoldingColumns ic = new InfoldingColumns(columns); |
291 ic.markInfoldingColumns(results); | 296 ic.markInfoldingColumns(results); |
292 | 297 |
293 List<WQKms> infoldings = new ArrayList<WQKms>(); | 298 List<QKms> infoldings = new ArrayList<QKms>(); |
294 | 299 |
295 boolean [] infoldingColumns = ic.getInfoldingColumns(); | 300 boolean [] infoldingColumns = ic.getInfoldingColumns(); |
301 | |
302 double [] kms = null; | |
303 | |
296 for (int i = 0; i < infoldingColumns.length; ++i) { | 304 for (int i = 0; i < infoldingColumns.length; ++i) { |
297 if (!infoldingColumns[i]) { | 305 if (!infoldingColumns[i]) { |
298 continue; | 306 continue; |
299 } | 307 } |
300 double q = columns[i].getQRangeTree().findQ(from); | 308 |
301 if (Double.isNaN(q)) { | 309 kms = kms == null |
302 addProblem(from, "cannot.find.q"); | 310 ? DoubleUtil.explode(from, to, step) |
303 continue; | 311 : (double [])kms.clone(); |
304 } | 312 |
305 double [] kms = DoubleUtil.explode(from, to, step); | 313 QRangeTree.QuickQFinder qf = |
306 double [] oqs = new double[kms.length]; | 314 columns[i].getQRangeTree().new QuickQFinder(); |
307 double [] ows = new double[kms.length]; | 315 |
308 boolean success = | 316 int numProblemsBefore = numProblems(); |
309 wst.interpolate(q, from, kms, ows, oqs, this) != null; | 317 double [] qs = qf.findQs(kms, this); |
310 | 318 |
311 if (success) { | 319 // TODO: i18n |
312 // TODO: generate a better name. I18N. | 320 String name = "Umh\u00fcllende " + columns[i].getName(); |
313 String name = "Umh\u00fcllende " + columns[i].getName(); | 321 |
314 WQKms wqkms = new WQKms(kms, oqs, ows, name); | 322 QKmsImpl qkms = new QKmsImpl( |
315 infoldings.add(wqkms); | 323 new TDoubleArrayList(kms), |
316 } | 324 new TDoubleArrayList(qs), |
317 } | 325 name); |
318 | 326 |
319 int N = infoldings.size(); | 327 if (numProblems() > numProblemsBefore) { |
320 if (N > 0) { | 328 qkms.removeNaNs(); |
321 WQKms [] newResults = new WQKms[results.length + N]; | 329 } |
322 System.arraycopy(results, 0, newResults, 0, results.length); | 330 |
323 for (int i = 0; i < N; ++i) { | 331 infoldings.add(qkms); |
324 newResults[i+results.length] = infoldings.get(i); | 332 } |
325 } | 333 |
326 results = newResults; | 334 return infoldings.toArray(new QKms[infoldings.size()]); |
327 } | |
328 | |
329 return results; | |
330 } | 335 } |
331 | 336 |
332 protected String createName(int index) { | 337 protected String createName(int index) { |
333 // TODO: i18n | 338 // TODO: i18n |
334 StringBuilder sb = new StringBuilder(isQ ? "Q" : "W"); | 339 StringBuilder sb = new StringBuilder(isQ ? "Q" : "W"); |