sascha@3775: package de.intevation.flys.artifacts.model.extreme; sascha@3775: sascha@3775: import de.intevation.flys.artifacts.access.ExtremeAccess; sascha@3775: ingo@3785: import de.intevation.flys.artifacts.math.fitting.Function; ingo@3785: import de.intevation.flys.artifacts.math.fitting.FunctionFactory; ingo@3785: sascha@3775: import de.intevation.flys.artifacts.model.Calculation; sascha@3775: import de.intevation.flys.artifacts.model.CalculationResult; ingo@3785: import de.intevation.flys.artifacts.model.RangeWithValues; ingo@3785: import de.intevation.flys.artifacts.model.RiverFactory; ingo@3785: import de.intevation.flys.artifacts.model.WstValueTable; ingo@3785: import de.intevation.flys.artifacts.model.WstValueTableFactory; ingo@3785: ingo@3785: import de.intevation.flys.model.River; ingo@3785: ingo@3785: import de.intevation.flys.utils.DoubleUtil; ingo@3785: ingo@3785: import java.util.List; sascha@3775: felix@4040: /** Calculate extrapolated W. */ sascha@3775: public class ExtremeCalculation sascha@3775: extends Calculation sascha@3775: { ingo@3785: protected String river; ingo@3785: protected String function; ingo@3785: protected double from; ingo@3785: protected double to; ingo@3785: protected double step; ingo@3785: protected double percent; ingo@3785: protected List ranges; ingo@3785: sascha@3775: public ExtremeCalculation() { sascha@3775: } sascha@3775: sascha@3775: public ExtremeCalculation(ExtremeAccess access) { ingo@3785: String river = access.getRiver(); ingo@3785: String function = access.getFunction(); ingo@3785: Double from = access.getFrom(); ingo@3785: Double to = access.getTo(); ingo@3785: Double step = access.getStep(); ingo@3785: Double percent = access.getPercent(); ingo@3785: List ranges = access.getRanges(); ingo@3785: ingo@3785: if (river == null) { ingo@3785: // TODO: i18n ingo@3785: addProblem("extreme.no.river"); ingo@3785: } ingo@3785: ingo@3785: if (function == null) { ingo@3785: // TODO: i18n ingo@3785: addProblem("extreme.no.function"); ingo@3785: } ingo@3785: ingo@3785: if (from == null) { ingo@3785: // TODO: i18n ingo@3785: addProblem("extreme.no.from"); ingo@3785: } ingo@3785: ingo@3785: if (to == null) { ingo@3785: // TODO: i18n ingo@3785: addProblem("extreme.no.to"); ingo@3785: } ingo@3785: ingo@3785: if (step == null) { ingo@3785: // TODO: i18n ingo@3785: addProblem("extreme.no.step"); ingo@3785: } ingo@3785: ingo@3785: if (percent == null) { ingo@3785: // TODO: i18n ingo@3785: addProblem("extreme.no.percent"); ingo@3785: } ingo@3785: ingo@3785: if (ranges == null) { ingo@3785: // TODO: i18n ingo@3785: addProblem("extreme.no.ranges"); ingo@3785: } ingo@3785: ingo@3785: if (!hasProblems()) { ingo@3785: this.river = river; ingo@3785: this.function = function; ingo@3785: this.from = Math.min(from, to); ingo@3785: this.to = Math.max(from, to); ingo@3785: this.step = Math.max(0.001d, Math.abs(step)/1000d); ingo@3785: this.percent = Math.max(0d, Math.min(100d, percent)); ingo@3785: this.ranges = ranges; ingo@3785: } sascha@3775: } sascha@3775: sascha@3775: public CalculationResult calculate() { ingo@3785: ingo@3785: WstValueTable wst = null; ingo@3785: ingo@3785: River river = RiverFactory.getRiver(this.river); ingo@3785: if (river == null) { ingo@3785: // TODO: i18n ingo@3785: addProblem("extreme.no.such.river", this.river); sascha@3775: } ingo@3785: else { ingo@3785: wst = WstValueTableFactory.getTable(river); ingo@3785: if (wst == null) { ingo@3785: // TODO: i18n ingo@3785: addProblem("extreme.no.wst.table"); ingo@3785: } ingo@3785: } ingo@3785: ingo@3785: Function function = ingo@3785: FunctionFactory.getInstance().getFunction(this.function); ingo@3785: if (function == null) { ingo@3785: // TODO: i18n ingo@3785: addProblem("extreme.no.such.function", this.function); ingo@3785: } ingo@3785: ingo@3785: return hasProblems() ingo@3785: ? new CalculationResult(this) ingo@3785: : innerCalculate(wst, function); ingo@3785: } ingo@3785: ingo@3785: protected CalculationResult innerCalculate( ingo@3785: WstValueTable wst, ingo@3785: Function function ingo@3785: ) { ingo@3785: RangeWithValues range = null; ingo@3785: ingo@3785: KMs: for (double km = from; km <= to; km += step) { ingo@3785: double currentKm = DoubleUtil.round(km); ingo@3785: ingo@3785: if (range == null || !range.inside(currentKm)) { ingo@3785: for (RangeWithValues r: ranges) { ingo@3785: if (r.inside(currentKm)) { ingo@3785: range = r; ingo@3785: break; ingo@3785: } ingo@3785: } ingo@3785: // TODO: i18n ingo@3785: addProblem(currentKm, "extreme.no.range"); ingo@3785: continue KMs; ingo@3785: } ingo@3785: ingo@3785: double [][] wqs = wst.interpolateTabulated(currentKm); ingo@3785: if (wqs == null) { ingo@3785: // TODO: i18n ingo@3785: addProblem(currentKm, "extreme.no.raw.data"); ingo@3785: continue; ingo@3785: } ingo@3785: ingo@3785: // XXX: This should not be necessary for model data. ingo@3785: if (!DoubleUtil.isValid(wqs)) { ingo@3785: // TODO: i18n ingo@3785: addProblem(currentKm, "extreme.invalid.data"); ingo@3785: continue; ingo@3785: } ingo@3785: // TODO: Implement extraction of points for curve fitting. ingo@3785: // TODO: Implement curve fitting. ingo@3785: // TODO: Implement generating Curve object per km. ingo@3785: } ingo@3785: sascha@3775: ExtremeResult result = new ExtremeResult(); sascha@3775: return new CalculationResult(result, this); sascha@3775: } sascha@3775: } sascha@3775: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 :