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

http://dive4elements.wald.intevation.org