Mercurial > dive4elements > river
diff artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/tkhcalculation/TkhCalculator.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 | 183f42641ab6 |
children | b5600453bb8f |
line wrap: on
line diff
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/tkhcalculation/TkhCalculator.java Wed Mar 28 17:04:20 2018 +0200 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/tkhcalculation/TkhCalculator.java Thu Mar 29 15:48:17 2018 +0200 @@ -10,10 +10,7 @@ package org.dive4elements.river.artifacts.sinfo.tkhcalculation; import org.apache.commons.lang.math.DoubleRange; -import org.apache.commons.math.ArgumentOutsideDomainException; -import org.dive4elements.artifacts.CallContext; import org.dive4elements.river.artifacts.model.Calculation; -import org.dive4elements.river.artifacts.resources.Resources; import org.dive4elements.river.artifacts.sinfo.common.SInfoResultRow; import org.dive4elements.river.artifacts.sinfo.common.SInfoResultType; import org.dive4elements.river.artifacts.sinfo.tkhstate.BedHeightsFinder; @@ -26,12 +23,6 @@ private static final int VALID_BED_MEASUREMENT_YEARS = 20; - private final Calculation problems; - - private final String problemLabel; - - private final CallContext context; - private final BedQualityD50KmValueFinder bedMeasurementsFinder; private final SoilKindKmValueFinder soilKindFinder; @@ -44,56 +35,42 @@ private final FlowVelocityModelKmValueFinder flowVelocitiesFinder; - public static TkhCalculator buildTkhCalculator(final boolean useTkh, final CallContext context, final Calculation problems, final String label, + public static TkhCalculator buildTkhCalculator(final boolean useTkh, final Calculation problems, final String label, final River river, final DoubleRange calcRange, final WaterlevelValuesFinder waterlevelProvider, final DischargeValuesFinder dischargeProvider, final BedHeightsFinder bedHeightsProvider) { if (!useTkh) - return new TkhCalculator(problems, label, context, null, waterlevelProvider, dischargeProvider, bedHeightsProvider, null, null); + return new TkhCalculator(null, waterlevelProvider, dischargeProvider, bedHeightsProvider, null, null); if (!dischargeProvider.isValid()) { - final String message = Resources.getMsg(context.getMeta(), "sinfo_calc_flow_depth.warning.missingQ", null, label); - problems.addProblem(message); - return new TkhCalculator(problems, label, context, null, waterlevelProvider, dischargeProvider, bedHeightsProvider, null, null); + problems.addProblem("sinfo_calc_flow_depth.warning.missingQ", label); + return new TkhCalculator(null, waterlevelProvider, dischargeProvider, bedHeightsProvider, null, null); } + /* access bed quality data */ final int soundingYear = bedHeightsProvider.getInfo().getYear(); - final BedQualityD50KmValueFinder bedMeasurementsFinder = BedQualityD50KmValueFinder.loadBedMeasurements(river, calcRange, soundingYear, + final BedQualityD50KmValueFinder bedMeasurementsFinder = BedQualityD50KmValueFinder.loadBedMeasurements(problems, river, calcRange, soundingYear, VALID_BED_MEASUREMENT_YEARS); + if (bedMeasurementsFinder == null) + return new TkhCalculator(null, waterlevelProvider, dischargeProvider, bedHeightsProvider, null, null); - if (bedMeasurementsFinder == null) { - final String message = Resources.getMsg(context.getMeta(), "sinfo_calc_flow_depth.warning.missingD50", null, label); - problems.addProblem(message); - return new TkhCalculator(problems, label, context, null, waterlevelProvider, dischargeProvider, bedHeightsProvider, null, null); - } - - // FIXME: wie wird ggf. interpoliert? prüfung ob werte vorhanden? - final SoilKindKmValueFinder soilKindFinder = SoilKindKmValueFinder.loadValues(river, calcRange); - if (soilKindFinder == null) { - final String message = Resources.getMsg(context.getMeta(), "sinfo_calc_flow_depth.warning.missingSoilKind", null, label); - problems.addProblem(message); - return new TkhCalculator(problems, label, context, null, waterlevelProvider, dischargeProvider, bedHeightsProvider, null, null); - } + /* access bed soil kind data */ + final SoilKindKmValueFinder soilKindFinder = SoilKindKmValueFinder.loadValues(problems, river, calcRange); + if (soilKindFinder == null) + return new TkhCalculator(null, waterlevelProvider, dischargeProvider, bedHeightsProvider, null, null); final DoubleRange qRange = dischargeProvider.getRange(); - final FlowVelocityModelKmValueFinder flowVelocitiesFinder = FlowVelocityModelKmValueFinder.loadValues(river, calcRange, qRange); - if (flowVelocitiesFinder == null) { - final String message = Resources.getMsg(context.getMeta(), "sinfo_calc_flow_depth.warning.missingVelocity", null, label); - problems.addProblem(message); - return new TkhCalculator(problems, label, context, null, waterlevelProvider, dischargeProvider, bedHeightsProvider, null, null); - } + final FlowVelocityModelKmValueFinder flowVelocitiesFinder = FlowVelocityModelKmValueFinder.loadValues(problems, river, calcRange, qRange); + if (flowVelocitiesFinder == null) + return new TkhCalculator(null, waterlevelProvider, dischargeProvider, bedHeightsProvider, null, null); - return new TkhCalculator(problems, label, context, bedMeasurementsFinder, waterlevelProvider, dischargeProvider, bedHeightsProvider, soilKindFinder, + return new TkhCalculator(bedMeasurementsFinder, waterlevelProvider, dischargeProvider, bedHeightsProvider, soilKindFinder, flowVelocitiesFinder); } - private TkhCalculator(final Calculation problems, final String problemLabel, final CallContext context, - final BedQualityD50KmValueFinder bedMeasurementsFinder, final WaterlevelValuesFinder waterlevelProvider, + private TkhCalculator(final BedQualityD50KmValueFinder bedMeasurementsFinder, final WaterlevelValuesFinder waterlevelProvider, final DischargeValuesFinder dischargeProvider, final BedHeightsFinder bedHeightsProvider, final SoilKindKmValueFinder soilKindFinder, final FlowVelocityModelKmValueFinder flowVelocitiesFinder) { - this.problems = problems; - this.problemLabel = problemLabel; - this.context = context; this.bedMeasurementsFinder = bedMeasurementsFinder; this.waterlevelProvider = waterlevelProvider; this.dischargeProvider = dischargeProvider; @@ -121,32 +98,14 @@ private SoilKind getSoilKind(final double km) { - try { - if (this.soilKindFinder == null) - return null; + if (this.soilKindFinder == null) + return null; - return this.soilKindFinder.findSoilKind(km); - } - catch (final ArgumentOutsideDomainException e) { - // FIXME: cumulate problems to one message? - final String message = Resources.getMsg(this.context.getMeta(), "sinfo_calc_flow_depth.warning.missingSoilKind", null, this.problemLabel); - this.problems.addProblem(km, message); - return null; - } + return this.soilKindFinder.findSoilKind(km); } private double getBedMeasurement(final double km) { - - try { - return this.bedMeasurementsFinder.findD50(km); - } - catch (final Exception e) { - // FIXME: cumulate problems to one message? - final String message = Resources.getMsg(this.context.getMeta(), "sinfo_calc_flow_depth.warning.missingD50", null, this.problemLabel); - this.problems.addProblem(km, message); - - return Double.NaN; - } + return this.bedMeasurementsFinder.findD50(km); } public void calculateTkh(final double km, final SInfoResultRow row) { @@ -178,13 +137,8 @@ return; row.putValue(SInfoResultType.d50, d50); - if (!this.flowVelocitiesFinder.findKmQValues(km, discharge)) { - // TODO: ggf. station in Fehlermeldung? - final String message = Resources.getMsg(this.context.getMeta(), "sinfo_calc_flow_depth.warning.missingVelocity", null, this.problemLabel); - this.problems.addProblem(km, message); - // FIXME: cumulate problems to one message? + if (!this.flowVelocitiesFinder.findKmQValues(km, discharge)) return; - } final double velocity = this.flowVelocitiesFinder.getFindVmainFound(); row.putValue(SInfoResultType.velocity, velocity);