Mercurial > dive4elements > river
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 | 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 | 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 | 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 | 25 import org.dive4elements.river.artifacts.model.river.MainWstValuesCalculator; |
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 | 29 import org.dive4elements.river.artifacts.uinfo.common.UInfoResultType; |
9309 | 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 | 41 private static final String MAIN_VALUE_MNQ = "mnq"; |
42 | |
43 private static final String MAIN_VALUE_MQ = "mq"; | |
44 | |
45 private static final String MAIN_VALUE_MHQ = "mhq"; | |
46 | |
47 private static final String MAIN_VALUE_HQ5 = "hq5"; | |
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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 83 private MainWstValuesCalculator fetchGaugeMainValuePositions2(final Calculation problems) { |
84 final MainWstValuesCalculator mainWstValues = MainWstValuesCalculator.forRiverInfo(this.riverInfoProvider, MAIN_VALUE_MQ, MAIN_VALUE_MNQ, | |
85 MAIN_VALUE_MHQ, MAIN_VALUE_HQ5); | |
9430 | 86 |
9499 | 87 if (!mainWstValues.hasPosition(MAIN_VALUE_MQ)) |
88 problems.addProblem("uinfo_salix_calc.warning.missing_mq"); | |
89 else { | |
90 if (!mainWstValues.hasPosition(MAIN_VALUE_MHQ)) | |
91 problems.addProblem("uinfo_salix_calc.warning.missing_mhq"); | |
92 if (!mainWstValues.hasPosition(MAIN_VALUE_MNQ)) | |
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 | 95 |
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 | 101 * |
102 * @param mainWstValues | |
9295
385b52ccde23
Work on U-Info salix line calculation and chart (no scenario case)
mschaefer
parents:
diff
changeset
|
103 */ |
9499 | 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 | 114 final double mnw = mainWstValues.interpolateW(station, MAIN_VALUE_MNQ); |
115 final double mw = mainWstValues.interpolateW(station, MAIN_VALUE_MQ); | |
116 final double mhw = mainWstValues.interpolateW(station, MAIN_VALUE_MHQ); | |
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 | 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 | 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 | 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 | 175 |
176 /** | |
177 * Find and return a height (iota, w main value) of a station in a previously calculated result | |
178 */ | |
179 public double fetchStationHeight(final Calculation problems, final double station, final AbstractResultType resultType, | |
180 final SalixLineCalculationResult result) { | |
181 | |
182 // Search the station in the previously calculated result rows | |
183 final ResultRow stationRow = searchStation(station, result.getRows()); | |
184 if (stationRow != null) | |
185 return stationRow.getDoubleValue(resultType); | |
186 return Double.NaN; | |
187 } | |
188 | |
189 /** | |
190 * Searches the row of a station in a result rows collection | |
191 */ | |
192 private ResultRow searchStation(final double station, final Collection<ResultRow> rows) { | |
193 for (final ResultRow row : rows) { | |
194 if (row.getDoubleValue(GeneralResultType.station) > station + 0.0001) | |
195 return row; | |
196 } | |
197 return null; | |
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 | 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 } |