teichmann@5863: /* Copyright (C) 2011, 2012, 2013 by Bundesanstalt für Gewässerkunde teichmann@5863: * Software engineering by Intevation GmbH teichmann@5863: * teichmann@5994: * This file is Free Software under the GNU AGPL (>=v3) teichmann@5863: * and comes with ABSOLUTELY NO WARRANTY! Check out the teichmann@5994: * documentation coming with Dive4Elements River for details. teichmann@5863: */ teichmann@5863: teichmann@5831: package org.dive4elements.river.artifacts.model.minfo; ingo@3784: ingo@3784: import gnu.trove.TDoubleArrayList; andre@8581: import org.apache.commons.math.analysis.polynomials.PolynomialSplineFunction; andre@8581: import org.dive4elements.river.utils.DoubleUtil; andre@8581: import org.apache.commons.math.ArgumentOutsideDomainException; ingo@3784: ingo@3784: import java.io.Serializable; ingo@3784: ingo@3784: ingo@3784: public class BedParametersResult ingo@3784: implements Serializable ingo@3784: { ingo@3784: protected TDoubleArrayList porosityCap; ingo@3784: protected TDoubleArrayList porositySub; ingo@3784: protected TDoubleArrayList loadDensityCap; ingo@3784: protected TDoubleArrayList loadDensitySub; ingo@3784: protected TDoubleArrayList kms; ingo@3784: andre@8581: protected PolynomialSplineFunction interpolPoroSub; andre@8581: protected PolynomialSplineFunction interpolPoroCap; andre@8581: protected PolynomialSplineFunction interpolDensSub; andre@8581: protected PolynomialSplineFunction interpolDensCap; andre@8581: andre@8581: protected boolean nonInterpolPoroSub; andre@8581: protected boolean nonInterpolPoroCap; andre@8581: protected boolean nonInterpolDensSub; andre@8581: protected boolean nonInterpolDensCap; andre@8581: ingo@3784: public BedParametersResult() { ingo@3784: ingo@3784: } ingo@3784: ingo@3784: public BedParametersResult( ingo@3784: TDoubleArrayList kms, ingo@3784: TDoubleArrayList porosityCap, ingo@3784: TDoubleArrayList porositySub, ingo@3784: TDoubleArrayList densityCap, ingo@3784: TDoubleArrayList densitySub ingo@3784: ) { ingo@3784: this.kms = kms; ingo@3784: this.porosityCap = porosityCap; ingo@3784: this.porositySub = porositySub; ingo@3784: this.loadDensityCap = densityCap; ingo@3784: this.loadDensitySub = densitySub; andre@8581: andre@8581: PolynomialSplineFunction interpolPoroSub = null; andre@8581: PolynomialSplineFunction interpolPoroCap = null; andre@8581: PolynomialSplineFunction interpolDensSub = null; andre@8581: PolynomialSplineFunction interpolDensCap = null; andre@8581: andre@8581: nonInterpolPoroSub = false; andre@8581: nonInterpolPoroCap = false; andre@8581: nonInterpolDensSub = false; andre@8581: nonInterpolDensCap = false; ingo@3784: } ingo@3784: ingo@3784: public double getPorosityCap(int ndx) { ingo@3784: return porosityCap.get(ndx); ingo@3784: } ingo@3784: ingo@3784: public double getPorositySub(int ndx) { ingo@3784: return porositySub.get(ndx); ingo@3784: } ingo@3784: ingo@3784: public double getLoadDensityCap(int ndx) { ingo@3784: return loadDensityCap.get(ndx); ingo@3784: } ingo@3784: ingo@3784: public double getLoadDensitySub(int ndx) { ingo@3784: return loadDensitySub.get(ndx); ingo@3784: } ingo@3784: ingo@3785: public double getPorosityCap(double km) { ingo@3785: if (kms.indexOf(km) >= 0) { ingo@3785: return porosityCap.get(kms.indexOf(km)); ingo@3785: } ingo@3785: return Double.NaN; ingo@3785: } ingo@3785: ingo@3785: public double getPorositySub(double km) { ingo@3785: if (kms.indexOf(km) >= 0) { ingo@3785: return porositySub.get(kms.indexOf(km)); ingo@3785: } ingo@3785: return Double.NaN; ingo@3785: } ingo@3785: ingo@3785: public double getLoadDensityCap(double km) { ingo@3785: if (kms.indexOf(km) >= 0) { ingo@3785: return loadDensityCap.get(kms.indexOf(km)); ingo@3785: } ingo@3785: return Double.NaN; ingo@3785: } ingo@3785: ingo@3785: public double getLoadDensitySub(double km) { ingo@3785: if (kms.indexOf(km) >= 0) { ingo@3785: return loadDensitySub.get(kms.indexOf(km)); ingo@3785: } ingo@3785: return Double.NaN; ingo@3785: } ingo@3785: ingo@3784: public double[][] getPorosityCapData() { ingo@3784: return new double[][] { ingo@3784: kms.toNativeArray(), ingo@3784: porosityCap.toNativeArray() ingo@3784: }; ingo@3784: } ingo@3784: ingo@3784: public double[][] getPorositySubData() { ingo@3784: return new double[][] { ingo@3784: kms.toNativeArray(), ingo@3784: porositySub.toNativeArray() ingo@3784: }; ingo@3784: } ingo@3784: ingo@3784: public double[][] getDensityCapData() { ingo@3784: return new double[][] { ingo@3784: kms.toNativeArray(), ingo@3784: loadDensityCap.toNativeArray() ingo@3784: }; ingo@3784: } ingo@3784: ingo@3784: public double[][] getDensitySubData() { ingo@3784: return new double[][] { ingo@3784: kms.toNativeArray(), ingo@3784: loadDensitySub.toNativeArray() ingo@3784: }; ingo@3784: } andre@8581: andre@8581: public double getPorositySubInterpol(double km) { andre@8581: if (nonInterpolPoroSub) { andre@8581: return Double.NaN; andre@8581: } andre@8581: if (interpolPoroSub == null) { andre@8581: interpolPoroSub = DoubleUtil.getLinearInterpolator(kms, porositySub); andre@8581: if (interpolPoroSub == null) { andre@8581: nonInterpolPoroSub = true; andre@8581: return Double.NaN; andre@8581: } andre@8581: } andre@8581: try { andre@8581: return interpolPoroSub.value(km); andre@8581: } catch (ArgumentOutsideDomainException e) { andre@8581: /* This is expected for many results. */ andre@8581: return Double.NaN; andre@8581: } andre@8581: } andre@8581: andre@8581: public double getPorosityCapInterpol(double km) { andre@8581: if (nonInterpolPoroCap) { andre@8581: return Double.NaN; andre@8581: } andre@8581: if (interpolPoroCap == null) { andre@8581: interpolPoroCap = DoubleUtil.getLinearInterpolator(kms, porosityCap); andre@8581: if (interpolPoroCap == null) { andre@8581: nonInterpolPoroCap = true; andre@8581: return Double.NaN; andre@8581: } andre@8581: } andre@8581: try { andre@8581: return interpolPoroCap.value(km); andre@8581: } catch (ArgumentOutsideDomainException e) { andre@8581: /* This is expected for many results. */ andre@8581: return Double.NaN; andre@8581: } andre@8581: } andre@8581: andre@8581: public double getDensitySubInterpol(double km) { andre@8581: if (nonInterpolDensSub) { andre@8581: return Double.NaN; andre@8581: } andre@8581: if (interpolDensSub == null) { andre@8581: interpolDensSub = DoubleUtil.getLinearInterpolator(kms, loadDensitySub); andre@8581: if (interpolDensSub == null) { andre@8581: nonInterpolDensSub = true; andre@8581: return Double.NaN; andre@8581: } andre@8581: } andre@8581: try { andre@8581: return interpolDensSub.value(km); andre@8581: } catch (ArgumentOutsideDomainException e) { andre@8581: /* This is expected for many results. */ andre@8581: return Double.NaN; andre@8581: } andre@8581: } andre@8581: andre@8581: public double getDensityCapInterpol(double km) { andre@8581: if (nonInterpolDensCap) { andre@8581: return Double.NaN; andre@8581: } andre@8581: if (interpolDensCap == null) { andre@8581: interpolDensCap = DoubleUtil.getLinearInterpolator(kms, loadDensityCap); andre@8581: if (interpolDensCap == null) { andre@8581: nonInterpolDensCap = true; andre@8581: return Double.NaN; andre@8581: } andre@8581: } andre@8581: try { andre@8581: return interpolDensCap.value(km); andre@8581: } catch (ArgumentOutsideDomainException e) { andre@8581: /* This is expected for many results. */ andre@8581: return Double.NaN; andre@8581: } andre@8581: } andre@8581: ingo@3784: }