annotate artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/salix/SalixLineCalculator.java @ 9499:853f2dafc16e

VegetationZones in CrossSectionsDiagram
author gernotbelger
date Thu, 27 Sep 2018 18:06:26 +0200
parents e44c1a8b0c54
children 76c0665888a3
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.List;
9316
72b3270e1568 U-Info salix line with regional and supraregional scenario calculation and chart display
mschaefer
parents: 9309
diff changeset
16 import java.util.Map.Entry;
9309
9a9f076d5716 Work on U-Info salix line calculation
mschaefer
parents: 9295
diff changeset
17 import java.util.NavigableMap;
9295
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
18
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
19 import org.dive4elements.river.artifacts.WINFOArtifact;
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
20 import org.dive4elements.river.artifacts.access.ComputationRangeAccess;
9397
6e7094368e97 Added gauge name column for uinfo iota
mschaefer
parents: 9394
diff changeset
21 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
22 import org.dive4elements.river.artifacts.common.GeneralResultType;
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
23 import org.dive4elements.river.artifacts.common.ResultRow;
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
24 import org.dive4elements.river.artifacts.model.Calculation;
9499
853f2dafc16e VegetationZones in CrossSectionsDiagram
gernotbelger
parents: 9490
diff changeset
25 import org.dive4elements.river.artifacts.model.river.MainWstValuesCalculator;
853f2dafc16e VegetationZones in CrossSectionsDiagram
gernotbelger
parents: 9490
diff changeset
26 import org.dive4elements.river.artifacts.model.river.RiverInfoProvider;
9295
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
27 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
28 import org.dive4elements.river.artifacts.uinfo.UINFOArtifact;
9328
b3d3c958a594 Renamed package name
gernotbelger
parents: 9321
diff changeset
29 import org.dive4elements.river.artifacts.uinfo.common.UInfoResultType;
9309
9a9f076d5716 Work on U-Info salix line calculation
mschaefer
parents: 9295
diff changeset
30 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
31 import org.dive4elements.river.artifacts.uinfo.vegetationzones.VegetationZoneServerClientXChange;
9361
2aec052d4088 Refactoring on SalixLineCalculationResult etc., calculation using MQ etc., scenario (regional+supra) csv columns and meta data added
mschaefer
parents: 9328
diff changeset
32 import org.dive4elements.river.utils.Formatter;
9295
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
33
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
34 /**
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
35 * 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
36 *
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
37 * @author Matthias Schäfer
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
38 */
9321
a978b601a034 Salix: Fixed ArrrayoutOfBoundsException; minor cleanup
gernotbelger
parents: 9316
diff changeset
39 final class SalixLineCalculator {
9295
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
40
9499
853f2dafc16e VegetationZones in CrossSectionsDiagram
gernotbelger
parents: 9490
diff changeset
41 private static final String MAIN_VALUE_MNQ = "mnq";
853f2dafc16e VegetationZones in CrossSectionsDiagram
gernotbelger
parents: 9490
diff changeset
42
853f2dafc16e VegetationZones in CrossSectionsDiagram
gernotbelger
parents: 9490
diff changeset
43 private static final String MAIN_VALUE_MQ = "mq";
853f2dafc16e VegetationZones in CrossSectionsDiagram
gernotbelger
parents: 9490
diff changeset
44
853f2dafc16e VegetationZones in CrossSectionsDiagram
gernotbelger
parents: 9490
diff changeset
45 private static final String MAIN_VALUE_MHQ = "mhq";
853f2dafc16e VegetationZones in CrossSectionsDiagram
gernotbelger
parents: 9490
diff changeset
46
853f2dafc16e VegetationZones in CrossSectionsDiagram
gernotbelger
parents: 9490
diff changeset
47 private static final String MAIN_VALUE_HQ5 = "hq5";
853f2dafc16e VegetationZones in CrossSectionsDiagram
gernotbelger
parents: 9490
diff changeset
48
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
49 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
50 private final List<ResultRow> rows = new ArrayList<>();
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 RiverInfoProvider riverInfoProvider;
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
53
9321
a978b601a034 Salix: Fixed ArrrayoutOfBoundsException; minor cleanup
gernotbelger
parents: 9316
diff changeset
54 public SalixLineCalculator(final RiverInfoProvider riverInfoProvider) {
9295
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
55 this.riverInfoProvider = riverInfoProvider;
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
56 }
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
57
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
58 /**
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
59 * Calculate the salix line result rows
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
60 */
9309
9a9f076d5716 Work on U-Info salix line calculation
mschaefer
parents: 9295
diff changeset
61 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
62 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
63 final SalixLineCalculationResults results) {
9295
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
64
9499
853f2dafc16e VegetationZones in CrossSectionsDiagram
gernotbelger
parents: 9490
diff changeset
65 final MainWstValuesCalculator mainWstValues = fetchGaugeMainValuePositions2(problems);
9295
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
66
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
67 final WINFOArtifact winfo = new WinfoArtifactWrapper(uinfo);
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
68 winfo.addStringData("ld_mode", "distance");
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
69 winfo.addStringData("ld_step", "100");
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
70 for (final double station : new ComputationRangeAccess(winfo).getKms()) {
9499
853f2dafc16e VegetationZones in CrossSectionsDiagram
gernotbelger
parents: 9490
diff changeset
71 this.rows.add(createRow(mainWstValues, station, rangeScenarios));
9295
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
72 }
9309
9a9f076d5716 Work on U-Info salix line calculation
mschaefer
parents: 9295
diff changeset
73 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
74 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
75 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
76 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
77 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
78 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
79 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
80 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
81 }
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
82
9499
853f2dafc16e VegetationZones in CrossSectionsDiagram
gernotbelger
parents: 9490
diff changeset
83 private MainWstValuesCalculator fetchGaugeMainValuePositions2(final Calculation problems) {
853f2dafc16e VegetationZones in CrossSectionsDiagram
gernotbelger
parents: 9490
diff changeset
84 final MainWstValuesCalculator mainWstValues = MainWstValuesCalculator.forRiverInfo(this.riverInfoProvider, MAIN_VALUE_MQ, MAIN_VALUE_MNQ,
853f2dafc16e VegetationZones in CrossSectionsDiagram
gernotbelger
parents: 9490
diff changeset
85 MAIN_VALUE_MHQ, MAIN_VALUE_HQ5);
9430
e8b1255fc89e Added calculation of salix hw5 and salix line w
mschaefer
parents: 9429
diff changeset
86
9499
853f2dafc16e VegetationZones in CrossSectionsDiagram
gernotbelger
parents: 9490
diff changeset
87 if (!mainWstValues.hasPosition(MAIN_VALUE_MQ))
853f2dafc16e VegetationZones in CrossSectionsDiagram
gernotbelger
parents: 9490
diff changeset
88 problems.addProblem("uinfo_salix_calc.warning.missing_mq");
853f2dafc16e VegetationZones in CrossSectionsDiagram
gernotbelger
parents: 9490
diff changeset
89 else {
853f2dafc16e VegetationZones in CrossSectionsDiagram
gernotbelger
parents: 9490
diff changeset
90 if (!mainWstValues.hasPosition(MAIN_VALUE_MHQ))
853f2dafc16e VegetationZones in CrossSectionsDiagram
gernotbelger
parents: 9490
diff changeset
91 problems.addProblem("uinfo_salix_calc.warning.missing_mhq");
853f2dafc16e VegetationZones in CrossSectionsDiagram
gernotbelger
parents: 9490
diff changeset
92 if (!mainWstValues.hasPosition(MAIN_VALUE_MNQ))
853f2dafc16e VegetationZones in CrossSectionsDiagram
gernotbelger
parents: 9490
diff changeset
93 problems.addProblem("uinfo_salix_calc.warning.missing_mnq");
9368
6f7e92c16050 Fixed U-Info salix mw calculation, added filtered themes, own y axis, warning report
mschaefer
parents: 9361
diff changeset
94 }
9499
853f2dafc16e VegetationZones in CrossSectionsDiagram
gernotbelger
parents: 9490
diff changeset
95
853f2dafc16e VegetationZones in CrossSectionsDiagram
gernotbelger
parents: 9490
diff changeset
96 return mainWstValues;
9295
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
97 }
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
98
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
99 /**
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
100 * Create a result row for a station and its gauge, and add w-q-values as selected
9499
853f2dafc16e VegetationZones in CrossSectionsDiagram
gernotbelger
parents: 9490
diff changeset
101 *
853f2dafc16e VegetationZones in CrossSectionsDiagram
gernotbelger
parents: 9490
diff changeset
102 * @param mainWstValues
9295
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
103 */
9499
853f2dafc16e VegetationZones in CrossSectionsDiagram
gernotbelger
parents: 9490
diff changeset
104 private ResultRow createRow(final MainWstValuesCalculator mainWstValues, 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
105
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
106 final ResultRow row = ResultRow.create();
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
107 row.putValue(GeneralResultType.station, station);
9394
439699ff9b2d Added U-Info iota (prev. salix) calculation for historical scenario
mschaefer
parents: 9382
diff changeset
108 // 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
109 // 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
110 // 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
111 // 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
112 // 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
113 // final double mhw = interpolateW(station, this.gaugeMhwPos.get(gauge));
9499
853f2dafc16e VegetationZones in CrossSectionsDiagram
gernotbelger
parents: 9490
diff changeset
114 final double mnw = mainWstValues.interpolateW(station, MAIN_VALUE_MNQ);
853f2dafc16e VegetationZones in CrossSectionsDiagram
gernotbelger
parents: 9490
diff changeset
115 final double mw = mainWstValues.interpolateW(station, MAIN_VALUE_MQ);
853f2dafc16e VegetationZones in CrossSectionsDiagram
gernotbelger
parents: 9490
diff changeset
116 final double mhw = mainWstValues.interpolateW(station, MAIN_VALUE_MHQ);
853f2dafc16e VegetationZones in CrossSectionsDiagram
gernotbelger
parents: 9490
diff changeset
117 final double hw5 = mainWstValues.interpolateW(station, MAIN_VALUE_HQ5);
9429
bd5f5d2220fa Work on salix cross sections; waterlevels work now with different colors
gernotbelger
parents: 9397
diff changeset
118 row.putValue(UInfoResultType.waterlevelMNW, mnw);
bd5f5d2220fa Work on salix cross sections; waterlevels work now with different colors
gernotbelger
parents: 9397
diff changeset
119 row.putValue(UInfoResultType.waterlevelMW, mw);
bd5f5d2220fa Work on salix cross sections; waterlevels work now with different colors
gernotbelger
parents: 9397
diff changeset
120 row.putValue(UInfoResultType.waterlevelMHW, mhw);
9430
e8b1255fc89e Added calculation of salix hw5 and salix line w
mschaefer
parents: 9429
diff changeset
121 row.putValue(UInfoResultType.waterlevelMH5, hw5);
9429
bd5f5d2220fa Work on salix cross sections; waterlevels work now with different colors
gernotbelger
parents: 9397
diff changeset
122
9316
72b3270e1568 U-Info salix line with regional and supraregional scenario calculation and chart display
mschaefer
parents: 9309
diff changeset
123 // Calc salix-line and mw-mnw
9490
e44c1a8b0c54 Fixed: rounding problems in iota/salix scenario calculation
mschaefer
parents: 9443
diff changeset
124 row.putValue(UInfoResultType.salixline, calcSalix(mhw, mw, 0.0));
9361
2aec052d4088 Refactoring on SalixLineCalculationResult etc., calculation using MQ etc., scenario (regional+supra) csv columns and meta data added
mschaefer
parents: 9328
diff changeset
125 row.putValue(UInfoResultType.salix_mw_mnw, calcMwmnw(mw, mnw));
9490
e44c1a8b0c54 Fixed: rounding problems in iota/salix scenario calculation
mschaefer
parents: 9443
diff changeset
126 final double salixw = Formatter.roundW(mhw).subtract(SALIX_DISTANCE).doubleValue();
e44c1a8b0c54 Fixed: rounding problems in iota/salix scenario calculation
mschaefer
parents: 9443
diff changeset
127 row.putValue(UInfoResultType.salixw, salixw);
9316
72b3270e1568 U-Info salix line with regional and supraregional scenario calculation and chart display
mschaefer
parents: 9309
diff changeset
128 // 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
129 final List<SalixScenario> scenarios = new ArrayList<>();
9394
439699ff9b2d Added U-Info iota (prev. salix) calculation for historical scenario
mschaefer
parents: 9382
diff changeset
130 final List<Double> deltaws = getDeltaWs(station, rangeScenarios);
439699ff9b2d Added U-Info iota (prev. salix) calculation for historical scenario
mschaefer
parents: 9382
diff changeset
131 for (final Double deltaw : deltaws) {
439699ff9b2d Added U-Info iota (prev. salix) calculation for historical scenario
mschaefer
parents: 9382
diff changeset
132 if (deltaw != null) {
9490
e44c1a8b0c54 Fixed: rounding problems in iota/salix scenario calculation
mschaefer
parents: 9443
diff changeset
133 final double salix = calcSalix(mhw, mw, deltaw.doubleValue());
e44c1a8b0c54 Fixed: rounding problems in iota/salix scenario calculation
mschaefer
parents: 9443
diff changeset
134 final double scen = calcSalix(mhw, 0.0, deltaw.doubleValue());
e44c1a8b0c54 Fixed: rounding problems in iota/salix scenario calculation
mschaefer
parents: 9443
diff changeset
135 scenarios.add(new SalixScenario((int) (deltaw * 100), salix, scen));
9499
853f2dafc16e VegetationZones in CrossSectionsDiagram
gernotbelger
parents: 9490
diff changeset
136 } 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
137 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
138 }
9316
72b3270e1568 U-Info salix line with regional and supraregional scenario calculation and chart display
mschaefer
parents: 9309
diff changeset
139 }
9361
2aec052d4088 Refactoring on SalixLineCalculationResult etc., calculation using MQ etc., scenario (regional+supra) csv columns and meta data added
mschaefer
parents: 9328
diff changeset
140 row.putValue(UInfoResultType.customMultiRowColSalixScenarios, scenarios);
9397
6e7094368e97 Added gauge name column for uinfo iota
mschaefer
parents: 9394
diff changeset
141 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
142 return row;
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 * Calculates the salix value
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
147 */
9490
e44c1a8b0c54 Fixed: rounding problems in iota/salix scenario calculation
mschaefer
parents: 9443
diff changeset
148 private double calcSalix(final double mhw, final double mw, final double deltamw) {
9382
8ae7137b67d7 Fixed: avoiding NaN exception in BigDecimal rounding
mschaefer
parents: 9375
diff changeset
149 if (Double.isNaN(mw) || Double.isInfinite(mw) || Double.isNaN(mhw) || Double.isInfinite(mhw))
9490
e44c1a8b0c54 Fixed: rounding problems in iota/salix scenario calculation
mschaefer
parents: 9443
diff changeset
150 return mhw - mw; // preserving NaN or Infinity
e44c1a8b0c54 Fixed: rounding problems in iota/salix scenario calculation
mschaefer
parents: 9443
diff changeset
151 return Formatter.roundW(mhw).subtract(SALIX_DISTANCE).subtract(Formatter.roundW(mw).add(Formatter.roundW(deltamw))).doubleValue();
9295
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
152 }
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
153
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
154 /**
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
155 * Calculates the inverse MW-MNW difference
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
156 */
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
157 private double calcMwmnw(final double mw, final double mnw) {
9382
8ae7137b67d7 Fixed: avoiding NaN exception in BigDecimal rounding
mschaefer
parents: 9375
diff changeset
158 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
159 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
160 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
161 }
9316
72b3270e1568 U-Info salix line with regional and supraregional scenario calculation and chart display
mschaefer
parents: 9309
diff changeset
162
72b3270e1568 U-Info salix line with regional and supraregional scenario calculation and chart display
mschaefer
parents: 9309
diff changeset
163 /**
9394
439699ff9b2d Added U-Info iota (prev. salix) calculation for historical scenario
mschaefer
parents: 9382
diff changeset
164 * 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
165 */
9394
439699ff9b2d Added U-Info iota (prev. salix) calculation for historical scenario
mschaefer
parents: 9382
diff changeset
166 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
167 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
168 if (stationScenarios != null) {
439699ff9b2d Added U-Info iota (prev. salix) calculation for historical scenario
mschaefer
parents: 9382
diff changeset
169 return stationScenarios.getValue();
439699ff9b2d Added U-Info iota (prev. salix) calculation for historical scenario
mschaefer
parents: 9382
diff changeset
170 }
439699ff9b2d Added U-Info iota (prev. salix) calculation for historical scenario
mschaefer
parents: 9382
diff changeset
171 final List<Double> noScen = new ArrayList<>();
439699ff9b2d Added U-Info iota (prev. salix) calculation for historical scenario
mschaefer
parents: 9382
diff changeset
172 noScen.add(null);
439699ff9b2d Added U-Info iota (prev. salix) calculation for historical scenario
mschaefer
parents: 9382
diff changeset
173 return noScen;
9316
72b3270e1568 U-Info salix line with regional and supraregional scenario calculation and chart display
mschaefer
parents: 9309
diff changeset
174 }
9397
6e7094368e97 Added gauge name column for uinfo iota
mschaefer
parents: 9394
diff changeset
175
6e7094368e97 Added gauge name column for uinfo iota
mschaefer
parents: 9394
diff changeset
176 /**
6e7094368e97 Added gauge name column for uinfo iota
mschaefer
parents: 9394
diff changeset
177 * 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
178 */
6e7094368e97 Added gauge name column for uinfo iota
mschaefer
parents: 9394
diff changeset
179 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
180 final SalixLineCalculationResult result) {
6e7094368e97 Added gauge name column for uinfo iota
mschaefer
parents: 9394
diff changeset
181
6e7094368e97 Added gauge name column for uinfo iota
mschaefer
parents: 9394
diff changeset
182 // Search the station in the previously calculated result rows
6e7094368e97 Added gauge name column for uinfo iota
mschaefer
parents: 9394
diff changeset
183 final ResultRow stationRow = searchStation(station, result.getRows());
6e7094368e97 Added gauge name column for uinfo iota
mschaefer
parents: 9394
diff changeset
184 if (stationRow != null)
6e7094368e97 Added gauge name column for uinfo iota
mschaefer
parents: 9394
diff changeset
185 return stationRow.getDoubleValue(resultType);
6e7094368e97 Added gauge name column for uinfo iota
mschaefer
parents: 9394
diff changeset
186 return Double.NaN;
6e7094368e97 Added gauge name column for uinfo iota
mschaefer
parents: 9394
diff changeset
187 }
6e7094368e97 Added gauge name column for uinfo iota
mschaefer
parents: 9394
diff changeset
188
6e7094368e97 Added gauge name column for uinfo iota
mschaefer
parents: 9394
diff changeset
189 /**
6e7094368e97 Added gauge name column for uinfo iota
mschaefer
parents: 9394
diff changeset
190 * Searches the row of a station in a result rows collection
6e7094368e97 Added gauge name column for uinfo iota
mschaefer
parents: 9394
diff changeset
191 */
6e7094368e97 Added gauge name column for uinfo iota
mschaefer
parents: 9394
diff changeset
192 private ResultRow searchStation(final double station, final Collection<ResultRow> rows) {
6e7094368e97 Added gauge name column for uinfo iota
mschaefer
parents: 9394
diff changeset
193 for (final ResultRow row : rows) {
6e7094368e97 Added gauge name column for uinfo iota
mschaefer
parents: 9394
diff changeset
194 if (row.getDoubleValue(GeneralResultType.station) > station + 0.0001)
6e7094368e97 Added gauge name column for uinfo iota
mschaefer
parents: 9394
diff changeset
195 return row;
6e7094368e97 Added gauge name column for uinfo iota
mschaefer
parents: 9394
diff changeset
196 }
6e7094368e97 Added gauge name column for uinfo iota
mschaefer
parents: 9394
diff changeset
197 return null;
6e7094368e97 Added gauge name column for uinfo iota
mschaefer
parents: 9394
diff changeset
198 }
9443
515643b2c49a Added computation of uinfo salix line vegetation zone height (not yet connected to the cross section facet)
mschaefer
parents: 9430
diff changeset
199
515643b2c49a Added computation of uinfo salix line vegetation zone height (not yet connected to the cross section facet)
mschaefer
parents: 9430
diff changeset
200 /**
515643b2c49a Added computation of uinfo salix line vegetation zone height (not yet connected to the cross section facet)
mschaefer
parents: 9430
diff changeset
201 * 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
202 */
515643b2c49a Added computation of uinfo salix line vegetation zone height (not yet connected to the cross section facet)
mschaefer
parents: 9430
diff changeset
203 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
204 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
205
515643b2c49a Added computation of uinfo salix line vegetation zone height (not yet connected to the cross section facet)
mschaefer
parents: 9430
diff changeset
206 // 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
207 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
208 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
209 return Double.NaN;
9499
853f2dafc16e VegetationZones in CrossSectionsDiagram
gernotbelger
parents: 9490
diff changeset
210
9443
515643b2c49a Added computation of uinfo salix line vegetation zone height (not yet connected to the cross section facet)
mschaefer
parents: 9430
diff changeset
211 // 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
212 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
213 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
214 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
215 // Ü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
216 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
217 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
218 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
219 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
220 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
221 }
515643b2c49a Added computation of uinfo salix line vegetation zone height (not yet connected to the cross section facet)
mschaefer
parents: 9430
diff changeset
222 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
223 }
515643b2c49a Added computation of uinfo salix line vegetation zone height (not yet connected to the cross section facet)
mschaefer
parents: 9430
diff changeset
224 }

http://dive4elements.wald.intevation.org