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

http://dive4elements.wald.intevation.org