teichmann@5863: /* Copyright (C) 2011, 2012, 2013 by Bundesanstalt für Gewässerkunde teichmann@5863: * Software engineering by Intevation GmbH teichmann@5863: * teichmann@5994: * This file is Free Software under the GNU AGPL (>=v3) teichmann@5863: * and comes with ABSOLUTELY NO WARRANTY! Check out the teichmann@5994: * documentation coming with Dive4Elements River for details. teichmann@5863: */ teichmann@5863: teichmann@5831: package org.dive4elements.river.artifacts.model; sascha@677: teichmann@6434: import java.io.FileWriter; teichmann@6434: import java.io.IOException; teichmann@6434: import java.io.PrintWriter; sascha@677: import java.util.Arrays; sascha@677: sascha@677: import org.apache.log4j.Logger; sascha@677: felix@3265: felix@3265: /** ComputedDischargeCurve. */ sascha@677: public class Calculation2 sascha@677: extends Calculation sascha@677: { sascha@677: private static Logger logger = Logger.getLogger(Calculation2.class); sascha@677: sascha@677: protected double km; sascha@677: sascha@677: public Calculation2() { sascha@677: } sascha@677: sascha@677: public Calculation2(double km) { sascha@677: this.km = km; sascha@677: } sascha@677: teichmann@6434: private void dump(double [][] wqs) { teichmann@6434: double [] ws = wqs[0]; teichmann@6434: double [] qs = wqs[1]; teichmann@6434: teichmann@6434: String filename = "/tmp/computed-discharge-curve-" + km + "-" + teichmann@6434: System.currentTimeMillis() + ".txt"; teichmann@6434: teichmann@6434: PrintWriter pw = null; teichmann@6434: try { teichmann@6434: pw = teichmann@6434: new PrintWriter( teichmann@6434: new FileWriter(filename)); teichmann@6434: teichmann@6434: for (int i = 0; i < ws.length; ++i) { teichmann@6434: pw.println(ws[i] + " " + qs[i]); teichmann@6434: } teichmann@6434: teichmann@6434: pw.flush(); teichmann@6434: } teichmann@6434: catch (IOException ioe) { teichmann@6434: logger.error(ioe); teichmann@6434: } teichmann@6434: finally { teichmann@6434: if (pw != null) { teichmann@6434: pw.close(); teichmann@6434: } teichmann@6434: } teichmann@6434: } teichmann@6434: sascha@709: public CalculationResult calculate(WstValueTable wst) { sascha@677: teichmann@6434: boolean debug = logger.isDebugEnabled(); teichmann@6434: teichmann@6434: if (debug) { teichmann@6434: logger.debug("Calculation2.calculate: km " + km); teichmann@6434: } sascha@677: sascha@677: double [][] wqs = wst.interpolateWQ(km, this); sascha@677: teichmann@6434: if (debug) { teichmann@6434: if (hasProblems()) { teichmann@6434: logger.debug("problems: " + problemsToString()); teichmann@6434: } teichmann@6434: logger.debug("wqs: " + wqs); teichmann@6434: if (wqs != null && wqs[0] != null) { teichmann@6434: logger.debug("wqs length: " + wqs[0].length); teichmann@6434: // TODO: Uncomment to see the data externally. teichmann@6434: //dump(wqs); teichmann@6434: } teichmann@6434: } teichmann@6434: sascha@677: if (wqs == null || wqs[0].length == 0) { sascha@2166: addProblem("cannot.compute.discharge.curve"); sascha@709: return new CalculationResult(new WQKms[0], this); sascha@677: } sascha@677: sascha@677: double [] ws = wqs[0]; sascha@677: double [] qs = wqs[1]; sascha@677: double [] kms = new double[ws.length]; sascha@677: sascha@677: Arrays.fill(kms, km); sascha@677: sascha@677: WQKms wqkms = new WQKms(kms, qs, ws, String.valueOf(km)); sascha@677: sascha@677: if (hasProblems()) { felix@3265: logger.debug("found " + numProblems() + " problems."); sascha@677: wqkms.removeNaNs(); sascha@677: } sascha@677: sascha@709: return new CalculationResult(new WQKms[] { wqkms }, this); sascha@677: } sascha@677: } sascha@677: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :