teichmann@5863: /* Copyright (C) 2011, 2012, 2013 by Bundesanstalt für Gewässerkunde teichmann@5863: * Software engineering by Intevation GmbH teichmann@5863: * teichmann@5994: * This file is Free Software under the GNU AGPL (>=v3) teichmann@5863: * and comes with ABSOLUTELY NO WARRANTY! Check out the teichmann@5994: * documentation coming with Dive4Elements River for details. teichmann@5863: */ teichmann@5863: teichmann@5831: package org.dive4elements.river.artifacts.model.minfo; rrenkert@4373: rrenkert@4373: import gnu.trove.TDoubleArrayList; rrenkert@4373: rrenkert@4373: import java.util.ArrayList; felix@6498: import java.util.TreeSet; rrenkert@4373: import java.util.List; rrenkert@4373: rrenkert@4373: import org.apache.log4j.Logger; rrenkert@4373: teichmann@5831: import org.dive4elements.river.artifacts.access.SedimentLoadAccess; teichmann@5831: import org.dive4elements.river.artifacts.model.Calculation; teichmann@5831: import org.dive4elements.river.artifacts.model.CalculationResult; felix@6381: import org.dive4elements.river.artifacts.model.Range; rrenkert@4373: rrenkert@4373: felix@4483: /** Calculate sediment load. */ rrenkert@4373: public class SedimentLoadCalculation rrenkert@4373: extends Calculation rrenkert@4373: { rrenkert@4373: felix@4483: /** Private logger. */ rrenkert@4373: private static final Logger logger = Logger rrenkert@4373: .getLogger(SedimentLoadCalculation.class); rrenkert@4373: rrenkert@4373: protected String river; rrenkert@4373: protected String yearEpoch; rrenkert@4373: protected double kmUp; rrenkert@4373: protected double kmLow; rrenkert@4373: protected int[] period; rrenkert@4373: protected int[][] epoch; rrenkert@4373: protected String unit; rrenkert@4373: rrenkert@4373: public SedimentLoadCalculation() { rrenkert@4373: } rrenkert@4373: felix@6678: /** Returns CalculationResult with array of SedimentLoadResults. */ rrenkert@4373: public CalculationResult calculate(SedimentLoadAccess access) { rrenkert@4373: logger.info("SedimentLoadCalculation.calculate"); rrenkert@4373: rrenkert@4373: String river = access.getRiver(); rrenkert@4373: String yearEpoch = access.getYearEpoch(); rrenkert@4373: String unit = access.getUnit(); rrenkert@4373: int[] period = null; rrenkert@4373: int[][] epoch = null; rrenkert@4373: double kmUp = access.getUpperKM(); rrenkert@4373: double kmLow = access.getLowerKM(); rrenkert@4373: if (yearEpoch.equals("year")) { rrenkert@4373: period = access.getPeriod(); rrenkert@4373: epoch = null; rrenkert@4373: } rrenkert@4522: else if (yearEpoch.equals("epoch") || yearEpoch.equals("off_epoch")) { rrenkert@4373: epoch = access.getEpochs(); rrenkert@4373: period = null; rrenkert@4373: } rrenkert@4373: else { rrenkert@4373: addProblem("minfo.missing.year_epoch"); rrenkert@4373: } rrenkert@4373: rrenkert@4373: if (river == null) { rrenkert@4373: // TODO: i18n rrenkert@4373: addProblem("minfo.missing.river"); rrenkert@4373: } rrenkert@4373: rrenkert@4373: if (period == null && epoch == null) { rrenkert@4373: addProblem("minfo.missing.time"); rrenkert@4373: } rrenkert@4373: rrenkert@4373: if (!hasProblems()) { rrenkert@4373: this.river = river; rrenkert@4373: this.yearEpoch = yearEpoch; rrenkert@4373: this.unit = unit; rrenkert@4373: this.period = period; rrenkert@4373: this.epoch = epoch; rrenkert@4373: this.kmUp = kmUp; rrenkert@4373: this.kmLow = kmLow; rrenkert@4373: return internalCalculate(); rrenkert@4373: } rrenkert@4373: rrenkert@4373: return new CalculationResult(); rrenkert@4373: } rrenkert@4373: felix@6678: /** Returns CalculationResult with array of SedimentLoadResults. */ rrenkert@4373: private CalculationResult internalCalculate() { rrenkert@4373: logger.debug("internalCalulate; mode:" + yearEpoch); rrenkert@4373: if (yearEpoch.equals("year")) { rrenkert@4373: List results = rrenkert@4373: new ArrayList(); rrenkert@4373: for (int i = period[0]; i <= period[1]; i++) { rrenkert@4373: SedimentLoadResult res = calculateYear(i); rrenkert@4373: results.add(res); rrenkert@4373: } rrenkert@4373: return new CalculationResult( rrenkert@4373: results.toArray(new SedimentLoadResult[results.size()]), this); rrenkert@4373: } rrenkert@4373: else if (yearEpoch.equals("epoch")) { rrenkert@4373: List results = rrenkert@4373: new ArrayList(); rrenkert@4373: for (int i = 0; i < epoch.length; i++) { rrenkert@4373: SedimentLoadResult res = calculateEpoch(i); rrenkert@4373: results.add(res); rrenkert@4373: } rrenkert@4373: return new CalculationResult( rrenkert@4373: results.toArray(new SedimentLoadResult[results.size()]), this); rrenkert@4373: } rrenkert@4373: else if (yearEpoch.equals("off_epoch")) { rrenkert@4373: List results = rrenkert@4373: new ArrayList(); rrenkert@4373: for (int i = 0; i < epoch.length; i++) { rrenkert@4373: SedimentLoadResult res = calculateOffEpoch(i); rrenkert@4373: results.add(res); rrenkert@4373: } rrenkert@4373: return new CalculationResult( rrenkert@4373: results.toArray(new SedimentLoadResult[results.size()]), this); rrenkert@4373: } rrenkert@4373: return null; rrenkert@4373: } rrenkert@4373: rrenkert@4373: private SedimentLoadResult calculateEpoch(int i) { rrenkert@4373: List epochLoads = new ArrayList(); rrenkert@4373: for (int j = epoch[i][0]; j < epoch[i][1]; j++) { felix@5661: epochLoads.add(SedimentLoadFactory.getLoadWithData( rrenkert@4373: this.river, rrenkert@4373: this.yearEpoch, rrenkert@4373: this.kmLow, rrenkert@4373: this.kmUp, rrenkert@4373: j, rrenkert@4373: j)); rrenkert@4373: } rrenkert@4373: rrenkert@4373: SedimentLoad resLoad = new SedimentLoad(); rrenkert@4373: TDoubleArrayList kms = new TDoubleArrayList(); rrenkert@4373: rrenkert@4373: for (SedimentLoad load : epochLoads) { rrenkert@4373: for (double km : load.getKms()) { rrenkert@4373: if (!kms.contains(km)) { rrenkert@4373: kms.add(km); rrenkert@4373: } rrenkert@4373: } rrenkert@4373: } rrenkert@4373: rrenkert@4373: for (int j = 0; j < kms.size(); j++) { rrenkert@4373: int cSum = 0; rrenkert@4373: int fmSum = 0; rrenkert@4373: int sSum = 0; rrenkert@4373: int ssSum = 0; rrenkert@4373: int ssbSum = 0; rrenkert@4373: int sseSum = 0; rrenkert@4373: double km = kms.get(j); rrenkert@4373: for (SedimentLoad load : epochLoads) { rrenkert@4373: SedimentLoadFraction f = load.getFraction(km); rrenkert@4373: if (f.getCoarse() > 0d) { rrenkert@4373: double c = resLoad.getFraction(km).getCoarse(); felix@6374: resLoad.setCoarse(km, c + f.getCoarse(), f.getCoarseRange()); rrenkert@4373: cSum++; rrenkert@4373: } felix@6376: if (f.getFineMiddle() > 0d) { felix@6376: double fm = resLoad.getFraction(km).getFineMiddle(); felix@6376: resLoad.setFineMiddle(km, fm + f.getFineMiddle(), f.getFineMiddleRange()); rrenkert@4373: fmSum++; rrenkert@4373: } rrenkert@4373: if (f.getSand() > 0d) { rrenkert@4373: double s = resLoad.getFraction(km).getSand(); felix@6374: resLoad.setSand(km, s + f.getSand(), f.getSandRange()); rrenkert@4373: sSum++; rrenkert@4373: } felix@6376: if (f.getSuspSand() > 0d) { felix@6376: double s = resLoad.getFraction(km).getSuspSand(); felix@6376: resLoad.setSuspSand(km, s + f.getSuspSand(), f.getSuspSandRange()); rrenkert@4373: ssSum++; rrenkert@4373: } felix@6376: if (f.getSuspSandBed() > 0d) { felix@6376: double s = resLoad.getFraction(km).getSuspSandBed(); felix@6376: resLoad.setSuspSandBed(km, s + f.getSuspSandBed(), f.getSuspSandBedRange()); rrenkert@4373: ssbSum++; rrenkert@4373: } felix@6376: if (f.getSuspSediment() > 0d) { felix@6376: double s = resLoad.getFraction(km).getSuspSediment(); felix@6376: resLoad.setSuspSediment(km, s + f.getSuspSediment(), f.getSuspSedimentRange()); rrenkert@4373: sseSum++; rrenkert@4373: } rrenkert@4373: } rrenkert@4373: SedimentLoadFraction fr = resLoad.getFraction(km); felix@6543: // Prevent divisions by zero, the fraction defaults to 0d. felix@6543: if (cSum != 0) { felix@6543: resLoad.setCoarse(km, fr.getCoarse()/cSum, fr.getCoarseRange()); felix@6543: } felix@6543: if (fmSum != 0) { felix@6543: resLoad.setFineMiddle(km, fr.getFineMiddle()/fmSum, felix@6543: fr.getFineMiddleRange()); felix@6543: } felix@6543: if (sSum != 0) { felix@6543: resLoad.setSand(km, fr.getSand()/sSum, fr.getSandRange()); felix@6543: } felix@6543: if (ssSum != 0) { felix@6543: resLoad.setSuspSand(km, fr.getSuspSand()/ssSum, felix@6543: fr.getSuspSandRange()); felix@6543: } felix@6543: if (ssbSum != 0) { felix@6543: resLoad.setSuspSandBed(km, fr.getSuspSandBed()/ssbSum, felix@6543: fr.getSuspSandBedRange()); felix@6543: } felix@6543: if (sseSum != 0) { felix@6543: resLoad.setSuspSediment(km, fr.getSuspSediment()/sseSum, fr.getSuspSedimentRange()); felix@6543: } rrenkert@4373: } rrenkert@4373: resLoad.setDescription(""); rrenkert@4373: resLoad.setEpoch(true); rrenkert@4373: rrenkert@4522: SedimentLoadResult result; rrenkert@4522: SedimentLoad sl = calculateTotalLoad(resLoad, this.epoch[i][0]); rrenkert@4522: if (this.unit.equals("m3_per_a")) { rrenkert@4522: SedimentLoad slu = calculateUnit(sl, this.epoch[i][0]); rrenkert@4522: result = new SedimentLoadResult( rrenkert@4522: this.epoch[i][0], rrenkert@4522: this.epoch[i][1], rrenkert@4522: slu); rrenkert@4522: } rrenkert@4522: else { rrenkert@4522: result = new SedimentLoadResult( rrenkert@4522: this.epoch[i][0], rrenkert@4522: this.epoch[i][1], rrenkert@4522: sl); rrenkert@4522: } rrenkert@4522: rrenkert@4522: return result; rrenkert@4373: } rrenkert@4373: rrenkert@4373: private SedimentLoadResult calculateOffEpoch(int i) { felix@5661: SedimentLoad load = SedimentLoadFactory.getLoadWithData( rrenkert@4522: this.river, rrenkert@4522: this.yearEpoch, rrenkert@4522: kmLow, rrenkert@4522: kmUp, rrenkert@4522: this.epoch[i][0], rrenkert@4522: this.epoch[i][1]); rrenkert@4522: SedimentLoadResult result; rrenkert@4522: SedimentLoad sl = calculateTotalLoad(load, this.epoch[i][0]); rrenkert@4522: if (unit.equals("m3_per_a")) { rrenkert@4522: SedimentLoad slu = calculateUnit(sl, epoch[i][0]); rrenkert@4522: result = new SedimentLoadResult( rrenkert@4522: this.epoch[i][0], rrenkert@4522: this.epoch[i][1], rrenkert@4522: slu); rrenkert@4522: } rrenkert@4522: else { rrenkert@4522: result = new SedimentLoadResult( rrenkert@4522: this.epoch[i][0], rrenkert@4522: this.epoch[i][1], rrenkert@4522: sl); rrenkert@4522: } rrenkert@4522: rrenkert@4522: return result; rrenkert@4373: } rrenkert@4373: felix@6678: /** felix@6678: * Fetch loads for a single year, calculate total and felix@6678: * return the result containing both. felix@6678: * @param y year, e.g. 1980 felix@6678: */ rrenkert@4373: private SedimentLoadResult calculateYear(int y) { felix@5661: SedimentLoad load = SedimentLoadFactory.getLoadWithData( rrenkert@4373: this.river, rrenkert@4373: this.yearEpoch, rrenkert@4373: this.kmLow, rrenkert@4373: this.kmUp, rrenkert@4373: y, rrenkert@4373: y); rrenkert@4373: rrenkert@4522: SedimentLoadResult result; rrenkert@4522: SedimentLoad sl = calculateTotalLoad(load, y); rrenkert@4373: if (unit.equals("m3_per_a")) { rrenkert@4522: SedimentLoad slu = calculateUnit(sl, y); rrenkert@4522: result = new SedimentLoadResult(y, 0, slu); rrenkert@4373: } rrenkert@4522: else { rrenkert@4522: result = new SedimentLoadResult(y, 0, sl); rrenkert@4522: } rrenkert@4373: return result; rrenkert@4373: } rrenkert@4373: felix@6374: /** Add up the loads of a year. */ rrenkert@4522: private SedimentLoad calculateTotalLoad(SedimentLoad load, int year) { rrenkert@4522: logger.debug("calculateTotalLoad"); felix@5685: boolean problemThisYear = false; rrenkert@4522: if (!load.hasCoarse()) { felix@5742: addProblem("missing.fraction.coarse", Integer.toString(year)); felix@5685: problemThisYear = true; rrenkert@4373: } rrenkert@4522: if (!load.hasFineMiddle()) { felix@5742: addProblem("missing.fraction.fine_middle", Integer.toString(year)); felix@5685: problemThisYear = true; rrenkert@4522: } rrenkert@4522: if (!load.hasSand()) { felix@5742: addProblem("missing.fraction.sand", Integer.toString(year)); felix@5685: problemThisYear = true; rrenkert@4522: } rrenkert@4522: if (!load.hasSuspSand()) { felix@5742: addProblem("missing.fraction.susp_sand", Integer.toString(year)); felix@5685: problemThisYear = true; rrenkert@4522: } rrenkert@4522: if (!load.hasSuspSediment()) { felix@5742: addProblem("missing.fraction.susp_sediment", Integer.toString(year)); felix@5685: problemThisYear = true; rrenkert@4522: } felix@5685: if (problemThisYear) { felix@5685: logger.warn("Some problem, not calculating total load."); rrenkert@4522: return load; rrenkert@4522: } felix@6381: return partialTotal(load); felix@6381: } felix@6381: felix@6381: felix@6381: /** Returns true if all fraction values except SuspSediment are unset. */ felix@6404: private boolean hasOnlySuspValues(SedimentLoadFraction fraction) { felix@6381: return (fraction.getSuspSediment() != 0d && felix@6381: fraction.getCoarse() == 0d && felix@6381: fraction.getFineMiddle() == 0d && felix@6411: fraction.getSand() == 0d && felix@6411: fraction.getSuspSand() == 0d); felix@6381: } felix@6381: felix@6381: felix@6381: /** Returns true if all fraction values except SuspSediment are set. */ felix@6404: private boolean hasButSuspValues(SedimentLoadFraction fraction) { felix@6381: return (fraction.getSuspSediment() == 0d && felix@6381: fraction.getCoarse() != 0d && felix@6381: fraction.getFineMiddle() != 0d && felix@6411: fraction.getSand() != 0d && felix@6411: fraction.getSuspSand() != 0d); felix@6381: } felix@6381: felix@6381: felix@6381: /** Returns true if all fraction needed for total calculation are set. */ felix@6381: private boolean complete(SedimentLoadFraction fraction) { felix@6381: return (fraction.getCoarse() != 0d && felix@6381: fraction.getFineMiddle() != 0d && felix@6381: fraction.getSand() != 0d && felix@6381: fraction.getSuspSand() != 0d && felix@6381: fraction.getSuspSediment() != 0d); felix@6381: } felix@6381: felix@6381: felix@6381: /** felix@6381: * Set total values in load. felix@6678: * felix@6678: * Therefore, run over the sorted kms and find ranges where either all felix@6381: * or all Geschiebe or just the Schwebstoff fractions are set. felix@6381: * Merge these ranges and add (maybe new) respective fractions to felix@6678: * load. In the process, remember any 'unfished' ends from measurements felix@6678: * where the km-ranges did not completely match. felix@6678: * felix@6381: * @param load SedimentLoad to add total values (and ranges) to. felix@6678: * @return input param load, with total values set. felix@6381: */ felix@6381: private SedimentLoad partialTotal(SedimentLoad load) { felix@6381: SedimentLoad fairLoad = load; felix@6381: felix@6381: Range lastOtherRange = null; felix@6381: double lastOtherValue = 0d; felix@6381: felix@6404: Range lastSuspRange = null; felix@6404: double lastSuspValue = 0d; felix@6381: felix@6498: TreeSet kms = new TreeSet(load.getKms()); felix@6498: felix@6498: for (double km: kms) { felix@6381: logger.debug ("Trying to add at km " + km); rrenkert@4522: SedimentLoadFraction fraction = load.getFraction(km); felix@6381: if (complete(fraction)) { felix@6381: double total = fraction.getCoarse() + felix@6381: fraction.getFineMiddle() + felix@6381: fraction.getSand() + felix@6381: fraction.getSuspSand() + felix@6381: fraction.getSuspSediment(); felix@6381: // Easiest case. Add values up and set'em. felix@6381: if (fraction.getCoarseRange().equals( felix@6381: fraction.getSuspSedimentRange())) { felix@6381: lastOtherRange = null; felix@6404: lastSuspRange = null; felix@6381: fairLoad.setTotal(km, total, fraction.getCoarseRange()); felix@6381: } felix@6381: else { felix@6381: // Need to split a range. felix@6381: if (fraction.getCoarseRange().getEnd() felix@6381: < fraction.getSuspSedimentRange().getEnd()) { felix@6381: // Schwebstoff is longer. felix@6381: // Adjust and remember schwebstoffs range and value. felix@6404: lastSuspRange = (Range) fraction.getSuspSedimentRange().clone(); felix@6404: lastSuspRange.setStart(fraction.getCoarseRange().getEnd()); felix@6411: lastSuspValue = fraction.getSuspSediment(); felix@6381: lastOtherRange = null; felix@6381: fairLoad.setTotal(km, total, fraction.getCoarseRange()); felix@6381: } felix@6381: else { felix@6381: // Geschiebe is longer. felix@6381: // Adjust and remember other values. felix@6381: lastOtherRange = (Range) fraction.getSuspSedimentRange().clone(); felix@6381: lastOtherRange.setStart(fraction.getSuspSedimentRange().getEnd()); felix@6381: lastOtherValue = (total - fraction.getSuspSediment()); felix@6404: lastSuspRange = null; felix@6381: fairLoad.setTotal(km, total, fraction.getSuspSedimentRange()); felix@6381: } felix@6381: } rrenkert@4522: } felix@6404: else if (hasOnlySuspValues(fraction) && lastOtherRange != null) { felix@6381: // Split stuff. felix@6381: Range suspSedimentRange = fraction.getSuspSedimentRange(); felix@6381: // if intersects with last other range, cool! merge and add! felix@6381: if (lastOtherRange.contains(km)) { felix@6381: double maxStart = 0d; felix@6381: double minEnd = 0d; felix@6381: maxStart = Math.max(suspSedimentRange.getStart(), felix@6381: lastOtherRange.getStart()); felix@6381: felix@6381: minEnd = Math.min(suspSedimentRange.getEnd(), felix@6381: lastOtherRange.getEnd()); felix@6381: double total = lastOtherValue + fraction.getSuspSediment(); felix@6381: Range totalRange = new Range(maxStart, minEnd); felix@6381: if (suspSedimentRange.getEnd() > lastOtherRange.getEnd()) { felix@6404: lastSuspRange = (Range) suspSedimentRange.clone(); felix@6404: lastSuspRange.setStart(lastOtherRange.getEnd()); felix@6411: lastSuspValue = fraction.getSuspSediment(); felix@6381: lastOtherRange = null; felix@6381: } felix@6381: else { felix@6381: // Other is "longer". felix@6381: lastOtherRange.setStart(suspSedimentRange.getEnd()); felix@6404: lastSuspRange = null; felix@6381: } felix@6381: if (Math.abs(suspSedimentRange.getEnd() - lastOtherRange.getEnd()) < 0.1d) { felix@6381: lastOtherRange = null; felix@6404: lastSuspRange = null; felix@6381: } felix@6381: fairLoad.setTotal(km, total + fraction.getSuspSediment(), totalRange); felix@6381: } felix@6381: else { felix@6404: lastSuspRange = suspSedimentRange; felix@6411: lastSuspValue = fraction.getSuspSediment(); felix@6381: lastOtherRange = null; felix@6381: } rrenkert@4522: } felix@6404: else if (hasButSuspValues(fraction) && lastSuspRange != null) { felix@6381: // If intersects with last suspsed range, merge and add felix@6381: double total = fraction.getCoarse() + felix@6381: fraction.getFineMiddle() + felix@6381: fraction.getSand() + felix@6411: fraction.getSuspSand() + felix@6404: lastSuspValue; felix@6381: double maxStart = Math.max(fraction.getCoarseRange().getStart(), felix@6404: lastSuspRange.getStart()); felix@6404: if (lastSuspRange.contains(km)) { felix@6381: double minEnd = Math.min(fraction.getCoarseRange().getEnd(), felix@6404: lastSuspRange.getEnd()); felix@6381: Range totalRange = new Range(maxStart, minEnd); felix@6404: if (lastSuspRange.getEnd() > fraction.getCoarseRange().getEnd()) { felix@6381: // SuspSed longer. felix@6404: lastSuspRange.setStart(fraction.getCoarseRange().getEnd()); felix@6381: lastOtherRange = null; felix@6381: } felix@6381: else { felix@6381: // Other longer felix@6381: lastOtherRange = (Range) fraction.getCoarseRange().clone(); felix@6404: lastOtherRange.setStart(lastSuspRange.getEnd()); felix@6404: lastSuspRange = null; felix@6404: lastOtherValue = total - lastSuspValue; felix@6381: } felix@6499: if (lastSuspRange != null && Math.abs(lastSuspRange.getEnd() - lastOtherRange.getEnd()) < 0.1d) { felix@6381: lastOtherRange = null; felix@6404: lastSuspRange = null; felix@6381: } felix@6381: fairLoad.setTotal(km, total, totalRange); felix@6381: } felix@6381: else { felix@6381: // Ranges are disjoint. felix@6381: lastOtherRange = fraction.getCoarseRange(); felix@6381: lastOtherValue = total - fraction.getSuspSediment(); felix@6404: lastSuspRange = null; felix@6381: } felix@6381: } felix@6381: else { felix@6381: // Some values are missing or no intersection with former values. felix@6381: // Stay as we are. felix@6500: if (hasButSuspValues(fraction)) { felix@6500: double total = fraction.getCoarse() + felix@6500: fraction.getFineMiddle() + felix@6500: fraction.getSand() + felix@6500: fraction.getSuspSand(); felix@6500: lastOtherRange = fraction.getCoarseRange(); felix@6500: lastOtherValue = total; felix@6500: lastSuspRange = null; felix@6500: } felix@6500: else if (hasOnlySuspValues(fraction)) { felix@6500: lastSuspRange = fraction.getSuspSedimentRange(); felix@6500: lastSuspValue = fraction.getSuspSediment(); felix@6500: lastOtherRange = null; felix@6500: } felix@6381: } rrenkert@4373: } felix@6381: return fairLoad; rrenkert@4373: } rrenkert@4373: felix@6381: felix@6678: /** felix@6678: * Transform values in load. felix@6678: * @param load The load of which values should be transformed. felix@6678: * @return parameter load with transformed values. felix@6678: */ rrenkert@4522: private SedimentLoad calculateUnit(SedimentLoad load, int year) { rrenkert@4522: SedimentDensity density = rrenkert@4522: SedimentDensityFactory.getSedimentDensity(river, kmLow, kmUp, year); rrenkert@4522: for (double km: load.getKms()) { rrenkert@4522: double dens = density.getDensity(km, year); rrenkert@4522: SedimentLoadFraction fraction = load.getFraction(km); rrenkert@4522: double coarse = fraction.getCoarse(); felix@6376: double fineMiddle = fraction.getFineMiddle(); rrenkert@4522: double sand = fraction.getSand(); felix@6376: double suspSand = fraction.getSuspSand(); felix@6376: double bedSand = fraction.getSuspSandBed(); felix@6376: double sediment = fraction.getSuspSediment(); rrenkert@4522: double total = fraction.getTotal(); felix@6374: load.setCoarse(km, (coarse * dens), fraction.getCoarseRange()); felix@6374: load.setFineMiddle(km, (fineMiddle * dens), fraction.getFineMiddleRange()); felix@6374: load.setSand(km, (sand * dens), fraction.getSandRange()); felix@6374: load.setSuspSand(km, (suspSand * dens), fraction.getSuspSandRange()); felix@6374: load.setSuspSandBed(km, (bedSand * dens), fraction.getSuspSandBedRange()); felix@6374: load.setSuspSediment(km, (sediment * dens), fraction.getSuspSedimentRange()); felix@6374: load.setTotal(km, (total * dens), fraction.getTotalRange()); rrenkert@4522: } rrenkert@4373: return load; rrenkert@4373: } rrenkert@4373: } felix@4483: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 :