Mercurial > dive4elements > river
diff artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/tkhcalculation/TkhCalculator.java @ 8946:5d5d482da3e9
Implementing SINFO - FlowDepthMinMax calculation
author | gernotbelger |
---|---|
date | Tue, 13 Mar 2018 18:49:33 +0100 |
parents | 82998242ba84 |
children | a4f1ac81f26d |
line wrap: on
line diff
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/tkhcalculation/TkhCalculator.java Tue Mar 13 09:55:53 2018 +0100 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/tkhcalculation/TkhCalculator.java Tue Mar 13 18:49:33 2018 +0100 @@ -11,7 +11,6 @@ import org.apache.commons.lang.math.DoubleRange; import org.apache.commons.math.ArgumentOutsideDomainException; -import org.apache.commons.math.FunctionEvaluationException; import org.dive4elements.artifacts.CallContext; import org.dive4elements.river.artifacts.model.Calculation; import org.dive4elements.river.artifacts.resources.Resources; @@ -37,30 +36,33 @@ private final BedHeightsFinder bedHeightsProvider; + private final WaterlevelValuesFinder waterlevelProvider; + private final DischargeValuesFinder dischargeProvider; private final FlowVelocityModelKmValueFinder flowVelocitiesFinder; public static TkhCalculator buildTkhCalculator(final boolean useTkh, final CallContext context, final Calculation problems, final String label, - final River river, final DoubleRange calcRange, final DischargeValuesFinder dischargeProvider, final BedHeightsFinder bedHeightsProvider) { + final River river, final DoubleRange calcRange, final WaterlevelValuesFinder waterlevelProvider, final DischargeValuesFinder dischargeProvider, + final BedHeightsFinder bedHeightsProvider) { if (!useTkh) - return null; + return new TkhCalculator(problems, label, context, 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 null; + return new TkhCalculator(problems, label, context, null, waterlevelProvider, dischargeProvider, bedHeightsProvider, null, null); } - final Integer soundingYear = bedHeightsProvider.getInfo().getYear(); + final int soundingYear = bedHeightsProvider.getInfo().getYear(); final BedQualityD50KmValueFinder bedMeasurementsFinder = BedQualityD50KmValueFinder.loadBedMeasurements(river, calcRange, soundingYear, VALID_BED_MEASUREMENT_YEARS); if (bedMeasurementsFinder == null) { final String message = Resources.getMsg(context.getMeta(), "sinfo_calc_flow_depth.warning.missingD50", null, label); problems.addProblem(message); - return null; + return new TkhCalculator(problems, label, context, null, waterlevelProvider, dischargeProvider, bedHeightsProvider, null, null); } // FIXME: wie wird ggf. interpoliert? prüfung ob werte vorhanden? @@ -68,7 +70,7 @@ if (soilKindFinder == null) { final String message = Resources.getMsg(context.getMeta(), "sinfo_calc_flow_depth.warning.missingSoilKind", null, label); problems.addProblem(message); - return null; + return new TkhCalculator(problems, label, context, null, waterlevelProvider, dischargeProvider, bedHeightsProvider, null, null); } final DoubleRange qRange = dischargeProvider.getRange(); @@ -76,35 +78,43 @@ if (flowVelocitiesFinder == null) { final String message = Resources.getMsg(context.getMeta(), "sinfo_calc_flow_depth.warning.missingVelocity", null, label); problems.addProblem(message); - return null; + return new TkhCalculator(problems, label, context, null, waterlevelProvider, dischargeProvider, bedHeightsProvider, null, null); } - return new TkhCalculator(problems, label, context, bedMeasurementsFinder, dischargeProvider, bedHeightsProvider, soilKindFinder, flowVelocitiesFinder); + return new TkhCalculator(problems, label, context, bedMeasurementsFinder, waterlevelProvider, dischargeProvider, bedHeightsProvider, soilKindFinder, + flowVelocitiesFinder); } private TkhCalculator(final Calculation problems, final String problemLabel, final CallContext context, - final BedQualityD50KmValueFinder bedMeasurementsFinder, final DischargeValuesFinder dischargeProvider, final BedHeightsFinder bedHeightsProvider, - final SoilKindKmValueFinder soilKindFinder, + 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; this.bedHeightsProvider = bedHeightsProvider; this.soilKindFinder = soilKindFinder; this.flowVelocitiesFinder = flowVelocitiesFinder; } - private double getDischarge(final double km) { + public boolean hasTkh() { - try { - return this.dischargeProvider.getDischarge(km); - } - catch (final FunctionEvaluationException e) { - // TODO: exceptions nicht komplett schlucken? evtl. mit log.debug(e) ausgeben - return Double.NaN; - } + if (this.dischargeProvider == null || !this.dischargeProvider.isValid()) + return false; + + if (this.bedMeasurementsFinder == null) + return false; + + if (this.soilKindFinder == null) + return false; + + if (this.flowVelocitiesFinder == null) + return false; + + return true; } private SoilKind getSoilKind(final double km) { @@ -134,26 +144,22 @@ } } - public Tkh getTkh(final double km, final double wst) { + public Tkh getTkh(final double km) { final SoilKind kind = getSoilKind(km); + final double wst = this.waterlevelProvider.getWaterlevel(km); + final double meanBedHeight = this.bedHeightsProvider.getMeanBedHeight(km); final double flowDepth = wst - meanBedHeight; - final double discharge = getDischarge(km); - if (Double.isNaN(discharge)) { + final double discharge = this.dischargeProvider.getDischarge(km); + if (Double.isNaN(discharge)) + return new Tkh(km, wst, meanBedHeight, flowDepth, Double.NaN, kind); - // final String message = Resources.getMsg(this.context.getMeta(), "sinfo_calc_flow_depth.warning.missingQ", null, - // this.problemLabel); - // this.problems.addProblem(km, message); - - // TODO: nochmal gemeinsam überlegen welche probleme wir loggen, an dieser stelle müsste man ggf. die station - // mitausgeben - + if (!this.hasTkh()) return new Tkh(km, wst, meanBedHeight, flowDepth, Double.NaN, kind); - } final double d50 = getBedMeasurement(km); if (Double.isNaN(d50))