Mercurial > dive4elements > river
diff flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/Calculation6.java @ 2311:b8df8d1476ba
Compute differences between discharge table values and reference discharge table values in historical discharge curve calculation.
flys-artifacts/trunk@3991 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author | Ingo Weinzierl <ingo.weinzierl@intevation.de> |
---|---|
date | Thu, 09 Feb 2012 10:57:35 +0000 |
parents | abb390101595 |
children | c0dfa36add96 |
line wrap: on
line diff
--- a/flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/Calculation6.java Thu Feb 09 10:21:16 2012 +0000 +++ b/flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/Calculation6.java Thu Feb 09 10:57:35 2012 +0000 @@ -47,6 +47,7 @@ debug(); } + DischargeTable refTable = fetchReferenceTable(gauge); List<DischargeTable> dts = fetchDischargeTables(gauge); int numTables = dts.size(); @@ -57,7 +58,7 @@ addProblem("cannot.find.hist.q.tables"); } - WQTimerange[] wqt = prepareCalculationData(dts); + WQTimerange[] wqt = prepareCalculationData(refTable, dts); logger.debug("Number of calculation results: " + wqt.length); @@ -85,6 +86,11 @@ } + protected DischargeTable fetchReferenceTable(Gauge gauge) { + return gauge.fetchMasterDischargeTable(); + } + + protected List<DischargeTable> fetchDischargeTables(Gauge gauge) { List<DischargeTable> relevant = new ArrayList<DischargeTable>(); List<DischargeTable> all = gauge.getDischargeTables(); @@ -122,15 +128,30 @@ } - protected WQTimerange[] prepareCalculationData(List<DischargeTable> dts) { - List<WQTimerange> wqts = new ArrayList<WQTimerange>(values.length); + protected WQTimerange[] prepareCalculationData( + DischargeTable refTable, + List<DischargeTable> dts + ) { + if (refTable == null) { + addProblem("cannot.find.hist.q.reftable"); + return prepareSimpleData(dts); + } + else { + return prepareData(refTable, dts); + } + } + + + protected WQTimerange[] prepareSimpleData(List<DischargeTable> dts) { + List<WQTimerange> wqts = + new ArrayList<WQTimerange>(values.length); boolean debug = logger.isDebugEnabled(); for (double value: values) { logger.debug("Prepare data for value: " + value); - String name = mode == MODE_W ? "W=" + value : "Q=" + value; + String name = mode == MODE_W ? "W=" + value : "Q=" + value; WQTimerange wqt = null; for (DischargeTable dt: dts) { @@ -184,6 +205,85 @@ } + protected HistoricalWQTimerange[] prepareData( + DischargeTable refTable, + List<DischargeTable> dts + ) { + List<HistoricalWQTimerange> wqts = + new ArrayList<HistoricalWQTimerange>(values.length); + + boolean debug = logger.isDebugEnabled(); + + for (double value: values) { + logger.debug("Prepare data plus diff for value: " + value); + + String name = mode == MODE_W ? "W=" + value : "Q=" + value; + HistoricalWQTimerange wqt = null; + + double ref; + + if (refTable != null && mode == MODE_W) { + ref = findValueForW(refTable, value); + } + else if (refTable != null) { + ref = findValueForQ(refTable, value); + } + else { + ref = Double.NaN; + } + + for (DischargeTable dt: dts) { + TimeInterval ti = dt.getTimeInterval(); + + Date start = ti.getStartTime(); + Date end = ti.getStopTime(); + + if (end == null) { + logger.warn("TimeInterval has no stop time set!"); + + end = new Date(); + } + + Timerange t = new Timerange(ti.getStartTime(),ti.getStopTime()); + double w; + double q; + + if (mode == MODE_W) { + w = value; + q = findValueForW(dt, w); + + if (Double.isNaN(q)) { + logger.warn("Cannot find Q for W: " + w); + addProblem("cannot.find.hist.q.for.w", w, start, end); + continue; + } + } + else { + q = value; + w = findValueForQ(dt, q); + } + + if (debug) { + logger.debug("Q=" + q + " | W=" + w); + } + + if (wqt == null) { + wqt = new HistoricalWQTimerange(name); + } + + wqt.add(w, q, ref-value, t); + } + + if (wqt != null) { + wqts.add(wqt); + } + } + + return (HistoricalWQTimerange[]) + wqts.toArray(new HistoricalWQTimerange[wqts.size()]); + } + + protected double findValueForW(DischargeTable dt, double w) { double[][] vs = DischargeTables.loadDischargeTableValues(dt,SCALE,true); return DischargeTables.getQForW(vs, w);