diff artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flowdepth/BedQualityD50KmValueFinder.java @ 8911:37ff7f435912

SINFO Flowdepth: more error checks, d50 interpolation, avoid negative tkh
author mschaefer
date Fri, 23 Feb 2018 09:30:24 +0100
parents 0a900d605d52
children 86395ab8ebc3
line wrap: on
line diff
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flowdepth/BedQualityD50KmValueFinder.java	Thu Feb 22 18:46:37 2018 +0100
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flowdepth/BedQualityD50KmValueFinder.java	Fri Feb 23 09:30:24 2018 +0100
@@ -161,15 +161,10 @@
     private static final String[] SQL_BED_D50_SELECT_ALIAS = {"km", "mindate", "maxdate", "cnt", "mindepth", "maxdepth", "d50"};
 
     /**
-     * Kms of the loaded river range
+     * Real linear interpolator for kms and d50 values
      */
-    private TDoubleArrayList kms;
+    private PolynomialSplineFunction interpolator;
     
-    /**
-     * D50 for each km in kms 
-     */
-    private TDoubleArrayList values;
-
     
     /***** METHODS *****/
     
@@ -178,6 +173,8 @@
      * @return d50 (mm) of the km, or NaN
      */
     public double findD50(double km) throws ArgumentOutsideDomainException {
+        return interpolator.value(km);
+        /* ohne interpolation:
         if ((kms == null) || (kms.size() == 0))
             return Double.NaN;
         int i = kms.binarySearch(km);
@@ -189,7 +186,7 @@
         else if ((i >= 0) && (i <= kms.size() - 1) && Utils.epsilonEquals(km, kms.get(i), 0.0001))
             return values.get(i);
         else
-            return Double.NaN;
+            return Double.NaN; */
     }
     
     /**
@@ -215,16 +212,24 @@
         sqlQuery.setDate("todate", dateRange.getTo());
         @SuppressWarnings("unchecked")
         final List<Object[]> rows = sqlQuery.list();
-        kms = new TDoubleArrayList();
-        values = new TDoubleArrayList();
+        final double[] kms = new double[rows.size()];
+        final double[] values = new double[rows.size()];
         D50Measurement measurement;
+        int i = -1;
         for (Object[] row : rows) {
             measurement = new D50Measurement(row, SQL_BED_D50_SELECT_ALIAS);
-            kms.add(measurement.getKm());
-            values.add(measurement.getD50());
-            log.debug(String.format("loadValues km %.3f d50(mm) %.1f count %d", kms.get(kms.size()-1), values.get(values.size()-1), measurement.getCnt()));
+            i++;
+            kms[i] = measurement.getKm();
+            values[i] = measurement.getD50();
+            log.debug(String.format("loadValues km %.3f d50(mm) %.1f count %d", kms[i], values[i], measurement.getCnt()));
         }
-        return true;
+        try {
+            interpolator = new LinearInterpolator().interpolate(kms, values);
+            return true;
+        } catch (Exception e) {
+            interpolator = null;
+            return false;
+        }
     }
 
 }

http://dive4elements.wald.intevation.org