Mercurial > dive4elements > river
changeset 8049:d49846f05108
Sediment load: (incomplete) new sediment load calculation.
author | Sascha L. Teichmann <teichmann@intevation.de> |
---|---|
date | Thu, 17 Jul 2014 16:51:18 +0200 (2014-07-17) |
parents | cde6d2a9ec32 |
children | 9e79e384aa8b |
files | artifacts/src/main/java/org/dive4elements/river/artifacts/model/minfo/SedimentLoadDataCalculation.java |
diffstat | 1 files changed, 152 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/model/minfo/SedimentLoadDataCalculation.java Thu Jul 17 16:51:18 2014 +0200 @@ -0,0 +1,152 @@ +/* Copyright (C) 2014 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 java.util.List; +import java.util.Set; + +import org.dive4elements.river.artifacts.access.SedimentLoadAccess; +import org.dive4elements.river.artifacts.model.Calculation; +import org.dive4elements.river.artifacts.model.CalculationResult; +import org.apache.log4j.Logger; +import org.dive4elements.river.artifacts.model.minfo.SedimentLoadData; +import org.dive4elements.river.artifacts.model.minfo.SedimentLoadData.Value; +import org.dive4elements.river.artifacts.model.minfo.SedimentLoadData.Station; + +public class SedimentLoadDataCalculation +extends Calculation +{ + private static final Logger log = Logger + .getLogger(SedimentLoadDataCalculation.class); + + public static final int [] TOTAL_LOAD_FLYS = { + SedimentLoadData.GF_COARSE, + SedimentLoadData.GF_FINE_MIDDLE, + SedimentLoadData.GF_SAND, + SedimentLoadData.GF_SUSP_SEDIMENT + }; + + public static final int [] BED_LOAD_FLYS = { + SedimentLoadData.GF_COARSE, + SedimentLoadData.GF_FINE_MIDDLE, + SedimentLoadData.GF_SAND + }; + + public static final int [] BED_LOAD_SUSP_SAND_FLYS = { + SedimentLoadData.GF_COARSE, + SedimentLoadData.GF_FINE_MIDDLE, + SedimentLoadData.GF_SAND, + SedimentLoadData.GF_SUSP_SAND + }; + + public static final class Sum implements Value.Visitor { + + private int n; + private double sum; + private double scale; + + public Sum() { + } + + public Sum(double scale) { + this.scale = scale; + } + + public double getSum() { + return sum * scale; + } + + public int getN() { + return n; + } + + public double getScale() { + return scale; + } + + public void reset() { + n = 0; + sum = 0.0; + } + + @Override + public void visit(Value value) { + sum += value.getValue(); + ++n; + } + } // class Aggregate + + + public SedimentLoadDataCalculation() { + } + + public CalculationResult calculate(SedimentLoadAccess access) { + log.info("SedimentLoadDataCalculation.calculate"); + // TODO: Implement me! + + return null; + } + + private static double sum(double [] values) { + double sum = 0.0; + for (double value: values) { + sum += value; + } + return sum; + } + + public double[][] sum( + SedimentLoadData sld, + double from, + double to, + int [] grainFractions, + Value.Filter filter, + Sum sum, + boolean isKMUp, + Set<Integer> missingFractions + ) { + List<Station> stations = sld.findStations(from, to); + + double [] values = new double[grainFractions.length]; + + double [][] result = new double[2][stations.size()]; + + for (int j = 0, S = stations.size(); j < S; ++j) { + Station station = stations.get(j); + for (int i = 0; i < grainFractions.length; ++i) { + int gf = grainFractions[i]; + sum.reset(); + station.filterGrainFraction(gf, filter, sum); + if (sum.getN() == 0) { // No values found + int msType = SedimentLoadData.measurementStationType(gf); + // Station of right fraction type already? No: take previous. + if (!station.isType(msType)) { + Station prev = station.prevByType(msType, isKMUp); + if (prev != null) { + prev.filterGrainFraction(gf, filter, sum); + } + } + } + + if (sum.getN() == 0) { + missingFractions.add(gf); + values[i] = Double.NaN; + } else { + values[i] = sum.getSum(); + } + } + result[0][j] = station.getStation(); + result[1][j] = sum(values); + } + + // TODO: Handle 'virtual' measument stations 'from' and 'to'. + + return result; + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 :