Index: src/Plugins/Wti/Wti.Calculation/Piping/PipingCalculation.cs
===================================================================
diff -u -re4bd298c3f3762925531b11517a0f57b7005e5ad -r56799a04d6d49cdcb6706d8ada0f1d1e5d7d08dc
--- src/Plugins/Wti/Wti.Calculation/Piping/PipingCalculation.cs (.../PipingCalculation.cs) (revision e4bd298c3f3762925531b11517a0f57b7005e5ad)
+++ src/Plugins/Wti/Wti.Calculation/Piping/PipingCalculation.cs (.../PipingCalculation.cs) (revision 56799a04d6d49cdcb6706d8ada0f1d1e5d7d08dc)
@@ -1,4 +1,7 @@
-using Deltares.WTIPiping;
+using System.Collections.Generic;
+using System.Collections.ObjectModel;
+using System.Linq;
+using Deltares.WTIPiping;
namespace Wti.Calculation.Piping
{
@@ -29,44 +32,90 @@
/// Thrown when any of the invocations of the sub-calculations from the kernel throws an Exception.
public PipingCalculationResult Calculate()
{
+ var upliftResult = CalculateUplift();
+ var heaveResult = CalculateHeave();
+ var sellmeijerResult = CalculateSellmeijer();
+
+ return new PipingCalculationResult(
+ upliftResult.Zu,
+ upliftResult.FoSu,
+ heaveResult.Zh,
+ heaveResult.FoSh,
+ sellmeijerResult.Zp,
+ sellmeijerResult.FoSp
+ );
+ }
+
+ ///
+ /// Returns a list of validation messages. The validation messages are based on the values of the
+ /// which was provided to this and are determined by the Piping kernel.
+ ///
+ public List Validate()
+ {
+ List upliftCalculatorValidationResults = CreateUpliftCalculator().Validate();
+ List heaveCalculatorValidationResults = CreateHeaveCalculator().Validate();
+ List sellmeijerCalculatorValidationResults = CreateSellmeijerCalculator().Validate();
+
+ return upliftCalculatorValidationResults.Concat(heaveCalculatorValidationResults).Concat(sellmeijerCalculatorValidationResults).ToList();
+ }
+
+ private Sellmeijer2011Calculator CalculateSellmeijer()
+ {
+ Sellmeijer2011Calculator sellmeijerCalculator = CreateSellmeijerCalculator();
+
try
{
- var upliftResultContainer = CalculateUplift();
- var heaveResultContainer = CalulateHeave();
- var sellmejerResultContainer = CalulateSellmeijer();
-
- return new PipingCalculationResult(
- upliftResultContainer.Zu,
- upliftResultContainer.FoSu,
- heaveResultContainer.Zh,
- heaveResultContainer.FoSh,
- sellmejerResultContainer.Zp,
- sellmejerResultContainer.FoSp
- );
+ sellmeijerCalculator.Calculate();
}
- catch (WTIUpliftCalculatorException e)
+ catch (PipingException e)
{
throw new PipingCalculationException(e.Message);
}
- catch (PipingException e)
+ catch (PipingException e)
{
throw new PipingCalculationException(e.Message);
}
- catch (PipingException e)
+
+ return sellmeijerCalculator;
+ }
+
+ private HeaveCalculator CalculateHeave()
+ {
+ var heaveCalculator = CreateHeaveCalculator();
+
+ try
{
+ heaveCalculator.Calculate();
+ }
+ catch (PipingException e)
+ {
throw new PipingCalculationException(e.Message);
}
- catch (PipingException e)
+
+ return heaveCalculator;
+ }
+
+ private WTIUpliftCalculator CalculateUplift()
+ {
+ WTIUpliftCalculator upliftCalculator = CreateUpliftCalculator();
+
+ try
{
+ upliftCalculator.Calculate();
+ }
+ catch (WTIUpliftCalculatorException e)
+ {
throw new PipingCalculationException(e.Message);
}
- catch (PipingException e)
+ catch (PipingException e)
{
throw new PipingCalculationException(e.Message);
}
+
+ return upliftCalculator;
}
- private HeaveCalculator CalulateHeave()
+ private HeaveCalculator CreateHeaveCalculator()
{
var calculator = new HeaveCalculator
{
@@ -77,11 +126,10 @@
RExit = input.DampingFactorExit,
HExit = input.PhreaticLevelExit
};
- calculator.Calculate();
return calculator;
}
- private WTIUpliftCalculator CalculateUplift()
+ private WTIUpliftCalculator CreateUpliftCalculator()
{
var effectiveStressResult = CalculateEffectiveThickness();
@@ -96,11 +144,10 @@
HExit = input.PhreaticLevelExit,
PhiPolder = input.PiezometricHeadPolder
};
- calculator.Calculate();
return calculator;
}
- private Sellmeijer2011Calculator CalulateSellmeijer()
+ private Sellmeijer2011Calculator CreateSellmeijerCalculator()
{
var calculator = new Sellmeijer2011Calculator
{
@@ -121,7 +168,6 @@
D70Mean = input.MeanDiameter70,
BeddingAngle = input.BeddingAngle
};
- calculator.Calculate();
return calculator;
}
Index: test/Plugins/Wti/Wti.Calculation.Test/Piping/PipingCalculationTest.cs
===================================================================
diff -u -re4bd298c3f3762925531b11517a0f57b7005e5ad -r56799a04d6d49cdcb6706d8ada0f1d1e5d7d08dc
--- test/Plugins/Wti/Wti.Calculation.Test/Piping/PipingCalculationTest.cs (.../PipingCalculationTest.cs) (revision e4bd298c3f3762925531b11517a0f57b7005e5ad)
+++ test/Plugins/Wti/Wti.Calculation.Test/Piping/PipingCalculationTest.cs (.../PipingCalculationTest.cs) (revision 56799a04d6d49cdcb6706d8ada0f1d1e5d7d08dc)
@@ -1,4 +1,6 @@
using System;
+using System.Collections.Generic;
+using System.Linq;
using NUnit.Framework;
using Wti.Calculation.Piping;
@@ -9,30 +11,7 @@
[Test]
public void GivenACompleteInput_WhenCalculationPerformed_ThenResultContainsNoNaN()
{
- Random random = new Random(22);
- PipingCalculationInput input = new PipingCalculationInput(
- random.NextDouble(),
- random.NextDouble(),
- random.NextDouble(),
- random.NextDouble(),
- random.NextDouble(),
- random.NextDouble(),
- random.NextDouble(),
- random.NextDouble(),
- random.NextDouble(),
- random.NextDouble(),
- random.NextDouble(),
- random.NextDouble(),
- random.NextDouble(),
- random.NextDouble(),
- random.NextDouble(),
- random.NextDouble(),
- random.NextDouble(),
- random.NextDouble(),
- random.NextDouble(),
- random.NextDouble(),
- random.NextDouble(),
- random.NextDouble());
+ PipingCalculationInput input = new TestPipingInput().AsRealInput();
PipingCalculationResult actual = new PipingCalculation(input).Calculate();
@@ -44,5 +23,189 @@
Assert.IsFalse(double.IsNaN(actual.SellmeijerZValue));
Assert.IsFalse(double.IsNaN(actual.SellmeijerFactorOfSafety));
}
+
+ [Test]
+ [TestCase(0)]
+ [TestCase(-1e-6)]
+ [TestCase(-100)]
+ public void Validate_ZeroOrNegativeSeepageLength_ValidationMessageForPipingLength(double seepageLength)
+ {
+ // Setup
+ PipingCalculationInput input = new TestPipingInput
+ {
+ SeepageLength = seepageLength
+ }.AsRealInput();
+
+ var calculation = new PipingCalculation(input);
+
+ // Call
+ List validationMessages = calculation.Validate();
+
+ // Assert
+ Assert.AreEqual(1, validationMessages.Count);
+ Assert.IsTrue(validationMessages.Any(message => message.Contains("Piping length")));
+ }
+
+ [Test]
+ [TestCase(0)]
+ [TestCase(-1e-6)]
+ [TestCase(-100)]
+ public void Validate_ZeroOrNegativeAquiferThickness_ValidationMessageForDAquifer(double aquiferThickness)
+ {
+ // Setup
+ PipingCalculationInput input = new TestPipingInput
+ {
+ ThicknessAquiferLayer = aquiferThickness
+ }.AsRealInput();
+
+ var calculation = new PipingCalculation(input);
+
+ // Call
+ List validationMessages = calculation.Validate();
+
+ // Assert
+ Assert.AreEqual(1, validationMessages.Count);
+ Assert.IsTrue(validationMessages.Any(message => message.Contains("DAquifer")));
+ }
+
+ [Test]
+ [TestCase(-1e-6)]
+ [TestCase(-100)]
+ public void Validate_NegativeBeddingAngle_ValidationMessageForBeddingAngle(double beddingAngle)
+ {
+ // Setup
+ PipingCalculationInput input = new TestPipingInput
+ {
+ BeddingAngle = beddingAngle
+ }.AsRealInput();
+
+ var calculation = new PipingCalculation(input);
+
+ // Call
+ List validationMessages = calculation.Validate();
+
+ // Assert
+ Assert.AreEqual(1, validationMessages.Count);
+ Assert.IsTrue(validationMessages.Any(message => message.Contains("Bedding angle")));
+ }
+
+ [Test]
+ [TestCase(-1e-6)]
+ [TestCase(-100)]
+ public void Validate_PiezometricHeadExitSameAsPhreaticLevelExit_ValidationMessageForPhiExitAndHExit(double level)
+ {
+ // Setup
+ PipingCalculationInput input = new TestPipingInput
+ {
+ PiezometricHeadExit = level,
+ PhreaticLevelExit = level
+ }.AsRealInput();
+
+ var calculation = new PipingCalculation(input);
+
+ // Call
+ List validationMessages = calculation.Validate();
+
+ // Assert
+ Assert.AreEqual(2, validationMessages.Count);
+ Assert.IsTrue(validationMessages.Any(message => message.Contains("PhiExit - HExit")));
+ Assert.IsTrue(validationMessages.Any(message => message.Contains("phiExit - hExit")));
+ }
+
+ class TestPipingInput
+ {
+ public double WaterVolumetricWeight;
+ public double UpliftModelFactor;
+ public double AssessmentLevel;
+ public double PiezometricHeadExit;
+ public double DampingFactorExit;
+ public double PhreaticLevelExit;
+ public double PiezometricHeadPolder;
+ public double CriticalHeaveGradient;
+ public double ThicknessCoverageLayer;
+ public double SellmeijerModelFactor;
+ public double SellmeijerReductionFactor;
+ public double SeepageLength;
+ public double SandParticlesVolumicWeight;
+ public double WhitesDragCoefficient;
+ public double Diameter70;
+ public double DarcyPermeability;
+ public double WaterKinematicViscosity;
+ public double Gravity;
+ public double ExitPointXCoordinate;
+ public double BeddingAngle;
+ public double MeanDiameter70;
+ public double ThicknessAquiferLayer;
+
+ private readonly Random random = new Random(22);
+ private double last;
+
+ public TestPipingInput()
+ {
+ WaterVolumetricWeight = NextDouble();
+ UpliftModelFactor = NextDouble();
+ AssessmentLevel = NextDouble();
+ PiezometricHeadExit = NextDouble();
+ PhreaticLevelExit = NextDouble();
+ DampingFactorExit = NextDouble();
+ PiezometricHeadPolder = NextDouble();
+ CriticalHeaveGradient = NextDouble();
+ ThicknessCoverageLayer = NextDouble();
+ SellmeijerModelFactor = NextDouble();
+ SellmeijerReductionFactor = NextDouble();
+ SeepageLength = NextDouble();
+ SandParticlesVolumicWeight = NextDouble();
+ WhitesDragCoefficient = NextDouble();
+ Diameter70 = NextDouble();
+ DarcyPermeability = NextDouble();
+ WaterKinematicViscosity = NextDouble();
+ Gravity = NextDouble();
+ ExitPointXCoordinate = NextDouble();
+ BeddingAngle = NextDouble();
+ MeanDiameter70 = NextDouble();
+ ThicknessAquiferLayer = NextDouble();
+ }
+
+ ///
+ /// The returned double is sure to be different from the last time it was called.
+ ///
+ ///
+ private double NextDouble()
+ {
+ return last += random.NextDouble() + 1e-6;
+ }
+
+ ///
+ /// Returns the current set value as a
+ ///
+ ///
+ public PipingCalculationInput AsRealInput()
+ {
+ return new PipingCalculationInput(
+ WaterVolumetricWeight,
+ UpliftModelFactor,
+ AssessmentLevel,
+ PiezometricHeadExit,
+ DampingFactorExit,
+ PhreaticLevelExit,
+ PiezometricHeadPolder,
+ CriticalHeaveGradient,
+ ThicknessCoverageLayer,
+ SellmeijerModelFactor,
+ SellmeijerReductionFactor,
+ SeepageLength,
+ SandParticlesVolumicWeight,
+ WhitesDragCoefficient,
+ Diameter70,
+ DarcyPermeability,
+ WaterKinematicViscosity,
+ Gravity,
+ ThicknessAquiferLayer,
+ MeanDiameter70,
+ BeddingAngle,
+ ExitPointXCoordinate
+ );
+ }
+ }
}
}
\ No newline at end of file
Index: test/Plugins/Wti/Wti.Forms.Test/Helper/PipingOutputCreator.cs
===================================================================
diff -u -r0a2e4c7ac0cdcaf0038721c74ed9c823f1e14f91 -r56799a04d6d49cdcb6706d8ada0f1d1e5d7d08dc
--- test/Plugins/Wti/Wti.Forms.Test/Helper/PipingOutputCreator.cs (.../PipingOutputCreator.cs) (revision 0a2e4c7ac0cdcaf0038721c74ed9c823f1e14f91)
+++ test/Plugins/Wti/Wti.Forms.Test/Helper/PipingOutputCreator.cs (.../PipingOutputCreator.cs) (revision 56799a04d6d49cdcb6706d8ada0f1d1e5d7d08dc)
@@ -4,7 +4,7 @@
namespace Wti.Forms.Test.Helper
{
///
- /// Helper class to create simple PipingOutput.
+ /// Helper class to create simple .
///
public static class PipingOutputCreator
{