Mercurial > dive4elements > river
diff 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 |
line wrap: on
line diff
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/salix/SalixLineCalculator.java Thu Jul 26 17:23:49 2018 +0200 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/salix/SalixLineCalculator.java Thu Jul 26 17:28:32 2018 +0200 @@ -13,6 +13,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Map.Entry; import java.util.NavigableMap; import org.dive4elements.artifacts.CallContext; @@ -56,6 +57,9 @@ private WstValueTable wst; + /** + * List of delta-w (may be 0) mapped by km range + */ private NavigableMap<Double, List<Double>> rangeScenarios; @@ -72,7 +76,7 @@ * Calculate the salix line result rows */ public void execute(final Calculation problems, final UINFOArtifact uinfo, final NavigableMap<Double, List<Double>> rangeScenarios, - final ScenarioType scenarioType, final SalixLineCalculationResults results) { + final ScenarioType scenarioType, final String[] scenarioLabels, final SalixLineCalculationResults results) { this.problems = problems; this.wst = WstValueTableFactory.getTable(this.riverInfoProvider.getRiver()); @@ -87,13 +91,13 @@ this.rows.add(createRow(station)); } if (scenarioType == ScenarioType.REGIONAL) - results.addResult(new SalixLineCalculationRegionalResult("Salix", null, this.rows), problems); + results.addResult(new SalixLineCalculationRegionalResult("Salix", scenarioLabels, this.rows), problems); else if (scenarioType == ScenarioType.SUPRAREGIONAL) - results.addResult(new SalixLineCalculationSupraRegionalResult("Salix", null, this.rows), problems); + results.addResult(new SalixLineCalculationSupraRegionalResult("Salix", this.rows), problems); else if (scenarioType == ScenarioType.HISTORICAL) - results.addResult(new SalixLineCalculationHistoricalResult("Salix", null, this.rows), problems); + results.addResult(new SalixLineCalculationHistoricalResult("Salix", this.rows), problems); else - results.addResult(new SalixLineCalculationNoScenarioResult("Salix", null, this.rows), problems); + results.addResult(new SalixLineCalculationNoScenarioResult("Salix", this.rows), problems); } /** @@ -128,16 +132,35 @@ private ResultRow createRow(final double station) { final ResultRow row = ResultRow.create(); + // Find station's gauge final Gauge gauge = this.riverInfoProvider.getGauge(station, true); row.putValue(GeneralResultType.station, station); + // Interpolate mnw, mw, and mhw final double mnw = interpolateW(station, this.gaugeMnwPos.get(gauge)); final double mw = interpolateW(station, this.gaugeMwPos.get(gauge)); final double mhw = interpolateW(station, this.gaugeMhwPos.get(gauge)); row.putValue(SInfoResultType.waterlevel, mnw); row.putValue(SInfoResultType.waterlevel1, mw); row.putValue(SInfoResultType.waterlevel2, mhw); + // Calc salix-line and mw-mnw row.putValue(UInfoResultType.salixline, calcSalix(mhw, mw)); row.putValue(UInfoResultType.salix_delta_mw, calcMwmnw(mw, mnw)); + // Calc scenario values (always all scenario types set, Result variant extracts the fields needed) + final List<SalixScenario> scenarios = new ArrayList<>(); + final double[] deltaws = getDeltaWs(station); + for (int i = 0; i <= deltaws.length - 1; i++) { + if (Math.abs(deltaws[i]) < 0.0001) { + row.putValue(UInfoResultType.salix_line_scenario, Double.NaN); + row.putValue(UInfoResultType.salix_line_scenario_dwspl, 0); // TODO NaN when changed from int to double + } + else { + final double salix = calcSalix(mhw, mw + deltaws[i]); + row.putValue(UInfoResultType.salix_line_scenario, salix); + row.putValue(UInfoResultType.salix_line_scenario_dwspl, (int) (deltaws[i] * 100)); + scenarios.add(new SalixScenario((int) (deltaws[i] * 100), salix)); + } + } + row.putValue(UInfoResultType.customMultiRowColSalixRegionalValue_Dwspl, scenarios); return row; } @@ -164,4 +187,19 @@ private double calcMwmnw(final double mw, final double mnw) { return mnw - mw; } + + /** + * Gets the station-specific list of delta-ws of the active scenario, at least with one 0 item in any case + */ + private double[] getDeltaWs(final double station) { + final Entry<Double, List<Double>> stationScenarios = this.rangeScenarios.floorEntry(station); + if (stationScenarios == null) + return new double[] { 0.0 }; + else { + final double[] deltaws = new double[stationScenarios.getValue().size()]; + for (int i = 0; i <= stationScenarios.getValue().size() - 1; i++) + deltaws[i] = stationScenarios.getValue().get(i); + return deltaws; + } + } }