comparison 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
comparison
equal deleted inserted replaced
9308:9055afc19ec6 9309:9a9f076d5716
7 * and comes with ABSOLUTELY NO WARRANTY! Check out the 7 * and comes with ABSOLUTELY NO WARRANTY! Check out the
8 * documentation coming with Dive4Elements River for details. 8 * documentation coming with Dive4Elements River for details.
9 */ 9 */
10 package org.dive4elements.river.artifacts.uinfo.salix; 10 package org.dive4elements.river.artifacts.uinfo.salix;
11 11
12 import java.util.ArrayList;
12 import java.util.Iterator; 13 import java.util.Iterator;
14 import java.util.List;
13 import java.util.Map; 15 import java.util.Map;
16 import java.util.NavigableMap;
17 import java.util.TreeMap;
14 18
15 import org.apache.commons.lang.math.DoubleRange; 19 import org.apache.commons.lang.math.DoubleRange;
16 import org.dive4elements.artifacts.CallContext; 20 import org.dive4elements.artifacts.CallContext;
21 import org.dive4elements.river.artifacts.access.RangeAccess;
17 import org.dive4elements.river.artifacts.model.Calculation; 22 import org.dive4elements.river.artifacts.model.Calculation;
18 import org.dive4elements.river.artifacts.model.CalculationResult; 23 import org.dive4elements.river.artifacts.model.CalculationResult;
19 import org.dive4elements.river.artifacts.resources.Resources; 24 import org.dive4elements.river.artifacts.resources.Resources;
20 import org.dive4elements.river.artifacts.sinfo.common.RiverInfoProvider; 25 import org.dive4elements.river.artifacts.sinfo.common.RiverInfoProvider;
21 import org.dive4elements.river.artifacts.sinfo.util.CalculationUtils; 26 import org.dive4elements.river.artifacts.sinfo.util.CalculationUtils;
22 import org.dive4elements.river.artifacts.sinfo.util.RiverInfo; 27 import org.dive4elements.river.artifacts.sinfo.util.RiverInfo;
23 import org.dive4elements.river.artifacts.uinfo.UINFOArtifact; 28 import org.dive4elements.river.artifacts.uinfo.UINFOArtifact;
29 import org.dive4elements.river.artifacts.uinfo.salix.SalixLineAccess.ScenarioType;
24 import org.dive4elements.river.model.River; 30 import org.dive4elements.river.model.River;
25 31
26 /** 32 /**
27 * @author Domenico Nardi Tironi 33 * @author Domenico Nardi Tironi
28 * 34 *
44 final SalixLineAccess accessSalix = new SalixLineAccess(uinfo); 50 final SalixLineAccess accessSalix = new SalixLineAccess(uinfo);
45 51
46 final River river = accessSalix.getRiver(); 52 final River river = accessSalix.getRiver();
47 final RiverInfo riverInfo = new RiverInfo(river); 53 final RiverInfo riverInfo = new RiverInfo(river);
48 54
49 final DoubleRange range = accessSalix.getRange(); 55 // final DoubleRange range = accessSalix.getRange();
50 final boolean useScenario = accessSalix.getUseScenario(); 56 // final boolean useScenario = accessSalix.getUseScenario();
51 final String selectedScenario = accessSalix.getScenario(); 57 // final String selectedScenario = accessSalix.getScenario();
52 final Double fromPart = accessSalix.getFromPart(); 58 // final Double fromPart = accessSalix.getFromPart();
53 final Double toPart = accessSalix.getToPart(); 59 // final Double toPart = accessSalix.getToPart();
54 60 //
55 final boolean useSCenario = accessSalix.getUseScenario(); 61 // final boolean useSCenario = accessSalix.getUseScenario();
56 final String scenario = accessSalix.getScenario(); 62 // final String scenario = accessSalix.getScenario();
57 // calculation_mode 63 // calculation_mode
58 // ld_from , ld_to 64 // ld_from , ld_to
59 // use_scenario (boolean) 65 // use_scenario (boolean)
60 // ld_from_part; ld_to_part 66 // ld_from_part; ld_to_part
61 // scenario_selection (mögliche Werte:"scenarioType.option1" "scenarioType.option2" "scenarioType.option3" 67 // scenario_selection (mögliche Werte:"scenarioType.option1" "scenarioType.option2" "scenarioType.option3"
62 final RiverInfoProvider riverInfoProvider = RiverInfoProvider.forRange(this.context, river, range); 68 final RiverInfoProvider riverInfoProvider = RiverInfoProvider.forRange(this.context, river, accessSalix.getRange());
63 69
64 // FIXME: real calculation 70 // FIXME: real calculation
65 71
66 final SalixLineCalculationResults results = new SalixLineCalculationResults(calcModeLabel, user, riverInfo, range); 72 final SalixLineCalculationResults results = new SalixLineCalculationResults(calcModeLabel, user, riverInfo, accessSalix.getRange());
67 73
68 final SalixLineCalculator calculator = new SalixLineCalculator(this.context, riverInfoProvider); 74 final SalixLineCalculator calculator = new SalixLineCalculator(this.context, riverInfoProvider);
69 calculator.execute(problems, uinfo, results); 75 final NavigableMap<Double, List<Double>> rangeScenarios = buildRangeScenarios(accessSalix);
76
77 calculator.execute(problems, uinfo, rangeScenarios, accessSalix.getScenario(), results);
70 78
71 // final Collection<ResultRow> rows = new ArrayList<>(); 79 // final Collection<ResultRow> rows = new ArrayList<>();
72 // SalixLineCalculationNoScenarioResult result = null; // verzweigung etwas ungünstig. möglicherweise auch die 80 // SalixLineCalculationNoScenarioResult result = null; // verzweigung etwas ungünstig. möglicherweise auch die
73 // Abstraktion. ist erstmal nur ne idee 81 // Abstraktion. ist erstmal nur ne idee
74 // final ResultRow row1 = ResultRow.create(). // 82 // final ResultRow row1 = ResultRow.create(). //
141 // result = new SalixLineCalculationHistoricalResult("Ergebnis 1 historical test", null, rows); 149 // result = new SalixLineCalculationHistoricalResult("Ergebnis 1 historical test", null, rows);
142 // } 150 // }
143 // } 151 // }
144 // results.addResult(result, problems); 152 // results.addResult(result, problems);
145 return new CalculationResult(results, problems); 153 return new CalculationResult(results, problems);
154 }
155
156 /**
157 * Build a map of delta-Ws by km-range for the selected scenario
158 */
159 private NavigableMap<Double, List<Double>> buildRangeScenarios(final SalixLineAccess access) {
160 final NavigableMap<Double, List<Double>> rangeScenarios = new TreeMap<>();
161 if (access.getScenario() == ScenarioType.REGIONAL)
162 fillRangeScenarios(rangeScenarios, access, access.getFromPart().doubleValue(), access.getToPart().doubleValue(),
163 access.getRegionalScenarioIntegers());
164 else if (access.getScenario() == ScenarioType.SUPRAREGIONAL)
165 fillRangeScenarios(rangeScenarios, access.getSupraRegionalString());
166 // TODO else if (access.getScenario().equals(ScenarioType.HISTORICAL.getKey()))
167 // historisches Szenario aus MSH etc.
168 else
169 fillRangeScenarios(rangeScenarios, access);
170 return rangeScenarios;
171 }
172
173 /**
174 * Fill a map of delta-Ws with only one 0-delta for the whole calc range (no scenario)
175 */
176 private void fillRangeScenarios(final NavigableMap<Double, List<Double>> rangeScenarios, final RangeAccess calcRange) {
177 final List<Double> nulls = new ArrayList<>();
178 nulls.add(0.0);
179 rangeScenarios.put(Double.valueOf(calcRange.getLowerKm() - 0.0001), nulls);
180 }
181
182 /**
183 * Fill a map of delta-Ws by km-range from the regional scenario input data
184 */
185 private void fillRangeScenarios(final NavigableMap<Double, List<Double>> rangeScenarios, final RangeAccess calcRange, final double partFrom,
186 final double partTo, final int[] deltaWs) {
187 final List<Double> nulls = new ArrayList<>();
188 final List<Double> dwsm = new ArrayList<>();
189 for (int i = 0; i <= deltaWs.length - 1; i++) {
190 nulls.add(0.0);
191 dwsm.add(deltaWs[i] / 100.0);
192 }
193 rangeScenarios.put(Double.valueOf(calcRange.getLowerKm() - 0.0001), nulls);
194 rangeScenarios.put(Double.valueOf(partFrom - 0.0001), dwsm);
195 rangeScenarios.put(Double.valueOf(partTo + 0.0001), nulls);
196 }
197
198 /**
199 * Fill a map of delta-Ws by km-range from the supraregional scenario input data
200 * (the zones input by the user cover the calc range completely)
201 */
202 private void fillRangeScenarios(final NavigableMap<Double, List<Double>> rangeScenarios, final String zones) {
203 final List<SalixZone> parts = SalixZone.parse(zones);
204 for (final SalixZone part : parts) {
205 final List<Double> dwsm = new ArrayList<>();
206 dwsm.add(part.getDwsplValue() / 100.0);
207 rangeScenarios.put(Double.valueOf(part.getFromKm().doubleValue() - 0.0001), dwsm);
208 }
146 } 209 }
147 210
148 private SalixScenario findScenarioByKm(final double km, final Map<DoubleRange, SalixScenario> rangeScenarioMap) { 211 private SalixScenario findScenarioByKm(final double km, final Map<DoubleRange, SalixScenario> rangeScenarioMap) {
149 final Iterator<DoubleRange> rangeIterator = rangeScenarioMap.keySet().iterator(); 212 final Iterator<DoubleRange> rangeIterator = rangeScenarioMap.keySet().iterator();
150 while (rangeIterator.hasNext()) { 213 while (rangeIterator.hasNext()) {

http://dive4elements.wald.intevation.org