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

http://dive4elements.wald.intevation.org