annotate artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/salix/SalixLineCalculator.java @ 9430:e8b1255fc89e

Added calculation of salix hw5 and salix line w
author mschaefer
date Mon, 20 Aug 2018 09:41:07 +0200
parents bd5f5d2220fa
children 515643b2c49a
rev   line source
9295
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
1 /** Copyright (C) 2017 by Bundesanstalt für Gewässerkunde
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
2 * Software engineering by
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
3 * Björnsen Beratende Ingenieure GmbH
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
4 * Dr. Schumacher Ingenieurbüro für Wasser und Umwelt
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
5 *
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
6 * This file is Free Software under the GNU AGPL (>=v3)
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
7 * and comes with ABSOLUTELY NO WARRANTY! Check out the
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
8 * documentation coming with Dive4Elements River for details.
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
9 */
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
10 package org.dive4elements.river.artifacts.uinfo.salix;
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
11
9375
a0a2e68a1e11 Fixed: cm rounding in S-Info flow depth/tkh and U-Info salix via BigDecimal, half_even mode
mschaefer
parents: 9368
diff changeset
12 import java.math.BigDecimal;
9295
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
13 import java.util.ArrayList;
9397
6e7094368e97 Added gauge name column for uinfo iota
mschaefer
parents: 9394
diff changeset
14 import java.util.Collection;
9295
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
15 import java.util.HashMap;
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
16 import java.util.List;
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
17 import java.util.Map;
9316
72b3270e1568 U-Info salix line with regional and supraregional scenario calculation and chart display
mschaefer
parents: 9309
diff changeset
18 import java.util.Map.Entry;
9309
9a9f076d5716 Work on U-Info salix line calculation
mschaefer
parents: 9295
diff changeset
19 import java.util.NavigableMap;
9295
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
20
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
21 import org.dive4elements.river.artifacts.WINFOArtifact;
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
22 import org.dive4elements.river.artifacts.access.ComputationRangeAccess;
9397
6e7094368e97 Added gauge name column for uinfo iota
mschaefer
parents: 9394
diff changeset
23 import org.dive4elements.river.artifacts.common.AbstractResultType;
9295
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
24 import org.dive4elements.river.artifacts.common.GeneralResultType;
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
25 import org.dive4elements.river.artifacts.common.ResultRow;
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
26 import org.dive4elements.river.artifacts.model.Calculation;
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
27 import org.dive4elements.river.artifacts.model.WstValueTable;
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
28 import org.dive4elements.river.artifacts.model.WstValueTable.QPosition;
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
29 import org.dive4elements.river.artifacts.model.WstValueTableFactory;
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
30 import org.dive4elements.river.artifacts.sinfo.common.RiverInfoProvider;
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
31 import org.dive4elements.river.artifacts.sinfo.tkhstate.WinfoArtifactWrapper;
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
32 import org.dive4elements.river.artifacts.uinfo.UINFOArtifact;
9328
b3d3c958a594 Renamed package name
gernotbelger
parents: 9321
diff changeset
33 import org.dive4elements.river.artifacts.uinfo.common.UInfoResultType;
9309
9a9f076d5716 Work on U-Info salix line calculation
mschaefer
parents: 9295
diff changeset
34 import org.dive4elements.river.artifacts.uinfo.salix.SalixLineAccess.ScenarioType;
9295
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
35 import org.dive4elements.river.model.Gauge;
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
36 import org.dive4elements.river.model.MainValue;
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
37 import org.dive4elements.river.model.MainValueType.MainValueTypeKey;
9361
2aec052d4088 Refactoring on SalixLineCalculationResult etc., calculation using MQ etc., scenario (regional+supra) csv columns and meta data added
mschaefer
parents: 9328
diff changeset
38 import org.dive4elements.river.utils.Formatter;
9295
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
39
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
40 /**
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
41 * Calculation of the result rows of the u-info salix line calc mode
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
42 *
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
43 * @author Matthias Schäfer
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
44 */
9321
a978b601a034 Salix: Fixed ArrrayoutOfBoundsException; minor cleanup
gernotbelger
parents: 9316
diff changeset
45 final class SalixLineCalculator {
9295
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
46
9375
a0a2e68a1e11 Fixed: cm rounding in S-Info flow depth/tkh and U-Info salix via BigDecimal, half_even mode
mschaefer
parents: 9368
diff changeset
47 private static final BigDecimal SALIX_DISTANCE = new BigDecimal("2.31");
9295
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
48 private final List<ResultRow> rows = new ArrayList<>();
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
49
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
50 private final RiverInfoProvider riverInfoProvider;
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
51
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
52 private final Map<Gauge, QPosition> gaugeMwPos;
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
53 private final Map<Gauge, QPosition> gaugeMnwPos;
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
54 private final Map<Gauge, QPosition> gaugeMhwPos;
9430
e8b1255fc89e Added calculation of salix hw5 and salix line w
mschaefer
parents: 9429
diff changeset
55 private final Map<Gauge, QPosition> gaugeHw5Pos;
9368
6f7e92c16050 Fixed U-Info salix mw calculation, added filtered themes, own y axis, warning report
mschaefer
parents: 9361
diff changeset
56 private QPosition refGaugeMwPos;
6f7e92c16050 Fixed U-Info salix mw calculation, added filtered themes, own y axis, warning report
mschaefer
parents: 9361
diff changeset
57 private QPosition refGaugeMnwPos;
6f7e92c16050 Fixed U-Info salix mw calculation, added filtered themes, own y axis, warning report
mschaefer
parents: 9361
diff changeset
58 private QPosition refGaugeMhwPos;
9430
e8b1255fc89e Added calculation of salix hw5 and salix line w
mschaefer
parents: 9429
diff changeset
59 private QPosition refGaugeHw5Pos;
9397
6e7094368e97 Added gauge name column for uinfo iota
mschaefer
parents: 9394
diff changeset
60 private Gauge firstGauge;
9295
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
61
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
62 private Calculation problems;
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
63
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
64 private WstValueTable wst;
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
65
9321
a978b601a034 Salix: Fixed ArrrayoutOfBoundsException; minor cleanup
gernotbelger
parents: 9316
diff changeset
66 public SalixLineCalculator(final RiverInfoProvider riverInfoProvider) {
9295
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
67 this.riverInfoProvider = riverInfoProvider;
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
68 this.gaugeMwPos = new HashMap<>();
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
69 this.gaugeMnwPos = new HashMap<>();
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
70 this.gaugeMhwPos = new HashMap<>();
9430
e8b1255fc89e Added calculation of salix hw5 and salix line w
mschaefer
parents: 9429
diff changeset
71 this.gaugeHw5Pos = new HashMap<>();
9295
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
72 }
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
73
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
74 /**
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
75 * Calculate the salix line result rows
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
76 */
9309
9a9f076d5716 Work on U-Info salix line calculation
mschaefer
parents: 9295
diff changeset
77 public void execute(final Calculation problems, final UINFOArtifact uinfo, final NavigableMap<Double, List<Double>> rangeScenarios,
9361
2aec052d4088 Refactoring on SalixLineCalculationResult etc., calculation using MQ etc., scenario (regional+supra) csv columns and meta data added
mschaefer
parents: 9328
diff changeset
78 final ScenarioType scenarioType, final String[] scenarioLabels, final String rangeString, final String additionalString,
2aec052d4088 Refactoring on SalixLineCalculationResult etc., calculation using MQ etc., scenario (regional+supra) csv columns and meta data added
mschaefer
parents: 9328
diff changeset
79 final SalixLineCalculationResults results) {
9295
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
80
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
81 this.problems = problems;
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
82 this.wst = WstValueTableFactory.getTable(this.riverInfoProvider.getRiver());
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
83
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
84 fetchGaugeMainValuePositions();
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
85
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
86 final WINFOArtifact winfo = new WinfoArtifactWrapper(uinfo);
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
87 winfo.addStringData("ld_mode", "distance");
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
88 winfo.addStringData("ld_step", "100");
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
89 for (final double station : new ComputationRangeAccess(winfo).getKms()) {
9321
a978b601a034 Salix: Fixed ArrrayoutOfBoundsException; minor cleanup
gernotbelger
parents: 9316
diff changeset
90 this.rows.add(createRow(station, rangeScenarios));
9295
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
91 }
9309
9a9f076d5716 Work on U-Info salix line calculation
mschaefer
parents: 9295
diff changeset
92 if (scenarioType == ScenarioType.REGIONAL)
9361
2aec052d4088 Refactoring on SalixLineCalculationResult etc., calculation using MQ etc., scenario (regional+supra) csv columns and meta data added
mschaefer
parents: 9328
diff changeset
93 results.addResult(new SalixLineCalculationRegionalResult("Salix-regional", scenarioLabels, rangeString, additionalString, this.rows), problems);
9309
9a9f076d5716 Work on U-Info salix line calculation
mschaefer
parents: 9295
diff changeset
94 else if (scenarioType == ScenarioType.SUPRAREGIONAL)
9361
2aec052d4088 Refactoring on SalixLineCalculationResult etc., calculation using MQ etc., scenario (regional+supra) csv columns and meta data added
mschaefer
parents: 9328
diff changeset
95 results.addResult(new SalixLineCalculationSupraRegionalResult("Salix-supra", scenarioLabels, rangeString, additionalString, this.rows), problems);
9309
9a9f076d5716 Work on U-Info salix line calculation
mschaefer
parents: 9295
diff changeset
96 else if (scenarioType == ScenarioType.HISTORICAL)
9361
2aec052d4088 Refactoring on SalixLineCalculationResult etc., calculation using MQ etc., scenario (regional+supra) csv columns and meta data added
mschaefer
parents: 9328
diff changeset
97 results.addResult(new SalixLineCalculationHistoricalResult("Salix-hist", scenarioLabels, rangeString, additionalString, this.rows), problems);
9309
9a9f076d5716 Work on U-Info salix line calculation
mschaefer
parents: 9295
diff changeset
98 else
9361
2aec052d4088 Refactoring on SalixLineCalculationResult etc., calculation using MQ etc., scenario (regional+supra) csv columns and meta data added
mschaefer
parents: 9328
diff changeset
99 results.addResult(new SalixLineCalculationResult("Salix-simple", this.rows), problems);
9295
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
100 }
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
101
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
102 /**
9361
2aec052d4088 Refactoring on SalixLineCalculationResult etc., calculation using MQ etc., scenario (regional+supra) csv columns and meta data added
mschaefer
parents: 9328
diff changeset
103 * Fetch MQ, MNQ and MHQ of all gauges and determine the wst QPosition for each one
9295
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
104 */
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
105 private void fetchGaugeMainValuePositions() {
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
106 this.gaugeMwPos.clear();
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
107 this.gaugeMnwPos.clear();
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
108 this.gaugeMhwPos.clear();
9430
e8b1255fc89e Added calculation of salix hw5 and salix line w
mschaefer
parents: 9429
diff changeset
109 this.gaugeHw5Pos.clear();
e8b1255fc89e Added calculation of salix hw5 and salix line w
mschaefer
parents: 9429
diff changeset
110
9397
6e7094368e97 Added gauge name column for uinfo iota
mschaefer
parents: 9394
diff changeset
111 this.firstGauge = null;
9295
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
112 for (final Gauge gauge : this.riverInfoProvider.getGauges()) {
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
113 this.gaugeMwPos.put(gauge, null);
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
114 this.gaugeMnwPos.put(gauge, null);
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
115 this.gaugeMhwPos.put(gauge, null);
9430
e8b1255fc89e Added calculation of salix hw5 and salix line w
mschaefer
parents: 9429
diff changeset
116 this.gaugeHw5Pos.put(gauge, null);
9295
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
117 final double gaugeKm = gauge.getStation().doubleValue();
9361
2aec052d4088 Refactoring on SalixLineCalculationResult etc., calculation using MQ etc., scenario (regional+supra) csv columns and meta data added
mschaefer
parents: 9328
diff changeset
118 for (final MainValue mv : MainValue.getValuesOfGaugeAndType(gauge, MainValueTypeKey.Q)) {
2aec052d4088 Refactoring on SalixLineCalculationResult etc., calculation using MQ etc., scenario (regional+supra) csv columns and meta data added
mschaefer
parents: 9328
diff changeset
119 if (mv.getMainValue().getName().equalsIgnoreCase("mq"))
2aec052d4088 Refactoring on SalixLineCalculationResult etc., calculation using MQ etc., scenario (regional+supra) csv columns and meta data added
mschaefer
parents: 9328
diff changeset
120 this.gaugeMwPos.put(gauge, this.wst.getQPosition(gaugeKm, mv.getValue().doubleValue()));
2aec052d4088 Refactoring on SalixLineCalculationResult etc., calculation using MQ etc., scenario (regional+supra) csv columns and meta data added
mschaefer
parents: 9328
diff changeset
121 else if (mv.getMainValue().getName().equalsIgnoreCase("mnq"))
2aec052d4088 Refactoring on SalixLineCalculationResult etc., calculation using MQ etc., scenario (regional+supra) csv columns and meta data added
mschaefer
parents: 9328
diff changeset
122 this.gaugeMnwPos.put(gauge, this.wst.getQPosition(gaugeKm, mv.getValue().doubleValue()));
2aec052d4088 Refactoring on SalixLineCalculationResult etc., calculation using MQ etc., scenario (regional+supra) csv columns and meta data added
mschaefer
parents: 9328
diff changeset
123 else if (mv.getMainValue().getName().equalsIgnoreCase("mhq"))
2aec052d4088 Refactoring on SalixLineCalculationResult etc., calculation using MQ etc., scenario (regional+supra) csv columns and meta data added
mschaefer
parents: 9328
diff changeset
124 this.gaugeMhwPos.put(gauge, this.wst.getQPosition(gaugeKm, mv.getValue().doubleValue()));
9430
e8b1255fc89e Added calculation of salix hw5 and salix line w
mschaefer
parents: 9429
diff changeset
125 else if (mv.getMainValue().getName().equalsIgnoreCase("hq5"))
e8b1255fc89e Added calculation of salix hw5 and salix line w
mschaefer
parents: 9429
diff changeset
126 this.gaugeHw5Pos.put(gauge, this.wst.getQPosition(gaugeKm, mv.getValue().doubleValue()));
9295
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
127 }
9397
6e7094368e97 Added gauge name column for uinfo iota
mschaefer
parents: 9394
diff changeset
128 if (this.firstGauge == null) {
9368
6f7e92c16050 Fixed U-Info salix mw calculation, added filtered themes, own y axis, warning report
mschaefer
parents: 9361
diff changeset
129 this.refGaugeMwPos = this.gaugeMwPos.get(gauge);
6f7e92c16050 Fixed U-Info salix mw calculation, added filtered themes, own y axis, warning report
mschaefer
parents: 9361
diff changeset
130 this.refGaugeMnwPos = this.gaugeMnwPos.get(gauge);
6f7e92c16050 Fixed U-Info salix mw calculation, added filtered themes, own y axis, warning report
mschaefer
parents: 9361
diff changeset
131 this.refGaugeMhwPos = this.gaugeMhwPos.get(gauge);
9430
e8b1255fc89e Added calculation of salix hw5 and salix line w
mschaefer
parents: 9429
diff changeset
132 this.refGaugeHw5Pos = this.gaugeHw5Pos.get(gauge);
9397
6e7094368e97 Added gauge name column for uinfo iota
mschaefer
parents: 9394
diff changeset
133 this.firstGauge = gauge;
9368
6f7e92c16050 Fixed U-Info salix mw calculation, added filtered themes, own y axis, warning report
mschaefer
parents: 9361
diff changeset
134 }
6f7e92c16050 Fixed U-Info salix mw calculation, added filtered themes, own y axis, warning report
mschaefer
parents: 9361
diff changeset
135 }
6f7e92c16050 Fixed U-Info salix mw calculation, added filtered themes, own y axis, warning report
mschaefer
parents: 9361
diff changeset
136 if (this.refGaugeMwPos == null)
6f7e92c16050 Fixed U-Info salix mw calculation, added filtered themes, own y axis, warning report
mschaefer
parents: 9361
diff changeset
137 this.problems.addProblem("uinfo_salix_calc.warning.missing_mq");
6f7e92c16050 Fixed U-Info salix mw calculation, added filtered themes, own y axis, warning report
mschaefer
parents: 9361
diff changeset
138 else {
6f7e92c16050 Fixed U-Info salix mw calculation, added filtered themes, own y axis, warning report
mschaefer
parents: 9361
diff changeset
139 if (this.refGaugeMhwPos == null)
6f7e92c16050 Fixed U-Info salix mw calculation, added filtered themes, own y axis, warning report
mschaefer
parents: 9361
diff changeset
140 this.problems.addProblem("uinfo_salix_calc.warning.missing_mhq");
6f7e92c16050 Fixed U-Info salix mw calculation, added filtered themes, own y axis, warning report
mschaefer
parents: 9361
diff changeset
141 if (this.refGaugeMnwPos == null)
6f7e92c16050 Fixed U-Info salix mw calculation, added filtered themes, own y axis, warning report
mschaefer
parents: 9361
diff changeset
142 this.problems.addProblem("uinfo_salix_calc.warning.missing_mnq");
9295
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
143 }
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
144 }
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
145
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
146 /**
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
147 * Create a result row for a station and its gauge, and add w-q-values as selected
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
148 */
9321
a978b601a034 Salix: Fixed ArrrayoutOfBoundsException; minor cleanup
gernotbelger
parents: 9316
diff changeset
149 private ResultRow createRow(final double station, final NavigableMap<Double, List<Double>> rangeScenarios) {
9295
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
150
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
151 final ResultRow row = ResultRow.create();
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
152 row.putValue(GeneralResultType.station, station);
9394
439699ff9b2d Added U-Info iota (prev. salix) calculation for historical scenario
mschaefer
parents: 9382
diff changeset
153 // Find station's gauge (obsolete version which calculates gauge-wise)
9368
6f7e92c16050 Fixed U-Info salix mw calculation, added filtered themes, own y axis, warning report
mschaefer
parents: 9361
diff changeset
154 // final Gauge gauge = this.riverInfoProvider.getGauge(station, true);
9316
72b3270e1568 U-Info salix line with regional and supraregional scenario calculation and chart display
mschaefer
parents: 9309
diff changeset
155 // Interpolate mnw, mw, and mhw
9368
6f7e92c16050 Fixed U-Info salix mw calculation, added filtered themes, own y axis, warning report
mschaefer
parents: 9361
diff changeset
156 // final double mnw = interpolateW(station, this.gaugeMnwPos.get(gauge));
6f7e92c16050 Fixed U-Info salix mw calculation, added filtered themes, own y axis, warning report
mschaefer
parents: 9361
diff changeset
157 // final double mw = interpolateW(station, this.gaugeMwPos.get(gauge));
6f7e92c16050 Fixed U-Info salix mw calculation, added filtered themes, own y axis, warning report
mschaefer
parents: 9361
diff changeset
158 // final double mhw = interpolateW(station, this.gaugeMhwPos.get(gauge));
6f7e92c16050 Fixed U-Info salix mw calculation, added filtered themes, own y axis, warning report
mschaefer
parents: 9361
diff changeset
159 final double mnw = interpolateW(station, this.refGaugeMnwPos);
6f7e92c16050 Fixed U-Info salix mw calculation, added filtered themes, own y axis, warning report
mschaefer
parents: 9361
diff changeset
160 final double mw = interpolateW(station, this.refGaugeMwPos);
6f7e92c16050 Fixed U-Info salix mw calculation, added filtered themes, own y axis, warning report
mschaefer
parents: 9361
diff changeset
161 final double mhw = interpolateW(station, this.refGaugeMhwPos);
9430
e8b1255fc89e Added calculation of salix hw5 and salix line w
mschaefer
parents: 9429
diff changeset
162 final double hw5 = interpolateW(station, this.refGaugeHw5Pos);
9429
bd5f5d2220fa Work on salix cross sections; waterlevels work now with different colors
gernotbelger
parents: 9397
diff changeset
163 row.putValue(UInfoResultType.waterlevelMNW, mnw);
bd5f5d2220fa Work on salix cross sections; waterlevels work now with different colors
gernotbelger
parents: 9397
diff changeset
164 row.putValue(UInfoResultType.waterlevelMW, mw);
bd5f5d2220fa Work on salix cross sections; waterlevels work now with different colors
gernotbelger
parents: 9397
diff changeset
165 row.putValue(UInfoResultType.waterlevelMHW, mhw);
9430
e8b1255fc89e Added calculation of salix hw5 and salix line w
mschaefer
parents: 9429
diff changeset
166 row.putValue(UInfoResultType.waterlevelMH5, hw5);
9429
bd5f5d2220fa Work on salix cross sections; waterlevels work now with different colors
gernotbelger
parents: 9397
diff changeset
167
9316
72b3270e1568 U-Info salix line with regional and supraregional scenario calculation and chart display
mschaefer
parents: 9309
diff changeset
168 // Calc salix-line and mw-mnw
9295
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
169 row.putValue(UInfoResultType.salixline, calcSalix(mhw, mw));
9361
2aec052d4088 Refactoring on SalixLineCalculationResult etc., calculation using MQ etc., scenario (regional+supra) csv columns and meta data added
mschaefer
parents: 9328
diff changeset
170 row.putValue(UInfoResultType.salix_mw_mnw, calcMwmnw(mw, mnw));
9430
e8b1255fc89e Added calculation of salix hw5 and salix line w
mschaefer
parents: 9429
diff changeset
171 row.putValue(UInfoResultType.salixw, mhw - SALIX_DISTANCE.doubleValue());
9316
72b3270e1568 U-Info salix line with regional and supraregional scenario calculation and chart display
mschaefer
parents: 9309
diff changeset
172 // Calc scenario values (always all scenario types set, Result variant extracts the fields needed)
72b3270e1568 U-Info salix line with regional and supraregional scenario calculation and chart display
mschaefer
parents: 9309
diff changeset
173 final List<SalixScenario> scenarios = new ArrayList<>();
9394
439699ff9b2d Added U-Info iota (prev. salix) calculation for historical scenario
mschaefer
parents: 9382
diff changeset
174 final List<Double> deltaws = getDeltaWs(station, rangeScenarios);
439699ff9b2d Added U-Info iota (prev. salix) calculation for historical scenario
mschaefer
parents: 9382
diff changeset
175 for (final Double deltaw : deltaws) {
439699ff9b2d Added U-Info iota (prev. salix) calculation for historical scenario
mschaefer
parents: 9382
diff changeset
176 if (deltaw != null) {
439699ff9b2d Added U-Info iota (prev. salix) calculation for historical scenario
mschaefer
parents: 9382
diff changeset
177 final double salix = calcSalix(mhw, mw + deltaw);
9430
e8b1255fc89e Added calculation of salix hw5 and salix line w
mschaefer
parents: 9429
diff changeset
178 scenarios.add(new SalixScenario((int) (deltaw * 100), salix, mhw + deltaw - SALIX_DISTANCE.doubleValue()));
9316
72b3270e1568 U-Info salix line with regional and supraregional scenario calculation and chart display
mschaefer
parents: 9309
diff changeset
179 }
9361
2aec052d4088 Refactoring on SalixLineCalculationResult etc., calculation using MQ etc., scenario (regional+supra) csv columns and meta data added
mschaefer
parents: 9328
diff changeset
180 else {
2aec052d4088 Refactoring on SalixLineCalculationResult etc., calculation using MQ etc., scenario (regional+supra) csv columns and meta data added
mschaefer
parents: 9328
diff changeset
181 scenarios.add(null);
2aec052d4088 Refactoring on SalixLineCalculationResult etc., calculation using MQ etc., scenario (regional+supra) csv columns and meta data added
mschaefer
parents: 9328
diff changeset
182 }
9316
72b3270e1568 U-Info salix line with regional and supraregional scenario calculation and chart display
mschaefer
parents: 9309
diff changeset
183 }
9361
2aec052d4088 Refactoring on SalixLineCalculationResult etc., calculation using MQ etc., scenario (regional+supra) csv columns and meta data added
mschaefer
parents: 9328
diff changeset
184 row.putValue(UInfoResultType.customMultiRowColSalixScenarios, scenarios);
9397
6e7094368e97 Added gauge name column for uinfo iota
mschaefer
parents: 9394
diff changeset
185 row.putValue(GeneralResultType.gaugeLabel, this.riverInfoProvider.findGauge(station));
9295
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
186 return row;
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
187 }
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
188
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
189 /**
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
190 * Interpolates the W for a station with a fixed (virtual) wst column position
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
191 */
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
192 private double interpolateW(final double station, final QPosition qPosition) {
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
193 if (qPosition != null)
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
194 return this.wst.interpolateW(station, qPosition, this.problems);
9321
a978b601a034 Salix: Fixed ArrrayoutOfBoundsException; minor cleanup
gernotbelger
parents: 9316
diff changeset
195 return Double.NaN;
9295
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
196 }
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
197
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
198 /**
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
199 * Calculates the salix value
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
200 */
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
201 private double calcSalix(final double mhw, final double mw) {
9382
8ae7137b67d7 Fixed: avoiding NaN exception in BigDecimal rounding
mschaefer
parents: 9375
diff changeset
202 if (Double.isNaN(mw) || Double.isInfinite(mw) || Double.isNaN(mhw) || Double.isInfinite(mhw))
8ae7137b67d7 Fixed: avoiding NaN exception in BigDecimal rounding
mschaefer
parents: 9375
diff changeset
203 return mw; // preserving NaN or Infinity
9375
a0a2e68a1e11 Fixed: cm rounding in S-Info flow depth/tkh and U-Info salix via BigDecimal, half_even mode
mschaefer
parents: 9368
diff changeset
204 return Formatter.roundW(mhw).subtract(SALIX_DISTANCE).subtract(Formatter.roundW(mw)).doubleValue();
9295
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
205 }
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
206
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
207 /**
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
208 * Calculates the inverse MW-MNW difference
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
209 */
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
210 private double calcMwmnw(final double mw, final double mnw) {
9382
8ae7137b67d7 Fixed: avoiding NaN exception in BigDecimal rounding
mschaefer
parents: 9375
diff changeset
211 if (Double.isNaN(mw) || Double.isInfinite(mw) || Double.isNaN(mnw) || Double.isInfinite(mnw))
8ae7137b67d7 Fixed: avoiding NaN exception in BigDecimal rounding
mschaefer
parents: 9375
diff changeset
212 return mnw - mw; // preserving NaN or Inifinity
9375
a0a2e68a1e11 Fixed: cm rounding in S-Info flow depth/tkh and U-Info salix via BigDecimal, half_even mode
mschaefer
parents: 9368
diff changeset
213 return Formatter.roundW(mnw).subtract(Formatter.roundW(mw)).doubleValue();
9295
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
214 }
9316
72b3270e1568 U-Info salix line with regional and supraregional scenario calculation and chart display
mschaefer
parents: 9309
diff changeset
215
72b3270e1568 U-Info salix line with regional and supraregional scenario calculation and chart display
mschaefer
parents: 9309
diff changeset
216 /**
9394
439699ff9b2d Added U-Info iota (prev. salix) calculation for historical scenario
mschaefer
parents: 9382
diff changeset
217 * Gets the station-specific list of delta-ws of the active scenario, at least with one null item in any case
9316
72b3270e1568 U-Info salix line with regional and supraregional scenario calculation and chart display
mschaefer
parents: 9309
diff changeset
218 */
9394
439699ff9b2d Added U-Info iota (prev. salix) calculation for historical scenario
mschaefer
parents: 9382
diff changeset
219 private List<Double> getDeltaWs(final double station, final NavigableMap<Double, List<Double>> rangeScenarios) {
9321
a978b601a034 Salix: Fixed ArrrayoutOfBoundsException; minor cleanup
gernotbelger
parents: 9316
diff changeset
220 final Entry<Double, List<Double>> stationScenarios = rangeScenarios.floorEntry(station);
9394
439699ff9b2d Added U-Info iota (prev. salix) calculation for historical scenario
mschaefer
parents: 9382
diff changeset
221 if (stationScenarios != null) {
439699ff9b2d Added U-Info iota (prev. salix) calculation for historical scenario
mschaefer
parents: 9382
diff changeset
222 return stationScenarios.getValue();
439699ff9b2d Added U-Info iota (prev. salix) calculation for historical scenario
mschaefer
parents: 9382
diff changeset
223 }
439699ff9b2d Added U-Info iota (prev. salix) calculation for historical scenario
mschaefer
parents: 9382
diff changeset
224 final List<Double> noScen = new ArrayList<>();
439699ff9b2d Added U-Info iota (prev. salix) calculation for historical scenario
mschaefer
parents: 9382
diff changeset
225 noScen.add(null);
439699ff9b2d Added U-Info iota (prev. salix) calculation for historical scenario
mschaefer
parents: 9382
diff changeset
226 return noScen;
9316
72b3270e1568 U-Info salix line with regional and supraregional scenario calculation and chart display
mschaefer
parents: 9309
diff changeset
227 }
9397
6e7094368e97 Added gauge name column for uinfo iota
mschaefer
parents: 9394
diff changeset
228
6e7094368e97 Added gauge name column for uinfo iota
mschaefer
parents: 9394
diff changeset
229 /**
6e7094368e97 Added gauge name column for uinfo iota
mschaefer
parents: 9394
diff changeset
230 * Find and return a height (iota, w main value) of a station in a previously calculated result
6e7094368e97 Added gauge name column for uinfo iota
mschaefer
parents: 9394
diff changeset
231 */
6e7094368e97 Added gauge name column for uinfo iota
mschaefer
parents: 9394
diff changeset
232 public double fetchStationHeight(final Calculation problems, final double station, final AbstractResultType resultType,
6e7094368e97 Added gauge name column for uinfo iota
mschaefer
parents: 9394
diff changeset
233 final SalixLineCalculationResult result) {
6e7094368e97 Added gauge name column for uinfo iota
mschaefer
parents: 9394
diff changeset
234
6e7094368e97 Added gauge name column for uinfo iota
mschaefer
parents: 9394
diff changeset
235 // Search the station in the previously calculated result rows
6e7094368e97 Added gauge name column for uinfo iota
mschaefer
parents: 9394
diff changeset
236 final ResultRow stationRow = searchStation(station, result.getRows());
6e7094368e97 Added gauge name column for uinfo iota
mschaefer
parents: 9394
diff changeset
237 if (stationRow != null)
6e7094368e97 Added gauge name column for uinfo iota
mschaefer
parents: 9394
diff changeset
238 return stationRow.getDoubleValue(resultType);
6e7094368e97 Added gauge name column for uinfo iota
mschaefer
parents: 9394
diff changeset
239 return Double.NaN;
6e7094368e97 Added gauge name column for uinfo iota
mschaefer
parents: 9394
diff changeset
240 }
6e7094368e97 Added gauge name column for uinfo iota
mschaefer
parents: 9394
diff changeset
241
6e7094368e97 Added gauge name column for uinfo iota
mschaefer
parents: 9394
diff changeset
242 /**
6e7094368e97 Added gauge name column for uinfo iota
mschaefer
parents: 9394
diff changeset
243 * Searches the row of a station in a result rows collection
6e7094368e97 Added gauge name column for uinfo iota
mschaefer
parents: 9394
diff changeset
244 */
6e7094368e97 Added gauge name column for uinfo iota
mschaefer
parents: 9394
diff changeset
245 private ResultRow searchStation(final double station, final Collection<ResultRow> rows) {
6e7094368e97 Added gauge name column for uinfo iota
mschaefer
parents: 9394
diff changeset
246 for (final ResultRow row : rows) {
6e7094368e97 Added gauge name column for uinfo iota
mschaefer
parents: 9394
diff changeset
247 if (row.getDoubleValue(GeneralResultType.station) > station + 0.0001)
6e7094368e97 Added gauge name column for uinfo iota
mschaefer
parents: 9394
diff changeset
248 return row;
6e7094368e97 Added gauge name column for uinfo iota
mschaefer
parents: 9394
diff changeset
249 }
6e7094368e97 Added gauge name column for uinfo iota
mschaefer
parents: 9394
diff changeset
250 return null;
6e7094368e97 Added gauge name column for uinfo iota
mschaefer
parents: 9394
diff changeset
251 }
9321
a978b601a034 Salix: Fixed ArrrayoutOfBoundsException; minor cleanup
gernotbelger
parents: 9316
diff changeset
252 }

http://dive4elements.wald.intevation.org