diff artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/tkhcalculation/TkhCalculator.java @ 8978:b5600453bb8f

SINFO Calculations: do not produce result rows if some input data has missing values. Also check for years of waterlevels in flow depth development calculation.
author gernotbelger
date Thu, 05 Apr 2018 11:57:54 +0200
parents 45f1ad66560e
children d5802f22e4f5
line wrap: on
line diff
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/tkhcalculation/TkhCalculator.java	Tue Apr 03 17:23:51 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/tkhcalculation/TkhCalculator.java	Thu Apr 05 11:57:54 2018 +0200
@@ -108,7 +108,7 @@
         return this.bedMeasurementsFinder.findD50(km);
     }
 
-    public void calculateTkh(final double km, final SInfoResultRow row) {
+    public boolean calculateTkh(final double km, final SInfoResultRow row) {
 
         row.putValue(SInfoResultType.station, km);
 
@@ -117,37 +117,53 @@
 
         final double wst = this.waterlevelProvider.getWaterlevel(km);
         row.putValue(SInfoResultType.waterlevel, wst);
+        if (Double.isNaN(wst))
+            return false;
 
         final double meanBedHeight = this.bedHeightsProvider.getMeanBedHeight(km);
         row.putValue(SInfoResultType.meanBedHeight, meanBedHeight);
+        if (Double.isNaN(meanBedHeight))
+            return false;
 
         final double flowDepth = wst - meanBedHeight;
         row.putValue(SInfoResultType.flowdepth, flowDepth);
+        if (Double.isNaN(flowDepth))
+            return false;
 
         final double discharge = this.dischargeProvider.getDischarge(km);
         row.putValue(SInfoResultType.discharge, discharge);
-        if (Double.isNaN(discharge))
-            return;
 
         if (!this.hasTkh())
-            return;
+            return true;
+
+        // Missing discharge or kind is only a problem if we want to calculate tkh
+        if (Double.isNaN(discharge))
+            return false;
+        if (kind == null)
+            return false;
 
         final double d50 = getBedMeasurement(km);
+        row.putValue(SInfoResultType.d50, d50);
         if (Double.isNaN(d50))
-            return;
-        row.putValue(SInfoResultType.d50, d50);
+            return false;
 
         if (!this.flowVelocitiesFinder.findKmQValues(km, discharge))
-            return;
+            return false;
 
         final double velocity = this.flowVelocitiesFinder.getFindVmainFound();
         row.putValue(SInfoResultType.velocity, velocity);
+        if (Double.isNaN(velocity))
+            return false;
 
         final double tau = this.flowVelocitiesFinder.getFindTauFound();
         row.putValue(SInfoResultType.tau, tau);
+        if (Double.isNaN(tau))
+            return false;
 
         final double tkh = calculateTkh(wst - meanBedHeight, velocity, d50, tau);
         row.putValue(SInfoResultType.tkh, tkh);
+        if (Double.isNaN(tkh))
+            return false;
 
         switch (kind) {
         case starr:
@@ -164,6 +180,8 @@
 
         final double flowDepthTkh = calculateFlowDepthTkh(tkh, kind, wst, meanBedHeight);
         row.putValue(SInfoResultType.flowdepthtkh, flowDepthTkh);
+
+        return true;
     }
 
     /**
@@ -202,9 +220,6 @@
 
     private double calculateFlowDepthTkh(final double tkhValue, final SoilKind tkhKind, final double wst, final double meanBedHeight) {
 
-        if (Double.isNaN(tkhValue) || tkhKind == null)
-            return Double.NaN;
-
         switch (tkhKind) {
         case starr:
             return wst - (meanBedHeight + tkhValue / 100);

http://dive4elements.wald.intevation.org