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;
        }
    }

}

http://dive4elements.wald.intevation.org