Mercurial > dive4elements > river
view artifacts/src/main/java/org/dive4elements/river/artifacts/model/minfo/BedParametersResult.java @ 8581:073ea4bcea58
(issue1755) Interpolate BedQuality Results
This adds an interpolation function to each various bedQuality result class.
Imho this is ok as the interpolation function can be seen as part of the result.
The interpolation function is initalized on first use and can be accessed through
get.*Interpol functions.
author | Andre Heinecke <andre.heinecke@intevation.de> |
---|---|
date | Mon, 16 Mar 2015 15:36:38 +0100 |
parents | af13ceeba52a |
children |
line wrap: on
line source
/* Copyright (C) 2011, 2012, 2013 by Bundesanstalt für Gewässerkunde * Software engineering by Intevation GmbH * * This file is Free Software under the GNU AGPL (>=v3) * and comes with ABSOLUTELY NO WARRANTY! Check out the * documentation coming with Dive4Elements River for details. */ package org.dive4elements.river.artifacts.model.minfo; import gnu.trove.TDoubleArrayList; import org.apache.commons.math.analysis.polynomials.PolynomialSplineFunction; import org.dive4elements.river.utils.DoubleUtil; import org.apache.commons.math.ArgumentOutsideDomainException; import java.io.Serializable; public class BedParametersResult implements Serializable { protected TDoubleArrayList porosityCap; protected TDoubleArrayList porositySub; protected TDoubleArrayList loadDensityCap; protected TDoubleArrayList loadDensitySub; protected TDoubleArrayList kms; protected PolynomialSplineFunction interpolPoroSub; protected PolynomialSplineFunction interpolPoroCap; protected PolynomialSplineFunction interpolDensSub; protected PolynomialSplineFunction interpolDensCap; protected boolean nonInterpolPoroSub; protected boolean nonInterpolPoroCap; protected boolean nonInterpolDensSub; protected boolean nonInterpolDensCap; public BedParametersResult() { } public BedParametersResult( TDoubleArrayList kms, TDoubleArrayList porosityCap, TDoubleArrayList porositySub, TDoubleArrayList densityCap, TDoubleArrayList densitySub ) { this.kms = kms; this.porosityCap = porosityCap; this.porositySub = porositySub; this.loadDensityCap = densityCap; this.loadDensitySub = densitySub; PolynomialSplineFunction interpolPoroSub = null; PolynomialSplineFunction interpolPoroCap = null; PolynomialSplineFunction interpolDensSub = null; PolynomialSplineFunction interpolDensCap = null; nonInterpolPoroSub = false; nonInterpolPoroCap = false; nonInterpolDensSub = false; nonInterpolDensCap = false; } public double getPorosityCap(int ndx) { return porosityCap.get(ndx); } public double getPorositySub(int ndx) { return porositySub.get(ndx); } public double getLoadDensityCap(int ndx) { return loadDensityCap.get(ndx); } public double getLoadDensitySub(int ndx) { return loadDensitySub.get(ndx); } public double getPorosityCap(double km) { if (kms.indexOf(km) >= 0) { return porosityCap.get(kms.indexOf(km)); } return Double.NaN; } public double getPorositySub(double km) { if (kms.indexOf(km) >= 0) { return porositySub.get(kms.indexOf(km)); } return Double.NaN; } public double getLoadDensityCap(double km) { if (kms.indexOf(km) >= 0) { return loadDensityCap.get(kms.indexOf(km)); } return Double.NaN; } public double getLoadDensitySub(double km) { if (kms.indexOf(km) >= 0) { return loadDensitySub.get(kms.indexOf(km)); } return Double.NaN; } public double[][] getPorosityCapData() { return new double[][] { kms.toNativeArray(), porosityCap.toNativeArray() }; } public double[][] getPorositySubData() { return new double[][] { kms.toNativeArray(), porositySub.toNativeArray() }; } public double[][] getDensityCapData() { return new double[][] { kms.toNativeArray(), loadDensityCap.toNativeArray() }; } public double[][] getDensitySubData() { return new double[][] { kms.toNativeArray(), loadDensitySub.toNativeArray() }; } public double getPorositySubInterpol(double km) { if (nonInterpolPoroSub) { return Double.NaN; } if (interpolPoroSub == null) { interpolPoroSub = DoubleUtil.getLinearInterpolator(kms, porositySub); if (interpolPoroSub == null) { nonInterpolPoroSub = true; return Double.NaN; } } try { return interpolPoroSub.value(km); } catch (ArgumentOutsideDomainException e) { /* This is expected for many results. */ return Double.NaN; } } public double getPorosityCapInterpol(double km) { if (nonInterpolPoroCap) { return Double.NaN; } if (interpolPoroCap == null) { interpolPoroCap = DoubleUtil.getLinearInterpolator(kms, porosityCap); if (interpolPoroCap == null) { nonInterpolPoroCap = true; return Double.NaN; } } try { return interpolPoroCap.value(km); } catch (ArgumentOutsideDomainException e) { /* This is expected for many results. */ return Double.NaN; } } public double getDensitySubInterpol(double km) { if (nonInterpolDensSub) { return Double.NaN; } if (interpolDensSub == null) { interpolDensSub = DoubleUtil.getLinearInterpolator(kms, loadDensitySub); if (interpolDensSub == null) { nonInterpolDensSub = true; return Double.NaN; } } try { return interpolDensSub.value(km); } catch (ArgumentOutsideDomainException e) { /* This is expected for many results. */ return Double.NaN; } } public double getDensityCapInterpol(double km) { if (nonInterpolDensCap) { return Double.NaN; } if (interpolDensCap == null) { interpolDensCap = DoubleUtil.getLinearInterpolator(kms, loadDensityCap); if (interpolDensCap == null) { nonInterpolDensCap = true; return Double.NaN; } } try { return interpolDensCap.value(km); } catch (ArgumentOutsideDomainException e) { /* This is expected for many results. */ return Double.NaN; } } }