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 mschaefer@8898: * @author Matthias Schäfer mschaefer@8898: * mschaefer@8898: */ mschaefer@8898: public class FlowVelocityKmModelValues { mschaefer@8898: mschaefer@8898: /***** FIELDS *****/ mschaefer@8898: mschaefer@8898: /** mschaefer@8898: * Km mschaefer@8898: */ mschaefer@8898: private double km; mschaefer@8898: mschaefer@8898: /** mschaefer@8898: * The station's discharge model values, sorted in ascending order mschaefer@8898: */ mschaefer@8898: private TDoubleArrayList qs; mschaefer@8898: mschaefer@8898: /** mschaefer@8898: * The station's main section velocity for the q values mschaefer@8898: */ mschaefer@8898: private TDoubleArrayList vmains; mschaefer@8898: mschaefer@8898: /** mschaefer@8898: * The station's shear stress (tau) values for the q values mschaefer@8898: */ mschaefer@8898: private TDoubleArrayList taus; mschaefer@8898: mschaefer@8898: /** mschaefer@8898: * Discharge found by the last findQ mschaefer@8898: */ mschaefer@8898: private double findQ; mschaefer@8898: mschaefer@8898: /** mschaefer@8898: * Velocity found by the last {@link findQ} mschaefer@8898: */ mschaefer@8898: private double vmainFound; mschaefer@8898: mschaefer@8898: /** mschaefer@8898: * Shear stress found by the last {@link findQ} mschaefer@8898: */ mschaefer@8898: private double tauFound; mschaefer@8898: mschaefer@8898: /** mschaefer@8898: * Whether qFound has been interpolated mschaefer@8898: */ mschaefer@8898: private boolean isInterpolated; mschaefer@8898: mschaefer@8898: /** mschaefer@8898: * Real linear interpolator for q and v values mschaefer@8898: */ mschaefer@8898: private PolynomialSplineFunction vInterpolator; mschaefer@8898: mschaefer@8898: /** mschaefer@8898: * Real linear interpolator for q and tau values mschaefer@8898: */ mschaefer@8898: private PolynomialSplineFunction tauInterpolator; mschaefer@8898: mschaefer@8898: mschaefer@8898: /***** CONSTRUCTORS *****/ mschaefer@8898: mschaefer@8898: /** mschaefer@8898: * Constructor with km parameter mschaefer@8898: */ mschaefer@8898: public FlowVelocityKmModelValues(double km) { mschaefer@8898: this.km = km; mschaefer@8898: qs = new TDoubleArrayList(); mschaefer@8898: vmains = new TDoubleArrayList(); mschaefer@8898: taus = new TDoubleArrayList(); mschaefer@8898: vInterpolator = null; mschaefer@8898: tauInterpolator = null; mschaefer@8898: } mschaefer@8898: mschaefer@8898: /** mschaefer@8898: * Copy constructor with new km mschaefer@8898: */ mschaefer@8898: public FlowVelocityKmModelValues(double km, FlowVelocityKmModelValues src) { mschaefer@8898: this(km); mschaefer@8898: src.copyTo(qs, vmains, taus); mschaefer@8898: } mschaefer@8898: mschaefer@8898: /***** METHODS *****/ mschaefer@8898: mschaefer@8898: /** mschaefer@8898: * Number of the q-v-tau tuples mschaefer@8898: */ mschaefer@8898: public int size() { mschaefer@8898: if (qs != null) mschaefer@8898: return qs.size(); mschaefer@8898: else mschaefer@8898: return 0; mschaefer@8898: } mschaefer@8898: mschaefer@8898: /** mschaefer@8898: * Km mschaefer@8898: */ mschaefer@8898: public double getKm() { mschaefer@8898: return km; mschaefer@8898: } mschaefer@8898: mschaefer@8898: /** mschaefer@8898: * Adds all q-v-tau to another set of arrays mschaefer@8898: */ mschaefer@8898: void copyTo(TDoubleArrayList dstqs, TDoubleArrayList dstvmains, TDoubleArrayList dsttaus) { mschaefer@8898: for (int i = 0; i <= qs.size(); i++) { mschaefer@8898: dstqs.add(qs.getQuick(i)); mschaefer@8898: dstvmains.add(vmains.getQuick(i)); mschaefer@8898: dsttaus.add(taus.getQuick(i)); mschaefer@8898: } mschaefer@8898: } mschaefer@8898: mschaefer@8898: /** mschaefer@8898: * Discharge found by the last {@link findQ} mschaefer@8898: * @return mschaefer@8898: */ mschaefer@8898: public double getFindQ() { mschaefer@8898: return findQ; mschaefer@8898: } mschaefer@8898: mschaefer@8898: /** mschaefer@8898: * Velocity found by the last {@link findQ} mschaefer@8898: */ mschaefer@8898: public double getVmainFound() { mschaefer@8898: return vmainFound; mschaefer@8898: } mschaefer@8898: mschaefer@8898: /** mschaefer@8898: * Shear stress found by the last {@link findQ} mschaefer@8898: */ mschaefer@8898: public double getTauFound() { mschaefer@8898: return tauFound; mschaefer@8898: } mschaefer@8898: mschaefer@8898: /** mschaefer@8898: * Whether qFound has been interpolated mschaefer@8898: */ mschaefer@8898: public boolean getIsInterpolated() { mschaefer@8898: return isInterpolated; mschaefer@8898: } mschaefer@8898: mschaefer@8898: /** mschaefer@8898: * Adds a q-v-tau value triple. mschaefer@8898: */ mschaefer@8898: public void addValues(double q, double vmain, double tau) { mschaefer@8898: qs.add(q); mschaefer@8898: vmains.add(vmain); mschaefer@8898: taus.add(tau); mschaefer@8898: } mschaefer@8898: mschaefer@8898: /** mschaefer@8898: * Searches a discharge value and returns it or the interpolated value mschaefer@8898: * @return Found or interpolated discharge, or NaN otherwise mschaefer@8898: */ mschaefer@8898: public double findQ(double q) { mschaefer@8898: if (vInterpolator == null) { mschaefer@8898: vInterpolator = new LinearInterpolator().interpolate(qs.toNativeArray(), vmains.toNativeArray()); mschaefer@8898: tauInterpolator = new LinearInterpolator().interpolate(qs.toNativeArray(), taus.toNativeArray()); mschaefer@8898: } mschaefer@8898: findQ = q; mschaefer@8898: try { mschaefer@8898: vmainFound = vInterpolator.value(q); mschaefer@8898: tauFound = tauInterpolator.value(q); mschaefer@8898: } catch (Exception e) { mschaefer@8898: q = Double.NaN; mschaefer@8898: } mschaefer@8898: return q; mschaefer@8898: } mschaefer@8898: }