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 }

http://dive4elements.wald.intevation.org