# HG changeset patch # User Sascha L. Teichmann # Date 1347993412 0 # Node ID 00abcd3737f9e1eb26e98ae9c1d7a0a135894c0a # Parent c0a15547ad766ef5c189157b71df50a5a7e77928 Some more little steps towards "Auslagerung extremer Wasserspiegellagen". flys-artifacts/trunk@5512 c6561f87-3c4e-4783-a992-168aeb5c3f6f diff -r c0a15547ad76 -r 00abcd3737f9 flys-artifacts/ChangeLog --- a/flys-artifacts/ChangeLog Tue Sep 18 16:24:51 2012 +0000 +++ b/flys-artifacts/ChangeLog Tue Sep 18 18:36:52 2012 +0000 @@ -1,3 +1,11 @@ +2012-09-18 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/extreme/ExtremeCalculation.java: + Extract parameters needed for calculation from access. + + * src/main/java/de/intevation/flys/utils/DoubleUtil.java(isValid): + Added method to check if 2d double array is valid. + 2012-09-18 Sascha L. Teichmann * src/main/java/de/intevation/flys/jfree/StableXYDifferenceRenderer.java, diff -r c0a15547ad76 -r 00abcd3737f9 flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/extreme/ExtremeCalculation.java --- a/flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/extreme/ExtremeCalculation.java Tue Sep 18 16:24:51 2012 +0000 +++ b/flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/extreme/ExtremeCalculation.java Tue Sep 18 18:36:52 2012 +0000 @@ -2,26 +2,160 @@ import de.intevation.flys.artifacts.access.ExtremeAccess; +import de.intevation.flys.artifacts.math.fitting.Function; +import de.intevation.flys.artifacts.math.fitting.FunctionFactory; + import de.intevation.flys.artifacts.model.Calculation; import de.intevation.flys.artifacts.model.CalculationResult; +import de.intevation.flys.artifacts.model.RangeWithValues; +import de.intevation.flys.artifacts.model.RiverFactory; +import de.intevation.flys.artifacts.model.WstValueTable; +import de.intevation.flys.artifacts.model.WstValueTableFactory; + +import de.intevation.flys.model.River; + +import de.intevation.flys.utils.DoubleUtil; + +import java.util.List; public class ExtremeCalculation extends Calculation { + protected String river; + protected String function; + protected double from; + protected double to; + protected double step; + protected double percent; + protected List ranges; + public ExtremeCalculation() { } public ExtremeCalculation(ExtremeAccess access) { - // TODO: Implement me! + String river = access.getRiver(); + String function = access.getFunction(); + Double from = access.getFrom(); + Double to = access.getTo(); + Double step = access.getStep(); + Double percent = access.getPercent(); + List ranges = access.getRanges(); + + if (river == null) { + // TODO: i18n + addProblem("extreme.no.river"); + } + + if (function == null) { + // TODO: i18n + addProblem("extreme.no.function"); + } + + if (from == null) { + // TODO: i18n + addProblem("extreme.no.from"); + } + + if (to == null) { + // TODO: i18n + addProblem("extreme.no.to"); + } + + if (step == null) { + // TODO: i18n + addProblem("extreme.no.step"); + } + + if (percent == null) { + // TODO: i18n + addProblem("extreme.no.percent"); + } + + if (ranges == null) { + // TODO: i18n + addProblem("extreme.no.ranges"); + } + + if (!hasProblems()) { + this.river = river; + this.function = function; + this.from = Math.min(from, to); + this.to = Math.max(from, to); + this.step = Math.max(0.001d, Math.abs(step)/1000d); + this.percent = Math.max(0d, Math.min(100d, percent)); + this.ranges = ranges; + } } public CalculationResult calculate() { - if (hasProblems()) { - return new CalculationResult(this); + + WstValueTable wst = null; + + River river = RiverFactory.getRiver(this.river); + if (river == null) { + // TODO: i18n + addProblem("extreme.no.such.river", this.river); } - // TODO: Implement me! + else { + wst = WstValueTableFactory.getTable(river); + if (wst == null) { + // TODO: i18n + addProblem("extreme.no.wst.table"); + } + } + + Function function = + FunctionFactory.getInstance().getFunction(this.function); + if (function == null) { + // TODO: i18n + addProblem("extreme.no.such.function", this.function); + } + + return hasProblems() + ? new CalculationResult(this) + : innerCalculate(wst, function); + } + + protected CalculationResult innerCalculate( + WstValueTable wst, + Function function + ) { + RangeWithValues range = null; + + KMs: for (double km = from; km <= to; km += step) { + double currentKm = DoubleUtil.round(km); + + if (range == null || !range.inside(currentKm)) { + for (RangeWithValues r: ranges) { + if (r.inside(currentKm)) { + range = r; + break; + } + } + // TODO: i18n + addProblem(currentKm, "extreme.no.range"); + continue KMs; + } + + double [][] wqs = wst.interpolateTabulated(currentKm); + if (wqs == null) { + // TODO: i18n + addProblem(currentKm, "extreme.no.raw.data"); + continue; + } + + // XXX: This should not be necessary for model data. + if (!DoubleUtil.isValid(wqs)) { + // TODO: i18n + addProblem(currentKm, "extreme.invalid.data"); + continue; + } + // TODO: Implement extraction of points for curve fitting. + // TODO: Implement curve fitting. + // TODO: Implement generating Curve object per km. + } + ExtremeResult result = new ExtremeResult(); - return new CalculationResult(result, this); } } diff -r c0a15547ad76 -r 00abcd3737f9 flys-artifacts/src/main/java/de/intevation/flys/utils/DoubleUtil.java --- a/flys-artifacts/src/main/java/de/intevation/flys/utils/DoubleUtil.java Tue Sep 18 16:24:51 2012 +0000 +++ b/flys-artifacts/src/main/java/de/intevation/flys/utils/DoubleUtil.java Tue Sep 18 18:36:52 2012 +0000 @@ -177,5 +177,16 @@ } } } + + public static final boolean isValid(double [][] data) { + for (double [] ds: data) { + for (double d: ds) { + if (Double.isNaN(d)) { + return false; + } + } + } + return true; + } } // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :