gernotbelger@8915: /** Copyright (C) 2017 by Bundesanstalt für Gewässerkunde gernotbelger@8915: * Software engineering by gernotbelger@8915: * Björnsen Beratende Ingenieure GmbH gernotbelger@8915: * Dr. Schumacher Ingenieurbüro für Wasser und Umwelt gernotbelger@8915: * gernotbelger@8915: * This file is Free Software under the GNU AGPL (>=v3) gernotbelger@8915: * and comes with ABSOLUTELY NO WARRANTY! Check out the gernotbelger@8915: * documentation coming with Dive4Elements River for details. gernotbelger@8915: */ gernotbelger@8915: package org.dive4elements.river.artifacts.sinfo.tkhcalculation; gernotbelger@8915: gernotbelger@8915: import org.apache.commons.lang.math.DoubleRange; gernotbelger@8915: import org.apache.commons.math.FunctionEvaluationException; gernotbelger@8915: import org.apache.commons.math.analysis.UnivariateRealFunction; gernotbelger@8915: import org.dive4elements.river.artifacts.model.QKms; gernotbelger@8915: import org.dive4elements.river.artifacts.model.WKms; gernotbelger@8915: import org.dive4elements.river.artifacts.model.WQKms; gernotbelger@8915: import org.dive4elements.river.utils.DoubleUtil; gernotbelger@8915: gernotbelger@8915: /** gernotbelger@8915: * @author Gernot Belger gernotbelger@8915: */ gernotbelger@8915: public final class DischargeValuesFinder { gernotbelger@8915: gernotbelger@8915: private final UnivariateRealFunction qInterpolator; gernotbelger@8915: private final QKms qKms; gernotbelger@8915: gernotbelger@8915: /** gernotbelger@8915: * Create an instance from a {@link WKms} object. If the given {@link WKms} is not a {@link WQKms}, a finder that always gernotbelger@8915: * returns {@link Double#NaN} is returned. gernotbelger@8915: */ gernotbelger@8915: public static DischargeValuesFinder fromKms(final WKms wstKms) { gernotbelger@8915: if (!(wstKms instanceof QKms)) { gernotbelger@8915: return new DischargeValuesFinder(null); gernotbelger@8915: } gernotbelger@8915: gernotbelger@8915: final QKms qKms = (QKms) wstKms; gernotbelger@8915: gernotbelger@8915: return new DischargeValuesFinder(qKms); gernotbelger@8915: } gernotbelger@8915: gernotbelger@8915: public DischargeValuesFinder(final QKms qKms) { gernotbelger@8915: this.qKms = qKms; gernotbelger@8915: this.qInterpolator = qKms == null ? null : DoubleUtil.getLinearInterpolator(qKms.allKms(), qKms.allQs()); gernotbelger@8915: } gernotbelger@8915: gernotbelger@8915: /** gernotbelger@8915: * If this provider may return valid data at all. gernotbelger@8915: */ gernotbelger@8915: public boolean isValid() { gernotbelger@8915: return this.qInterpolator != null; gernotbelger@8915: } gernotbelger@8915: gernotbelger@8915: public DoubleRange getRange() { gernotbelger@8915: return new DoubleRange(this.qKms.allQs().min(), this.qKms.allQs().max()); gernotbelger@8915: } gernotbelger@8915: gernotbelger@8915: public double getDischarge(final double station) throws FunctionEvaluationException { gernotbelger@8915: return this.qInterpolator.value(station); gernotbelger@8915: } gernotbelger@8915: }