view flys-artifacts/src/main/java/de/intevation/flys/exports/ATWriter.java @ 729:078934923acb

New AT writer for results. flys-artifacts/trunk@2219 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Thu, 23 Jun 2011 15:50:44 +0000
parents
children 39d191f011dc
line wrap: on
line source
package de.intevation.flys.exports;

import java.io.IOException;
import java.io.Writer;
import java.io.PrintWriter;

import java.util.Locale;

import de.intevation.flys.artifacts.model.WQ;

import org.apache.commons.math.analysis.interpolation.SplineInterpolator;

import org.apache.commons.math.analysis.polynomials.PolynomialSplineFunction;

import org.apache.commons.math.ArgumentOutsideDomainException;

import org.apache.log4j.Logger;

public class ATWriter
{
    private static Logger logger = Logger.getLogger(ATWriter.class);

    public static final int COLUMNS = 10;

    public static final String EMPTY = "             ";

    protected double minW;
    protected double maxW;
    protected double minQ;
    protected double maxQ;

    protected PolynomialSplineFunction qFunc;

    public ATWriter() {
    }

    public ATWriter(WQ wq) throws IllegalArgumentException {

        int maxIndex = maxIncreasingWIndex(wq);

        if (maxIndex < 1) { // Only first w can be written out.
            minW = maxW = wq.getW(0);
            minQ = maxQ = wq.getQ(0);
            return;
        }

        double [] ws = new double[maxIndex+1];
        double [] qs = new double[ws.length];

        for (int i = 0; i < ws.length; ++i) {
            ws[i] = wq.getW(i);
            qs[i] = wq.getQ(i);
        }

        SplineInterpolator interpolator = new SplineInterpolator();

        qFunc = interpolator.interpolate(ws, qs);

        minW = wq.getW(0);
        maxW = wq.getW(maxIndex);
        minQ = wq.getQ(0);
        maxQ = wq.getQ(maxIndex);
    }

    public static int maxIncreasingWIndex(WQ wq) {

        int N = wq.size();

        if (N < 2) {
            return N-1;
        }

        double last = wq.getW(0);

        for (int i = 1; i < N; ++i) {
            double current = wq.getW(i);
            if (current <= last) {
                return i-1;
            }
        }

        return N-1;
    }

    public double getQ(double w) {

        try {
            return qFunc.value(w);
        }
        catch (ArgumentOutsideDomainException aode) {
            // should not happen
            logger.warn("spline interpolation failed", aode);
            return w <= minW ? minQ : maxQ;
        }
    }

    protected static void printQ(PrintWriter out, double q) {
        String format;
             if (q <   1) format = " % 8.3f";
        else if (q <  10) format = " % 8.2f";
        else if (q < 100) format = " % 8.1f";
        else {
            format = " % 8.0f";
            if (q > 1000) q = Math.rint(q/10)*10;
        }
        out.printf(Locale.US, format, q);
    }

    public void write(Writer writer) throws IOException {

        PrintWriter out = new PrintWriter(writer);

        double range = COLUMNS;

        double rest = Math.abs(minW % range);

        int startW = (int)(minW - rest);
        if (rest >= 1d) {
            out.printf(Locale.US, "%8d", startW);
            int columns = (int)Math.floor(rest);
            for (int i = columns; i < COLUMNS; ++i) {
                out.print(EMPTY);
            }
            for (int i = 0, N = COLUMNS-columns; i < N; ++i) {
                printQ(out, getQ(startW + (COLUMNS-i-1)));
            }
            startW += COLUMNS;
        }

        int col = 0;
        for (int w = startW; w <= maxW; ++w) {
            if (col == 0) out.printf(Locale.US, "%8d", w);

            printQ(out, getQ(w));

            if (++col >= COLUMNS) {
                out.println();
                col = 0;
            }
        }

        if (col > 0) {
            out.println();
        }

        out.flush();
    }
}
// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :

http://dive4elements.wald.intevation.org