Mercurial > dive4elements > river
annotate artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/salix/SalixLineCalculation.java @ 9249:600e1ac42049
Historical Result
author | gernotbelger |
---|---|
date | Thu, 12 Jul 2018 14:15:36 +0200 |
parents | c08d5cfa4981 |
children | 385b52ccde23 |
rev | line source |
---|---|
8996 | 1 /** Copyright (C) 2017 by Bundesanstalt für Gewässerkunde |
2 * Software engineering by | |
3 * Björnsen Beratende Ingenieure GmbH | |
4 * Dr. Schumacher Ingenieurbüro für Wasser und Umwelt | |
5 * | |
6 * This file is Free Software under the GNU AGPL (>=v3) | |
7 * and comes with ABSOLUTELY NO WARRANTY! Check out the | |
8 * documentation coming with Dive4Elements River for details. | |
9 */ | |
10 package org.dive4elements.river.artifacts.uinfo.salix; | |
11 | |
12 import java.util.ArrayList; | |
13 import java.util.Collection; | |
9243 | 14 import java.util.HashMap; |
15 import java.util.Iterator; | |
16 import java.util.List; | |
17 import java.util.Map; | |
8996 | 18 |
19 import org.apache.commons.lang.math.DoubleRange; | |
20 import org.dive4elements.artifacts.CallContext; | |
21 import org.dive4elements.river.artifacts.common.GeneralResultType; | |
22 import org.dive4elements.river.artifacts.common.ResultRow; | |
23 import org.dive4elements.river.artifacts.model.Calculation; | |
24 import org.dive4elements.river.artifacts.model.CalculationResult; | |
25 import org.dive4elements.river.artifacts.resources.Resources; | |
26 import org.dive4elements.river.artifacts.sinfo.util.CalculationUtils; | |
27 import org.dive4elements.river.artifacts.sinfo.util.RiverInfo; | |
28 import org.dive4elements.river.artifacts.uinfo.UINFOArtifact; | |
29 import org.dive4elements.river.artifacts.uinfo.commons.UInfoResultType; | |
30 import org.dive4elements.river.model.River; | |
31 | |
32 /** | |
33 * @author Domenico Nardi Tironi | |
34 * | |
35 */ | |
36 final class SalixLineCalculation { | |
37 | |
38 private final CallContext context; | |
39 | |
40 public SalixLineCalculation(final CallContext context) { | |
41 this.context = context; | |
42 } | |
43 | |
44 public CalculationResult calculate(final UINFOArtifact uinfo) { | |
45 final Calculation problems = new Calculation(); | |
46 | |
47 final String calcModeLabel = Resources.getMsg(this.context.getMeta(), uinfo.getCalculationMode().name()); | |
48 final String user = CalculationUtils.findArtifactUser(this.context, uinfo); | |
49 | |
9070
611a523fc42f
VegetationZoneAccessHelper, VegetationTablePanels verbessert
gernotbelger
parents:
9069
diff
changeset
|
50 final SalixLineAccess accessSalix = new SalixLineAccess(uinfo); |
611a523fc42f
VegetationZoneAccessHelper, VegetationTablePanels verbessert
gernotbelger
parents:
9069
diff
changeset
|
51 |
611a523fc42f
VegetationZoneAccessHelper, VegetationTablePanels verbessert
gernotbelger
parents:
9069
diff
changeset
|
52 final River river = accessSalix.getRiver(); |
8996 | 53 final RiverInfo riverInfo = new RiverInfo(river); |
54 | |
9068
a5cf8d7bff3c
access uinfo.salx; tablePanel edit/non-edit merge
gernotbelger
parents:
8996
diff
changeset
|
55 final DoubleRange range = accessSalix.getRange(); |
a5cf8d7bff3c
access uinfo.salx; tablePanel edit/non-edit merge
gernotbelger
parents:
8996
diff
changeset
|
56 final boolean useScenario = accessSalix.getUseScenario(); |
a5cf8d7bff3c
access uinfo.salx; tablePanel edit/non-edit merge
gernotbelger
parents:
8996
diff
changeset
|
57 final String selectedScenario = accessSalix.getScenario(); |
9222 | 58 final Double fromPart = accessSalix.getFromPart(); |
59 final Double toPart = accessSalix.getToPart(); | |
9243 | 60 |
61 final boolean useSCenario = accessSalix.getUseScenario(); | |
62 final String scenario = accessSalix.getScenario(); | |
9068
a5cf8d7bff3c
access uinfo.salx; tablePanel edit/non-edit merge
gernotbelger
parents:
8996
diff
changeset
|
63 // calculation_mode |
a5cf8d7bff3c
access uinfo.salx; tablePanel edit/non-edit merge
gernotbelger
parents:
8996
diff
changeset
|
64 // ld_from , ld_to |
a5cf8d7bff3c
access uinfo.salx; tablePanel edit/non-edit merge
gernotbelger
parents:
8996
diff
changeset
|
65 // use_scenario (boolean) |
a5cf8d7bff3c
access uinfo.salx; tablePanel edit/non-edit merge
gernotbelger
parents:
8996
diff
changeset
|
66 // ld_from_part; ld_to_part |
a5cf8d7bff3c
access uinfo.salx; tablePanel edit/non-edit merge
gernotbelger
parents:
8996
diff
changeset
|
67 // scenario_selection (mögliche Werte:"scenarioType.option1" "scenarioType.option2" "scenarioType.option3" |
a5cf8d7bff3c
access uinfo.salx; tablePanel edit/non-edit merge
gernotbelger
parents:
8996
diff
changeset
|
68 |
9070
611a523fc42f
VegetationZoneAccessHelper, VegetationTablePanels verbessert
gernotbelger
parents:
9069
diff
changeset
|
69 // FIXME: real calculation |
611a523fc42f
VegetationZoneAccessHelper, VegetationTablePanels verbessert
gernotbelger
parents:
9069
diff
changeset
|
70 |
611a523fc42f
VegetationZoneAccessHelper, VegetationTablePanels verbessert
gernotbelger
parents:
9069
diff
changeset
|
71 final SalixLineCalculationResults results = new SalixLineCalculationResults(calcModeLabel, user, riverInfo, range); |
8996 | 72 |
73 final Collection<ResultRow> rows = new ArrayList<>(); | |
9243 | 74 SalixLineCalculationNoScenarioResult result = null; // verzweigung etwas ungünstig. möglicherweise auch die Abstraktion. ist erstmal nur ne idee |
8996 | 75 final ResultRow row1 = ResultRow.create(). // |
9069
1ffd38826175
access uinfo.vegetationzones+inundation_duration
gernotbelger
parents:
9068
diff
changeset
|
76 putValue(GeneralResultType.station, 100).// |
1ffd38826175
access uinfo.vegetationzones+inundation_duration
gernotbelger
parents:
9068
diff
changeset
|
77 putValue(UInfoResultType.salixline, 28).// |
9243 | 78 putValue(UInfoResultType.salix_delta_mw, 2); |
8996 | 79 |
9243 | 80 if (!useScenario) { |
8996 | 81 |
9243 | 82 rows.add(row1); |
83 result = new SalixLineCalculationNoScenarioResult("Ergebnis 1", null, rows); | |
84 } else { | |
8996 | 85 |
9246
c08d5cfa4981
some hibernate queries on bedheigts for salix
gernotbelger
parents:
9244
diff
changeset
|
86 if (scenario.equals("scenarioType.option1")) { // REGIONAL |
9243 | 87 |
88 final int[] scenarios = accessSalix.getRegionalScenarioIntegers(); | |
89 final List<SalixScenario> list = new ArrayList<>(); | |
90 for (final int scen_val : scenarios) { | |
91 list.add(new SalixScenario(scen_val, 666.));// TODO: replace 666 by real calculated value | |
92 } | |
93 row1.putValue(UInfoResultType.customMultiRowColSalixRegionalValue_Dwspl, list);// | |
94 rows.add(row1); | |
95 result = new SalixLineCalculationRegionalResult("Ergebnis 1 regional test", null, rows, scenarios); | |
9246
c08d5cfa4981
some hibernate queries on bedheigts for salix
gernotbelger
parents:
9244
diff
changeset
|
96 |
c08d5cfa4981
some hibernate queries on bedheigts for salix
gernotbelger
parents:
9244
diff
changeset
|
97 } else if (scenario.equals("scenarioType.option2")) { // SUPRA-REGIONAL |
9243 | 98 |
99 final String supraRegional = accessSalix.getSupraRegionalString(); | |
100 final List<SalixZone> list = SalixZone.parse(supraRegional); | |
101 | |
102 final Map<DoubleRange, SalixScenario> rangeScenarioMap = new HashMap<>(); | |
103 // make double range | |
104 for (int i = 0; i < list.size(); i++) { | |
105 final SalixZone zone = list.get(i); | |
9244 | 106 final double upper = i < list.size() - 1 ? (zone.getUpperFromTo() - 0.0001) : zone.getUpperFromTo() + 0.0001;// "halboffenes Intervall |
9243 | 107 |
108 final DoubleRange zonerange = new DoubleRange((double) zone.getLowerFromTo(), upper); | |
109 final double salixValue = 666.;// TODO: calculate the salix value | |
110 final SalixScenario salixscen = new SalixScenario(zone.getDwsplValue(), salixValue); | |
111 | |
112 rangeScenarioMap.put(zonerange, salixscen); | |
113 } | |
114 | |
9246
c08d5cfa4981
some hibernate queries on bedheigts for salix
gernotbelger
parents:
9244
diff
changeset
|
115 // make calculation |
9243 | 116 double currentKm = range.getMinimumDouble(); |
9246
c08d5cfa4981
some hibernate queries on bedheigts for salix
gernotbelger
parents:
9244
diff
changeset
|
117 final double step = 0.1; // TODO: get from global setting? |
9243 | 118 while (currentKm < range.getMaximumDouble()) { |
119 final ResultRow rowSupraRegional = ResultRow.create(). // | |
120 putValue(GeneralResultType.station, currentKm).// | |
121 putValue(UInfoResultType.salixline, 28).// | |
122 putValue(UInfoResultType.salix_delta_mw, 2); | |
123 | |
124 final SalixScenario scenarioCurrentKm = findScenarioByKm(currentKm, rangeScenarioMap); | |
125 | |
9246
c08d5cfa4981
some hibernate queries on bedheigts for salix
gernotbelger
parents:
9244
diff
changeset
|
126 if (scenarioCurrentKm != null) { // should not happen, scenarioCurrentKm == null -> BUG |
9243 | 127 rowSupraRegional.putValue(UInfoResultType.salix_line_scenario, scenarioCurrentKm.getSalixValue()); |
128 rowSupraRegional.putValue(UInfoResultType.salix_line_scenario_dwspl, scenarioCurrentKm.getDwspl()); | |
129 } | |
130 rows.add(rowSupraRegional); | |
131 | |
132 currentKm = currentKm + step; | |
133 } | |
134 | |
135 result = new SalixLineCalculationSupraRegionalResult("Ergebnis 1 supra regional test", null, rows); | |
136 | |
9246
c08d5cfa4981
some hibernate queries on bedheigts for salix
gernotbelger
parents:
9244
diff
changeset
|
137 } else if (scenario.equals("scenarioType.option3")) { // HISTORICAL |
9249 | 138 row1.putValue(UInfoResultType.salixlinehist, 66).// |
139 putValue(UInfoResultType.salix_line_scenario_dwspl, 88); | |
140 rows.add(row1); | |
141 result = new SalixLineCalculationHistoricalResult("Ergebnis 1 historical test", null, rows); | |
9243 | 142 } |
143 } | |
8996 | 144 results.addResult(result, problems); |
145 return new CalculationResult(results, problems); | |
146 } | |
9243 | 147 |
148 private SalixScenario findScenarioByKm(final double km, final Map<DoubleRange, SalixScenario> rangeScenarioMap) { | |
149 final Iterator<DoubleRange> rangeIterator = rangeScenarioMap.keySet().iterator(); | |
150 while (rangeIterator.hasNext()) { | |
151 final DoubleRange range = rangeIterator.next(); | |
152 if (range.containsDouble(km + 0.0001)) { | |
153 return rangeScenarioMap.get(range); | |
154 } | |
155 } | |
156 return null; | |
157 } | |
8996 | 158 } |