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 }

http://dive4elements.wald.intevation.org