Mercurial > dive4elements > river
diff 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 |
line wrap: on
line diff
--- a/flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/Calculation4.java Mon Jan 21 12:49:44 2013 +0100 +++ b/flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/Calculation4.java Mon Jan 21 14:03:22 2013 +0100 @@ -1,18 +1,21 @@ package de.intevation.flys.artifacts.model; +import de.intevation.flys.artifacts.access.Calculation4Access; + import de.intevation.flys.artifacts.math.BackJumpCorrector; import de.intevation.flys.artifacts.math.Function; import de.intevation.flys.artifacts.math.Identity; import de.intevation.flys.artifacts.math.Linear; import de.intevation.flys.artifacts.model.RiverFactory; + import de.intevation.flys.artifacts.model.WstValueTable.QPosition; import de.intevation.flys.model.River; import de.intevation.flys.utils.DoubleUtil; -import de.intevation.flys.artifacts.access.Calculation4Access; +import gnu.trove.TDoubleArrayList; import java.util.ArrayList; import java.util.Arrays; @@ -273,12 +276,14 @@ } // Generate the "Umhuellende". - results = generateInfolding(table, results, from, to, step); + QKms [] qkms = generateInfolding(table, results, from, to, step); + + // TODO: Use qkms in a new result type. return new CalculationResult(results, this); } - protected WQKms [] generateInfolding( + protected QKms [] generateInfolding( WstValueTable wst, WQKms [] results, double from, @@ -290,43 +295,43 @@ InfoldingColumns ic = new InfoldingColumns(columns); ic.markInfoldingColumns(results); - List<WQKms> infoldings = new ArrayList<WQKms>(); + List<QKms> infoldings = new ArrayList<QKms>(); boolean [] infoldingColumns = ic.getInfoldingColumns(); + + double [] kms = null; + for (int i = 0; i < infoldingColumns.length; ++i) { if (!infoldingColumns[i]) { continue; } - double q = columns[i].getQRangeTree().findQ(from); - if (Double.isNaN(q)) { - addProblem(from, "cannot.find.q"); - continue; + + kms = kms == null + ? DoubleUtil.explode(from, to, step) + : (double [])kms.clone(); + + QRangeTree.QuickQFinder qf = + columns[i].getQRangeTree().new QuickQFinder(); + + int numProblemsBefore = numProblems(); + double [] qs = qf.findQs(kms, this); + + // TODO: i18n + String name = "Umh\u00fcllende " + columns[i].getName(); + + QKmsImpl qkms = new QKmsImpl( + new TDoubleArrayList(kms), + new TDoubleArrayList(qs), + name); + + if (numProblems() > numProblemsBefore) { + qkms.removeNaNs(); } - double [] kms = DoubleUtil.explode(from, to, step); - double [] oqs = new double[kms.length]; - double [] ows = new double[kms.length]; - boolean success = - wst.interpolate(q, from, kms, ows, oqs, this) != null; - if (success) { - // TODO: generate a better name. I18N. - String name = "Umh\u00fcllende " + columns[i].getName(); - WQKms wqkms = new WQKms(kms, oqs, ows, name); - infoldings.add(wqkms); - } + infoldings.add(qkms); } - int N = infoldings.size(); - if (N > 0) { - WQKms [] newResults = new WQKms[results.length + N]; - System.arraycopy(results, 0, newResults, 0, results.length); - for (int i = 0; i < N; ++i) { - newResults[i+results.length] = infoldings.get(i); - } - results = newResults; - } - - return results; + return infoldings.toArray(new QKms[infoldings.size()]); } protected String createName(int index) {