diff flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/fixings/FixDerivateFacet.java @ 3043:22da13d1b180

Added facet for derivate curve and fixed facet names. flys-artifacts/trunk@4612 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author Raimund Renkert <raimund.renkert@intevation.de>
date Wed, 06 Jun 2012 14:58:25 +0000
parents
children d87aadaa4f7e
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/fixings/FixDerivateFacet.java	Wed Jun 06 14:58:25 2012 +0000
@@ -0,0 +1,147 @@
+package de.intevation.flys.artifacts.model.fixings;
+
+import org.apache.log4j.Logger;
+
+import de.intevation.artifacts.Artifact;
+import de.intevation.artifacts.CallContext;
+
+import de.intevation.flys.utils.KMIndex;
+
+import de.intevation.flys.artifacts.FLYSArtifact;
+import de.intevation.flys.artifacts.FixationArtifactAccess;
+
+import de.intevation.flys.artifacts.model.FacetTypes;
+import de.intevation.flys.artifacts.model.DataFacet;
+import de.intevation.flys.artifacts.model.CalculationResult;
+import de.intevation.flys.artifacts.model.Parameters;
+
+import de.intevation.flys.artifacts.math.fitting.FunctionFactory;
+import de.intevation.flys.artifacts.math.fitting.Function;
+
+import de.intevation.flys.artifacts.states.DefaultState.ComputeType;
+
+
+/**
+ * Facet to show the W|Q values.
+ *
+ * @author <a href="mailto:raimund.renkert@intevation.de">Raimund Renkert</a>
+ */
+public class FixDerivateFacet
+extends      DataFacet
+implements   FacetTypes {
+
+    /** House logger. */
+    private static Logger logger = Logger.getLogger(FixDerivateFacet.class);
+
+    /** Trivial Constructor. */
+    public FixDerivateFacet() {
+    }
+
+
+    /**
+     * @param name
+     */
+    public FixDerivateFacet(String name, String description) {
+        super(0, name, description, ComputeType.ADVANCE, null, null);
+    }
+
+
+    /**
+     * Returns the data this facet requires.
+     *
+     * @param artifact the owner artifact.
+     * @param context  the CallContext (ignored).
+     *
+     * @return the data.
+     */
+    @Override
+    public Object getData(Artifact artifact, CallContext context) {
+        logger.debug("FixDerivateFacet.getData");
+        if (artifact instanceof FLYSArtifact) {
+            FLYSArtifact flys = (FLYSArtifact)artifact;
+            FixationArtifactAccess access = new FixationArtifactAccess(flys);
+
+            CalculationResult res =
+                (CalculationResult) flys.compute(context,
+                                                 ComputeType.ADVANCE,
+                                                 false);
+
+            FixResult result = (FixResult) res.getData();
+
+            double km = access.getCurrentKm();
+
+            String function = access.getFunction();
+            Function ff = FunctionFactory.getInstance().getFunction(function);
+            Function.Derivative fd = ff.getDerivative();
+
+            Parameters params = result.getParameters();
+            int row = params.binarySearch("km", km, Math.pow(10, -4));
+            String[] paramNames = ff.getParameterNames();
+            int[] paramInd = params.columnIndices(paramNames);
+            double[] coeffs = new double[paramNames.length];
+            params.get(row, paramInd, coeffs);
+
+            de.intevation.flys.artifacts.math.Function mf =
+                fd.instantiate(coeffs);
+
+            double maxQ = getMaxQ(result, km);
+
+            FixFunction fix = new FixFunction(
+                "",
+                ff.getDescription(),
+                mf,
+                maxQ);
+
+            return fix;
+        }
+        else {
+            logger.debug("Not an instance of FixationArtifact.");
+            return null;
+        }
+    }
+
+
+    protected double getMaxQ(FixResult result, double km) {
+        double maxQ = 0;
+
+        KMIndex<QW []> kmQWRef = result.getReferenced();
+
+        QW[] qwRef = kmQWRef.binarySearch(km).getValue();
+        if (qwRef != null) {
+            for (int i = 0; i < qwRef.length; i++) {
+                if (qwRef[i].getQ() > maxQ) {
+                    maxQ = qwRef[i].getQ();
+                }
+            }
+        }
+
+        KMIndex<AnalysisPeriod []> kmQWDAna = result.getAnalysisPeriods();
+        AnalysisPeriod[] periods = kmQWDAna.binarySearch(km).getValue();
+
+        if(periods != null) {
+            for (int i = 0; i < periods.length; i++) {
+                QWD[] qwdAna = periods[i].getQWDs();
+                if (qwdAna != null) {
+                    for (int j = 0; j < qwdAna.length; j++) {
+                        if (qwdAna[j].getQ() > maxQ) {
+                            maxQ = qwdAna[j].getQ();
+                        }
+                    }
+                }
+            }
+        }
+        return maxQ;
+    }
+
+    /**
+     * Create a deep copy of this Facet.
+     * @return a deep copy.
+     */
+    @Override
+    public FixDerivateFacet deepCopy() {
+        FixDerivateFacet copy = new FixDerivateFacet();
+        copy.set(this);
+        return copy;
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :

http://dive4elements.wald.intevation.org