view artifacts/src/main/java/org/dive4elements/river/artifacts/model/minfo/BedParametersResult.java @ 8584:ce325339e9ba

(issue1754) Add range to W / Bed difference export. This also fixes the Title layout in waterlevel report and removes the year/epoch field from the english beddifference report.
author Andre Heinecke <andre.heinecke@intevation.de>
date Mon, 16 Mar 2015 17:38: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