annotate artifacts/src/main/java/org/dive4elements/river/artifacts/model/DischargeTables.java @ 5863:4897a58c8746

River artifacts: Added new copyright headers.
author Sascha L. Teichmann <teichmann@intevation.de>
date Sun, 28 Apr 2013 14:40:59 +0200
parents 5aa05a7a34b7
children af13ceeba52a
rev   line source
5863
4897a58c8746 River artifacts: Added new copyright headers.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5838
diff changeset
1 /* Copyright (C) 2011, 2012, 2013 by Bundesanstalt für Gewässerkunde
4897a58c8746 River artifacts: Added new copyright headers.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5838
diff changeset
2 * Software engineering by Intevation GmbH
4897a58c8746 River artifacts: Added new copyright headers.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5838
diff changeset
3 *
4897a58c8746 River artifacts: Added new copyright headers.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5838
diff changeset
4 * This file is Free Software under the GNU AGPL (>=v3)
4897a58c8746 River artifacts: Added new copyright headers.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5838
diff changeset
5 * and comes with ABSOLUTELY NO WARRANTY! Check out the
4897a58c8746 River artifacts: Added new copyright headers.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5838
diff changeset
6 * documentation coming with Dive4Elements River for details.
4897a58c8746 River artifacts: Added new copyright headers.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5838
diff changeset
7 */
4897a58c8746 River artifacts: Added new copyright headers.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5838
diff changeset
8
5831
bd047b71ab37 Repaired internal references
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5340
diff changeset
9 package org.dive4elements.river.artifacts.model;
146
e8dfe6ba2000 Fetch w/q values of discharge tables for given gauges.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
10
e8dfe6ba2000 Fetch w/q values of discharge tables for given gauges.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
11 import java.util.List;
e8dfe6ba2000 Fetch w/q values of discharge tables for given gauges.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
12 import java.util.Map;
e8dfe6ba2000 Fetch w/q values of discharge tables for given gauges.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
13 import java.util.HashMap;
e8dfe6ba2000 Fetch w/q values of discharge tables for given gauges.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
14 import java.util.Arrays;
e8dfe6ba2000 Fetch w/q values of discharge tables for given gauges.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
15
e8dfe6ba2000 Fetch w/q values of discharge tables for given gauges.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
16 import java.io.Serializable;
e8dfe6ba2000 Fetch w/q values of discharge tables for given gauges.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
17
e8dfe6ba2000 Fetch w/q values of discharge tables for given gauges.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
18 import org.hibernate.Session;
e8dfe6ba2000 Fetch w/q values of discharge tables for given gauges.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
19 import org.hibernate.Query;
e8dfe6ba2000 Fetch w/q values of discharge tables for given gauges.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
20
e8dfe6ba2000 Fetch w/q values of discharge tables for given gauges.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
21 import org.apache.log4j.Logger;
e8dfe6ba2000 Fetch w/q values of discharge tables for given gauges.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
22
5831
bd047b71ab37 Repaired internal references
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5340
diff changeset
23 import org.dive4elements.river.backend.SessionHolder;
bd047b71ab37 Repaired internal references
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5340
diff changeset
24 import org.dive4elements.river.model.Gauge;
bd047b71ab37 Repaired internal references
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5340
diff changeset
25 import org.dive4elements.river.model.DischargeTable;
bd047b71ab37 Repaired internal references
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5340
diff changeset
26 import org.dive4elements.river.model.DischargeTableValue;
146
e8dfe6ba2000 Fetch w/q values of discharge tables for given gauges.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
27
2418
899ca89f497e Another partial fix for flys/issue499: Do the W to Q conversions
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2230
diff changeset
28 import gnu.trove.TDoubleArrayList;
899ca89f497e Another partial fix for flys/issue499: Do the W to Q conversions
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2230
diff changeset
29
3050
02254d763bc0 cosmetics.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 2418
diff changeset
30 /** Documentation goes here. */
146
e8dfe6ba2000 Fetch w/q values of discharge tables for given gauges.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
31 public class DischargeTables
e8dfe6ba2000 Fetch w/q values of discharge tables for given gauges.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
32 implements Serializable
e8dfe6ba2000 Fetch w/q values of discharge tables for given gauges.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
33 {
3050
02254d763bc0 cosmetics.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 2418
diff changeset
34 /** Private logger. */
329
0b2358bc716d Discharge table: Added static method getWForQ() to interpolate a w value for a given q value based on a given discharge table.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 328
diff changeset
35 private static Logger log = Logger.getLogger(DischargeTables.class);
0b2358bc716d Discharge table: Added static method getWForQ() to interpolate a w value for a given q value based on a given discharge table.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 328
diff changeset
36
5340
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 4919
diff changeset
37 /** Scale to convert discharge table values of master table into [cm]. */
4138
1d9c9a3493ea #904 Use the correct scale to convert discharge table values into [cm].
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 3269
diff changeset
38 public static final double MASTER_SCALE = 100d;
1d9c9a3493ea #904 Use the correct scale to convert discharge table values into [cm].
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 3269
diff changeset
39
5340
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 4919
diff changeset
40 /** Scale to convert discharge table values of historical tables into [cm]. */
4138
1d9c9a3493ea #904 Use the correct scale to convert discharge table values into [cm].
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 3269
diff changeset
41 public static final double HISTORICAL_SCALE = 1d;
328
07e642030172 Discharge tables: Added convenience constructors/methods to ease the access to the master discharge table of a gauge.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 315
diff changeset
42
07e642030172 Discharge tables: Added convenience constructors/methods to ease the access to the master discharge table of a gauge.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 315
diff changeset
43 public static final int MASTER = 0;
07e642030172 Discharge tables: Added convenience constructors/methods to ease the access to the master discharge table of a gauge.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 315
diff changeset
44
146
e8dfe6ba2000 Fetch w/q values of discharge tables for given gauges.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
45 protected List<String> gaugeNames;
e8dfe6ba2000 Fetch w/q values of discharge tables for given gauges.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
46
e8dfe6ba2000 Fetch w/q values of discharge tables for given gauges.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
47 protected String riverName;
e8dfe6ba2000 Fetch w/q values of discharge tables for given gauges.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
48
154
03362976fa0f DischargeTables: Cache the scale, too. Otherwise two calls to getValues() with different arguments will result in the same output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 153
diff changeset
49 protected double scale;
03362976fa0f DischargeTables: Cache the scale, too. Otherwise two calls to getValues() with different arguments will result in the same output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 153
diff changeset
50
328
07e642030172 Discharge tables: Added convenience constructors/methods to ease the access to the master discharge table of a gauge.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 315
diff changeset
51 protected int kind;
07e642030172 Discharge tables: Added convenience constructors/methods to ease the access to the master discharge table of a gauge.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 315
diff changeset
52
150
c904d52cdfd0 Don't used interleaved x/y data.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 146
diff changeset
53 protected Map<String, double [][]> values;
146
e8dfe6ba2000 Fetch w/q values of discharge tables for given gauges.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
54
e8dfe6ba2000 Fetch w/q values of discharge tables for given gauges.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
55 public DischargeTables() {
e8dfe6ba2000 Fetch w/q values of discharge tables for given gauges.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
56 }
e8dfe6ba2000 Fetch w/q values of discharge tables for given gauges.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
57
328
07e642030172 Discharge tables: Added convenience constructors/methods to ease the access to the master discharge table of a gauge.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 315
diff changeset
58 public DischargeTables(String riverName, String gaugeName) {
07e642030172 Discharge tables: Added convenience constructors/methods to ease the access to the master discharge table of a gauge.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 315
diff changeset
59 this(riverName, gaugeName, MASTER);
146
e8dfe6ba2000 Fetch w/q values of discharge tables for given gauges.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
60 }
e8dfe6ba2000 Fetch w/q values of discharge tables for given gauges.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
61
328
07e642030172 Discharge tables: Added convenience constructors/methods to ease the access to the master discharge table of a gauge.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 315
diff changeset
62 public DischargeTables(String riverName, String gaugeName, int kind) {
07e642030172 Discharge tables: Added convenience constructors/methods to ease the access to the master discharge table of a gauge.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 315
diff changeset
63 this(riverName, new String [] { gaugeName }, kind);
07e642030172 Discharge tables: Added convenience constructors/methods to ease the access to the master discharge table of a gauge.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 315
diff changeset
64 }
07e642030172 Discharge tables: Added convenience constructors/methods to ease the access to the master discharge table of a gauge.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 315
diff changeset
65
07e642030172 Discharge tables: Added convenience constructors/methods to ease the access to the master discharge table of a gauge.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 315
diff changeset
66 public DischargeTables(String riverName, String [] gaugeNames) {
07e642030172 Discharge tables: Added convenience constructors/methods to ease the access to the master discharge table of a gauge.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 315
diff changeset
67 this(riverName, gaugeNames, MASTER);
07e642030172 Discharge tables: Added convenience constructors/methods to ease the access to the master discharge table of a gauge.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 315
diff changeset
68 }
07e642030172 Discharge tables: Added convenience constructors/methods to ease the access to the master discharge table of a gauge.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 315
diff changeset
69
07e642030172 Discharge tables: Added convenience constructors/methods to ease the access to the master discharge table of a gauge.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 315
diff changeset
70 public DischargeTables(String riverName, String [] gaugeNames, int kind) {
07e642030172 Discharge tables: Added convenience constructors/methods to ease the access to the master discharge table of a gauge.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 315
diff changeset
71 this(riverName, Arrays.asList(gaugeNames), kind);
07e642030172 Discharge tables: Added convenience constructors/methods to ease the access to the master discharge table of a gauge.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 315
diff changeset
72 }
07e642030172 Discharge tables: Added convenience constructors/methods to ease the access to the master discharge table of a gauge.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 315
diff changeset
73
07e642030172 Discharge tables: Added convenience constructors/methods to ease the access to the master discharge table of a gauge.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 315
diff changeset
74 public DischargeTables(
07e642030172 Discharge tables: Added convenience constructors/methods to ease the access to the master discharge table of a gauge.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 315
diff changeset
75 String riverName,
07e642030172 Discharge tables: Added convenience constructors/methods to ease the access to the master discharge table of a gauge.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 315
diff changeset
76 List<String> gaugeNames,
07e642030172 Discharge tables: Added convenience constructors/methods to ease the access to the master discharge table of a gauge.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 315
diff changeset
77 int kind
07e642030172 Discharge tables: Added convenience constructors/methods to ease the access to the master discharge table of a gauge.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 315
diff changeset
78 ) {
154
03362976fa0f DischargeTables: Cache the scale, too. Otherwise two calls to getValues() with different arguments will result in the same output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 153
diff changeset
79 scale = Double.NaN;
328
07e642030172 Discharge tables: Added convenience constructors/methods to ease the access to the master discharge table of a gauge.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 315
diff changeset
80 this.kind = kind;
146
e8dfe6ba2000 Fetch w/q values of discharge tables for given gauges.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
81 this.riverName = riverName;
e8dfe6ba2000 Fetch w/q values of discharge tables for given gauges.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
82 this.gaugeNames = gaugeNames;
e8dfe6ba2000 Fetch w/q values of discharge tables for given gauges.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
83 }
e8dfe6ba2000 Fetch w/q values of discharge tables for given gauges.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
84
328
07e642030172 Discharge tables: Added convenience constructors/methods to ease the access to the master discharge table of a gauge.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 315
diff changeset
85 public double [][] getFirstTable() {
4138
1d9c9a3493ea #904 Use the correct scale to convert discharge table values into [cm].
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 3269
diff changeset
86 return getFirstTable(MASTER_SCALE);
328
07e642030172 Discharge tables: Added convenience constructors/methods to ease the access to the master discharge table of a gauge.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 315
diff changeset
87 }
07e642030172 Discharge tables: Added convenience constructors/methods to ease the access to the master discharge table of a gauge.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 315
diff changeset
88
07e642030172 Discharge tables: Added convenience constructors/methods to ease the access to the master discharge table of a gauge.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 315
diff changeset
89 public double [][] getFirstTable(double scale) {
07e642030172 Discharge tables: Added convenience constructors/methods to ease the access to the master discharge table of a gauge.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 315
diff changeset
90 Map<String, double [][]> values = getValues(scale);
07e642030172 Discharge tables: Added convenience constructors/methods to ease the access to the master discharge table of a gauge.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 315
diff changeset
91 for (double [][] table: values.values()) {
07e642030172 Discharge tables: Added convenience constructors/methods to ease the access to the master discharge table of a gauge.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 315
diff changeset
92 return table;
07e642030172 Discharge tables: Added convenience constructors/methods to ease the access to the master discharge table of a gauge.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 315
diff changeset
93 }
07e642030172 Discharge tables: Added convenience constructors/methods to ease the access to the master discharge table of a gauge.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 315
diff changeset
94 return null;
07e642030172 Discharge tables: Added convenience constructors/methods to ease the access to the master discharge table of a gauge.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 315
diff changeset
95 }
07e642030172 Discharge tables: Added convenience constructors/methods to ease the access to the master discharge table of a gauge.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 315
diff changeset
96
07e642030172 Discharge tables: Added convenience constructors/methods to ease the access to the master discharge table of a gauge.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 315
diff changeset
97 public Map<String, double [][]> getValues() {
4138
1d9c9a3493ea #904 Use the correct scale to convert discharge table values into [cm].
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 3269
diff changeset
98 return getValues(MASTER_SCALE);
328
07e642030172 Discharge tables: Added convenience constructors/methods to ease the access to the master discharge table of a gauge.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 315
diff changeset
99 }
07e642030172 Discharge tables: Added convenience constructors/methods to ease the access to the master discharge table of a gauge.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 315
diff changeset
100
153
c97f9bc9b642 The out() operation of the WINFO artifact draws discharge tables for gauges specified by the user.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 150
diff changeset
101 public Map<String, double [][]> getValues(double scale) {
154
03362976fa0f DischargeTables: Cache the scale, too. Otherwise two calls to getValues() with different arguments will result in the same output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 153
diff changeset
102 if (values == null || scale != this.scale) {
153
c97f9bc9b642 The out() operation of the WINFO artifact draws discharge tables for gauges specified by the user.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 150
diff changeset
103 values = loadValues(scale);
154
03362976fa0f DischargeTables: Cache the scale, too. Otherwise two calls to getValues() with different arguments will result in the same output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 153
diff changeset
104 this.scale = scale;
146
e8dfe6ba2000 Fetch w/q values of discharge tables for given gauges.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
105 }
e8dfe6ba2000 Fetch w/q values of discharge tables for given gauges.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
106 return values;
e8dfe6ba2000 Fetch w/q values of discharge tables for given gauges.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
107 }
e8dfe6ba2000 Fetch w/q values of discharge tables for given gauges.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
108
1929
6b0ae0f2cae6 (Minor) cosmetics, docs.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 735
diff changeset
109 /**
6b0ae0f2cae6 (Minor) cosmetics, docs.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 735
diff changeset
110 * Returns mapping of gauge name to values.
6b0ae0f2cae6 (Minor) cosmetics, docs.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 735
diff changeset
111 */
153
c97f9bc9b642 The out() operation of the WINFO artifact draws discharge tables for gauges specified by the user.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 150
diff changeset
112 protected Map<String, double [][]> loadValues(double scale) {
150
c904d52cdfd0 Don't used interleaved x/y data.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 146
diff changeset
113 Map<String, double [][]> values = new HashMap<String, double [][]>();
146
e8dfe6ba2000 Fetch w/q values of discharge tables for given gauges.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
114
311
ea3a438a7021 Backend access: Static methods are using the SessionHolder, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 154
diff changeset
115 Session session = SessionHolder.HOLDER.get();
146
e8dfe6ba2000 Fetch w/q values of discharge tables for given gauges.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
116
311
ea3a438a7021 Backend access: Static methods are using the SessionHolder, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 154
diff changeset
117 Query gaugeQuery = session.createQuery(
336
7f13ed751277 Fixed broken HQL statement.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 334
diff changeset
118 "from Gauge where name=:gauge and river.name=:river");
311
ea3a438a7021 Backend access: Static methods are using the SessionHolder, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 154
diff changeset
119 gaugeQuery.setParameter("river", riverName);
146
e8dfe6ba2000 Fetch w/q values of discharge tables for given gauges.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
120
311
ea3a438a7021 Backend access: Static methods are using the SessionHolder, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 154
diff changeset
121 for (String gaugeName: gaugeNames) {
ea3a438a7021 Backend access: Static methods are using the SessionHolder, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 154
diff changeset
122 gaugeQuery.setParameter("gauge", gaugeName);
ea3a438a7021 Backend access: Static methods are using the SessionHolder, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 154
diff changeset
123 List<Gauge> gauges = gaugeQuery.list();
ea3a438a7021 Backend access: Static methods are using the SessionHolder, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 154
diff changeset
124 if (gauges.isEmpty()) {
ea3a438a7021 Backend access: Static methods are using the SessionHolder, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 154
diff changeset
125 log.warn(
ea3a438a7021 Backend access: Static methods are using the SessionHolder, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 154
diff changeset
126 "no gauge '"+gaugeName+"' at river '"+riverName+"'");
ea3a438a7021 Backend access: Static methods are using the SessionHolder, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 154
diff changeset
127 continue;
ea3a438a7021 Backend access: Static methods are using the SessionHolder, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 154
diff changeset
128 }
ea3a438a7021 Backend access: Static methods are using the SessionHolder, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 154
diff changeset
129 Gauge gauge = gauges.get(0);
146
e8dfe6ba2000 Fetch w/q values of discharge tables for given gauges.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
130
311
ea3a438a7021 Backend access: Static methods are using the SessionHolder, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 154
diff changeset
131 List<DischargeTable> tables = gauge.getDischargeTables();
146
e8dfe6ba2000 Fetch w/q values of discharge tables for given gauges.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
132
311
ea3a438a7021 Backend access: Static methods are using the SessionHolder, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 154
diff changeset
133 if (tables.isEmpty()) {
ea3a438a7021 Backend access: Static methods are using the SessionHolder, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 154
diff changeset
134 log.warn(
ea3a438a7021 Backend access: Static methods are using the SessionHolder, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 154
diff changeset
135 "no discharge table for gauge '" + gaugeName + "'");
ea3a438a7021 Backend access: Static methods are using the SessionHolder, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 154
diff changeset
136 continue;
146
e8dfe6ba2000 Fetch w/q values of discharge tables for given gauges.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
137 }
e8dfe6ba2000 Fetch w/q values of discharge tables for given gauges.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
138
311
ea3a438a7021 Backend access: Static methods are using the SessionHolder, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 154
diff changeset
139 // TODO: Filter by time interval
4919
dbe9b7d6b80b Find correct discharge table for gauge.
Raimund Renkert <rrenkert@intevation.de>
parents: 4226
diff changeset
140 DischargeTable table = null;
dbe9b7d6b80b Find correct discharge table for gauge.
Raimund Renkert <rrenkert@intevation.de>
parents: 4226
diff changeset
141 for (DischargeTable dt : tables) {
dbe9b7d6b80b Find correct discharge table for gauge.
Raimund Renkert <rrenkert@intevation.de>
parents: 4226
diff changeset
142 if (dt.getKind() == 0) {
dbe9b7d6b80b Find correct discharge table for gauge.
Raimund Renkert <rrenkert@intevation.de>
parents: 4226
diff changeset
143 table = dt;
dbe9b7d6b80b Find correct discharge table for gauge.
Raimund Renkert <rrenkert@intevation.de>
parents: 4226
diff changeset
144 break;
dbe9b7d6b80b Find correct discharge table for gauge.
Raimund Renkert <rrenkert@intevation.de>
parents: 4226
diff changeset
145 }
dbe9b7d6b80b Find correct discharge table for gauge.
Raimund Renkert <rrenkert@intevation.de>
parents: 4226
diff changeset
146 }
dbe9b7d6b80b Find correct discharge table for gauge.
Raimund Renkert <rrenkert@intevation.de>
parents: 4226
diff changeset
147 if (table == null) {
dbe9b7d6b80b Find correct discharge table for gauge.
Raimund Renkert <rrenkert@intevation.de>
parents: 4226
diff changeset
148 table = tables.get(0);
dbe9b7d6b80b Find correct discharge table for gauge.
Raimund Renkert <rrenkert@intevation.de>
parents: 4226
diff changeset
149 }
2418
899ca89f497e Another partial fix for flys/issue499: Do the W to Q conversions
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2230
diff changeset
150 double [][] vs = loadDischargeTableValues(table, scale);
329
0b2358bc716d Discharge table: Added static method getWForQ() to interpolate a w value for a given q value based on a given discharge table.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 328
diff changeset
151
2418
899ca89f497e Another partial fix for flys/issue499: Do the W to Q conversions
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2230
diff changeset
152 values.put(gaugeName, vs);
146
e8dfe6ba2000 Fetch w/q values of discharge tables for given gauges.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
153 }
311
ea3a438a7021 Backend access: Static methods are using the SessionHolder, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 154
diff changeset
154
ea3a438a7021 Backend access: Static methods are using the SessionHolder, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 154
diff changeset
155 return values;
146
e8dfe6ba2000 Fetch w/q values of discharge tables for given gauges.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
156 }
329
0b2358bc716d Discharge table: Added static method getWForQ() to interpolate a w value for a given q value based on a given discharge table.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 328
diff changeset
157
2230
59af81364eb1 Improved the 'historical discharge' calculation: implemented findValueForW().
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 1929
diff changeset
158
59af81364eb1 Improved the 'historical discharge' calculation: implemented findValueForW().
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 1929
diff changeset
159 /**
59af81364eb1 Improved the 'historical discharge' calculation: implemented findValueForW().
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 1929
diff changeset
160 * @param table The discharge table
59af81364eb1 Improved the 'historical discharge' calculation: implemented findValueForW().
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 1929
diff changeset
161 * @param scale The scale factor to adjust W and Q values.
59af81364eb1 Improved the 'historical discharge' calculation: implemented findValueForW().
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 1929
diff changeset
162 *
59af81364eb1 Improved the 'historical discharge' calculation: implemented findValueForW().
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 1929
diff changeset
163 * @return the values of a discharge table.
59af81364eb1 Improved the 'historical discharge' calculation: implemented findValueForW().
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 1929
diff changeset
164 */
59af81364eb1 Improved the 'historical discharge' calculation: implemented findValueForW().
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 1929
diff changeset
165 public static double[][] loadDischargeTableValues(
59af81364eb1 Improved the 'historical discharge' calculation: implemented findValueForW().
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 1929
diff changeset
166 DischargeTable table,
2418
899ca89f497e Another partial fix for flys/issue499: Do the W to Q conversions
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2230
diff changeset
167 double scale
2230
59af81364eb1 Improved the 'historical discharge' calculation: implemented findValueForW().
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 1929
diff changeset
168 ) {
59af81364eb1 Improved the 'historical discharge' calculation: implemented findValueForW().
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 1929
diff changeset
169 List<DischargeTableValue> dtvs = table.getDischargeTableValues();
59af81364eb1 Improved the 'historical discharge' calculation: implemented findValueForW().
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 1929
diff changeset
170
59af81364eb1 Improved the 'historical discharge' calculation: implemented findValueForW().
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 1929
diff changeset
171 final double [][] vs = new double[2][dtvs.size()];
59af81364eb1 Improved the 'historical discharge' calculation: implemented findValueForW().
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 1929
diff changeset
172
59af81364eb1 Improved the 'historical discharge' calculation: implemented findValueForW().
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 1929
diff changeset
173 int idx = 0;
59af81364eb1 Improved the 'historical discharge' calculation: implemented findValueForW().
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 1929
diff changeset
174 for (DischargeTableValue dtv: dtvs) {
59af81364eb1 Improved the 'historical discharge' calculation: implemented findValueForW().
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 1929
diff changeset
175 double q = dtv.getQ().doubleValue();
59af81364eb1 Improved the 'historical discharge' calculation: implemented findValueForW().
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 1929
diff changeset
176 vs[0][idx] = q * scale;
59af81364eb1 Improved the 'historical discharge' calculation: implemented findValueForW().
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 1929
diff changeset
177 vs[1][idx] = dtv.getW().doubleValue() * scale;
59af81364eb1 Improved the 'historical discharge' calculation: implemented findValueForW().
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 1929
diff changeset
178 ++idx;
59af81364eb1 Improved the 'historical discharge' calculation: implemented findValueForW().
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 1929
diff changeset
179 }
59af81364eb1 Improved the 'historical discharge' calculation: implemented findValueForW().
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 1929
diff changeset
180
59af81364eb1 Improved the 'historical discharge' calculation: implemented findValueForW().
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 1929
diff changeset
181 return vs;
59af81364eb1 Improved the 'historical discharge' calculation: implemented findValueForW().
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 1929
diff changeset
182 }
59af81364eb1 Improved the 'historical discharge' calculation: implemented findValueForW().
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 1929
diff changeset
183
2418
899ca89f497e Another partial fix for flys/issue499: Do the W to Q conversions
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2230
diff changeset
184 private static final double EPSILON = 1e-5;
2230
59af81364eb1 Improved the 'historical discharge' calculation: implemented findValueForW().
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 1929
diff changeset
185
2418
899ca89f497e Another partial fix for flys/issue499: Do the W to Q conversions
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2230
diff changeset
186 private static final boolean epsEquals(double a, double b) {
899ca89f497e Another partial fix for flys/issue499: Do the W to Q conversions
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2230
diff changeset
187 return Math.abs(a - b) < EPSILON;
899ca89f497e Another partial fix for flys/issue499: Do the W to Q conversions
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2230
diff changeset
188 }
899ca89f497e Another partial fix for flys/issue499: Do the W to Q conversions
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2230
diff changeset
189
899ca89f497e Another partial fix for flys/issue499: Do the W to Q conversions
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2230
diff changeset
190 private static final boolean between(double a, double b, double x) {
899ca89f497e Another partial fix for flys/issue499: Do the W to Q conversions
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2230
diff changeset
191 if (a > b) { double t = a; a = b; b = t; }
899ca89f497e Another partial fix for flys/issue499: Do the W to Q conversions
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2230
diff changeset
192 return x > a && x < b;
899ca89f497e Another partial fix for flys/issue499: Do the W to Q conversions
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2230
diff changeset
193 }
899ca89f497e Another partial fix for flys/issue499: Do the W to Q conversions
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2230
diff changeset
194
5340
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 4919
diff changeset
195 /**
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 4919
diff changeset
196 * Find or interpolate Qs from q/w array.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 4919
diff changeset
197 * @param values [[q0,q1,q2],[w0,w1,w2]]
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 4919
diff changeset
198 * @param w W value to look for in values.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 4919
diff changeset
199 */
2418
899ca89f497e Another partial fix for flys/issue499: Do the W to Q conversions
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2230
diff changeset
200 public static double [] getQsForW(double [][] values, double w) {
378
20c3a5b36434 Repaired DischargeTables.getQForW()
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 376
diff changeset
201
20c3a5b36434 Repaired DischargeTables.getQForW()
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 376
diff changeset
202 boolean debug = log.isDebugEnabled();
20c3a5b36434 Repaired DischargeTables.getQForW()
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 376
diff changeset
203
20c3a5b36434 Repaired DischargeTables.getQForW()
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 376
diff changeset
204 if (debug) {
2418
899ca89f497e Another partial fix for flys/issue499: Do the W to Q conversions
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2230
diff changeset
205 log.debug("getQsForW: W = " + w);
329
0b2358bc716d Discharge table: Added static method getWForQ() to interpolate a w value for a given q value based on a given discharge table.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 328
diff changeset
206 }
0b2358bc716d Discharge table: Added static method getWForQ() to interpolate a w value for a given q value based on a given discharge table.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 328
diff changeset
207
2418
899ca89f497e Another partial fix for flys/issue499: Do the W to Q conversions
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2230
diff changeset
208 double [] qs = values[0];
899ca89f497e Another partial fix for flys/issue499: Do the W to Q conversions
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2230
diff changeset
209 double [] ws = values[1];
329
0b2358bc716d Discharge table: Added static method getWForQ() to interpolate a w value for a given q value based on a given discharge table.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 328
diff changeset
210
2418
899ca89f497e Another partial fix for flys/issue499: Do the W to Q conversions
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2230
diff changeset
211 int N = Math.min(qs.length, ws.length);
329
0b2358bc716d Discharge table: Added static method getWForQ() to interpolate a w value for a given q value based on a given discharge table.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 328
diff changeset
212
2418
899ca89f497e Another partial fix for flys/issue499: Do the W to Q conversions
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2230
diff changeset
213 if (N == 0) {
378
20c3a5b36434 Repaired DischargeTables.getQForW()
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 376
diff changeset
214 if (debug) {
2418
899ca89f497e Another partial fix for flys/issue499: Do the W to Q conversions
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2230
diff changeset
215 log.debug("Q(" + w + ") = []");
899ca89f497e Another partial fix for flys/issue499: Do the W to Q conversions
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2230
diff changeset
216 }
899ca89f497e Another partial fix for flys/issue499: Do the W to Q conversions
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2230
diff changeset
217 return new double [0];
899ca89f497e Another partial fix for flys/issue499: Do the W to Q conversions
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2230
diff changeset
218 }
899ca89f497e Another partial fix for flys/issue499: Do the W to Q conversions
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2230
diff changeset
219
899ca89f497e Another partial fix for flys/issue499: Do the W to Q conversions
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2230
diff changeset
220 TDoubleArrayList outQs = new TDoubleArrayList();
899ca89f497e Another partial fix for flys/issue499: Do the W to Q conversions
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2230
diff changeset
221
899ca89f497e Another partial fix for flys/issue499: Do the W to Q conversions
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2230
diff changeset
222 if (epsEquals(ws[0], w)) {
899ca89f497e Another partial fix for flys/issue499: Do the W to Q conversions
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2230
diff changeset
223 outQs.add(qs[0]);
899ca89f497e Another partial fix for flys/issue499: Do the W to Q conversions
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2230
diff changeset
224 }
899ca89f497e Another partial fix for flys/issue499: Do the W to Q conversions
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2230
diff changeset
225
899ca89f497e Another partial fix for flys/issue499: Do the W to Q conversions
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2230
diff changeset
226 for (int i = 1; i < N; ++i) {
899ca89f497e Another partial fix for flys/issue499: Do the W to Q conversions
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2230
diff changeset
227 if (epsEquals(ws[i], w)) {
899ca89f497e Another partial fix for flys/issue499: Do the W to Q conversions
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2230
diff changeset
228 outQs.add(qs[i]);
899ca89f497e Another partial fix for flys/issue499: Do the W to Q conversions
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2230
diff changeset
229 }
899ca89f497e Another partial fix for flys/issue499: Do the W to Q conversions
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2230
diff changeset
230 else if (between(ws[i-1], ws[i], w)) {
899ca89f497e Another partial fix for flys/issue499: Do the W to Q conversions
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2230
diff changeset
231 double w1 = ws[i-1];
899ca89f497e Another partial fix for flys/issue499: Do the W to Q conversions
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2230
diff changeset
232 double w2 = ws[i];
899ca89f497e Another partial fix for flys/issue499: Do the W to Q conversions
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2230
diff changeset
233 double q1 = qs[i-1];
899ca89f497e Another partial fix for flys/issue499: Do the W to Q conversions
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2230
diff changeset
234 double q2 = qs[i];
899ca89f497e Another partial fix for flys/issue499: Do the W to Q conversions
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2230
diff changeset
235
899ca89f497e Another partial fix for flys/issue499: Do the W to Q conversions
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2230
diff changeset
236 // q1 = m*w1 + b
899ca89f497e Another partial fix for flys/issue499: Do the W to Q conversions
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2230
diff changeset
237 // q2 = m*w2 + b
899ca89f497e Another partial fix for flys/issue499: Do the W to Q conversions
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2230
diff changeset
238 // q2 - q1 = m*(w2 - w1)
899ca89f497e Another partial fix for flys/issue499: Do the W to Q conversions
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2230
diff changeset
239 // m = (q2 - q1)/(w2 - w1) # w2 != w1
899ca89f497e Another partial fix for flys/issue499: Do the W to Q conversions
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2230
diff changeset
240 // b = q1 - m*w1
899ca89f497e Another partial fix for flys/issue499: Do the W to Q conversions
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2230
diff changeset
241 // w1 != w2
899ca89f497e Another partial fix for flys/issue499: Do the W to Q conversions
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2230
diff changeset
242
899ca89f497e Another partial fix for flys/issue499: Do the W to Q conversions
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2230
diff changeset
243 double m = (q2 - q1)/(w2 - w1);
899ca89f497e Another partial fix for flys/issue499: Do the W to Q conversions
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2230
diff changeset
244 double b = q1 - m*w1;
899ca89f497e Another partial fix for flys/issue499: Do the W to Q conversions
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2230
diff changeset
245 double q = w*m + b;
899ca89f497e Another partial fix for flys/issue499: Do the W to Q conversions
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2230
diff changeset
246
899ca89f497e Another partial fix for flys/issue499: Do the W to Q conversions
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2230
diff changeset
247 outQs.add(q);
378
20c3a5b36434 Repaired DischargeTables.getQForW()
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 376
diff changeset
248 }
329
0b2358bc716d Discharge table: Added static method getWForQ() to interpolate a w value for a given q value based on a given discharge table.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 328
diff changeset
249 }
2418
899ca89f497e Another partial fix for flys/issue499: Do the W to Q conversions
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2230
diff changeset
250
899ca89f497e Another partial fix for flys/issue499: Do the W to Q conversions
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2230
diff changeset
251 double [] result = outQs.toNativeArray();
899ca89f497e Another partial fix for flys/issue499: Do the W to Q conversions
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2230
diff changeset
252
899ca89f497e Another partial fix for flys/issue499: Do the W to Q conversions
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2230
diff changeset
253 if (debug) {
899ca89f497e Another partial fix for flys/issue499: Do the W to Q conversions
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2230
diff changeset
254 log.debug("Q(" + w + ") = " + Arrays.toString(result));
378
20c3a5b36434 Repaired DischargeTables.getQForW()
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 376
diff changeset
255 }
2418
899ca89f497e Another partial fix for flys/issue499: Do the W to Q conversions
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2230
diff changeset
256
899ca89f497e Another partial fix for flys/issue499: Do the W to Q conversions
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2230
diff changeset
257 return result;
329
0b2358bc716d Discharge table: Added static method getWForQ() to interpolate a w value for a given q value based on a given discharge table.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 328
diff changeset
258 }
4226
cb9f22c3553f DischargeTables: Added missing getWsForQ()
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4138
diff changeset
259
cb9f22c3553f DischargeTables: Added missing getWsForQ()
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4138
diff changeset
260 public static double [] getWsForQ(double [][] values, double q) {
cb9f22c3553f DischargeTables: Added missing getWsForQ()
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4138
diff changeset
261
cb9f22c3553f DischargeTables: Added missing getWsForQ()
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4138
diff changeset
262 boolean debug = log.isDebugEnabled();
cb9f22c3553f DischargeTables: Added missing getWsForQ()
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4138
diff changeset
263
cb9f22c3553f DischargeTables: Added missing getWsForQ()
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4138
diff changeset
264 if (debug) {
cb9f22c3553f DischargeTables: Added missing getWsForQ()
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4138
diff changeset
265 log.debug("getWsForQ: W = " + q);
cb9f22c3553f DischargeTables: Added missing getWsForQ()
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4138
diff changeset
266 }
cb9f22c3553f DischargeTables: Added missing getWsForQ()
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4138
diff changeset
267
cb9f22c3553f DischargeTables: Added missing getWsForQ()
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4138
diff changeset
268 double [] qs = values[0];
cb9f22c3553f DischargeTables: Added missing getWsForQ()
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4138
diff changeset
269 double [] ws = values[1];
cb9f22c3553f DischargeTables: Added missing getWsForQ()
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4138
diff changeset
270
cb9f22c3553f DischargeTables: Added missing getWsForQ()
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4138
diff changeset
271 int N = Math.min(qs.length, ws.length);
cb9f22c3553f DischargeTables: Added missing getWsForQ()
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4138
diff changeset
272
cb9f22c3553f DischargeTables: Added missing getWsForQ()
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4138
diff changeset
273 if (N == 0) {
cb9f22c3553f DischargeTables: Added missing getWsForQ()
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4138
diff changeset
274 if (debug) {
cb9f22c3553f DischargeTables: Added missing getWsForQ()
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4138
diff changeset
275 log.debug("W(" + q + ") = []");
cb9f22c3553f DischargeTables: Added missing getWsForQ()
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4138
diff changeset
276 }
cb9f22c3553f DischargeTables: Added missing getWsForQ()
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4138
diff changeset
277 return new double [0];
cb9f22c3553f DischargeTables: Added missing getWsForQ()
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4138
diff changeset
278 }
cb9f22c3553f DischargeTables: Added missing getWsForQ()
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4138
diff changeset
279
cb9f22c3553f DischargeTables: Added missing getWsForQ()
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4138
diff changeset
280 TDoubleArrayList outWs = new TDoubleArrayList();
cb9f22c3553f DischargeTables: Added missing getWsForQ()
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4138
diff changeset
281
cb9f22c3553f DischargeTables: Added missing getWsForQ()
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4138
diff changeset
282 if (epsEquals(qs[0], q)) {
cb9f22c3553f DischargeTables: Added missing getWsForQ()
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4138
diff changeset
283 outWs.add(ws[0]);
cb9f22c3553f DischargeTables: Added missing getWsForQ()
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4138
diff changeset
284 }
cb9f22c3553f DischargeTables: Added missing getWsForQ()
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4138
diff changeset
285
cb9f22c3553f DischargeTables: Added missing getWsForQ()
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4138
diff changeset
286 for (int i = 1; i < N; ++i) {
cb9f22c3553f DischargeTables: Added missing getWsForQ()
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4138
diff changeset
287 if (epsEquals(qs[i], q)) {
cb9f22c3553f DischargeTables: Added missing getWsForQ()
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4138
diff changeset
288 outWs.add(ws[i]);
cb9f22c3553f DischargeTables: Added missing getWsForQ()
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4138
diff changeset
289 }
cb9f22c3553f DischargeTables: Added missing getWsForQ()
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4138
diff changeset
290 else if (between(qs[i-1], qs[i], q)) {
cb9f22c3553f DischargeTables: Added missing getWsForQ()
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4138
diff changeset
291 double w1 = ws[i-1];
cb9f22c3553f DischargeTables: Added missing getWsForQ()
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4138
diff changeset
292 double w2 = ws[i];
cb9f22c3553f DischargeTables: Added missing getWsForQ()
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4138
diff changeset
293 double q1 = qs[i-1];
cb9f22c3553f DischargeTables: Added missing getWsForQ()
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4138
diff changeset
294 double q2 = qs[i];
cb9f22c3553f DischargeTables: Added missing getWsForQ()
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4138
diff changeset
295
cb9f22c3553f DischargeTables: Added missing getWsForQ()
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4138
diff changeset
296 // w1 = m*q1 + b
cb9f22c3553f DischargeTables: Added missing getWsForQ()
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4138
diff changeset
297 // w2 = m*q2 + b
cb9f22c3553f DischargeTables: Added missing getWsForQ()
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4138
diff changeset
298 // w2 - w1 = m*(q2 - q1)
cb9f22c3553f DischargeTables: Added missing getWsForQ()
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4138
diff changeset
299 // m = (w2 - w1)/(q2 - q1) # q2 != q1
cb9f22c3553f DischargeTables: Added missing getWsForQ()
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4138
diff changeset
300 // b = w1 - m*q1
cb9f22c3553f DischargeTables: Added missing getWsForQ()
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4138
diff changeset
301 // q1 != q2
cb9f22c3553f DischargeTables: Added missing getWsForQ()
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4138
diff changeset
302
cb9f22c3553f DischargeTables: Added missing getWsForQ()
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4138
diff changeset
303 double m = (w2 - w1)/(q2 - q1);
cb9f22c3553f DischargeTables: Added missing getWsForQ()
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4138
diff changeset
304 double b = w1 - m*q1;
cb9f22c3553f DischargeTables: Added missing getWsForQ()
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4138
diff changeset
305 double w = q*m + b;
cb9f22c3553f DischargeTables: Added missing getWsForQ()
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4138
diff changeset
306
cb9f22c3553f DischargeTables: Added missing getWsForQ()
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4138
diff changeset
307 outWs.add(w);
cb9f22c3553f DischargeTables: Added missing getWsForQ()
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4138
diff changeset
308 }
cb9f22c3553f DischargeTables: Added missing getWsForQ()
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4138
diff changeset
309 }
cb9f22c3553f DischargeTables: Added missing getWsForQ()
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4138
diff changeset
310
cb9f22c3553f DischargeTables: Added missing getWsForQ()
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4138
diff changeset
311 double [] result = outWs.toNativeArray();
cb9f22c3553f DischargeTables: Added missing getWsForQ()
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4138
diff changeset
312
cb9f22c3553f DischargeTables: Added missing getWsForQ()
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4138
diff changeset
313 if (debug) {
cb9f22c3553f DischargeTables: Added missing getWsForQ()
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4138
diff changeset
314 log.debug("W(" + q + ") = " + Arrays.toString(result));
cb9f22c3553f DischargeTables: Added missing getWsForQ()
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4138
diff changeset
315 }
cb9f22c3553f DischargeTables: Added missing getWsForQ()
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4138
diff changeset
316
cb9f22c3553f DischargeTables: Added missing getWsForQ()
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4138
diff changeset
317 return result;
cb9f22c3553f DischargeTables: Added missing getWsForQ()
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4138
diff changeset
318 }
146
e8dfe6ba2000 Fetch w/q values of discharge tables for given gauges.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
319 }
e8dfe6ba2000 Fetch w/q values of discharge tables for given gauges.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
320 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :

http://dive4elements.wald.intevation.org