Mercurial > dive4elements > river
annotate artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flood_duration/FloodDurationCalculator.java @ 9176:1614cb14308f
Work on calculations for S-Info flood duration workflow
author | mschaefer |
---|---|
date | Mon, 25 Jun 2018 19:21:11 +0200 |
parents | 9b2e46090099 |
children | b4402594213b |
rev | line source |
---|---|
9145 | 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.sinfo.flood_duration; | |
11 | |
12 import java.util.ArrayList; | |
13 import java.util.Collection; | |
9176
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
9170
diff
changeset
|
14 import java.util.HashMap; |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
9170
diff
changeset
|
15 import java.util.Map; |
9145 | 16 |
17 import org.apache.commons.lang.math.DoubleRange; | |
9150
23945061daec
gigantic refactoring: exporter, result, results
gernotbelger
parents:
9145
diff
changeset
|
18 import org.dive4elements.artifacts.CallContext; |
9145 | 19 import org.dive4elements.river.artifacts.common.GeneralResultType; |
20 import org.dive4elements.river.artifacts.common.ResultRow; | |
9150
23945061daec
gigantic refactoring: exporter, result, results
gernotbelger
parents:
9145
diff
changeset
|
21 import org.dive4elements.river.artifacts.model.Calculation; |
9176
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
9170
diff
changeset
|
22 import org.dive4elements.river.artifacts.sinfo.common.GaugeDurationValuesFinder; |
9145 | 23 import org.dive4elements.river.artifacts.sinfo.common.RiverInfoProvider; |
24 import org.dive4elements.river.artifacts.sinfo.common.SInfoResultType; | |
9176
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
9170
diff
changeset
|
25 import org.dive4elements.river.artifacts.sinfo.common.WQBaseTableFinder; |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
9170
diff
changeset
|
26 import org.dive4elements.river.artifacts.sinfo.flood_duration.RiversideRadioChoice.RiversideChoiceKey; |
9150
23945061daec
gigantic refactoring: exporter, result, results
gernotbelger
parents:
9145
diff
changeset
|
27 import org.dive4elements.river.artifacts.sinfo.util.RiverInfo; |
9176
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
9170
diff
changeset
|
28 import org.dive4elements.river.model.Attribute.AttributeKey; |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
9170
diff
changeset
|
29 import org.dive4elements.river.model.Gauge; |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
9170
diff
changeset
|
30 import org.dive4elements.river.model.sinfo.InfrastructureValue; |
9145 | 31 |
32 /** | |
9176
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
9170
diff
changeset
|
33 * Calculation of the result rows of the flood duration of the infrastructures in a river km range |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
9170
diff
changeset
|
34 * and selected main value durations |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
9170
diff
changeset
|
35 * |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
9170
diff
changeset
|
36 * @author Matthias Schäfer |
9145 | 37 */ |
38 final class FloodDurationCalculator { | |
39 | |
40 private final Collection<ResultRow> rows = new ArrayList<>(); | |
41 | |
42 private final RiverInfoProvider riverInfoProvider; | |
43 | |
9150
23945061daec
gigantic refactoring: exporter, result, results
gernotbelger
parents:
9145
diff
changeset
|
44 private final CallContext context; |
9145 | 45 |
9176
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
9170
diff
changeset
|
46 |
9150
23945061daec
gigantic refactoring: exporter, result, results
gernotbelger
parents:
9145
diff
changeset
|
47 public FloodDurationCalculator(final CallContext context, final RiverInfoProvider riverInfoProvider) { |
23945061daec
gigantic refactoring: exporter, result, results
gernotbelger
parents:
9145
diff
changeset
|
48 this.context = context; |
9145 | 49 this.riverInfoProvider = riverInfoProvider; |
50 } | |
51 | |
9176
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
9170
diff
changeset
|
52 /** |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
9170
diff
changeset
|
53 * Calculate the result rows |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
9170
diff
changeset
|
54 * |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
9170
diff
changeset
|
55 * @return a result collection with one result |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
9170
diff
changeset
|
56 */ |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
9170
diff
changeset
|
57 public FloodDurationCalculationResults execute(final Calculation problems, final String label, final String calcModeLabel, |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
9170
diff
changeset
|
58 final DoubleRange calcRange, final RiversideChoiceKey riverside, final String user) { |
9145 | 59 |
9176
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
9170
diff
changeset
|
60 final WQBaseTableFinder wqFinder = WQBaseTableFinder.loadValues(this.riverInfoProvider.getRiver(), calcRange.getMinimumDouble(), |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
9170
diff
changeset
|
61 calcRange.getMaximumDouble(), problems); |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
9170
diff
changeset
|
62 final Map<Gauge, GaugeDurationValuesFinder> durFinders = new HashMap<>(); |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
9170
diff
changeset
|
63 for (final Gauge gauge : this.riverInfoProvider.getRiver().determineGauges(calcRange.getMinimumDouble(), calcRange.getMaximumDouble())) { |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
9170
diff
changeset
|
64 durFinders.put(gauge, GaugeDurationValuesFinder.loadValues(gauge, problems)); |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
9170
diff
changeset
|
65 } |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
9170
diff
changeset
|
66 final AttributeKey bankKey = riverside.getAttributeKey(); |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
9170
diff
changeset
|
67 for (final InfrastructureValue infrastructure : InfrastructureValue.getValues(this.riverInfoProvider.getRiver(), calcRange.getMinimumDouble(), |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
9170
diff
changeset
|
68 calcRange.getMaximumDouble(), bankKey)) { |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
9170
diff
changeset
|
69 calculateResultRow(infrastructure, wqFinder, durFinders); |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
9170
diff
changeset
|
70 } |
9150
23945061daec
gigantic refactoring: exporter, result, results
gernotbelger
parents:
9145
diff
changeset
|
71 |
9176
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
9170
diff
changeset
|
72 final FloodDurationCalculationResult result = new FloodDurationCalculationResult(label, this.rows); |
9150
23945061daec
gigantic refactoring: exporter, result, results
gernotbelger
parents:
9145
diff
changeset
|
73 |
23945061daec
gigantic refactoring: exporter, result, results
gernotbelger
parents:
9145
diff
changeset
|
74 final RiverInfo riverInfo = new RiverInfo(this.riverInfoProvider.getRiver()); |
23945061daec
gigantic refactoring: exporter, result, results
gernotbelger
parents:
9145
diff
changeset
|
75 |
9176
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
9170
diff
changeset
|
76 final FloodDurationCalculationResults results = new FloodDurationCalculationResults(calcModeLabel, user, riverInfo, calcRange); |
9150
23945061daec
gigantic refactoring: exporter, result, results
gernotbelger
parents:
9145
diff
changeset
|
77 results.addResult(result, problems); |
23945061daec
gigantic refactoring: exporter, result, results
gernotbelger
parents:
9145
diff
changeset
|
78 return results; |
9145 | 79 } |
80 | |
9176
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
9170
diff
changeset
|
81 /** |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
9170
diff
changeset
|
82 * Calculate the result row for one infrastructure |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
9170
diff
changeset
|
83 */ |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
9170
diff
changeset
|
84 private void calculateResultRow(final InfrastructureValue infrastructure, final WQBaseTableFinder wqFinder, |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
9170
diff
changeset
|
85 final Map<Gauge, GaugeDurationValuesFinder> durFinders) { |
9145 | 86 |
87 final ResultRow row = ResultRow.create(); | |
88 | |
9176
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
9170
diff
changeset
|
89 final Gauge gauge = this.riverInfoProvider.getGauge(infrastructure.getStation(), true); |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
9170
diff
changeset
|
90 final double q = wqFinder.getDischarge(infrastructure.getStation(), infrastructure.getHeight()); |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
9170
diff
changeset
|
91 final double qOut = Double.isInfinite(q) ? Double.NaN : q; |
9145 | 92 // REMARK: access the location once only during calculation |
9176
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
9170
diff
changeset
|
93 final String location = this.riverInfoProvider.getLocation(infrastructure.getStation()); |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
9170
diff
changeset
|
94 row.putValue(GeneralResultType.station, infrastructure.getStation()); |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
9170
diff
changeset
|
95 row.putValue(SInfoResultType.riverside, infrastructure.getAttributeKey().getName()); // TODO i18n |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
9170
diff
changeset
|
96 row.putValue(SInfoResultType.floodDuration, 365 - durFinders.get(gauge).getDuration(q)); |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
9170
diff
changeset
|
97 row.putValue(SInfoResultType.floodDischarge, qOut); |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
9170
diff
changeset
|
98 row.putValue(SInfoResultType.infrastructureHeight, infrastructure.getHeight()); |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
9170
diff
changeset
|
99 row.putValue(SInfoResultType.infrastructuretype, infrastructure.getInfrastructure().getType().getName()); |
9145 | 100 |
9176
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
9170
diff
changeset
|
101 // TODO Berechne W, Überflutungsdauer, Q und Bezeichnung von bis zu drei WSPL |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
9170
diff
changeset
|
102 // row.putValue(SInfoResultType.customMultiRowColWaterlevel, rowWsps); |
9145 | 103 |
9176
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
9170
diff
changeset
|
104 row.putValue(SInfoResultType.gaugeLabel, gauge.getName()); |
1614cb14308f
Work on calculations for S-Info flood duration workflow
mschaefer
parents:
9170
diff
changeset
|
105 row.putValue(SInfoResultType.location, location); |
9145 | 106 |
107 this.rows.add(row); | |
108 } | |
109 } |