diff artifacts/src/main/java/org/dive4elements/river/exports/minfo/BedQualityExporter.java @ 8581:073ea4bcea58

(issue1755) Interpolate BedQuality Results This adds an interpolation function to each various bedQuality result class. Imho this is ok as the interpolation function can be seen as part of the result. The interpolation function is initalized on first use and can be accessed through get.*Interpol functions.
author Andre Heinecke <andre.heinecke@intevation.de>
date Mon, 16 Mar 2015 15:36:38 +0100
parents e4606eae8ea5
children 07c9ac22f611
line wrap: on
line diff
--- a/artifacts/src/main/java/org/dive4elements/river/exports/minfo/BedQualityExporter.java	Mon Mar 16 14:37:30 2015 +0100
+++ b/artifacts/src/main/java/org/dive4elements/river/exports/minfo/BedQualityExporter.java	Mon Mar 16 15:36:38 2015 +0100
@@ -1,4 +1,4 @@
-/* Copyright (C) 2011, 2012, 2013 by Bundesanstalt für Gewässerkunde
+/* Copyright (C) 2011, 2012, 2013, 2015 by Bundesanstalt für Gewässerkunde
  * Software engineering by Intevation GmbH
  *
  * This file is Free Software under the GNU AGPL (>=v3)
@@ -29,6 +29,9 @@
 import org.dive4elements.river.exports.AbstractExporter;
 import org.dive4elements.river.utils.Formatter;
 
+import org.dive4elements.river.artifacts.access.RangeAccess;
+import org.dive4elements.river.artifacts.D4EArtifact;
+
 
 public class BedQualityExporter
 extends AbstractExporter
@@ -59,43 +62,16 @@
         results = new BedQualityResult[0];
     }
 
-    /** Populate param kms with kms from param beds and loads, return it. */
-    private TDoubleArrayList populateKmList(BedDiameterResult[] beds,
-        BedloadDiameterResult[] loads,
-        TDoubleArrayList kms) {
-        for (int j = 0; j < beds.length; j++) {
-            TDoubleArrayList bkms = beds[j].getKms();
-            for (int k = 0, K = bkms.size(); k < K; k++) {
-                double km = bkms.get(k);
-                if (!kms.contains(km)) { // XXX: O(N^2)
-                    kms.add(km);
-                }
-            }
-        }
-        for (int j = 0; j < loads.length; j++) {
-            TDoubleArrayList lkms = loads[j].getKms();
-            for (int k = 0, L = lkms.size(); k < L; k++) {
-                double km = lkms.get(k);
-                if (!kms.contains(km)) { // XXX: O(N^2)
-                    kms.add(km);
-                }
-            }
-        }
-        return kms;
-    }
-
     /** Create double[] containing the data for rows in csv. */
     private List<double[]> createDataRows() {
-        // Calculate how many columns and rows we need.
-        TDoubleArrayList kms = new TDoubleArrayList();
+
+        double[] kms = new RangeAccess((D4EArtifact) master).getKmSteps();
 
         int cols = 1;
         for (BedQualityResult result : results) {
             BedDiameterResult[]     beds  = result.getBedResults();
             BedloadDiameterResult[] loads = result.getBedloadResults();
 
-            kms = populateKmList(beds, loads, kms);
-
             cols += beds.length * 2;
             if (beds.length > 0) {
                 cols += 4;
@@ -103,22 +79,21 @@
             cols += loads.length;
         }
 
-        kms.sort();
-
-        List<double[]> rows = new ArrayList<double[]>(kms.size());
-        for (int i = 0, K = kms.size(); i < K; i++) {
+        List<double[]> rows = new ArrayList<double[]>(kms.length);
+        for (double km: kms) {
             double[] row = new double[cols];
-            double km = kms.get(i);
             row[0] = km;
             for (int j = 0; j < results.length; j++) {
+
                 BedloadDiameterResult[] loads = results[j].getBedloadResults();
 
                 for(int k = 0; k < loads.length; k++) {
                     // k + 1: shift km column.
                     // j* loads.length: shift periods.
                     row[(k + 1) + (j * loads.length)] =
-                        loads[k].getDiameter(km);
+                        loads[k].getDiameterInterpol(km);
                 }
+
                 BedDiameterResult[] beds = results[j].getBedResults();
                 if (beds.length == 0) {
                     continue;
@@ -128,17 +103,18 @@
                     // j * beds.length * 2: shift periods.
                     // loads.length * results.length: shift bed load columns.
                     int ndx = (k * 2 + 1) + (j * beds.length * 2) + (loads.length * results.length);
-                    row[ndx] = beds[k].getDiameterCap(km);
-                    row[ndx + 1] = beds[k].getDiameterSub(km);
+                    row[ndx] = beds[k].getDiameterCapInterpol(km);
+                    row[ndx + 1] = beds[k].getDiameterSubInterpol(km);
                 }
+
                 BedParametersResult[] params = results[j].getParameters();
                 for(int k = 0; k < params.length; k++) {
                     // loads.length + (beds.lenght * 2) * (j + 1): shift bed and bedload columns.
                     int ndx = 1 + (loads.length + (beds.length * 2) * (j + 1));
-                    row[ndx] = params[k].getLoadDensityCap(km);
-                    row[ndx + 1] = params[k].getLoadDensitySub(km);
-                    row[ndx + 2] = params[k].getPorosityCap(km);
-                    row[ndx + 3] = params[k].getPorositySub(km);
+                    row[ndx] = params[k].getDensityCapInterpol(km);
+                    row[ndx + 1] = params[k].getDensitySubInterpol(km);
+                    row[ndx + 2] = params[k].getPorosityCapInterpol(km);
+                    row[ndx + 3] = params[k].getPorositySubInterpol(km);
                 }
             }
             rows.add(row);
@@ -149,7 +125,6 @@
 
     @Override
     protected void writeCSVData(CSVWriter writer) throws IOException {
-        // TODO Auto-generated method stub
         writeCSVHeader(writer);
 
         NumberFormat nf = Formatter.getFormatter(context, 1, 3);
@@ -177,7 +152,6 @@
 
     @Override
     protected void addData(Object data) {
-        // TODO Auto-generated method stub
         log.debug("addData()");
         if (!(data instanceof CalculationResult)) {
             log.warn("Invalid data type.");

http://dive4elements.wald.intevation.org