Mercurial > dive4elements > river
view flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/extreme/ExtremeCalculation.java @ 4241:49cb65d5932d
Improved the historical discharge calculation.
The calculation now creates new HistoricalWQKms (new subclass of WQKms). Those WQKms are used
to create new facets from (new) type 'HistoricalDischargeCurveFacet'. The chart generator is
improved to support those facets.
author | Ingo Weinzierl <ingo.weinzierl@intevation.de> |
---|---|
date | Wed, 24 Oct 2012 14:34:35 +0200 |
parents | c63f0b4ac1b4 |
children | 5cc9453456a7 |
line wrap: on
line source
package de.intevation.flys.artifacts.model.extreme; 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; /** Calculate extrapolated W. */ 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<RangeWithValues> ranges; public ExtremeCalculation() { } public ExtremeCalculation(ExtremeAccess access) { 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<RangeWithValues> 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; } } /** Calculate an extreme curve (extrapolate). */ public CalculationResult calculate() { WstValueTable wst = null; River river = RiverFactory.getRiver(this.river); if (river == null) { // TODO: i18n addProblem("extreme.no.such.river", this.river); } 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); } /** Calculate an extreme curve (extrapolate). */ 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); } } // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 :