diff flys-artifacts/src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java @ 402:eb22ffe4d74c

Implemented methods to retrieve and compute the data used to create discharge longitudinal sections. flys-artifacts/trunk@1843 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author Ingo Weinzierl <ingo.weinzierl@intevation.de>
date Fri, 06 May 2011 14:19:27 +0000
parents befedd7629d5
children 5d65fe4c08d5
line wrap: on
line diff
--- a/flys-artifacts/src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java	Thu May 05 12:34:53 2011 +0000
+++ b/flys-artifacts/src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java	Fri May 06 14:19:27 2011 +0000
@@ -25,7 +25,9 @@
 
 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;
@@ -444,5 +446,92 @@
 
         return wqkms;
     }
+
+
+    /**
+     * Returns the data computed by the discharge longitudinal section
+     * computation.
+     *
+     * @return an array of WQKms object - one object for each given Q value.
+     */
+    public WQKms[] getDischargeLongitudinalSectionData() {
+        logger.debug("WINFOArtifact.getDischargeLongitudinalSectionData");
+
+        River river = getRiver();
+        if (river == null) {
+            logger.error("No river selected.");
+        }
+
+        WstValueTable wst = WstValueTable.getTable(river);
+        if (wst == null) {
+            logger.error("No Wst found for selected river.");
+        }
+
+        double[][] dist = getSplittedDistance();
+        int        num  = dist != null ? dist.length : 0;
+
+        WQKms[][] wqkms = new WQKms[num][];
+
+        for (int i = 0; i < num; i++) {
+            double[] kms = getKms(dist[i]);
+            if (kms == null) {
+                // XXX maybe we should cancel this operation here.
+                continue;
+            }
+
+            double[] qs = getQs(dist[i]);
+            if (qs == null) {
+                logger.debug("Determine Q values based on a set of W values.");
+
+                double[] ws = getWs(dist[i]);
+                qs = getQsForWs(ws);
+            }
+
+            wqkms[i] = computeWaterlevelData(kms, qs, wst);
+        }
+
+        WQKms[] merged    = WQKms.merge(wqkms);
+        int     numMerged = merged.length;
+        WQKms[] computed  = new WQKms[numMerged];
+
+        for (int i = 0; i < numMerged; i++) {
+            computed[i] = computeDischargeLongitudinalSectionData(merged[i]);
+        }
+
+        // TODO Introduce a caching mechanism here!
+
+        return computed;
+    }
+
+
+    /**
+     * Computes the data used for a discharge longitudinal section based on a
+     * given WQKms object. If there are backjumps while computing the data, a
+     * WQCKms object is returned, otherwise the incoming wqkms object.
+     *
+     * @param wqkms The WQKms object that contains W, Q and Kms.
+     *
+     * @return an instance of WQKms or WQCKms.
+     */
+    public static WQKms computeDischargeLongitudinalSectionData(WQKms wqkms) {
+        logger.info("WINFOArtifact.computeDischargeLongitudinalSectionData");
+
+        BackJumpCorrector bjc = new BackJumpCorrector();
+
+        bjc.doCorrection(wqkms.getKms(), wqkms.getWs());
+
+        if (bjc.hasBackJumps()) {
+            logger.info("Discharge longitudinal section has backjumps.");
+            return new WQCKms(
+                wqkms.getKms(),
+                wqkms.getQs(),
+                wqkms.getWs(),
+                bjc.getCorrected());
+        }
+        else {
+            logger.info("Discharge longitudinal section has no backjumps.");
+            return wqkms;
+        }
+    }
 }
 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :

http://dive4elements.wald.intevation.org