annotate artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/salix/SalixLineCalculator.java @ 9316:72b3270e1568

U-Info salix line with regional and supraregional scenario calculation and chart display
author mschaefer
date Thu, 26 Jul 2018 17:28:32 +0200
parents 9a9f076d5716
children a978b601a034
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
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
12 import java.util.ArrayList;
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
13 import java.util.HashMap;
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
14 import java.util.List;
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
15 import java.util.Map;
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.artifacts.CallContext;
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
20 import org.dive4elements.river.artifacts.WINFOArtifact;
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
21 import org.dive4elements.river.artifacts.access.ComputationRangeAccess;
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;
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
25 import org.dive4elements.river.artifacts.model.WstValueTable;
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
26 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
27 import org.dive4elements.river.artifacts.model.WstValueTableFactory;
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
28 import org.dive4elements.river.artifacts.sinfo.common.GaugeDischargeValuesFinder;
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
29 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
30 import org.dive4elements.river.artifacts.sinfo.common.SInfoResultType;
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;
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
33 import org.dive4elements.river.artifacts.uinfo.commons.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;
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
38
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 * 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
41 *
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
42 * @author Matthias Schäfer
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 public class SalixLineCalculator {
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
45
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
46 private final List<ResultRow> rows = new ArrayList<>();
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
47
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
48 private final RiverInfoProvider riverInfoProvider;
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 CallContext context;
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;
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
55
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
56 private Calculation problems;
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 private WstValueTable wst;
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
59
9316
72b3270e1568 U-Info salix line with regional and supraregional scenario calculation and chart display
mschaefer
parents: 9309
diff changeset
60 /**
72b3270e1568 U-Info salix line with regional and supraregional scenario calculation and chart display
mschaefer
parents: 9309
diff changeset
61 * List of delta-w (may be 0) mapped by km range
72b3270e1568 U-Info salix line with regional and supraregional scenario calculation and chart display
mschaefer
parents: 9309
diff changeset
62 */
9309
9a9f076d5716 Work on U-Info salix line calculation
mschaefer
parents: 9295
diff changeset
63 private NavigableMap<Double, List<Double>> rangeScenarios;
9a9f076d5716 Work on U-Info salix line calculation
mschaefer
parents: 9295
diff changeset
64
9a9f076d5716 Work on U-Info salix line calculation
mschaefer
parents: 9295
diff changeset
65
9295
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
66 public SalixLineCalculator(final CallContext context, final RiverInfoProvider riverInfoProvider) {
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
67 this.context = context;
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<>();
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 /**
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
9a9f076d5716 Work on U-Info salix line calculation
mschaefer
parents: 9295
diff changeset
78 public void execute(final Calculation problems, final UINFOArtifact uinfo, final NavigableMap<Double, List<Double>> rangeScenarios,
9316
72b3270e1568 U-Info salix line with regional and supraregional scenario calculation and chart display
mschaefer
parents: 9309
diff changeset
79 final ScenarioType scenarioType, final String[] scenarioLabels, 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());
9309
9a9f076d5716 Work on U-Info salix line calculation
mschaefer
parents: 9295
diff changeset
83 this.rangeScenarios = rangeScenarios;
9295
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()) {
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
91 this.rows.add(createRow(station));
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
92 }
9309
9a9f076d5716 Work on U-Info salix line calculation
mschaefer
parents: 9295
diff changeset
93 if (scenarioType == ScenarioType.REGIONAL)
9316
72b3270e1568 U-Info salix line with regional and supraregional scenario calculation and chart display
mschaefer
parents: 9309
diff changeset
94 results.addResult(new SalixLineCalculationRegionalResult("Salix", scenarioLabels, this.rows), problems);
9309
9a9f076d5716 Work on U-Info salix line calculation
mschaefer
parents: 9295
diff changeset
95 else if (scenarioType == ScenarioType.SUPRAREGIONAL)
9316
72b3270e1568 U-Info salix line with regional and supraregional scenario calculation and chart display
mschaefer
parents: 9309
diff changeset
96 results.addResult(new SalixLineCalculationSupraRegionalResult("Salix", this.rows), problems);
9309
9a9f076d5716 Work on U-Info salix line calculation
mschaefer
parents: 9295
diff changeset
97 else if (scenarioType == ScenarioType.HISTORICAL)
9316
72b3270e1568 U-Info salix line with regional and supraregional scenario calculation and chart display
mschaefer
parents: 9309
diff changeset
98 results.addResult(new SalixLineCalculationHistoricalResult("Salix", this.rows), problems);
9309
9a9f076d5716 Work on U-Info salix line calculation
mschaefer
parents: 9295
diff changeset
99 else
9316
72b3270e1568 U-Info salix line with regional and supraregional scenario calculation and chart display
mschaefer
parents: 9309
diff changeset
100 results.addResult(new SalixLineCalculationNoScenarioResult("Salix", 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 /**
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
104 * Fetch MW, MNW and MHW of all gauges and determine the wst QPosition for each one
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();
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
110 for (final Gauge gauge : this.riverInfoProvider.getGauges()) {
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
111 this.gaugeMwPos.put(gauge, null);
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
112 this.gaugeMnwPos.put(gauge, null);
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
113 this.gaugeMhwPos.put(gauge, null);
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
114 final GaugeDischargeValuesFinder finder = GaugeDischargeValuesFinder.loadValues(gauge, this.problems);
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
115 if (finder == null)
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
116 continue;
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
117 final double gaugeKm = gauge.getStation().doubleValue();
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
118 for (final MainValue mv : MainValue.getValuesOfGaugeAndType(gauge, MainValueTypeKey.W)) {
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
119 if (mv.getMainValue().getName().equalsIgnoreCase("mw"))
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
120 this.gaugeMwPos.put(gauge, this.wst.getQPosition(gaugeKm, finder.getDischarge(mv.getValue().doubleValue())));
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
121 else if (mv.getMainValue().getName().equalsIgnoreCase("mnw"))
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
122 this.gaugeMnwPos.put(gauge, this.wst.getQPosition(gaugeKm, finder.getDischarge(mv.getValue().doubleValue())));
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
123 else if (mv.getMainValue().getName().equalsIgnoreCase("mhw"))
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
124 this.gaugeMhwPos.put(gauge, this.wst.getQPosition(gaugeKm, finder.getDischarge(mv.getValue().doubleValue())));
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
125 }
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
126 }
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
127 }
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
128
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
129 /**
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
130 * 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
131 */
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
132 private ResultRow createRow(final double station) {
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
133
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
134 final ResultRow row = ResultRow.create();
9316
72b3270e1568 U-Info salix line with regional and supraregional scenario calculation and chart display
mschaefer
parents: 9309
diff changeset
135 // Find station's gauge
9295
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
136 final Gauge gauge = this.riverInfoProvider.getGauge(station, true);
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
137 row.putValue(GeneralResultType.station, station);
9316
72b3270e1568 U-Info salix line with regional and supraregional scenario calculation and chart display
mschaefer
parents: 9309
diff changeset
138 // Interpolate mnw, mw, and mhw
9295
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
139 final double mnw = interpolateW(station, this.gaugeMnwPos.get(gauge));
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
140 final double mw = interpolateW(station, this.gaugeMwPos.get(gauge));
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
141 final double mhw = interpolateW(station, this.gaugeMhwPos.get(gauge));
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
142 row.putValue(SInfoResultType.waterlevel, mnw);
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
143 row.putValue(SInfoResultType.waterlevel1, mw);
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
144 row.putValue(SInfoResultType.waterlevel2, mhw);
9316
72b3270e1568 U-Info salix line with regional and supraregional scenario calculation and chart display
mschaefer
parents: 9309
diff changeset
145 // Calc salix-line and mw-mnw
9295
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
146 row.putValue(UInfoResultType.salixline, calcSalix(mhw, mw));
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
147 row.putValue(UInfoResultType.salix_delta_mw, calcMwmnw(mw, mnw));
9316
72b3270e1568 U-Info salix line with regional and supraregional scenario calculation and chart display
mschaefer
parents: 9309
diff changeset
148 // 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
149 final List<SalixScenario> scenarios = new ArrayList<>();
72b3270e1568 U-Info salix line with regional and supraregional scenario calculation and chart display
mschaefer
parents: 9309
diff changeset
150 final double[] deltaws = getDeltaWs(station);
72b3270e1568 U-Info salix line with regional and supraregional scenario calculation and chart display
mschaefer
parents: 9309
diff changeset
151 for (int i = 0; i <= deltaws.length - 1; i++) {
72b3270e1568 U-Info salix line with regional and supraregional scenario calculation and chart display
mschaefer
parents: 9309
diff changeset
152 if (Math.abs(deltaws[i]) < 0.0001) {
72b3270e1568 U-Info salix line with regional and supraregional scenario calculation and chart display
mschaefer
parents: 9309
diff changeset
153 row.putValue(UInfoResultType.salix_line_scenario, Double.NaN);
72b3270e1568 U-Info salix line with regional and supraregional scenario calculation and chart display
mschaefer
parents: 9309
diff changeset
154 row.putValue(UInfoResultType.salix_line_scenario_dwspl, 0); // TODO NaN when changed from int to double
72b3270e1568 U-Info salix line with regional and supraregional scenario calculation and chart display
mschaefer
parents: 9309
diff changeset
155 }
72b3270e1568 U-Info salix line with regional and supraregional scenario calculation and chart display
mschaefer
parents: 9309
diff changeset
156 else {
72b3270e1568 U-Info salix line with regional and supraregional scenario calculation and chart display
mschaefer
parents: 9309
diff changeset
157 final double salix = calcSalix(mhw, mw + deltaws[i]);
72b3270e1568 U-Info salix line with regional and supraregional scenario calculation and chart display
mschaefer
parents: 9309
diff changeset
158 row.putValue(UInfoResultType.salix_line_scenario, salix);
72b3270e1568 U-Info salix line with regional and supraregional scenario calculation and chart display
mschaefer
parents: 9309
diff changeset
159 row.putValue(UInfoResultType.salix_line_scenario_dwspl, (int) (deltaws[i] * 100));
72b3270e1568 U-Info salix line with regional and supraregional scenario calculation and chart display
mschaefer
parents: 9309
diff changeset
160 scenarios.add(new SalixScenario((int) (deltaws[i] * 100), salix));
72b3270e1568 U-Info salix line with regional and supraregional scenario calculation and chart display
mschaefer
parents: 9309
diff changeset
161 }
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 row.putValue(UInfoResultType.customMultiRowColSalixRegionalValue_Dwspl, scenarios);
9295
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
164 return row;
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
165 }
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
166
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
167 /**
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
168 * 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
169 */
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
170 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
171 if (qPosition != null)
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
172 return this.wst.interpolateW(station, qPosition, this.problems);
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
173 else
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
174 return Double.NaN;
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
175 }
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
176
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
177 /**
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
178 * Calculates the salix value
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
179 */
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
180 private double calcSalix(final double mhw, final double mw) {
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
181 return mhw - 2.31 - mw;
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
182 }
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
183
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
184 /**
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
185 * Calculates the inverse MW-MNW difference
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
186 */
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
187 private double calcMwmnw(final double mw, final double mnw) {
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
188 return mnw - mw;
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
189 }
9316
72b3270e1568 U-Info salix line with regional and supraregional scenario calculation and chart display
mschaefer
parents: 9309
diff changeset
190
72b3270e1568 U-Info salix line with regional and supraregional scenario calculation and chart display
mschaefer
parents: 9309
diff changeset
191 /**
72b3270e1568 U-Info salix line with regional and supraregional scenario calculation and chart display
mschaefer
parents: 9309
diff changeset
192 * Gets the station-specific list of delta-ws of the active scenario, at least with one 0 item in any case
72b3270e1568 U-Info salix line with regional and supraregional scenario calculation and chart display
mschaefer
parents: 9309
diff changeset
193 */
72b3270e1568 U-Info salix line with regional and supraregional scenario calculation and chart display
mschaefer
parents: 9309
diff changeset
194 private double[] getDeltaWs(final double station) {
72b3270e1568 U-Info salix line with regional and supraregional scenario calculation and chart display
mschaefer
parents: 9309
diff changeset
195 final Entry<Double, List<Double>> stationScenarios = this.rangeScenarios.floorEntry(station);
72b3270e1568 U-Info salix line with regional and supraregional scenario calculation and chart display
mschaefer
parents: 9309
diff changeset
196 if (stationScenarios == null)
72b3270e1568 U-Info salix line with regional and supraregional scenario calculation and chart display
mschaefer
parents: 9309
diff changeset
197 return new double[] { 0.0 };
72b3270e1568 U-Info salix line with regional and supraregional scenario calculation and chart display
mschaefer
parents: 9309
diff changeset
198 else {
72b3270e1568 U-Info salix line with regional and supraregional scenario calculation and chart display
mschaefer
parents: 9309
diff changeset
199 final double[] deltaws = new double[stationScenarios.getValue().size()];
72b3270e1568 U-Info salix line with regional and supraregional scenario calculation and chart display
mschaefer
parents: 9309
diff changeset
200 for (int i = 0; i <= stationScenarios.getValue().size() - 1; i++)
72b3270e1568 U-Info salix line with regional and supraregional scenario calculation and chart display
mschaefer
parents: 9309
diff changeset
201 deltaws[i] = stationScenarios.getValue().get(i);
72b3270e1568 U-Info salix line with regional and supraregional scenario calculation and chart display
mschaefer
parents: 9309
diff changeset
202 return deltaws;
72b3270e1568 U-Info salix line with regional and supraregional scenario calculation and chart display
mschaefer
parents: 9309
diff changeset
203 }
72b3270e1568 U-Info salix line with regional and supraregional scenario calculation and chart display
mschaefer
parents: 9309
diff changeset
204 }
9295
385b52ccde23 Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff changeset
205 }

http://dive4elements.wald.intevation.org