Mercurial > dive4elements > river
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()) {