Mercurial > dive4elements > river
annotate artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/common/WQBaseTableFinder.java @ 9176:1614cb14308f
Work on calculations for S-Info flood duration workflow
author | mschaefer |
---|---|
date | Mon, 25 Jun 2018 19:21:11 +0200 |
parents | |
children |
rev | line source |
---|---|
9176
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
1 /** Copyright (C) 2017 by Bundesanstalt für Gewässerkunde |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
2 * Software engineering by |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
3 * Björnsen Beratende Ingenieure GmbH |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
4 * Dr. Schumacher Ingenieurbüro für Wasser und Umwelt |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
5 * |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
6 * This file is Free Software under the GNU AGPL (>=v3) |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
7 * and comes with ABSOLUTELY NO WARRANTY! Check out the |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
8 * documentation coming with Dive4Elements River for details. |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
9 */ |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
10 package org.dive4elements.river.artifacts.sinfo.common; |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
11 |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
12 import java.util.ArrayList; |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
13 import java.util.List; |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
14 import java.util.Map.Entry; |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
15 import java.util.NavigableMap; |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
16 import java.util.TreeMap; |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
17 |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
18 import org.apache.commons.math.FunctionEvaluationException; |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
19 import org.apache.commons.math.analysis.interpolation.LinearInterpolator; |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
20 import org.apache.commons.math.analysis.polynomials.PolynomialSplineFunction; |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
21 import org.dive4elements.river.artifacts.math.Linear; |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
22 import org.dive4elements.river.artifacts.model.Calculation; |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
23 import org.dive4elements.river.backend.SessionHolder; |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
24 import org.dive4elements.river.model.River; |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
25 import org.hibernate.SQLQuery; |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
26 import org.hibernate.Session; |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
27 import org.hibernate.type.StandardBasicTypes; |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
28 |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
29 import gnu.trove.TDoubleArrayList; |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
30 |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
31 /** |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
32 * Loading and search/interpolation of a W/Q base table of a river |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
33 * |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
34 * @author Matthias Schäfer |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
35 * |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
36 */ |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
37 public final class WQBaseTableFinder { |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
38 |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
39 /***** FIELDS *****/ |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
40 |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
41 // private static Logger log = Logger.getLogger(WQTableFinder.class); |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
42 |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
43 private final River river; |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
44 |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
45 private Calculation problems; |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
46 |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
47 private final List<String> columnNames; |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
48 |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
49 private final NavigableMap<Double, PolynomialSplineFunction> kmWs; |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
50 |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
51 private final NavigableMap<Double, PolynomialSplineFunction> kmQs; |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
52 |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
53 private static final String SQLCOLUMNS = "SELECT wc.position AS colindex, wc.name AS qzone" |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
54 + " FROM wsts w" |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
55 + " INNER JOIN wst_columns wc ON w.id=wc.wst_id" |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
56 + " WHERE w.river_id = :river_id" |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
57 + " AND w.kind = 0" |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
58 + " ORDER BY wc.position ASC"; |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
59 |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
60 private static final String SQLMAIN = "SELECT wcv.position AS station, wc.position AS colindex, wcv.w, wqr.q" |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
61 + " FROM wsts w" |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
62 + " INNER JOIN wst_columns wc ON w.id=wc.wst_id" |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
63 + " INNER JOIN wst_column_values wcv ON wc.id=wcv.wst_column_id" |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
64 + " INNER JOIN wst_column_q_ranges wcqr ON wc.id=wcqr.wst_column_id" |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
65 + " INNER JOIN wst_q_ranges wqr ON wcqr.wst_q_range_id=wqr.id" |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
66 + " INNER JOIN ranges r ON wqr.range_id=r.id AND wcv.position BETWEEN r.a AND r.b" |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
67 + " WHERE w.river_id = :river_id" |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
68 + " AND w.kind = 0" |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
69 + " AND r.river_id = :river_id" |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
70 + " AND wcv.position BETWEEN :kmfrom - 1 AND :kmto + 1" // some tolerance for start and end of list |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
71 + " ORDER BY wcv.position ASC, " |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
72 + " wc.position ASC"; |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
73 |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
74 |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
75 /***** CONSTRUCTORS *****/ |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
76 |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
77 private WQBaseTableFinder(final River river, final Calculation problems, final List<Object[]> colnames, final List<Object[]> rows) { |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
78 this.river = river; |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
79 this.problems = problems; |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
80 this.columnNames = new ArrayList<>(); |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
81 for (final Object[] colname : colnames) |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
82 this.columnNames.add(colname[1].toString()); |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
83 this.kmWs = new TreeMap<>(); |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
84 this.kmQs = new TreeMap<>(); |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
85 final TDoubleArrayList ws = new TDoubleArrayList(); |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
86 final TDoubleArrayList qs = new TDoubleArrayList(); |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
87 double km = Double.NaN; |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
88 for (int i = 0; i <= rows.size() - 1; i++) { |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
89 if (ws.isEmpty() || ((double) rows.get(i)[0] <= km + 0.0001)) { |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
90 if (ws.isEmpty()) |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
91 km = (double) rows.get(i)[0]; |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
92 ws.add((double) rows.get(i)[2]); |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
93 qs.add((double) rows.get(i)[3]); |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
94 } |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
95 if ((i == rows.size() - 1) || ((double) rows.get(i)[0] > km + 0.0001)) { |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
96 try { |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
97 this.kmWs.put(km, new LinearInterpolator().interpolate(ws.toNativeArray(), qs.toNativeArray())); |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
98 this.kmQs.put(km, new LinearInterpolator().interpolate(qs.toNativeArray(), ws.toNativeArray())); |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
99 } |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
100 catch (final Exception e) { |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
101 if (this.problems != null) { |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
102 this.problems.addProblem(km, "wq_base_data.missing"); |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
103 // Report only once |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
104 this.problems = null; |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
105 } |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
106 } |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
107 ws.clear(); |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
108 qs.clear(); |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
109 km = (double) rows.get(i)[0]; |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
110 ws.add((double) rows.get(i)[2]); |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
111 qs.add((double) rows.get(i)[3]); |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
112 } |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
113 } |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
114 } |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
115 |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
116 |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
117 /***** METHODS *****/ |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
118 |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
119 /** |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
120 * Loads the the W/Q tables of a km range of a river |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
121 * |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
122 * @return The W/Q table finder of the river, or null |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
123 */ |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
124 public static WQBaseTableFinder loadValues(final River river, final double fromKm, final double toKm, final Calculation problems) { |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
125 final Session session = SessionHolder.HOLDER.get(); |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
126 final SQLQuery colQuery = session.createSQLQuery(SQLCOLUMNS) |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
127 .addScalar("colindex", StandardBasicTypes.INTEGER) |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
128 .addScalar("qzone", StandardBasicTypes.STRING); |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
129 colQuery.setParameter("river_id", river.getId()); |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
130 final List<Object[]> colnames = colQuery.list(); |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
131 if ((colnames == null) || colnames.isEmpty()) { |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
132 problems.addProblem("wq_table.missing"); |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
133 return null; |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
134 } |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
135 final SQLQuery wqQuery = session.createSQLQuery(SQLMAIN) |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
136 .addScalar("station", StandardBasicTypes.DOUBLE) |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
137 .addScalar("colindex", StandardBasicTypes.INTEGER) |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
138 .addScalar("w", StandardBasicTypes.DOUBLE) |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
139 .addScalar("q", StandardBasicTypes.DOUBLE); |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
140 wqQuery.setParameter("river_id", river.getId()); |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
141 wqQuery.setParameter("kmfrom", fromKm); |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
142 wqQuery.setParameter("kmto", toKm); |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
143 final List<Object[]> rows = wqQuery.list(); |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
144 if ((rows != null) && !rows.isEmpty()) |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
145 return new WQBaseTableFinder(river, problems, colnames, rows); |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
146 else { |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
147 problems.addProblem("wq_table.missing"); |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
148 return null; |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
149 } |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
150 } |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
151 |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
152 /** |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
153 * If this provider may return valid data at all. |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
154 */ |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
155 public boolean isValid() { |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
156 return (this.kmWs != null); |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
157 } |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
158 |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
159 /** |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
160 * Discharge for a W |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
161 * |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
162 * @param station |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
163 * station to find or interpolate |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
164 * @param w |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
165 * W in m+NN or m+NHN |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
166 * @return Q, or NegInf for w less than all, or PosInf for w greater then all, or NaN in case of exception |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
167 */ |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
168 public double getDischarge(final double station, final double w) { |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
169 if (this.kmWs == null) |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
170 return Double.NaN; |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
171 final Entry<Double, PolynomialSplineFunction> lowerEntry = this.kmWs.floorEntry(Double.valueOf(station)); |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
172 final Entry<Double, PolynomialSplineFunction> upperEntry = this.kmWs.ceilingEntry(Double.valueOf(station)); |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
173 if ((lowerEntry == null) || (upperEntry == null)) |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
174 return Double.NaN; |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
175 try { |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
176 final double lowerQ = lowerEntry.getValue().value(w); |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
177 final double upperQ = upperEntry.getValue().value(w); |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
178 return Linear.linear(station, lowerEntry.getKey().doubleValue(), upperEntry.getKey().doubleValue(), lowerQ, upperQ); |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
179 } |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
180 catch (@SuppressWarnings("unused") final FunctionEvaluationException e) { |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
181 // ignore exception because this can/will happen regularly |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
182 return Double.NaN; |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
183 } |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
184 } |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff
changeset
|
185 } |