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

}

http://dive4elements.wald.intevation.org