Mercurial > dive4elements > river
comparison artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flowdepth/FlowDepthCalculation.java @ 8964:45f1ad66560e
Code cleanup concerning calculations: improved error handling; improved interpolation; bed heights are now always used for spatial discretisation
author | gernotbelger |
---|---|
date | Thu, 29 Mar 2018 15:48:17 +0200 |
parents | 322b0e6298ea |
children | b194fa64506a |
comparison
equal
deleted
inserted
replaced
8963:b98fbd91f64a | 8964:45f1ad66560e |
---|---|
88 final BedHeightsFinder bedHeight = BedHeightsFinder.forId(this.context, soundingId, calcRange, problems); | 88 final BedHeightsFinder bedHeight = BedHeightsFinder.forId(this.context, soundingId, calcRange, problems); |
89 if (bedHeight == null) | 89 if (bedHeight == null) |
90 return null; | 90 return null; |
91 | 91 |
92 /* REMARK: fetch ALL wst kms, because we want to determine the original reference gauge */ | 92 /* REMARK: fetch ALL wst kms, because we want to determine the original reference gauge */ |
93 final WaterlevelData waterlevel = new WaterlevelFetcher().findWaterlevel(this.context, wstId, Double.NaN, Double.NaN, problems); | 93 final WaterlevelData waterlevel = new WaterlevelFetcher().findWaterlevel(this.context, wstId, calcRange, problems); |
94 if (waterlevel == null) | 94 if (waterlevel == null) |
95 return null; | 95 return null; |
96 | 96 |
97 final WKms wstKms = waterlevel.getWkms(); | 97 final WKms wstKms = waterlevel.getWkms(); |
98 | 98 |
99 final String wspLabel = wstKms.getName(); | 99 final String wspLabel = wstKms.getName(); |
100 final String soundingLabel = bedHeight.getInfo().getDescription(); | 100 final String soundingLabel = bedHeight.getInfo().getDescription(); |
101 final String label = String.format("%s - %s", wspLabel, soundingLabel); | 101 final String label = String.format("%s - %s", wspLabel, soundingLabel); |
102 | 102 |
103 FlowDepthUtils.checkYearDifference(label, waterlevel.getYear(), bedHeight.getInfo().getYear(), problems); | 103 FlowDepthUtils.checkYearDifference(label, waterlevel.getYear(), bedHeight.getInfo().getYear(), problems); |
104 checkWaterlevelDiscretisation(wstKms, calcRange, problems); | |
105 // TODO: prüfen, ob sohlhöhen die calcRange abdecken/überschneiden | |
106 | 104 |
107 /* re-determine the reference gauge, in the same way as the WaterlevelArtifact would do it */ | 105 /* re-determine the reference gauge, in the same way as the WaterlevelArtifact would do it */ |
108 final RiverInfoProvider riverInfoProvider = infoProvider.forWaterlevel(waterlevel); | 106 final RiverInfoProvider riverInfoProvider = infoProvider.forWaterlevel(waterlevel); |
109 | 107 |
110 final int wspYear = waterlevel.getYear(); | 108 final int wspYear = waterlevel.getYear(); |
111 final WstInfo wstInfo = new WstInfo(wspLabel, wspYear, riverInfoProvider.getReferenceGauge()); | 109 final WstInfo wstInfo = new WstInfo(wspLabel, wspYear, riverInfoProvider.getReferenceGauge()); |
112 | 110 |
113 final WaterlevelValuesFinder waterlevelProvider = WaterlevelValuesFinder.fromKms(wstKms); | 111 final WaterlevelValuesFinder waterlevelProvider = WaterlevelValuesFinder.fromKms(problems, wstKms); |
114 final DischargeValuesFinder dischargeProvider = DischargeValuesFinder.fromKms(wstKms); | 112 final DischargeValuesFinder dischargeProvider = DischargeValuesFinder.fromKms(wstKms); |
115 | 113 |
116 final River river = riverInfoProvider.getRiver(); | 114 final River river = riverInfoProvider.getRiver(); |
117 final TkhCalculator tkhCalculator = TkhCalculator.buildTkhCalculator(useTkh, this.context, problems, label, river, calcRange, waterlevelProvider, | 115 final TkhCalculator tkhCalculator = TkhCalculator.buildTkhCalculator(useTkh, problems, label, river, calcRange, waterlevelProvider, |
118 dischargeProvider, | 116 dischargeProvider, bedHeight); |
119 bedHeight); | |
120 | 117 |
121 final FlowDepthCalculator calculator = new FlowDepthCalculator(riverInfoProvider, wspLabel, bedHeight, tkhCalculator); | 118 final FlowDepthCalculator calculator = new FlowDepthCalculator(riverInfoProvider, wspLabel, bedHeight, tkhCalculator); |
122 return calculator.execute(label, wstInfo, calcRange); | 119 return calculator.execute(label, wstInfo, calcRange); |
123 } | 120 } |
124 | |
125 /* Checks if the discretisation of the waterlevel exceeds 1000m */ | |
126 private void checkWaterlevelDiscretisation(final WKms wstKms, final DoubleRange calcRange, final Calculation problems) { | |
127 | |
128 final int size = wstKms.size(); | |
129 for (int i = 0; i < size - 2; i++) { | |
130 final double kmPrev = wstKms.getKm(i); | |
131 final double kmNext = wstKms.getKm(i + 1); | |
132 | |
133 /* only check if we are within the calculation range */ | |
134 if (calcRange.overlapsRange(new DoubleRange(kmPrev, kmNext))) { | |
135 if (Math.abs(kmPrev - kmNext) > 1) { | |
136 final String label = wstKms.getName(); | |
137 | |
138 final String message = Resources.getMsg(this.context.getMeta(), "sinfo_calc_flow_depth.warning.waterlevel_discretisation", null, label); | |
139 problems.addProblem(kmPrev, message); | |
140 } | |
141 } | |
142 } | |
143 } | |
144 } | 121 } |