teichmann@5863: /* Copyright (C) 2011, 2012, 2013 by Bundesanstalt für Gewässerkunde teichmann@5863: * Software engineering by Intevation GmbH teichmann@5863: * teichmann@5863: * This file is Free Software under the GNU AGPL (>=v3) teichmann@5863: * and comes with ABSOLUTELY NO WARRANTY! Check out the teichmann@5863: * documentation coming with Dive4Elements River for details. teichmann@5863: */ teichmann@5863: teichmann@5831: package org.dive4elements.river.artifacts.model.sq; teichmann@3992: rrenkert@4837: import java.util.Arrays; rrenkert@4837: rrenkert@4837: import org.apache.log4j.Logger; rrenkert@4837: teichmann@3992: public class SieveArray teichmann@3992: { rrenkert@4837: private static final Logger log = rrenkert@4837: Logger.getLogger(SieveArray.class); rrenkert@4837: teichmann@3992: public static final double EPSILON = 1e-8; teichmann@3992: teichmann@3992: public static final double [] SIEVE_DIAMETERS = { teichmann@3992: 100d, 63d, 31.5d, 16d, teichmann@3992: 8d, 4d, 2d, 1d, teichmann@3992: 0.5d, 0.25d, 0.125d, 0.063d teichmann@3992: }; teichmann@3992: teichmann@3992: protected double [] loads; teichmann@3992: protected double [] normLoads; teichmann@3992: teichmann@3992: public SieveArray() { teichmann@3992: loads = new double[SIEVE_DIAMETERS.length+1]; teichmann@3992: normLoads = new double[SIEVE_DIAMETERS.length+1]; teichmann@3992: } teichmann@3992: teichmann@3992: public void doSieving(Sieve s) { teichmann@3992: teichmann@3992: double diameter = s.getDiameter(); teichmann@3992: teichmann@3992: for (int i = 0; i < SIEVE_DIAMETERS.length; ++i) { teichmann@3992: if (diameter >= SIEVE_DIAMETERS[i]) { teichmann@3992: loads[i] += s.getLoad(); teichmann@3992: return; teichmann@3992: } teichmann@3992: } teichmann@3992: loads[loads.length-1] += s.getLoad(); teichmann@3992: } teichmann@3992: teichmann@3992: public double totalLoad() { teichmann@3992: double sum = 0d; teichmann@3992: for (double load: loads) { teichmann@3992: sum += load; teichmann@3992: } teichmann@3992: return sum; teichmann@3992: } teichmann@3992: teichmann@3992: public void calculateNormLoads() { teichmann@3992: double total = totalLoad(); teichmann@3992: if (Math.abs(total) < EPSILON) { teichmann@4001: System.arraycopy(loads, 0, normLoads, 0, loads.length); teichmann@3992: return; teichmann@3992: } teichmann@3992: total = 1d/total; teichmann@3992: for (int i = 0; i < normLoads.length; ++i) { teichmann@3992: normLoads[i] = total*loads[i]; teichmann@3992: } rrenkert@4837: log.debug("calculated norm loads: " + Arrays.toString(normLoads)); teichmann@3992: } teichmann@3992: rrenkert@4813: public void adjust(double eight, double four) { rrenkert@4813: this.normLoads[4] = eight; rrenkert@4813: this.normLoads[5] = four; rrenkert@4813: } rrenkert@4813: teichmann@3992: /** teichmann@3992: * Gets the loads for this instance. teichmann@3992: * teichmann@3992: * @return The loads. teichmann@3992: */ teichmann@3992: public double[] getLoads() { teichmann@3992: return this.loads; teichmann@3992: } teichmann@3992: teichmann@3992: /** teichmann@3992: * Gets the loads for this instance. teichmann@3992: * teichmann@3992: * @param index The index to get. teichmann@3992: * @return The loads. teichmann@3992: */ teichmann@3992: public double getLoads(int index) { teichmann@3992: return this.loads[index]; teichmann@3992: } teichmann@3992: teichmann@3992: /** teichmann@3992: * Gets the normLoads for this instance. teichmann@3992: * teichmann@3992: * @return The normLoads. teichmann@3992: */ teichmann@3992: public double[] getNormLoads() { teichmann@3992: return this.normLoads; teichmann@3992: } teichmann@3992: teichmann@3992: /** teichmann@3992: * Gets the normLoads for this instance. teichmann@3992: * teichmann@3992: * @param index The index to get. teichmann@3992: * @return The normLoads. teichmann@3992: */ teichmann@3992: public double getNormLoads(int index) { teichmann@3992: return this.normLoads[index]; teichmann@3992: } teichmann@4004: teichmann@4004: public double sandNormFraction() { teichmann@4004: double sum = 0d; rrenkert@4813: for (int i = 7; i < normLoads.length; ++i) { teichmann@4004: sum += normLoads[i]; teichmann@4004: } teichmann@4004: return sum; teichmann@4004: } teichmann@4004: teichmann@4004: public double coarseNormFraction() { teichmann@4004: double sum = 0d; teichmann@4004: for (int i = 0; i < 4; ++i) { teichmann@4004: sum += normLoads[i]; teichmann@4004: } teichmann@4004: return sum; teichmann@4004: } teichmann@4004: teichmann@4004: public double gravelNormFraction() { teichmann@4004: double sum = 0d; rrenkert@4813: for (int i = 4; i < 7; ++i) { teichmann@4004: sum += normLoads[i]; teichmann@4004: } teichmann@4004: return sum; teichmann@4004: } teichmann@3992: } teichmann@3992: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 :