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);

http://dive4elements.wald.intevation.org