Mercurial > dive4elements > river
view artifacts/src/main/java/org/dive4elements/river/artifacts/model/minfo/BedParametersResult.java @ 8587:07c9ac22f611
(issue1755) Generalise BedQuality result handling
The bedquality calculation now produces a result for each time period
which has BedQualityResultValues for each specific result type.
Formally this was split up in density, porosity and diameter classes
with some bedload diameter classes mixed in for extra fun.
The intent of this commit is to allow more shared code and generic
access patterns to the BedQuality results.
author | Andre Heinecke <andre.heinecke@intevation.de> |
---|---|
date | Wed, 18 Mar 2015 18:42:08 +0100 |
parents | 073ea4bcea58 |
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; } } }