Mercurial > dive4elements > river
view flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/DischargeTables.java @ 3785:a5f65e8983be
Merged revisions 5501-5502,5504-5508,5511-5513,5516-5519 via svnmerge from
file:///home/clients/bsh/bsh-generischer-viewer/Material/SVN/flys-artifacts/trunk
........
r5501 | felix | 2012-09-18 11:49:45 +0200 (Di, 18 Sep 2012) | 1 line
fix issue865 - missing showarea theme prop.
........
r5502 | clins | 2012-09-18 12:18:30 +0200 (Di, 18 Sep 2012) | 1 line
Add robustness checks to prevent NPEs
........
r5504 | felix | 2012-09-18 14:03:15 +0200 (Di, 18 Sep 2012) | 1 line
i18n for area label (fix issue487).
........
r5505 | clins | 2012-09-18 16:19:59 +0200 (Di, 18 Sep 2012) | 1 line
Update themes to show point descriptions
........
r5506 | rrenkert | 2012-09-18 17:00:30 +0200 (Di, 18 Sep 2012) | 3 lines
Removed incorrect characteristic diameter.
........
r5507 | rrenkert | 2012-09-18 17:03:20 +0200 (Di, 18 Sep 2012) | 3 lines
Fixed some stupid bugs in bed quality data factory and calculation.
........
r5508 | teichmann | 2012-09-18 17:45:49 +0200 (Di, 18 Sep 2012) | 1 line
The usual whitespace and import cleanups.
........
r5511 | teichmann | 2012-09-18 18:24:51 +0200 (Di, 18 Sep 2012) | 1 line
Use generics aware Collections.emptyList().
........
r5512 | teichmann | 2012-09-18 20:36:52 +0200 (Di, 18 Sep 2012) | 1 line
Some more little steps towards "Auslagerung extremer Wasserspiegellagen".
........
r5513 | clins | 2012-09-18 23:38:19 +0200 (Di, 18 Sep 2012) | 1 line
A and B facets of fix analyis are now deactivated by default
........
r5516 | bricks | 2012-09-19 10:45:51 +0200 (Mi, 19 Sep 2012) | 2 lines
Add the gauge station to the GaugeOverviewInfoService xml response
........
r5517 | rrenkert | 2012-09-19 10:50:23 +0200 (Mi, 19 Sep 2012) | 3 lines
Added CSV export to bed quality calculation.
........
r5518 | bricks | 2012-09-19 11:04:04 +0200 (Mi, 19 Sep 2012) | 2 lines
Fix date in changelog entry
........
r5519 | teichmann | 2012-09-19 11:17:14 +0200 (Mi, 19 Sep 2012) | 1 line
Removed trailing whitespace.
........
flys-artifacts/tags/2.9.1@5531 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author | Ingo Weinzierl <ingo.weinzierl@intevation.de> |
---|---|
date | Wed, 19 Sep 2012 14:58:31 +0000 |
parents | b2ea89a665bc |
children | 1d9c9a3493ea |
line wrap: on
line source
package de.intevation.flys.artifacts.model; import java.util.List; import java.util.Map; import java.util.HashMap; import java.util.Arrays; import java.io.Serializable; import org.hibernate.Session; import org.hibernate.Query; import org.apache.log4j.Logger; import de.intevation.flys.backend.SessionHolder; import de.intevation.flys.model.Gauge; import de.intevation.flys.model.DischargeTable; import de.intevation.flys.model.DischargeTableValue; import gnu.trove.TDoubleArrayList; /** Documentation goes here. */ public class DischargeTables implements Serializable { /** Private logger. */ private static Logger log = Logger.getLogger(DischargeTables.class); public static final double DEFAULT_SCALE = 100.0; public static final int MASTER = 0; protected List<String> gaugeNames; protected String riverName; protected double scale; protected int kind; protected Map<String, double [][]> values; public DischargeTables() { } public DischargeTables(String riverName, String gaugeName) { this(riverName, gaugeName, MASTER); } public DischargeTables(String riverName, String gaugeName, int kind) { this(riverName, new String [] { gaugeName }, kind); } public DischargeTables(String riverName, String [] gaugeNames) { this(riverName, gaugeNames, MASTER); } public DischargeTables(String riverName, String [] gaugeNames, int kind) { this(riverName, Arrays.asList(gaugeNames), kind); } public DischargeTables( String riverName, List<String> gaugeNames, int kind ) { scale = Double.NaN; this.kind = kind; this.riverName = riverName; this.gaugeNames = gaugeNames; } public double [][] getFirstTable() { return getFirstTable(DEFAULT_SCALE); } public double [][] getFirstTable(double scale) { Map<String, double [][]> values = getValues(scale); for (double [][] table: values.values()) { return table; } return null; } public Map<String, double [][]> getValues() { return getValues(DEFAULT_SCALE); } public Map<String, double [][]> getValues(double scale) { if (values == null || scale != this.scale) { values = loadValues(scale); this.scale = scale; } return values; } /** * Returns mapping of gauge name to values. */ protected Map<String, double [][]> loadValues(double scale) { Map<String, double [][]> values = new HashMap<String, double [][]>(); Session session = SessionHolder.HOLDER.get(); Query gaugeQuery = session.createQuery( "from Gauge where name=:gauge and river.name=:river"); gaugeQuery.setParameter("river", riverName); for (String gaugeName: gaugeNames) { gaugeQuery.setParameter("gauge", gaugeName); List<Gauge> gauges = gaugeQuery.list(); if (gauges.isEmpty()) { log.warn( "no gauge '"+gaugeName+"' at river '"+riverName+"'"); continue; } Gauge gauge = gauges.get(0); List<DischargeTable> tables = gauge.getDischargeTables(); if (tables.isEmpty()) { log.warn( "no discharge table for gauge '" + gaugeName + "'"); continue; } // TODO: Filter by time interval DischargeTable table = tables.get(0); double [][] vs = loadDischargeTableValues(table, scale); values.put(gaugeName, vs); } return values; } /** * @param table The discharge table * @param scale The scale factor to adjust W and Q values. * * @return the values of a discharge table. */ public static double[][] loadDischargeTableValues( DischargeTable table, double scale ) { List<DischargeTableValue> dtvs = table.getDischargeTableValues(); final double [][] vs = new double[2][dtvs.size()]; int idx = 0; for (DischargeTableValue dtv: dtvs) { double q = dtv.getQ().doubleValue(); vs[0][idx] = q * scale; vs[1][idx] = dtv.getW().doubleValue() * scale; ++idx; } return vs; } private static final double EPSILON = 1e-5; private static final boolean epsEquals(double a, double b) { return Math.abs(a - b) < EPSILON; } private static final boolean between(double a, double b, double x) { if (a > b) { double t = a; a = b; b = t; } return x > a && x < b; } public static double [] getQsForW(double [][] values, double w) { boolean debug = log.isDebugEnabled(); if (debug) { log.debug("getQsForW: W = " + w); } double [] qs = values[0]; double [] ws = values[1]; int N = Math.min(qs.length, ws.length); if (N == 0) { if (debug) { log.debug("Q(" + w + ") = []"); } return new double [0]; } TDoubleArrayList outQs = new TDoubleArrayList(); if (epsEquals(ws[0], w)) { outQs.add(qs[0]); } for (int i = 1; i < N; ++i) { if (epsEquals(ws[i], w)) { outQs.add(qs[i]); } else if (between(ws[i-1], ws[i], w)) { double w1 = ws[i-1]; double w2 = ws[i]; double q1 = qs[i-1]; double q2 = qs[i]; // q1 = m*w1 + b // q2 = m*w2 + b // q2 - q1 = m*(w2 - w1) // m = (q2 - q1)/(w2 - w1) # w2 != w1 // b = q1 - m*w1 // w1 != w2 double m = (q2 - q1)/(w2 - w1); double b = q1 - m*w1; double q = w*m + b; outQs.add(q); } } double [] result = outQs.toNativeArray(); if (debug) { log.debug("Q(" + w + ") = " + Arrays.toString(result)); } return result; } } // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :