annotate artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/common/GaugeDischargeValuesFinder.java @ 9533:d9fda7af24ca

No discharge zone calculation and output for gauges unknown in flys for sinfo collision (Meilenstein 2, 2.2.1)
author mschaefer
date Thu, 04 Oct 2018 12:48:57 +0200
parents b4402594213b
children f2473dc34535
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 org.apache.commons.lang.math.DoubleRange;
1614cb14308f Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff changeset
13 import org.apache.commons.math.FunctionEvaluationException;
1614cb14308f Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff changeset
14 import org.apache.commons.math.analysis.UnivariateRealFunction;
1614cb14308f Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff changeset
15 import org.apache.commons.math.analysis.interpolation.LinearInterpolator;
1614cb14308f Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff changeset
16 import org.dive4elements.river.artifacts.model.Calculation;
1614cb14308f Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff changeset
17 import org.dive4elements.river.model.DischargeTable;
1614cb14308f Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff changeset
18 import org.dive4elements.river.model.DischargeTableValue;
1614cb14308f Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff changeset
19 import org.dive4elements.river.model.Gauge;
9533
d9fda7af24ca No discharge zone calculation and output for gauges unknown in flys for sinfo collision (Meilenstein 2, 2.2.1)
mschaefer
parents: 9202
diff changeset
20 import org.dive4elements.river.model.River;
9176
1614cb14308f Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff changeset
21
1614cb14308f Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff changeset
22 import gnu.trove.TDoubleArrayList;
1614cb14308f Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff changeset
23
1614cb14308f Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff changeset
24 /**
1614cb14308f Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff changeset
25 * Loading and search/interpolation of a gauge's discharge table (.at)
1614cb14308f Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff changeset
26 *
1614cb14308f Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff changeset
27 * @author Matthias Schäfer
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 */
1614cb14308f Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff changeset
30 public final class GaugeDischargeValuesFinder {
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 /***** FIELDS *****/
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 // private static Logger log = Logger.getLogger(GaugeDischargeValuesFinder.class);
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 private final Gauge gauge;
1614cb14308f Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff changeset
37
1614cb14308f Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff changeset
38 private Calculation problems;
1614cb14308f Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff changeset
39
1614cb14308f Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff changeset
40 private final UnivariateRealFunction wInterpolator;
1614cb14308f Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff changeset
41
1614cb14308f Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff changeset
42 private final DoubleRange wRange;
1614cb14308f Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff changeset
43
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 /***** CONSTRUCTORS *****/
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 GaugeDischargeValuesFinder(final Gauge gauge, final Calculation problems, final DischargeTable dischargeTable) {
9202
b4402594213b More work on calculations and output for S-Info flood duration workflow (chart types 1 and 2)
mschaefer
parents: 9176
diff changeset
48 // Load W-Q-values from database
9176
1614cb14308f Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff changeset
49 this.gauge = gauge;
1614cb14308f Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff changeset
50 this.problems = problems;
1614cb14308f Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff changeset
51 final TDoubleArrayList ws = new TDoubleArrayList();
1614cb14308f Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff changeset
52 final TDoubleArrayList qs = new TDoubleArrayList();
9202
b4402594213b More work on calculations and output for S-Info flood duration workflow (chart types 1 and 2)
mschaefer
parents: 9176
diff changeset
53 for (final DischargeTableValue v : DischargeTable.fetchValuesSortedByW(dischargeTable)) {
9176
1614cb14308f Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff changeset
54 ws.add(v.getW().doubleValue());
1614cb14308f Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff changeset
55 qs.add(v.getQ().doubleValue());
1614cb14308f Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff changeset
56 }
9202
b4402594213b More work on calculations and output for S-Info flood duration workflow (chart types 1 and 2)
mschaefer
parents: 9176
diff changeset
57 // Build interpolator
9176
1614cb14308f Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff changeset
58 if (ws.size() >= 2) {
1614cb14308f Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff changeset
59 this.wInterpolator = new LinearInterpolator().interpolate(ws.toNativeArray(), qs.toNativeArray());
1614cb14308f Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff changeset
60 this.wRange = new DoubleRange(ws.get(0), ws.get(ws.size() - 1));
1614cb14308f Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff changeset
61 }
1614cb14308f Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff changeset
62 else {
1614cb14308f Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff changeset
63 this.wInterpolator = null;
1614cb14308f Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff changeset
64 this.wRange = null;
1614cb14308f Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff changeset
65 }
1614cb14308f Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff changeset
66 if ((this.wInterpolator == null) && (this.problems != null)) {
1614cb14308f Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff changeset
67 this.problems.addProblem("gauge_discharge_table.missing", gauge.getName());
1614cb14308f Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff changeset
68 // Report only once
1614cb14308f Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff changeset
69 this.problems = null;
1614cb14308f Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff changeset
70 }
1614cb14308f Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff changeset
71 }
1614cb14308f Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff changeset
72
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 /***** METHODS *****/
1614cb14308f Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff changeset
75
1614cb14308f Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff changeset
76 /**
9202
b4402594213b More work on calculations and output for S-Info flood duration workflow (chart types 1 and 2)
mschaefer
parents: 9176
diff changeset
77 * Loads the the main discharge table of a gauge ({gauge}.at)
9176
1614cb14308f Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff changeset
78 *
1614cb14308f Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff changeset
79 * @return The discharge table values finder of the gauge, or null
1614cb14308f Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff changeset
80 */
1614cb14308f Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff changeset
81 public static GaugeDischargeValuesFinder loadValues(final Gauge gauge, final Calculation problems) {
9533
d9fda7af24ca No discharge zone calculation and output for gauges unknown in flys for sinfo collision (Meilenstein 2, 2.2.1)
mschaefer
parents: 9202
diff changeset
82 return loadValues(gauge, gauge.getName(), problems);
d9fda7af24ca No discharge zone calculation and output for gauges unknown in flys for sinfo collision (Meilenstein 2, 2.2.1)
mschaefer
parents: 9202
diff changeset
83 }
d9fda7af24ca No discharge zone calculation and output for gauges unknown in flys for sinfo collision (Meilenstein 2, 2.2.1)
mschaefer
parents: 9202
diff changeset
84
d9fda7af24ca No discharge zone calculation and output for gauges unknown in flys for sinfo collision (Meilenstein 2, 2.2.1)
mschaefer
parents: 9202
diff changeset
85 /**
d9fda7af24ca No discharge zone calculation and output for gauges unknown in flys for sinfo collision (Meilenstein 2, 2.2.1)
mschaefer
parents: 9202
diff changeset
86 * Loads the the main discharge table of a river's gauge ({gauge}.at)
d9fda7af24ca No discharge zone calculation and output for gauges unknown in flys for sinfo collision (Meilenstein 2, 2.2.1)
mschaefer
parents: 9202
diff changeset
87 *
d9fda7af24ca No discharge zone calculation and output for gauges unknown in flys for sinfo collision (Meilenstein 2, 2.2.1)
mschaefer
parents: 9202
diff changeset
88 * @return The discharge table values finder of the gauge, or null
d9fda7af24ca No discharge zone calculation and output for gauges unknown in flys for sinfo collision (Meilenstein 2, 2.2.1)
mschaefer
parents: 9202
diff changeset
89 */
d9fda7af24ca No discharge zone calculation and output for gauges unknown in flys for sinfo collision (Meilenstein 2, 2.2.1)
mschaefer
parents: 9202
diff changeset
90 public static GaugeDischargeValuesFinder loadValues(final River river, final String gaugeName, final Calculation problems) {
d9fda7af24ca No discharge zone calculation and output for gauges unknown in flys for sinfo collision (Meilenstein 2, 2.2.1)
mschaefer
parents: 9202
diff changeset
91 final Gauge gauge = river.determineGaugeByName(gaugeName);
d9fda7af24ca No discharge zone calculation and output for gauges unknown in flys for sinfo collision (Meilenstein 2, 2.2.1)
mschaefer
parents: 9202
diff changeset
92 return loadValues(gauge, gaugeName, problems);
d9fda7af24ca No discharge zone calculation and output for gauges unknown in flys for sinfo collision (Meilenstein 2, 2.2.1)
mschaefer
parents: 9202
diff changeset
93 }
d9fda7af24ca No discharge zone calculation and output for gauges unknown in flys for sinfo collision (Meilenstein 2, 2.2.1)
mschaefer
parents: 9202
diff changeset
94
d9fda7af24ca No discharge zone calculation and output for gauges unknown in flys for sinfo collision (Meilenstein 2, 2.2.1)
mschaefer
parents: 9202
diff changeset
95 private static GaugeDischargeValuesFinder loadValues(final Gauge gauge, final String gaugeName, final Calculation problems) {
d9fda7af24ca No discharge zone calculation and output for gauges unknown in flys for sinfo collision (Meilenstein 2, 2.2.1)
mschaefer
parents: 9202
diff changeset
96 final DischargeTable table = (gauge != null) ? gauge.fetchMasterDischargeTable() : null;
9176
1614cb14308f Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff changeset
97 if ((table == null) || (table.getDischargeTableValues().size() == 0)) {
9533
d9fda7af24ca No discharge zone calculation and output for gauges unknown in flys for sinfo collision (Meilenstein 2, 2.2.1)
mschaefer
parents: 9202
diff changeset
98 problems.addProblem("gauge_discharge_table.missing", gaugeName);
9176
1614cb14308f Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff changeset
99 return null;
1614cb14308f Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff changeset
100 }
1614cb14308f Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff changeset
101 else
1614cb14308f Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff changeset
102 return new GaugeDischargeValuesFinder(gauge, problems, table);
1614cb14308f Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff changeset
103 }
1614cb14308f Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff changeset
104
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 * If this provider may return valid data at all.
1614cb14308f Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff changeset
107 */
1614cb14308f Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff changeset
108 public boolean isValid() {
1614cb14308f Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff changeset
109 return (this.wInterpolator != null);
1614cb14308f Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff changeset
110 }
1614cb14308f Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff changeset
111
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 * Discharge for a W
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 * @param w
1614cb14308f Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff changeset
116 * W in cm above gauge datum
1614cb14308f Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff changeset
117 * @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
118 */
1614cb14308f Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff changeset
119 public double getDischarge(final double w) {
1614cb14308f Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff changeset
120 try {
9533
d9fda7af24ca No discharge zone calculation and output for gauges unknown in flys for sinfo collision (Meilenstein 2, 2.2.1)
mschaefer
parents: 9202
diff changeset
121 if (!this.isValid())
9176
1614cb14308f Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff changeset
122 return Double.NaN;
1614cb14308f Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff changeset
123 else if (w < this.wRange.getMinimumDouble())
1614cb14308f Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff changeset
124 return Double.NEGATIVE_INFINITY;
1614cb14308f Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff changeset
125 else if (w > this.wRange.getMaximumDouble())
1614cb14308f Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff changeset
126 return Double.POSITIVE_INFINITY;
1614cb14308f Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff changeset
127 else
1614cb14308f Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff changeset
128 return this.wInterpolator.value(w);
1614cb14308f Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff changeset
129 }
1614cb14308f Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff changeset
130 catch (@SuppressWarnings("unused") final FunctionEvaluationException e) {
1614cb14308f Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff changeset
131 // ignore exception because this can/will happen regularly
1614cb14308f Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff changeset
132 return Double.NaN;
1614cb14308f Work on calculations for S-Info flood duration workflow
mschaefer
parents:
diff changeset
133 }
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 }

http://dive4elements.wald.intevation.org