mschaefer@8898: /* Copyright (C) 2017 by Bundesanstalt für Gewässerkunde mschaefer@8898: * Software engineering by mschaefer@8898: * Björnsen Beratende Ingenieure GmbH mschaefer@8898: * Dr. Schumacher Ingenieurbüro für Wasser und Umwelt mschaefer@8898: * mschaefer@8898: * This file is Free Software under the GNU AGPL (>=v3) mschaefer@8898: * and comes with ABSOLUTELY NO WARRANTY! Check out the mschaefer@8898: * documentation coming with Dive4Elements River for details. mschaefer@8898: */ mschaefer@8898: mschaefer@8898: package org.dive4elements.river.artifacts.sinfo.flowdepth; mschaefer@8898: mschaefer@8898: import org.apache.commons.math.analysis.interpolation.LinearInterpolator; mschaefer@8898: import org.apache.commons.math.analysis.polynomials.PolynomialSplineFunction; mschaefer@8898: mschaefer@8898: import gnu.trove.TDoubleArrayList; mschaefer@8898: mschaefer@8898: /** mschaefer@8898: * Sorted arrays of a station's q, v, and tau model values, running in parallel gernotbelger@8964: * mschaefer@8898: * @author Matthias Schäfer mschaefer@8898: * mschaefer@8898: */ mschaefer@8898: public class FlowVelocityKmModelValues { mschaefer@8898: mschaefer@8898: /***** FIELDS *****/ gernotbelger@8964: mschaefer@8898: /** mschaefer@8898: * Km mschaefer@8898: */ gernotbelger@8964: private final double km; gernotbelger@8964: mschaefer@8898: /** mschaefer@8898: * The station's discharge model values, sorted in ascending order mschaefer@8898: */ gernotbelger@8964: private final TDoubleArrayList qs; gernotbelger@8964: mschaefer@8898: /** mschaefer@8898: * The station's main section velocity for the q values mschaefer@8898: */ gernotbelger@8964: private final TDoubleArrayList vmains; gernotbelger@8964: mschaefer@8898: /** mschaefer@8898: * The station's shear stress (tau) values for the q values mschaefer@8898: */ gernotbelger@8964: private final TDoubleArrayList taus; mschaefer@8898: mschaefer@8898: /** mschaefer@8898: * Discharge found by the last findQ mschaefer@8898: */ mschaefer@8898: private double findQ; gernotbelger@8964: mschaefer@8898: /** mschaefer@8898: * Velocity found by the last {@link findQ} mschaefer@8898: */ mschaefer@8898: private double vmainFound; gernotbelger@8964: mschaefer@8898: /** mschaefer@8898: * Shear stress found by the last {@link findQ} mschaefer@8898: */ mschaefer@8898: private double tauFound; gernotbelger@8964: mschaefer@8898: /** mschaefer@8898: * Whether qFound has been interpolated mschaefer@8898: */ mschaefer@8898: private boolean isInterpolated; gernotbelger@8964: mschaefer@8898: /** mschaefer@8898: * Real linear interpolator for q and v values mschaefer@8898: */ mschaefer@8898: private PolynomialSplineFunction vInterpolator; gernotbelger@8964: mschaefer@8898: /** mschaefer@8898: * Real linear interpolator for q and tau values mschaefer@8898: */ mschaefer@8898: private PolynomialSplineFunction tauInterpolator; gernotbelger@8964: mschaefer@8898: /***** CONSTRUCTORS *****/ gernotbelger@8964: mschaefer@8898: /** mschaefer@8898: * Constructor with km parameter mschaefer@8898: */ gernotbelger@8964: public FlowVelocityKmModelValues(final double km) { mschaefer@8898: this.km = km; gernotbelger@8964: this.qs = new TDoubleArrayList(); gernotbelger@8964: this.vmains = new TDoubleArrayList(); gernotbelger@8964: this.taus = new TDoubleArrayList(); gernotbelger@8964: this.vInterpolator = null; gernotbelger@8964: this.tauInterpolator = null; mschaefer@8898: } mschaefer@8898: mschaefer@8898: /** mschaefer@8898: * Copy constructor with new km mschaefer@8898: */ gernotbelger@8964: public FlowVelocityKmModelValues(final double km, final FlowVelocityKmModelValues src) { mschaefer@8898: this(km); gernotbelger@8964: src.copyTo(this.qs, this.vmains, this.taus); mschaefer@8898: } gernotbelger@8964: mschaefer@8898: /***** METHODS *****/ gernotbelger@8964: mschaefer@8898: /** mschaefer@8898: * Number of the q-v-tau tuples mschaefer@8898: */ mschaefer@8898: public int size() { gernotbelger@8964: return this.qs.size(); mschaefer@8898: } gernotbelger@8964: mschaefer@8898: /** mschaefer@8898: * Km mschaefer@8898: */ mschaefer@8898: public double getKm() { gernotbelger@8964: return this.km; mschaefer@8898: } gernotbelger@8964: mschaefer@8898: /** mschaefer@8898: * Adds all q-v-tau to another set of arrays mschaefer@8898: */ gernotbelger@8964: void copyTo(final TDoubleArrayList dstqs, final TDoubleArrayList dstvmains, final TDoubleArrayList dsttaus) { gernotbelger@8964: for (int i = 0; i <= this.qs.size(); i++) { gernotbelger@8964: dstqs.add(this.qs.getQuick(i)); gernotbelger@8964: dstvmains.add(this.vmains.getQuick(i)); gernotbelger@8964: dsttaus.add(this.taus.getQuick(i)); mschaefer@8898: } mschaefer@8898: } gernotbelger@8964: mschaefer@8898: /** mschaefer@8898: * Discharge found by the last {@link findQ} gernotbelger@8964: * mschaefer@8898: * @return mschaefer@8898: */ mschaefer@8898: public double getFindQ() { gernotbelger@8964: return this.findQ; mschaefer@8898: } gernotbelger@8964: mschaefer@8898: /** mschaefer@8898: * Velocity found by the last {@link findQ} mschaefer@8898: */ mschaefer@8898: public double getVmainFound() { gernotbelger@8964: return this.vmainFound; mschaefer@8898: } gernotbelger@8964: mschaefer@8898: /** mschaefer@8898: * Shear stress found by the last {@link findQ} mschaefer@8898: */ mschaefer@8898: public double getTauFound() { gernotbelger@8964: return this.tauFound; mschaefer@8898: } gernotbelger@8964: mschaefer@8898: /** gernotbelger@8964: * Whether qFound has been interpolated mschaefer@8898: */ mschaefer@8898: public boolean getIsInterpolated() { gernotbelger@8964: return this.isInterpolated; mschaefer@8898: } gernotbelger@8964: mschaefer@8898: /** gernotbelger@8964: * Adds a q-v-tau value triple. mschaefer@8898: */ gernotbelger@8964: public void addValues(final double q, final double vmain, final double tau) { gernotbelger@8964: this.qs.add(q); gernotbelger@8964: this.vmains.add(vmain); gernotbelger@8964: this.taus.add(tau); mschaefer@8898: } gernotbelger@8964: mschaefer@8898: /** mschaefer@8898: * Searches a discharge value and returns it or the interpolated value gernotbelger@8964: * mschaefer@8898: * @return Found or interpolated discharge, or NaN otherwise mschaefer@8898: */ gernotbelger@8964: public double findQ(final double q) { gernotbelger@8964: if (this.vInterpolator == null) { gernotbelger@8964: this.vInterpolator = new LinearInterpolator().interpolate(this.qs.toNativeArray(), this.vmains.toNativeArray()); gernotbelger@8964: this.tauInterpolator = new LinearInterpolator().interpolate(this.qs.toNativeArray(), this.taus.toNativeArray()); mschaefer@8898: } gernotbelger@8964: gernotbelger@8964: this.findQ = q; gernotbelger@8964: mschaefer@8898: try { gernotbelger@8964: this.vmainFound = this.vInterpolator.value(q); gernotbelger@8964: this.tauFound = this.tauInterpolator.value(q); gernotbelger@8964: return q; mschaefer@8898: } gernotbelger@8964: catch (final Exception e) { gernotbelger@8964: e.printStackTrace(); gernotbelger@8964: return Double.NaN; gernotbelger@8964: } mschaefer@8898: } gernotbelger@8964: }