Mercurial > dive4elements > river
annotate artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/salix/SalixLineCalculator.java @ 9443:515643b2c49a
Added computation of uinfo salix line vegetation zone height (not yet connected to the cross section facet)
author | mschaefer |
---|---|
date | Mon, 20 Aug 2018 18:50:33 +0200 |
parents | e8b1255fc89e |
children | e44c1a8b0c54 |
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 | 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 | 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 | 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 | 33 import org.dive4elements.river.artifacts.uinfo.common.UInfoResultType; |
9309 | 34 import org.dive4elements.river.artifacts.uinfo.salix.SalixLineAccess.ScenarioType; |
9443
515643b2c49a
Added computation of uinfo salix line vegetation zone height (not yet connected to the cross section facet)
mschaefer
parents:
9430
diff
changeset
|
35 import org.dive4elements.river.artifacts.uinfo.vegetationzones.VegetationZoneServerClientXChange; |
9295
385b52ccde23
Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff
changeset
|
36 import org.dive4elements.river.model.Gauge; |
385b52ccde23
Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff
changeset
|
37 import org.dive4elements.river.model.MainValue; |
385b52ccde23
Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff
changeset
|
38 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
|
39 import org.dive4elements.river.utils.Formatter; |
9295
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 /** |
385b52ccde23
Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff
changeset
|
42 * 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
|
43 * |
385b52ccde23
Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff
changeset
|
44 * @author Matthias Schäfer |
385b52ccde23
Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff
changeset
|
45 */ |
9321
a978b601a034
Salix: Fixed ArrrayoutOfBoundsException; minor cleanup
gernotbelger
parents:
9316
diff
changeset
|
46 final class SalixLineCalculator { |
9295
385b52ccde23
Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff
changeset
|
47 |
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
|
48 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
|
49 private final List<ResultRow> rows = new ArrayList<>(); |
385b52ccde23
Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff
changeset
|
50 |
385b52ccde23
Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff
changeset
|
51 private final RiverInfoProvider riverInfoProvider; |
385b52ccde23
Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff
changeset
|
52 |
385b52ccde23
Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff
changeset
|
53 private final Map<Gauge, QPosition> gaugeMwPos; |
385b52ccde23
Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff
changeset
|
54 private final Map<Gauge, QPosition> gaugeMnwPos; |
385b52ccde23
Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff
changeset
|
55 private final Map<Gauge, QPosition> gaugeMhwPos; |
9430 | 56 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
|
57 private QPosition refGaugeMwPos; |
6f7e92c16050
Fixed U-Info salix mw calculation, added filtered themes, own y axis, warning report
mschaefer
parents:
9361
diff
changeset
|
58 private QPosition refGaugeMnwPos; |
6f7e92c16050
Fixed U-Info salix mw calculation, added filtered themes, own y axis, warning report
mschaefer
parents:
9361
diff
changeset
|
59 private QPosition refGaugeMhwPos; |
9430 | 60 private QPosition refGaugeHw5Pos; |
9397 | 61 private Gauge firstGauge; |
9295
385b52ccde23
Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff
changeset
|
62 |
385b52ccde23
Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff
changeset
|
63 private Calculation problems; |
385b52ccde23
Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff
changeset
|
64 |
385b52ccde23
Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff
changeset
|
65 private WstValueTable wst; |
385b52ccde23
Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff
changeset
|
66 |
9321
a978b601a034
Salix: Fixed ArrrayoutOfBoundsException; minor cleanup
gernotbelger
parents:
9316
diff
changeset
|
67 public SalixLineCalculator(final RiverInfoProvider riverInfoProvider) { |
9295
385b52ccde23
Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff
changeset
|
68 this.riverInfoProvider = riverInfoProvider; |
385b52ccde23
Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff
changeset
|
69 this.gaugeMwPos = new HashMap<>(); |
385b52ccde23
Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff
changeset
|
70 this.gaugeMnwPos = new HashMap<>(); |
385b52ccde23
Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff
changeset
|
71 this.gaugeMhwPos = new HashMap<>(); |
9430 | 72 this.gaugeHw5Pos = new HashMap<>(); |
9295
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 /** |
385b52ccde23
Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff
changeset
|
76 * Calculate the salix line result rows |
385b52ccde23
Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff
changeset
|
77 */ |
9309 | 78 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
|
79 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
|
80 final SalixLineCalculationResults results) { |
9295
385b52ccde23
Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff
changeset
|
81 |
385b52ccde23
Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff
changeset
|
82 this.problems = problems; |
385b52ccde23
Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff
changeset
|
83 this.wst = WstValueTableFactory.getTable(this.riverInfoProvider.getRiver()); |
385b52ccde23
Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff
changeset
|
84 |
385b52ccde23
Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff
changeset
|
85 fetchGaugeMainValuePositions(); |
385b52ccde23
Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff
changeset
|
86 |
385b52ccde23
Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff
changeset
|
87 final WINFOArtifact winfo = new WinfoArtifactWrapper(uinfo); |
385b52ccde23
Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff
changeset
|
88 winfo.addStringData("ld_mode", "distance"); |
385b52ccde23
Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff
changeset
|
89 winfo.addStringData("ld_step", "100"); |
385b52ccde23
Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff
changeset
|
90 for (final double station : new ComputationRangeAccess(winfo).getKms()) { |
9321
a978b601a034
Salix: Fixed ArrrayoutOfBoundsException; minor cleanup
gernotbelger
parents:
9316
diff
changeset
|
91 this.rows.add(createRow(station, rangeScenarios)); |
9295
385b52ccde23
Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff
changeset
|
92 } |
9309 | 93 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
|
94 results.addResult(new SalixLineCalculationRegionalResult("Salix-regional", scenarioLabels, rangeString, additionalString, this.rows), problems); |
9309 | 95 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
|
96 results.addResult(new SalixLineCalculationSupraRegionalResult("Salix-supra", scenarioLabels, rangeString, additionalString, this.rows), problems); |
9309 | 97 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
|
98 results.addResult(new SalixLineCalculationHistoricalResult("Salix-hist", scenarioLabels, rangeString, additionalString, this.rows), problems); |
9309 | 99 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
|
100 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
|
101 } |
385b52ccde23
Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff
changeset
|
102 |
385b52ccde23
Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff
changeset
|
103 /** |
9361
2aec052d4088
Refactoring on SalixLineCalculationResult etc., calculation using MQ etc., scenario (regional+supra) csv columns and meta data added
mschaefer
parents:
9328
diff
changeset
|
104 * 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
|
105 */ |
385b52ccde23
Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff
changeset
|
106 private void fetchGaugeMainValuePositions() { |
385b52ccde23
Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff
changeset
|
107 this.gaugeMwPos.clear(); |
385b52ccde23
Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff
changeset
|
108 this.gaugeMnwPos.clear(); |
385b52ccde23
Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff
changeset
|
109 this.gaugeMhwPos.clear(); |
9430 | 110 this.gaugeHw5Pos.clear(); |
111 | |
9397 | 112 this.firstGauge = null; |
9295
385b52ccde23
Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff
changeset
|
113 for (final Gauge gauge : this.riverInfoProvider.getGauges()) { |
385b52ccde23
Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff
changeset
|
114 this.gaugeMwPos.put(gauge, null); |
385b52ccde23
Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff
changeset
|
115 this.gaugeMnwPos.put(gauge, null); |
385b52ccde23
Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff
changeset
|
116 this.gaugeMhwPos.put(gauge, null); |
9430 | 117 this.gaugeHw5Pos.put(gauge, null); |
9295
385b52ccde23
Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff
changeset
|
118 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
|
119 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
|
120 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
|
121 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
|
122 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
|
123 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
|
124 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
|
125 this.gaugeMhwPos.put(gauge, this.wst.getQPosition(gaugeKm, mv.getValue().doubleValue())); |
9430 | 126 else if (mv.getMainValue().getName().equalsIgnoreCase("hq5")) |
127 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
|
128 } |
9397 | 129 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
|
130 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
|
131 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
|
132 this.refGaugeMhwPos = this.gaugeMhwPos.get(gauge); |
9430 | 133 this.refGaugeHw5Pos = this.gaugeHw5Pos.get(gauge); |
9397 | 134 this.firstGauge = gauge; |
9368
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 } |
6f7e92c16050
Fixed U-Info salix mw calculation, added filtered themes, own y axis, warning report
mschaefer
parents:
9361
diff
changeset
|
137 if (this.refGaugeMwPos == null) |
6f7e92c16050
Fixed U-Info salix mw calculation, added filtered themes, own y axis, warning report
mschaefer
parents:
9361
diff
changeset
|
138 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
|
139 else { |
6f7e92c16050
Fixed U-Info salix mw calculation, added filtered themes, own y axis, warning report
mschaefer
parents:
9361
diff
changeset
|
140 if (this.refGaugeMhwPos == null) |
6f7e92c16050
Fixed U-Info salix mw calculation, added filtered themes, own y axis, warning report
mschaefer
parents:
9361
diff
changeset
|
141 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
|
142 if (this.refGaugeMnwPos == null) |
6f7e92c16050
Fixed U-Info salix mw calculation, added filtered themes, own y axis, warning report
mschaefer
parents:
9361
diff
changeset
|
143 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
|
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 /** |
385b52ccde23
Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff
changeset
|
148 * 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
|
149 */ |
9321
a978b601a034
Salix: Fixed ArrrayoutOfBoundsException; minor cleanup
gernotbelger
parents:
9316
diff
changeset
|
150 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
|
151 |
385b52ccde23
Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff
changeset
|
152 final ResultRow row = ResultRow.create(); |
385b52ccde23
Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff
changeset
|
153 row.putValue(GeneralResultType.station, station); |
9394
439699ff9b2d
Added U-Info iota (prev. salix) calculation for historical scenario
mschaefer
parents:
9382
diff
changeset
|
154 // 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
|
155 // 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
|
156 // 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
|
157 // 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
|
158 // 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
|
159 // 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
|
160 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
|
161 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
|
162 final double mhw = interpolateW(station, this.refGaugeMhwPos); |
9430 | 163 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
|
164 row.putValue(UInfoResultType.waterlevelMNW, mnw); |
bd5f5d2220fa
Work on salix cross sections; waterlevels work now with different colors
gernotbelger
parents:
9397
diff
changeset
|
165 row.putValue(UInfoResultType.waterlevelMW, mw); |
bd5f5d2220fa
Work on salix cross sections; waterlevels work now with different colors
gernotbelger
parents:
9397
diff
changeset
|
166 row.putValue(UInfoResultType.waterlevelMHW, mhw); |
9430 | 167 row.putValue(UInfoResultType.waterlevelMH5, hw5); |
9429
bd5f5d2220fa
Work on salix cross sections; waterlevels work now with different colors
gernotbelger
parents:
9397
diff
changeset
|
168 |
9316
72b3270e1568
U-Info salix line with regional and supraregional scenario calculation and chart display
mschaefer
parents:
9309
diff
changeset
|
169 // Calc salix-line and mw-mnw |
9295
385b52ccde23
Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff
changeset
|
170 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
|
171 row.putValue(UInfoResultType.salix_mw_mnw, calcMwmnw(mw, mnw)); |
9430 | 172 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
|
173 // 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
|
174 final List<SalixScenario> scenarios = new ArrayList<>(); |
9394
439699ff9b2d
Added U-Info iota (prev. salix) calculation for historical scenario
mschaefer
parents:
9382
diff
changeset
|
175 final List<Double> deltaws = getDeltaWs(station, rangeScenarios); |
439699ff9b2d
Added U-Info iota (prev. salix) calculation for historical scenario
mschaefer
parents:
9382
diff
changeset
|
176 for (final Double deltaw : deltaws) { |
439699ff9b2d
Added U-Info iota (prev. salix) calculation for historical scenario
mschaefer
parents:
9382
diff
changeset
|
177 if (deltaw != null) { |
439699ff9b2d
Added U-Info iota (prev. salix) calculation for historical scenario
mschaefer
parents:
9382
diff
changeset
|
178 final double salix = calcSalix(mhw, mw + deltaw); |
9430 | 179 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
|
180 } |
9361
2aec052d4088
Refactoring on SalixLineCalculationResult etc., calculation using MQ etc., scenario (regional+supra) csv columns and meta data added
mschaefer
parents:
9328
diff
changeset
|
181 else { |
2aec052d4088
Refactoring on SalixLineCalculationResult etc., calculation using MQ etc., scenario (regional+supra) csv columns and meta data added
mschaefer
parents:
9328
diff
changeset
|
182 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
|
183 } |
9316
72b3270e1568
U-Info salix line with regional and supraregional scenario calculation and chart display
mschaefer
parents:
9309
diff
changeset
|
184 } |
9361
2aec052d4088
Refactoring on SalixLineCalculationResult etc., calculation using MQ etc., scenario (regional+supra) csv columns and meta data added
mschaefer
parents:
9328
diff
changeset
|
185 row.putValue(UInfoResultType.customMultiRowColSalixScenarios, scenarios); |
9397 | 186 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
|
187 return row; |
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 /** |
385b52ccde23
Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff
changeset
|
191 * 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
|
192 */ |
385b52ccde23
Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff
changeset
|
193 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
|
194 if (qPosition != null) |
385b52ccde23
Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff
changeset
|
195 return this.wst.interpolateW(station, qPosition, this.problems); |
9321
a978b601a034
Salix: Fixed ArrrayoutOfBoundsException; minor cleanup
gernotbelger
parents:
9316
diff
changeset
|
196 return Double.NaN; |
9295
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 /** |
385b52ccde23
Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff
changeset
|
200 * Calculates the salix value |
385b52ccde23
Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff
changeset
|
201 */ |
385b52ccde23
Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff
changeset
|
202 private double calcSalix(final double mhw, final double mw) { |
9382
8ae7137b67d7
Fixed: avoiding NaN exception in BigDecimal rounding
mschaefer
parents:
9375
diff
changeset
|
203 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
|
204 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
|
205 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
|
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 /** |
385b52ccde23
Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff
changeset
|
209 * Calculates the inverse MW-MNW difference |
385b52ccde23
Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff
changeset
|
210 */ |
385b52ccde23
Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff
changeset
|
211 private double calcMwmnw(final double mw, final double mnw) { |
9382
8ae7137b67d7
Fixed: avoiding NaN exception in BigDecimal rounding
mschaefer
parents:
9375
diff
changeset
|
212 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
|
213 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
|
214 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
|
215 } |
9316
72b3270e1568
U-Info salix line with regional and supraregional scenario calculation and chart display
mschaefer
parents:
9309
diff
changeset
|
216 |
72b3270e1568
U-Info salix line with regional and supraregional scenario calculation and chart display
mschaefer
parents:
9309
diff
changeset
|
217 /** |
9394
439699ff9b2d
Added U-Info iota (prev. salix) calculation for historical scenario
mschaefer
parents:
9382
diff
changeset
|
218 * 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
|
219 */ |
9394
439699ff9b2d
Added U-Info iota (prev. salix) calculation for historical scenario
mschaefer
parents:
9382
diff
changeset
|
220 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
|
221 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
|
222 if (stationScenarios != null) { |
439699ff9b2d
Added U-Info iota (prev. salix) calculation for historical scenario
mschaefer
parents:
9382
diff
changeset
|
223 return stationScenarios.getValue(); |
439699ff9b2d
Added U-Info iota (prev. salix) calculation for historical scenario
mschaefer
parents:
9382
diff
changeset
|
224 } |
439699ff9b2d
Added U-Info iota (prev. salix) calculation for historical scenario
mschaefer
parents:
9382
diff
changeset
|
225 final List<Double> noScen = new ArrayList<>(); |
439699ff9b2d
Added U-Info iota (prev. salix) calculation for historical scenario
mschaefer
parents:
9382
diff
changeset
|
226 noScen.add(null); |
439699ff9b2d
Added U-Info iota (prev. salix) calculation for historical scenario
mschaefer
parents:
9382
diff
changeset
|
227 return noScen; |
9316
72b3270e1568
U-Info salix line with regional and supraregional scenario calculation and chart display
mschaefer
parents:
9309
diff
changeset
|
228 } |
9397 | 229 |
230 /** | |
231 * Find and return a height (iota, w main value) of a station in a previously calculated result | |
232 */ | |
233 public double fetchStationHeight(final Calculation problems, final double station, final AbstractResultType resultType, | |
234 final SalixLineCalculationResult result) { | |
235 | |
236 // Search the station in the previously calculated result rows | |
237 final ResultRow stationRow = searchStation(station, result.getRows()); | |
238 if (stationRow != null) | |
239 return stationRow.getDoubleValue(resultType); | |
240 return Double.NaN; | |
241 } | |
242 | |
243 /** | |
244 * Searches the row of a station in a result rows collection | |
245 */ | |
246 private ResultRow searchStation(final double station, final Collection<ResultRow> rows) { | |
247 for (final ResultRow row : rows) { | |
248 if (row.getDoubleValue(GeneralResultType.station) > station + 0.0001) | |
249 return row; | |
250 } | |
251 return null; | |
252 } | |
9443
515643b2c49a
Added computation of uinfo salix line vegetation zone height (not yet connected to the cross section facet)
mschaefer
parents:
9430
diff
changeset
|
253 |
515643b2c49a
Added computation of uinfo salix line vegetation zone height (not yet connected to the cross section facet)
mschaefer
parents:
9430
diff
changeset
|
254 /** |
515643b2c49a
Added computation of uinfo salix line vegetation zone height (not yet connected to the cross section facet)
mschaefer
parents:
9430
diff
changeset
|
255 * Computes the height of a vegetation zone limit for a station and a previously computed salix line result |
515643b2c49a
Added computation of uinfo salix line vegetation zone height (not yet connected to the cross section facet)
mschaefer
parents:
9430
diff
changeset
|
256 */ |
515643b2c49a
Added computation of uinfo salix line vegetation zone height (not yet connected to the cross section facet)
mschaefer
parents:
9430
diff
changeset
|
257 public double computeVegetationZoneHeight(final Calculation problems, final double station, final int vegetationZoneType, |
515643b2c49a
Added computation of uinfo salix line vegetation zone height (not yet connected to the cross section facet)
mschaefer
parents:
9430
diff
changeset
|
258 final SalixLineCalculationResult result) { |
515643b2c49a
Added computation of uinfo salix line vegetation zone height (not yet connected to the cross section facet)
mschaefer
parents:
9430
diff
changeset
|
259 |
515643b2c49a
Added computation of uinfo salix line vegetation zone height (not yet connected to the cross section facet)
mschaefer
parents:
9430
diff
changeset
|
260 // Search the station in the previously calculated result rows |
515643b2c49a
Added computation of uinfo salix line vegetation zone height (not yet connected to the cross section facet)
mschaefer
parents:
9430
diff
changeset
|
261 final ResultRow stationRow = searchStation(station, result.getRows()); |
515643b2c49a
Added computation of uinfo salix line vegetation zone height (not yet connected to the cross section facet)
mschaefer
parents:
9430
diff
changeset
|
262 if (stationRow == null) |
515643b2c49a
Added computation of uinfo salix line vegetation zone height (not yet connected to the cross section facet)
mschaefer
parents:
9430
diff
changeset
|
263 return Double.NaN; |
515643b2c49a
Added computation of uinfo salix line vegetation zone height (not yet connected to the cross section facet)
mschaefer
parents:
9430
diff
changeset
|
264 // Compute height from overflow duration days |
515643b2c49a
Added computation of uinfo salix line vegetation zone height (not yet connected to the cross section facet)
mschaefer
parents:
9430
diff
changeset
|
265 final List<VegetationZoneServerClientXChange> vzs = VegetationZoneServerClientXChange.getStandardList(null, null); // TODO river, context |
515643b2c49a
Added computation of uinfo salix line vegetation zone height (not yet connected to the cross section facet)
mschaefer
parents:
9430
diff
changeset
|
266 if ((vegetationZoneType >= 1) && (vegetationZoneType <= vzs.size())) { |
515643b2c49a
Added computation of uinfo salix line vegetation zone height (not yet connected to the cross section facet)
mschaefer
parents:
9430
diff
changeset
|
267 final int uefd = vzs.get(vegetationZoneType - 1).getMin_day_overflow(); |
515643b2c49a
Added computation of uinfo salix line vegetation zone height (not yet connected to the cross section facet)
mschaefer
parents:
9430
diff
changeset
|
268 // Üfd = -70,559 ∗ ln((DGM - MW) + 0,5) + 80,711 |
515643b2c49a
Added computation of uinfo salix line vegetation zone height (not yet connected to the cross section facet)
mschaefer
parents:
9430
diff
changeset
|
269 final double f1 = -70.559; |
515643b2c49a
Added computation of uinfo salix line vegetation zone height (not yet connected to the cross section facet)
mschaefer
parents:
9430
diff
changeset
|
270 final double f2 = -88.711; |
515643b2c49a
Added computation of uinfo salix line vegetation zone height (not yet connected to the cross section facet)
mschaefer
parents:
9430
diff
changeset
|
271 final double mw = stationRow.getDoubleValue(UInfoResultType.waterlevelMW); |
515643b2c49a
Added computation of uinfo salix line vegetation zone height (not yet connected to the cross section facet)
mschaefer
parents:
9430
diff
changeset
|
272 final double dgm = Math.exp((uefd - f2) / f1) + mw - 0.5; |
515643b2c49a
Added computation of uinfo salix line vegetation zone height (not yet connected to the cross section facet)
mschaefer
parents:
9430
diff
changeset
|
273 return dgm; |
515643b2c49a
Added computation of uinfo salix line vegetation zone height (not yet connected to the cross section facet)
mschaefer
parents:
9430
diff
changeset
|
274 } |
515643b2c49a
Added computation of uinfo salix line vegetation zone height (not yet connected to the cross section facet)
mschaefer
parents:
9430
diff
changeset
|
275 return Double.NaN; |
515643b2c49a
Added computation of uinfo salix line vegetation zone height (not yet connected to the cross section facet)
mschaefer
parents:
9430
diff
changeset
|
276 } |
515643b2c49a
Added computation of uinfo salix line vegetation zone height (not yet connected to the cross section facet)
mschaefer
parents:
9430
diff
changeset
|
277 } |