diff artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/salix/SalixLineCalculation.java @ 9309:9a9f076d5716

Work on U-Info salix line calculation
author mschaefer
date Wed, 25 Jul 2018 19:29:25 +0200
parents 385b52ccde23
children 72b3270e1568
line wrap: on
line diff
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/salix/SalixLineCalculation.java	Wed Jul 25 19:28:54 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/salix/SalixLineCalculation.java	Wed Jul 25 19:29:25 2018 +0200
@@ -9,11 +9,16 @@
  */
 package org.dive4elements.river.artifacts.uinfo.salix;
 
+import java.util.ArrayList;
 import java.util.Iterator;
+import java.util.List;
 import java.util.Map;
+import java.util.NavigableMap;
+import java.util.TreeMap;
 
 import org.apache.commons.lang.math.DoubleRange;
 import org.dive4elements.artifacts.CallContext;
+import org.dive4elements.river.artifacts.access.RangeAccess;
 import org.dive4elements.river.artifacts.model.Calculation;
 import org.dive4elements.river.artifacts.model.CalculationResult;
 import org.dive4elements.river.artifacts.resources.Resources;
@@ -21,6 +26,7 @@
 import org.dive4elements.river.artifacts.sinfo.util.CalculationUtils;
 import org.dive4elements.river.artifacts.sinfo.util.RiverInfo;
 import org.dive4elements.river.artifacts.uinfo.UINFOArtifact;
+import org.dive4elements.river.artifacts.uinfo.salix.SalixLineAccess.ScenarioType;
 import org.dive4elements.river.model.River;
 
 /**
@@ -46,27 +52,29 @@
         final River river = accessSalix.getRiver();
         final RiverInfo riverInfo = new RiverInfo(river);
 
-        final DoubleRange range = accessSalix.getRange();
-        final boolean useScenario = accessSalix.getUseScenario();
-        final String selectedScenario = accessSalix.getScenario();
-        final Double fromPart = accessSalix.getFromPart();
-        final Double toPart = accessSalix.getToPart();
-
-        final boolean useSCenario = accessSalix.getUseScenario();
-        final String scenario = accessSalix.getScenario();
+        // final DoubleRange range = accessSalix.getRange();
+        // final boolean useScenario = accessSalix.getUseScenario();
+        // final String selectedScenario = accessSalix.getScenario();
+        // final Double fromPart = accessSalix.getFromPart();
+        // final Double toPart = accessSalix.getToPart();
+        //
+        // final boolean useSCenario = accessSalix.getUseScenario();
+        // final String scenario = accessSalix.getScenario();
         // calculation_mode
         // ld_from , ld_to
         // use_scenario (boolean)
         // ld_from_part; ld_to_part
         // scenario_selection (mögliche Werte:"scenarioType.option1" "scenarioType.option2" "scenarioType.option3"
-        final RiverInfoProvider riverInfoProvider = RiverInfoProvider.forRange(this.context, river, range);
+        final RiverInfoProvider riverInfoProvider = RiverInfoProvider.forRange(this.context, river, accessSalix.getRange());
 
         // FIXME: real calculation
 
-        final SalixLineCalculationResults results = new SalixLineCalculationResults(calcModeLabel, user, riverInfo, range);
+        final SalixLineCalculationResults results = new SalixLineCalculationResults(calcModeLabel, user, riverInfo, accessSalix.getRange());
 
         final SalixLineCalculator calculator = new SalixLineCalculator(this.context, riverInfoProvider);
-        calculator.execute(problems, uinfo, results);
+        final NavigableMap<Double, List<Double>> rangeScenarios = buildRangeScenarios(accessSalix);
+
+        calculator.execute(problems, uinfo, rangeScenarios, accessSalix.getScenario(), results);
 
         // final Collection<ResultRow> rows = new ArrayList<>();
         // SalixLineCalculationNoScenarioResult result = null; // verzweigung etwas ungünstig. möglicherweise auch die
@@ -145,6 +153,61 @@
         return new CalculationResult(results, problems);
     }
 
+    /**
+     * Build a map of delta-Ws by km-range for the selected scenario
+     */
+    private NavigableMap<Double, List<Double>> buildRangeScenarios(final SalixLineAccess access) {
+        final NavigableMap<Double, List<Double>> rangeScenarios = new TreeMap<>();
+        if (access.getScenario() == ScenarioType.REGIONAL)
+            fillRangeScenarios(rangeScenarios, access, access.getFromPart().doubleValue(), access.getToPart().doubleValue(),
+                    access.getRegionalScenarioIntegers());
+        else if (access.getScenario() == ScenarioType.SUPRAREGIONAL)
+            fillRangeScenarios(rangeScenarios, access.getSupraRegionalString());
+        // TODO else if (access.getScenario().equals(ScenarioType.HISTORICAL.getKey()))
+        // historisches Szenario aus MSH etc.
+        else
+            fillRangeScenarios(rangeScenarios, access);
+        return rangeScenarios;
+    }
+
+    /**
+     * Fill a map of delta-Ws with only one 0-delta for the whole calc range (no scenario)
+     */
+    private void fillRangeScenarios(final NavigableMap<Double, List<Double>> rangeScenarios, final RangeAccess calcRange) {
+        final List<Double> nulls = new ArrayList<>();
+        nulls.add(0.0);
+        rangeScenarios.put(Double.valueOf(calcRange.getLowerKm() - 0.0001), nulls);
+    }
+
+    /**
+     * Fill a map of delta-Ws by km-range from the regional scenario input data
+     */
+    private void fillRangeScenarios(final NavigableMap<Double, List<Double>> rangeScenarios, final RangeAccess calcRange, final double partFrom,
+            final double partTo, final int[] deltaWs) {
+        final List<Double> nulls = new ArrayList<>();
+        final List<Double> dwsm = new ArrayList<>();
+        for (int i = 0; i <= deltaWs.length - 1; i++) {
+            nulls.add(0.0);
+            dwsm.add(deltaWs[i] / 100.0);
+        }
+        rangeScenarios.put(Double.valueOf(calcRange.getLowerKm() - 0.0001), nulls);
+        rangeScenarios.put(Double.valueOf(partFrom - 0.0001), dwsm);
+        rangeScenarios.put(Double.valueOf(partTo + 0.0001), nulls);
+    }
+
+    /**
+     * Fill a map of delta-Ws by km-range from the supraregional scenario input data
+     * (the zones input by the user cover the calc range completely)
+     */
+    private void fillRangeScenarios(final NavigableMap<Double, List<Double>> rangeScenarios, final String zones) {
+        final List<SalixZone> parts = SalixZone.parse(zones);
+        for (final SalixZone part : parts) {
+            final List<Double> dwsm = new ArrayList<>();
+            dwsm.add(part.getDwsplValue() / 100.0);
+            rangeScenarios.put(Double.valueOf(part.getFromKm().doubleValue() - 0.0001), dwsm);
+        }
+    }
+
     private SalixScenario findScenarioByKm(final double km, final Map<DoubleRange, SalixScenario> rangeScenarioMap) {
         final Iterator<DoubleRange> rangeIterator = rangeScenarioMap.keySet().iterator();
         while (rangeIterator.hasNext()) {

http://dive4elements.wald.intevation.org