diff flys-artifacts/src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java @ 655:913b52064449

Refactored version of "Berechnung 4" flys-artifacts/trunk@2053 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Sun, 05 Jun 2011 18:24:46 +0000
parents 44175d4720f8
children fdc898a134a7
line wrap: on
line diff
--- a/flys-artifacts/src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java	Fri Jun 03 10:21:13 2011 +0000
+++ b/flys-artifacts/src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java	Sun Jun 05 18:24:46 2011 +0000
@@ -28,16 +28,15 @@
 
 import de.intevation.flys.artifacts.states.DefaultState;
 import de.intevation.flys.artifacts.context.FLYSContext;
-import de.intevation.flys.artifacts.math.BackJumpCorrector;
+
 import de.intevation.flys.artifacts.model.MainValuesFactory;
-import de.intevation.flys.artifacts.model.WQCKms;
 import de.intevation.flys.artifacts.model.WQDay;
 import de.intevation.flys.artifacts.model.WQKms;
 import de.intevation.flys.artifacts.model.WstValueTable;
 import de.intevation.flys.artifacts.model.WstValueTable.QPosition;
 import de.intevation.flys.artifacts.model.WstValueTableFactory;
-
-import de.intevation.flys.artifacts.math.LinearRemap;
+import de.intevation.flys.artifacts.model.Calculation4;
+import de.intevation.flys.artifacts.model.Segment;
 
 import gnu.trove.TDoubleArrayList;
 
@@ -583,204 +582,31 @@
             return new WQKms[0];
         }
 
-        boolean kmUp = river.getKmUp();
-
-        WstValueTable wst = WstValueTableFactory.getTable(river);
-        if (wst == null) {
+        WstValueTable table = WstValueTableFactory.getTable(river);
+        if (table == null) {
             logger.error("No wst found for selected river.");
             return new WQKms[0];
         }
 
-        double [][] segments = getRanges();
+        List<Segment> segments = getSegments();
 
-        if (logger.isDebugEnabled()) {
-            logger.debug("segments ----------------- enter");
-            for (double [] segment: segments) {
-                logger.debug("  " + joinDoubles(segment));
-            }
-            logger.debug("segments ----------------- leave");
-        }
-
-        if (segments.length < 1) {
-            logger.warn("no segments given");
+        if (segments == null) {
+            logger.error("Cannot create segments.");
             return new WQKms[0];
         }
 
-        if (segments.length == 1) {
-            // fall back to normal "Wasserstand/Wasserspiegellage" calculation
-            double [] qs = toQs(segments[0]);
-            if (qs == null) {
-                logger.warn("no qs given");
-                return new WQKms[0];
-            }
-            if (qs.length == 1) {
-                double [] kms = getKms(segments[0]);
-                HashSet<Integer> failed = new HashSet<Integer>();
-                WQKms [] results = computeWaterlevelData
-                    (kms, qs, wst, kmUp, failed);
-                setWaterlevelNames(
-                    results, qs, isQ() ? "Q" : "W", failed);
-                return results;
-            }
-        }
-
-        // more than one segment
-
-        double [] boundKms = extractBoundsKm(river, segments);
-
-
-        if (logger.isDebugEnabled()) {
-            logger.debug("bound kms: " + joinDoubles(boundKms));
-        }
-
-        double [][] iqs = null;
+        double [] range = getFromToStep();
 
-        for (int i = 0; i < segments.length; ++i) {
-            double [] iqsi = toQs(segments[i]);
-            if (iqsi == null) {
-                logger.warn("iqsi == null");
-                return new WQKms[0];
-            }
-
-            if (iqs == null) {
-                iqs = new double[iqsi.length][boundKms.length];
-            }
-            else if (iqs.length != iqsi.length) {
-                logger.warn("iqsi.logger != iqs.length: "
-                    + iqsi.length + " " + iqsi.length);
-                return new WQKms[0];
-            }
-
-            if (logger.isDebugEnabled()) {
-                logger.debug("segments qs[ " + i + "]: " + joinDoubles(iqsi));
-            }
-
-            for (int j = 0; j < iqs.length; ++j) {
-                iqs[j][i] = iqsi[j];
-            }
-        }
-
-        if (logger.isDebugEnabled()) {
-            for (int i = 0; i < iqs.length; ++i) {
-                logger.debug("iqs[" + i + "]: " + joinDoubles(iqs[i]));
-            }
+        if (range == null) {
+            logger.error("Cannot figure out range.");
+            return new WQKms[0];
         }
 
-        double [] boundWs = new double[boundKms.length];
-        double [] boundQs = new double[boundKms.length];
-
-        double [] okms = getKms(new double [] {
-            boundKms[0], boundKms[boundKms.length-1] });
-
-        ArrayList<WQKms> results = new ArrayList<WQKms>();
-
-        int referenceIndex = kmUp ?  0 : boundKms.length-1;
-
-        HashSet<Integer> failed = new HashSet<Integer>();
-
-        for (int i = 0; i < iqs.length; ++i) {
-            double [] iqsi = iqs[i];
-
-            QPosition qPosition = wst.interpolate(
-                iqsi[0],
-                boundKms[referenceIndex],
-                boundKms, boundWs, boundQs);
-
-            if (qPosition == null) {
-                logger.warn("interpolation failed for " + iqsi[i]);
-                failed.add(i);
-                continue;
-            }
-
-            LinearRemap remap = new LinearRemap();
-
-            for (int j = 1; j < boundKms.length; ++j) {
-                remap.add(
-                    boundKms[j-1], boundKms[j],
-                    boundQs[j-1],  iqsi[j-1],
-                    boundQs[j],    iqsi[j]);
-            }
-
-            double [] oqs = new double[okms.length];
-            double [] ows = new double[okms.length];
-
-            wst.interpolate(okms, ows, oqs, qPosition, remap);
-
-            BackJumpCorrector bjc = new BackJumpCorrector();
-            if (bjc.doCorrection(okms, ows)) {
-                logger.debug("Discharge longitudinal section has backjumps.");
-                results.add(new WQCKms(okms, oqs, ows, bjc.getCorrected()));
-            }
-            else {
-                results.add(new WQKms(okms, oqs, ows));
-            }
-        }
-
-        WQKms [] wqkms = results.toArray(new WQKms[results.size()]);
-
-        setDischargeLongitudinalSectionNames(
-            wqkms, iqs, isQ() ? "Q" : "W", failed);
+        Calculation4 calc4 = new Calculation4(segments, river, isQ());
 
-        return wqkms;
-    }
-
-    protected static String joinDoubles(double [] x) {
-        if (x == null) {
-            return "";
-        }
-        StringBuilder sb = new StringBuilder();
-        for (int i = 0; i < x.length; ++i) {
-            if (i > 0) sb.append(", ");
-            sb.append(x[i]);
-        }
-        return sb.toString();
-    }
-
-    protected double [] toQs(double [] range) {
-        double [] qs = getQs(range);
-        if (qs == null) {
-            logger.debug("Determine Q values based on a set of W values.");
-            double [] ws = getWs(range);
-            qs = getQsForWs(ws);
-        }
-        return qs;
-    }
-
+        WQKms [] results = calc4.calculate(table, range[0], range[1], range[2]);
 
-    /**
-     * Sets the name for discharge longitudinal section curves where each WQKms
-     * in <i>r</i> represents a column.
-     */
-    public static void setDischargeLongitudinalSectionNames(
-        WQKms  []    wqkms,
-        double [][]  iqs,
-        String       wq,
-        Set<Integer> failed
-    ) {
-        logger.debug("WINFOArtifact.setDischargeLongitudinalSectionNames");
-
-        // TODO: I18N
-
-        int pos = 0;
-
-        for (int j = 0; j < iqs.length; ++j) {
-            if (failed.contains(j)) {
-                continue;
-            }
-            StringBuilder sb = new StringBuilder(wq)
-                .append(" benutzerdefiniert (");
-
-            double [] iqsi = iqs[j];
-            for (int i = 0; i < iqsi.length; i++) {
-                if (i > 0) {
-                    sb.append("; ");
-                }
-                sb.append(iqsi[i]);
-            }
-            sb.append(")");
-
-            wqkms[pos++].setName(sb.toString());
-        }
+        return results;
     }
 }
 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :

http://dive4elements.wald.intevation.org