rrenkert@4373: package de.intevation.flys.artifacts.model.minfo; rrenkert@4373: rrenkert@4373: import gnu.trove.TDoubleArrayList; rrenkert@4373: rrenkert@4373: import java.util.ArrayList; rrenkert@4373: import java.util.Iterator; rrenkert@4373: import java.util.List; rrenkert@4373: import java.util.Set; rrenkert@4373: rrenkert@4373: import org.apache.log4j.Logger; rrenkert@4373: import org.jfree.util.Log; rrenkert@4373: rrenkert@4373: import de.intevation.flys.artifacts.access.SedimentLoadAccess; rrenkert@4373: import de.intevation.flys.artifacts.model.Calculation; rrenkert@4373: import de.intevation.flys.artifacts.model.CalculationResult; 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: 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@4373: else if (yearEpoch.equals("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: 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: logger.debug("calculating for year: " + 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++) { rrenkert@4373: 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(); rrenkert@4373: resLoad.setCoarse(km, c + f.getCoarse()); rrenkert@4373: cSum++; rrenkert@4373: } rrenkert@4373: if (f.getFine_middle() > 0d) { rrenkert@4373: double fm = resLoad.getFraction(km).getFine_middle(); rrenkert@4373: resLoad.setFineMiddle(km, fm + f.getFine_middle()); rrenkert@4373: fmSum++; rrenkert@4373: } rrenkert@4373: if (f.getSand() > 0d) { rrenkert@4373: double s = resLoad.getFraction(km).getSand(); rrenkert@4373: resLoad.setSand(km, s + f.getSand()); rrenkert@4373: sSum++; rrenkert@4373: } rrenkert@4373: if (f.getSusp_sand() > 0d) { rrenkert@4373: double s = resLoad.getFraction(km).getSand(); rrenkert@4373: resLoad.setSuspSand(km, s + f.getSusp_sand()); rrenkert@4373: ssSum++; rrenkert@4373: } rrenkert@4373: if (f.getSusp_sand_bed() > 0d) { rrenkert@4373: double s = resLoad.getFraction(km).getSusp_sand_bed(); rrenkert@4373: resLoad.setSuspSandBed(km, s + f.getSusp_sand_bed()); rrenkert@4373: ssbSum++; rrenkert@4373: } rrenkert@4373: if (f.getSusp_sediment() > 0d) { rrenkert@4373: double s = resLoad.getFraction(km).getSusp_sediment(); rrenkert@4373: resLoad.setSuspSediment(km, s + f.getSusp_sediment()); rrenkert@4373: sseSum++; rrenkert@4373: } rrenkert@4373: } rrenkert@4373: SedimentLoadFraction fr = resLoad.getFraction(km); rrenkert@4373: resLoad.setCoarse(km, fr.getCoarse()/cSum); rrenkert@4373: resLoad.setFineMiddle(km, fr.getFine_middle()/fmSum); rrenkert@4373: resLoad.setSand(km, fr.getSand()/sSum); rrenkert@4373: resLoad.setSuspSand(km, fr.getSusp_sand()/ssSum); rrenkert@4373: resLoad.setSuspSandBed(km, fr.getSusp_sand_bed()/ssbSum); rrenkert@4373: resLoad.setSuspSediment(km, fr.getSusp_sediment()/sseSum); rrenkert@4373: } rrenkert@4373: resLoad.setDescription(""); rrenkert@4373: resLoad.setEpoch(true); rrenkert@4373: rrenkert@4373: SedimentLoad sl = calculateTotalLoad(resLoad); rrenkert@4373: return new SedimentLoadResult(epoch[i][0], epoch[i][1], sl); rrenkert@4373: } rrenkert@4373: rrenkert@4373: private SedimentLoadResult calculateOffEpoch(int i) { rrenkert@4373: return null; rrenkert@4373: } rrenkert@4373: rrenkert@4373: private SedimentLoadResult calculateYear(int y) { rrenkert@4373: 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@4373: SedimentLoad sl = calculateTotalLoad(load); rrenkert@4373: if (unit.equals("m3_per_a")) { rrenkert@4373: SedimentLoad slu = calculateUnit(sl); rrenkert@4373: } rrenkert@4373: rrenkert@4373: SedimentLoadResult result = new SedimentLoadResult( rrenkert@4373: y, rrenkert@4373: 0, rrenkert@4373: sl); rrenkert@4373: return result; rrenkert@4373: } rrenkert@4373: rrenkert@4373: private SedimentLoad validateData(SedimentLoad load) { rrenkert@4373: SedimentLoad clean = new SedimentLoad(); rrenkert@4373: Set kms = load.getKms(); rrenkert@4373: for (double km : kms) { rrenkert@4373: SedimentLoadFraction fraction = load.getFraction(km); rrenkert@4373: if (fraction.getCoarse() > 0 && rrenkert@4373: fraction.getFine_middle() > 0 && rrenkert@4373: fraction.getSand() > 0 && rrenkert@4373: fraction.getSusp_sand() > 0&& rrenkert@4373: fraction.getSusp_sand_bed() > 0 && rrenkert@4373: fraction.getSusp_sediment() > 0) { rrenkert@4373: clean.addKm(km, fraction); rrenkert@4373: } rrenkert@4373: } rrenkert@4373: return clean; rrenkert@4373: } rrenkert@4373: rrenkert@4373: private SedimentLoad calculateTotalLoad(SedimentLoad load) { rrenkert@4373: Log.debug("calculateTotalLoad"); rrenkert@4373: SedimentLoad clean = validateData(load); rrenkert@4373: if (clean.getKms().size() > 0) { rrenkert@4373: Iterator iter = clean.getKms().iterator(); rrenkert@4373: while (iter.hasNext()) { rrenkert@4373: double km = iter.next(); rrenkert@4373: SedimentLoadFraction f =clean.getFraction(km); rrenkert@4373: double total = f.getCoarse() + rrenkert@4373: f.getFine_middle() + rrenkert@4373: f.getSand() + rrenkert@4373: f.getSusp_sand() + rrenkert@4373: f.getSusp_sediment(); rrenkert@4373: load.setTotal(km, total); rrenkert@4373: } rrenkert@4373: } rrenkert@4373: return load; rrenkert@4373: } rrenkert@4373: rrenkert@4373: private SedimentLoad calculateUnit(SedimentLoad load) { rrenkert@4373: //TODO implement me! rrenkert@4373: return load; rrenkert@4373: } rrenkert@4373: } felix@4483: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 :