Mercurial > dive4elements > river
view flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/minfo/SedimentDensity.java @ 4968:d76705b68e73
FixRealizingCalculation: TODO/issue comment.
author | Felix Wolfsteller <felix.wolfsteller@intevation.de> |
---|---|
date | Wed, 06 Feb 2013 09:57:27 +0100 |
parents | 2fadc6c5cdad |
children | 84e02b3f7a4f |
line wrap: on
line source
package de.intevation.flys.artifacts.model.minfo; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; import org.apache.log4j.Logger; public class SedimentDensity { private static final Logger logger = Logger .getLogger(SedimentDensity.class); private Map<Integer, List<SedimentDensityValue>> densities; private List<Integer> years; public SedimentDensity() { this.densities = new HashMap<Integer, List<SedimentDensityValue>>(); this.years = new ArrayList<Integer>(); } public Map<Integer, List<SedimentDensityValue>> getDensities() { return densities; } public void setDensities(Map<Integer, List<SedimentDensityValue>> densities) { this.densities = densities; } public void addDensity(double km, double density, int year) { logger.debug("adding " + year); if (this.densities.containsKey(year)) { List<SedimentDensityValue> list = this.densities.get(year); list.add(new SedimentDensityValue(km, density, year)); } else { List<SedimentDensityValue> list = new ArrayList<SedimentDensityValue>(); list.add(new SedimentDensityValue(km, density, year)); densities.put(year, list); } if (!this.years.contains(new Integer(year))) { logger.debug("new year"); years.add(new Integer(year)); } } public List<Integer> getYears() { return years; } public void setYears(List<Integer> years) { this.years = years; } public double getDensity(double km, int year) { Collections.sort(this.years); if (this.years.size() == 1) { return getDensityAtKm(densities.get(year), km); } else { for (int i = 0; i < years.size() -1; i++) { int y1 = years.get(i); int y2 = years.get(i + 1); int mid = Math.round((y1 + y2) / 2); if (year < mid) { return getDensityAtKm(densities.get(y1), km); } else if (i == years.size() -1) { continue; } else { return getDensityAtKm(densities.get(y2), km); } } } return -1d; } private double getDensityAtKm( List<SedimentDensityValue> values, double km ) { boolean found = true; SedimentDensityValue prev = null; SedimentDensityValue next = null; for (SedimentDensityValue sdv: values) { logger.debug("year: " + sdv.getYear()); if (sdv.getKm() == km) { prev = sdv; found = true; break; } if (sdv.getKm() > km) { next = sdv; break; } prev = sdv; } if (found) { return prev.getDensity(); } else { return spline(prev, next, km); } } private double spline( SedimentDensityValue prev, SedimentDensityValue next, double km ) { double lower = prev.getKm(); double upper = next.getKm(); double upperDensity = next.getDensity(); double lowerDensity = prev.getDensity(); double m =(upperDensity - lowerDensity)/(upper - lower) * km; double b = lowerDensity - ((upperDensity - lowerDensity)/(upper - lower) * lower); return (m * km) + b; } public void cleanUp() { Set<Integer> keys = densities.keySet(); for (Integer key : keys) { List<SedimentDensityValue> list = densities.get(key); if (list.size() == 0) { return; } List<SedimentDensityValue> cleaned = new ArrayList<SedimentDensityValue>(); double prevkm = list.get(0).getKm(); int counter = 0; double sum = 0d; for (SedimentDensityValue value : list) { if (value.getKm() == prevkm) { sum += value.getDensity(); counter++; } else { cleaned.add(new SedimentDensityValue( prevkm, sum / counter, value.getYear())); sum = value.getDensity(); counter = 1; } prevkm = value.getKm(); } this.densities.put(key, cleaned); } } }