# HG changeset patch # User mschaefer # Date 1539275961 -7200 # Node ID b380a5693514a306c7edb99fa70354a34bcd7815 # Parent d9fda7af24ca38071cb44e8d7a4197a54272afaf Calculation of Dauerlinie corrected in WInfo (fix wst position according to a reference gauge, km specific discharge instead of that of the gauge); using same calculation in SInfo flood duration diff -r d9fda7af24ca -r b380a5693514 artifacts/src/main/java/org/dive4elements/river/artifacts/WINFOArtifact.java --- a/artifacts/src/main/java/org/dive4elements/river/artifacts/WINFOArtifact.java Thu Oct 04 12:48:57 2018 +0200 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/WINFOArtifact.java Thu Oct 11 18:39:21 2018 +0200 @@ -319,7 +319,7 @@ final int[] days = (int[]) obj[0]; final double[] qs = (double[]) obj[1]; - final Calculation3 calculation = new Calculation3(location, days, qs); + final Calculation3 calculation = new Calculation3(location, days, qs, gauge.getStation().doubleValue()); return calculation.calculate(wst); } diff -r d9fda7af24ca -r b380a5693514 artifacts/src/main/java/org/dive4elements/river/artifacts/model/Calculation3.java --- a/artifacts/src/main/java/org/dive4elements/river/artifacts/model/Calculation3.java Thu Oct 04 12:48:57 2018 +0200 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/model/Calculation3.java Thu Oct 11 18:39:21 2018 +0200 @@ -9,7 +9,11 @@ package org.dive4elements.river.artifacts.model; import org.apache.log4j.Logger; +import org.dive4elements.river.artifacts.model.WstValueTable.QPosition; +/** + * Duration curve calculation of a km based on the duration curve of a gauge + */ public class Calculation3 extends Calculation { @@ -18,33 +22,50 @@ protected double km; protected int [] days; protected double [] qs; + private double gaugeKm; public Calculation3() { } - public Calculation3(double km, int [] days, double [] qs) { + public Calculation3(final double km, final int[] days, final double[] qs, final double gaugeKm) { this.km = km; this.days = days; this.qs = qs; + this.gaugeKm = gaugeKm; } - public CalculationResult calculate(WstValueTable wst) { + /** + * Calculates the W and Q duration curve of the active km + */ + public CalculationResult calculate(final WstValueTable wst) { - double [] ws = wst.interpolateW(km, qs, new double[qs.length], this); + if (this.days == null || this.days.length == 0) { + addProblem(this.km, "cannot.find.ds"); + } - if (days == null || days.length == 0) { - addProblem(km, "cannot.find.ds"); + final double[] ws = new double[this.days.length]; + final double[] kmqs = new double[this.days.length]; + for (int i = 0; i <= this.days.length - 1; i++) { + final QPosition qpos = wst.getQPosition(this.gaugeKm, this.qs[i]); + if (qpos != null) { + ws[i] = wst.interpolateW(this.km, qpos); + kmqs[i] = wst.getQ(qpos, this.km); + } + else { + addProblem(this.km, "cannot.find.q", this.qs[i]); + ws[i] = Double.NaN; + } } if (log.isDebugEnabled()) { log.debug("Calculate duration curve data:"); - log.debug(" km : " + km); - log.debug(" num Days : " + (days != null ? days.length : 0)); - log.debug(" num Qs : " + (qs != null ? qs.length : 0)); + log.debug(" km : " + this.km); + log.debug(" num Days : " + (this.days != null ? this.days.length : 0)); + log.debug(" num Qs : " + (this.qs != null ? this.qs.length : 0)); log.debug(" result Ws: " + (ws != null ? ws.length : 0)); } - WQDay wqday = new WQDay(days, ws, qs); + final WQDay wqday = new WQDay(this.days, ws, kmqs); if (hasProblems()) { log.debug("calculation caused "+numProblems()+" problem(s)."); diff -r d9fda7af24ca -r b380a5693514 artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flood_duration/FloodDurationCalculation.java --- a/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flood_duration/FloodDurationCalculation.java Thu Oct 04 12:48:57 2018 +0200 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flood_duration/FloodDurationCalculation.java Thu Oct 11 18:39:21 2018 +0200 @@ -95,13 +95,16 @@ // Calculate the selected main values, if any /* misuse winfo-artifact to calculate waterlevels in the same way */ final WINFOArtifact winfo = new WinfoArtifactWrapper(sinfo); - winfo.addStringData("ld_locations", Double.toString(station)); final FloodDurationCalculator calculator = new FloodDurationCalculator(this.context, infoProvider); - if (!Double.isNaN(station)) + if (!Double.isNaN(station)) { + winfo.addStringData("ld_locations", Double.toString(station)); return calculator.calcWQDays(problems, station, winfo); - else - return calculator.calcWQDays(problems, calcRange.getMinimumFloat(), winfo); + } + else { + winfo.addStringData("ld_locations", Double.toString(calcRange.getMinimumDouble())); + return calculator.calcWQDays(problems, calcRange.getMinimumDouble(), winfo); + } } /** diff -r d9fda7af24ca -r b380a5693514 artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flood_duration/FloodDurationCalculator.java --- a/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flood_duration/FloodDurationCalculator.java Thu Oct 04 12:48:57 2018 +0200 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flood_duration/FloodDurationCalculator.java Thu Oct 11 18:39:21 2018 +0200 @@ -137,26 +137,15 @@ */ public WQDay calcWQDays(final Calculation problems, final double station, final WINFOArtifact winfo) { - final WstValueTable wst = WstValueTableFactory.getTable(this.riverInfoProvider.getRiver()); - final Gauge gauge = this.riverInfoProvider.getGauge(station, true); - final Object[] obj = gauge.fetchDurationCurveData(); - final int[] udays = (int[]) obj[0]; - final double[] qs = (double[]) obj[1]; - final int[] odays = new int[udays.length]; - final double[] oqs = new double[udays.length]; - final double[] ows = new double[udays.length]; - for (int i = 0, j = udays.length - 1; i <= udays.length - 1; i++, j--) { - odays[j] = 365 - udays[i]; - final QPosition qpos = wst.getQPosition(gauge.getStation().doubleValue(), qs[i]); - if (qpos != null) { - ows[j] = wst.interpolateW(station, qpos); - oqs[j] = wst.getQ(qpos, station); - } else { - ows[j] = Double.NaN; - oqs[j] = qs[i]; - } - } - return new WQDay(odays, ows, oqs); + final CalculationResult res = winfo.getDurationCurveData(); + final WQDay wqday = (WQDay) res.getData(); + if (wqday == null) + return null; + + final int[] odays = new int[wqday.size()]; + for (int i = 0; i <= odays.length - 1; i++) + odays[i] = 365 - wqday.getDay(i); + return new WQDay(odays, wqday.getWs(), wqday.getQs()); } /**