Index: DamEngine/trunk/src/Deltares.DamEngine.Data/General/MStabParameters.cs =================================================================== diff -u -r5056 -r5627 --- DamEngine/trunk/src/Deltares.DamEngine.Data/General/MStabParameters.cs (.../MStabParameters.cs) (revision 5056) +++ DamEngine/trunk/src/Deltares.DamEngine.Data/General/MStabParameters.cs (.../MStabParameters.cs) (revision 5627) @@ -74,7 +74,7 @@ public class SlipCircleDefinition : IAssignable, ICloneable { - public double XCoordinateLastUpliftPoint { get; set; } + public double XCoordinateLowestUpliftFactorPoint { get; set; } public TangentLinesDefinition UpliftVanTangentLinesDefinition { get; set; } @@ -114,7 +114,7 @@ public void Assign(SlipCircleDefinition slipCircleDefinition) { - XCoordinateLastUpliftPoint = slipCircleDefinition.XCoordinateLastUpliftPoint; + XCoordinateLowestUpliftFactorPoint = slipCircleDefinition.XCoordinateLowestUpliftFactorPoint; UpliftVanTangentLinesDefinition = slipCircleDefinition.UpliftVanTangentLinesDefinition; UpliftVanTangentLinesDistance = slipCircleDefinition.UpliftVanTangentLinesDistance; BishopTangentLinesDefinition = slipCircleDefinition.BishopTangentLinesDefinition; Index: DamEngine/trunk/src/Deltares.DamEngine.Calculators/KernelWrappers/MacroStabilityInwards/BishopGridCreator.cs =================================================================== diff -u -r5056 -r5627 --- DamEngine/trunk/src/Deltares.DamEngine.Calculators/KernelWrappers/MacroStabilityInwards/BishopGridCreator.cs (.../BishopGridCreator.cs) (revision 5056) +++ DamEngine/trunk/src/Deltares.DamEngine.Calculators/KernelWrappers/MacroStabilityInwards/BishopGridCreator.cs (.../BishopGridCreator.cs) (revision 5627) @@ -34,7 +34,7 @@ /// /// the slip circle definition /// The surface line. - /// the the bishop calculation grid + /// The Bishop calculation grid public static BishopCalculationGrid DetermineGridsFromSettings(MStabGridPosition gridPosition, SlipCircleDefinition slipCircleDefinition, SurfaceLine2 surfaceLine) { Index: DamEngine/trunk/src/Deltares.DamEngine.Data/General/Location.cs =================================================================== diff -u -r5476 -r5627 --- DamEngine/trunk/src/Deltares.DamEngine.Data/General/Location.cs (.../Location.cs) (revision 5476) +++ DamEngine/trunk/src/Deltares.DamEngine.Data/General/Location.cs (.../Location.cs) (revision 5627) @@ -126,10 +126,10 @@ public virtual double XRdDikeLine { get; set; } /// - /// Gets or sets the x soil geometry2 d origin. + /// Gets or sets the x soil geometry 2D origin. /// /// - /// The x soil geometry2 d origin. + /// The x soil geometry 2D origin. /// public virtual double XSoilGeometry2DOrigin { get; set; } Index: DamEngine/trunk/src/Deltares.DamEngine.Calculators/KernelWrappers/Common/UpliftHelper.cs =================================================================== diff -u -r5404 -r5627 --- DamEngine/trunk/src/Deltares.DamEngine.Calculators/KernelWrappers/Common/UpliftHelper.cs (.../UpliftHelper.cs) (revision 5404) +++ DamEngine/trunk/src/Deltares.DamEngine.Calculators/KernelWrappers/Common/UpliftHelper.cs (.../UpliftHelper.cs) (revision 5627) @@ -49,13 +49,16 @@ riverLevelLow = damKernelInput.RiverLevelLow; } - var sensorPlLineCreatorSettings = new SensorPlLineCreatorSettings(); - sensorPlLineCreatorSettings.SensorLocation = damKernelInput.Location.SensorLocation; - sensorPlLineCreatorSettings.DateTime = damKernelInput.TimeStepDateTime; + var sensorPlLineCreatorSettings = new SensorPlLineCreatorSettings + { + SensorLocation = damKernelInput.Location.SensorLocation, + DateTime = damKernelInput.TimeStepDateTime + }; PlLines plLines = PlLinesHelper.CreatePlLinesForStability(damKernelInput.Location, damKernelInput.SubSoilScenario, riverLevel, riverLevelLow, sensorPlLineCreatorSettings, out upliftSituation); - upliftSituation.IsUplift = DetermineIsUplift(plLines, damKernelInput.Location, damKernelInput.SubSoilScenario); - + upliftSituation.IsUplift = DetermineIsUplift(plLines, damKernelInput.Location, damKernelInput.SubSoilScenario, out double xCoordLowestUpliftFactor); + upliftSituation.XCoordinateLowestUpliftFactorPoint = xCoordLowestUpliftFactor; + return plLines; } @@ -65,24 +68,27 @@ /// The pl lines. /// The location. /// The sub soil scenario. + /// The X co-ordinate of the point with the lowest uplift factor. /// true if there is uplift - private bool DetermineIsUplift(PlLines plLines, Location location, SoilGeometryProbability subSoilScenario) + private static bool DetermineIsUplift(PlLines plLines, Location location, SoilGeometryProbability subSoilScenario, out double xCoordLowestUpliftFactor) { if (plLines == null) { + xCoordLowestUpliftFactor = double.NaN; return false; } double upliftCriterion = location.ModelFactors.UpliftCriterionStability; SurfaceLine2 surfaceLineWithNewHeight = location.SurfaceLine; double? upliftFactor = GetLowestUpliftFactor(surfaceLineWithNewHeight, subSoilScenario.SoilProfile1D, subSoilScenario.FullStiFileName, - subSoilScenario.SoilProfile2D, plLines, location); + subSoilScenario.SoilProfile2D, plLines, location, out xCoordLowestUpliftFactor); + return upliftFactor < upliftCriterion; } - private double? GetLowestUpliftFactor(SurfaceLine2 surfaceLine, SoilProfile1D soilProfile1D, string soilGeometry2DName, - SoilProfile2D soilProfile2D, PlLines plLines, Location location) + private static double? GetLowestUpliftFactor(SurfaceLine2 surfaceLine, SoilProfile1D soilProfile1D, string soilGeometry2DName, + SoilProfile2D soilProfile2D, PlLines plLines, Location location, out double xCoordLowestUpliftFactor) { var upliftLocationDeterminator = new UpliftLocationDeterminator { @@ -95,7 +101,8 @@ PlLines = plLines, XSoilGeometry2DOrigin = location.XSoilGeometry2DOrigin }; - UpliftLocationAndResult upliftLocationAndResult = upliftLocationDeterminator.GetLocationAtWithLowestUpliftFactor(); + UpliftLocationAndResult upliftLocationAndResult = upliftLocationDeterminator.GetLocationWithLowestUpliftFactor(); + xCoordLowestUpliftFactor = upliftLocationAndResult.X; return upliftLocationAndResult?.UpliftFactor; } } \ No newline at end of file Index: DamEngine/trunk/src/Deltares.DamEngine.Calculators.Tests/Uplift/UpliftLocationDeterminatorTest.cs =================================================================== diff -u -r5416 -r5627 --- DamEngine/trunk/src/Deltares.DamEngine.Calculators.Tests/Uplift/UpliftLocationDeterminatorTest.cs (.../UpliftLocationDeterminatorTest.cs) (revision 5416) +++ DamEngine/trunk/src/Deltares.DamEngine.Calculators.Tests/Uplift/UpliftLocationDeterminatorTest.cs (.../UpliftLocationDeterminatorTest.cs) (revision 5627) @@ -98,7 +98,7 @@ SoilProfile = soilProfile, PlLines = plLines }; - UpliftLocationAndResult upliftLocationAndResult = upliftLocationDeterminator.GetLocationAtWithLowestUpliftFactor(); + UpliftLocationAndResult upliftLocationAndResult = upliftLocationDeterminator.GetLocationWithLowestUpliftFactor(); Assert.That(upliftLocationAndResult.X, Is.EqualTo(cExpectedXCoordinate).Within(cTolerance)); Assert.That(upliftLocationAndResult.Z, Is.EqualTo(cExpectedZCoordinate).Within(cTolerance)); Index: DamEngine/trunk/src/Deltares.DamEngine.Calculators.Tests/KernelWrappers/MacroStabilityInwards/MacroStabilityInwardsKernelWrapperTests.cs =================================================================== diff -u -r5598 -r5627 --- DamEngine/trunk/src/Deltares.DamEngine.Calculators.Tests/KernelWrappers/MacroStabilityInwards/MacroStabilityInwardsKernelWrapperTests.cs (.../MacroStabilityInwardsKernelWrapperTests.cs) (revision 5598) +++ DamEngine/trunk/src/Deltares.DamEngine.Calculators.Tests/KernelWrappers/MacroStabilityInwards/MacroStabilityInwardsKernelWrapperTests.cs (.../MacroStabilityInwardsKernelWrapperTests.cs) (revision 5627) @@ -46,50 +46,46 @@ [TestFixture] public class MacroStabilityInwardsKernelWrapperTests { - private const string TestFolder = @"..\..\..\Deltares.DamEngine.IntegrationTests\TestFiles"; - private readonly string inputXmlForDamEngine = Path.Combine(TestFolder, "StabilityDesign1Dbased.xml"); + private const string testFolder = @"..\..\..\Deltares.DamEngine.IntegrationTests\TestFiles"; + private readonly string inputXmlForDamEngine = Path.Combine(testFolder, "StabilityDesign1Dbased.xml"); private const double tolerance4Decimals = 0.000051; [Test] - public void TestPrepare() + [TestCase(0.8, true, false, PrepareResult.NotRelevant)] + [TestCase(1.4, true, true, PrepareResult.Successful)] + [TestCase(1.2, false, false, PrepareResult.Failed)] + public void TestPrepare(double upliftCriterionStability, bool isInputValid, bool expectedIsUplift, PrepareResult expectedPrepareResult) { + // Setup + DamKernelInput kernelInput = CreateDamKernelInputForTest(MStabModelType.UpliftVan, MStabSearchMethod.Grid, GridSizeDetermination.Specified); + kernelInput.Location.ModelFactors.UpliftCriterionStability = upliftCriterionStability; var kernelWrapper = new MacroStabilityInwardsKernelWrapper { FailureMechanismParametersMStab = new FailureMechanismParametersMStab { MStabParameters = { - Model = MStabModelType.UpliftVan + Model = kernelInput.DamFailureMechanismeCalculationSpecification.FailureMechanismParametersMStab.MStabParameters.Model, + SearchMethod = kernelInput.DamFailureMechanismeCalculationSpecification.FailureMechanismParametersMStab.MStabParameters.SearchMethod } } }; - - DamKernelInput kernelInput = CreateDamKernelInputForTest(); - - // Situation 1: no uplift. Expected PrepareResult.NotRelevant - kernelInput.Location.ModelFactors.UpliftCriterionStability = 0.8; - kernelInput.CurrentEmbankmentSoil = kernelInput.Location.GetDikeEmbankmentSoil(); + if (!isInputValid) + { + kernelInput.Location.SurfaceLine.CharacteristicPoints.Clear(); + } + + // Call PrepareResult prepareResult = kernelWrapper.Prepare(kernelInput, 0, out _, out IKernelDataOutput kernelDataOutput); - Assert.That(prepareResult, Is.EqualTo(PrepareResult.NotRelevant)); + + // Assert var damMacroStabilityOutput = (MacroStabilityOutput) kernelDataOutput; - Assert.That(damMacroStabilityOutput.CalculationResult, Is.EqualTo(CalculationResult.NoRun)); - Assert.That(damMacroStabilityOutput.UpliftSituation.IsUplift, Is.False); - - // Situation 2: there is uplift and prepare succeeds. Expected PrepareResult.Successful - kernelInput.Location.ModelFactors.UpliftCriterionStability = 1.4; - prepareResult = kernelWrapper.Prepare(kernelInput, 0, out _, out kernelDataOutput); - Assert.That(prepareResult, Is.EqualTo(PrepareResult.Successful)); - damMacroStabilityOutput = (MacroStabilityOutput) kernelDataOutput; - Assert.That(damMacroStabilityOutput.CalculationResult, Is.EqualTo(CalculationResult.NoRun)); - Assert.That(damMacroStabilityOutput.UpliftSituation.IsUplift, Is.True); - - // Situation 3: prepare fails. Expected PrepareResult.Failed - kernelInput.Location.ModelFactors.UpliftCriterionStability = 1.2; - kernelInput.Location.SurfaceLine.CharacteristicPoints.Clear(); - prepareResult = kernelWrapper.Prepare(kernelInput, 0, out _, out kernelDataOutput); - Assert.That(prepareResult, Is.EqualTo(PrepareResult.Failed)); - damMacroStabilityOutput = (MacroStabilityOutput) kernelDataOutput; - Assert.That(damMacroStabilityOutput.CalculationResult, Is.EqualTo(CalculationResult.NoRun)); + Assert.Multiple(() => + { + Assert.That(prepareResult, Is.EqualTo(expectedPrepareResult)); + Assert.That(damMacroStabilityOutput.CalculationResult, Is.EqualTo(CalculationResult.NoRun)); + Assert.That(damMacroStabilityOutput.UpliftSituation.IsUplift, Is.EqualTo(expectedIsUplift)); + }); } [Test] @@ -113,19 +109,24 @@ CalculationResult = CalculationResult.NoRun }; int errorCount = kernelWrapper.Validate(macroStabilityInput, macroStabilityOutput, out List messages); - Assert.That(errorCount, Is.GreaterThan(0)); - Assert.That(macroStabilityOutput.CalculationResult, Is.EqualTo(CalculationResult.InvalidInputData)); + Assert.Multiple(() => + { + Assert.That(errorCount, Is.GreaterThan(0)); + Assert.That(macroStabilityOutput.CalculationResult, Is.EqualTo(CalculationResult.InvalidInputData)); + }); // Validate the input when valid input is provided. Expected no messages. - DamKernelInput kernelInput = CreateDamKernelInputForTest(); - kernelInput.Location.ModelFactors.UpliftCriterionStability = 1.4; - kernelInput.CurrentEmbankmentSoil = kernelInput.Location.GetDikeEmbankmentSoil(); + DamKernelInput kernelInput = CreateDamKernelInputForTest(MStabModelType.UpliftVan, MStabSearchMethod.Grid, GridSizeDetermination.Specified); PrepareResult prepareResult = kernelWrapper.Prepare(kernelInput, 0, out IKernelDataInput kernelDataInput, out IKernelDataOutput kernelDataOutput); Assert.That(prepareResult, Is.EqualTo(PrepareResult.Successful)); messages.Clear(); + errorCount = kernelWrapper.Validate(kernelDataInput, kernelDataOutput, out messages); - Assert.That(errorCount, Is.EqualTo(0)); - Assert.That(((MacroStabilityOutput) kernelDataOutput).CalculationResult, Is.EqualTo(CalculationResult.NoRun)); + Assert.Multiple(() => + { + Assert.That(errorCount, Is.EqualTo(0)); + Assert.That(((MacroStabilityOutput)kernelDataOutput).CalculationResult, Is.EqualTo(CalculationResult.NoRun)); + }); } [Test] @@ -134,17 +135,19 @@ [TestCase(MStabModelType.BishopUpliftVan)] public void TestPostProcess(MStabModelType modelType) { + DamKernelInput kernelInput = CreateDamKernelInputForTest(modelType, MStabSearchMethod.Grid, GridSizeDetermination.Specified); var kernelWrapper = new MacroStabilityInwardsKernelWrapper { FailureMechanismParametersMStab = new FailureMechanismParametersMStab { MStabParameters = { - Model = modelType + Model = kernelInput.DamFailureMechanismeCalculationSpecification.FailureMechanismParametersMStab.MStabParameters.Model, + SearchMethod = kernelInput.DamFailureMechanismeCalculationSpecification.FailureMechanismParametersMStab.MStabParameters.SearchMethod } } }; - DamKernelInput kernelInput = CreateDamKernelInputForTest(); + var macroStabilityOutput = new MacroStabilityOutput { CalculationResult = CalculationResult.Succeeded, @@ -159,7 +162,7 @@ StabilityModelType = modelType != MStabModelType.BishopUpliftVan ? modelType : MStabModelType.Bishop, CalculationResult = CalculationResult.Succeeded, SafetyFactor = 2.34, - CalculationPath = TestFolder + "@\testpath", + CalculationPath = testFolder + "@\testpath", ProjectName = Path.GetFileNameWithoutExtension(inputXmlForDamEngine), ActiveCenterPoint = new Point2D(10, 10), ActiveCenterPointRadius = 8, @@ -339,7 +342,7 @@ Assert.Multiple(() => { Assert.That(result.BaseFileName, Is.EqualTo(Path.GetFileNameWithoutExtension(inputXmlForDamEngine))); - Assert.That(result.CalculationSubDir, Is.EqualTo(TestFolder + "@\testpath")); + Assert.That(result.CalculationSubDir, Is.EqualTo(testFolder + "@\testpath")); }); } @@ -461,20 +464,19 @@ [Test] public void TestFullCalculationSucceedsWithWarningsWithBadTangentLines() { + // Prepare the wrapper. Result is input for the calculation dll + DamKernelInput kernelInput = CreateDamKernelInputForTest(MStabModelType.UpliftVan, MStabSearchMethod.Grid, GridSizeDetermination.Specified); var kernelWrapper = new MacroStabilityInwardsKernelWrapper { FailureMechanismParametersMStab = new FailureMechanismParametersMStab { MStabParameters = { - Model = MStabModelType.UpliftVan + Model = kernelInput.DamFailureMechanismeCalculationSpecification.FailureMechanismParametersMStab.MStabParameters.Model, + SearchMethod = kernelInput.DamFailureMechanismeCalculationSpecification.FailureMechanismParametersMStab.MStabParameters.SearchMethod } } }; - - // Prepare the wrapper. Result is input for the calculation dll - DamKernelInput kernelInput = CreateDamKernelInputForTest(); - kernelInput.Location.ModelFactors.UpliftCriterionStability = 1.4; SlipCircleDefinition sd = kernelInput.DamFailureMechanismeCalculationSpecification.FailureMechanismParametersMStab .MStabParameters.SlipCircleDefinition; @@ -493,31 +495,33 @@ var macroStabilityOutput = (MacroStabilityOutput) kernelDataOutput; Assert.Multiple(() => { - Assert.That(messages, Has.Count.EqualTo(26)); + Assert.That(messages, Has.Count.EqualTo(24)); Assert.That(macroStabilityOutput.CalculationResult, Is.EqualTo(CalculationResult.Succeeded)); Assert.That(messages[0].Message, Does.Contain("A slice is beyond the geometry at x")); }); } [Test] - public void TestFullCalculationSucceeds() + [TestCase(MStabSearchMethod.Grid, GridSizeDetermination.Specified, 1.2812, 4)] + [TestCase(MStabSearchMethod.Grid, GridSizeDetermination.Automatic, 1.4752, 3)] + [TestCase(MStabSearchMethod.BeeSwarm, GridSizeDetermination.Specified, 2.2597, 3)] + [TestCase(MStabSearchMethod.BeeSwarm, GridSizeDetermination.Automatic, 1.1284, 894)] + public void TestFullCalculationSucceedsWithUpliftVan(MStabSearchMethod searchMethod, GridSizeDetermination gridSizeDetermination, double expectedSafetyFactor, int expectedLogMessageCount) { + // Prepare the wrapper. Result is input for the calculation dll + DamKernelInput kernelInput = CreateDamKernelInputForTest(MStabModelType.UpliftVan, searchMethod, gridSizeDetermination); var kernelWrapper = new MacroStabilityInwardsKernelWrapper { FailureMechanismParametersMStab = new FailureMechanismParametersMStab { MStabParameters = { - Model = MStabModelType.UpliftVan + Model = kernelInput.DamFailureMechanismeCalculationSpecification.FailureMechanismParametersMStab.MStabParameters.Model, + SearchMethod = kernelInput.DamFailureMechanismeCalculationSpecification.FailureMechanismParametersMStab.MStabParameters.SearchMethod } } }; - - // Prepare the wrapper. Result is input for the calculation dll - DamKernelInput kernelInput = CreateDamKernelInputForTest(); - // To ensure uplift occurs, set criterion to 1.4 - kernelInput.Location.ModelFactors.UpliftCriterionStability = 1.4; - kernelInput.CurrentEmbankmentSoil = kernelInput.Location.GetDikeEmbankmentSoil(); + PrepareResult prepareResult = kernelWrapper.Prepare(kernelInput, 0, out IKernelDataInput kernelDataInput, out IKernelDataOutput kernelDataOutput); Assert.That(prepareResult, Is.EqualTo(PrepareResult.Successful)); @@ -530,12 +534,20 @@ var macroStabilityOutput = (MacroStabilityOutput) kernelDataOutput; Assert.Multiple(() => { - Assert.That(messages, Has.Count.EqualTo(2)); + Assert.That(messages, Has.Count.EqualTo(expectedLogMessageCount)); Assert.That(macroStabilityOutput.CalculationResult, Is.EqualTo(CalculationResult.Succeeded)); Assert.That(macroStabilityOutput.StabilityOutputItems, Has.Count.EqualTo(1)); }); - Assert.That(macroStabilityOutput.StabilityOutputItems[0].SafetyFactor, Is.EqualTo(1.5076).Within(tolerance4Decimals)); // ToDo replace by actual value when calculation is done and output is parsed + Assert.That(macroStabilityOutput.StabilityOutputItems[0].SafetyFactor, Is.EqualTo(expectedSafetyFactor).Within(tolerance4Decimals)); + if (searchMethod == MStabSearchMethod.Grid && gridSizeDetermination == GridSizeDetermination.Specified) + { + CheckDesignResultsForUpliftVanSpecifiedGrid(kernelInput, kernelWrapper, macroStabilityOutput); + } + } + + private static void CheckDesignResultsForUpliftVanSpecifiedGrid(DamKernelInput kernelInput, MacroStabilityInwardsKernelWrapper kernelWrapper, MacroStabilityOutput macroStabilityOutput) + { // Fill the design results var designScenario = new DesignScenario { @@ -551,109 +563,58 @@ Assert.That(result.BaseFileName, Is.EqualTo("Loc(TestLocation)_Sce(1)_Pro(DefaultNameSoilProfile1D)")); Assert.That(result.CalculationSubDir, Is.EqualTo("..\\Test\\Stability\\UpliftVan")); Assert.That(result.CalculationResult, Is.EqualTo(CalculationResult.Succeeded)); - Assert.That(result.StabilityDesignResults.SafetyFactor, Is.EqualTo(1.5076).Within(tolerance4Decimals)); - Assert.That(result.StabilityDesignResults.ActiveCenterPoint.X, Is.EqualTo(50.75).Within(tolerance4Decimals)); - Assert.That(result.StabilityDesignResults.ActiveCenterPoint.Z, Is.EqualTo(12.25).Within(tolerance4Decimals)); - Assert.That(result.StabilityDesignResults.ActiveCenterPointRadius, Is.EqualTo(21).Within(tolerance4Decimals)); - Assert.That(result.StabilityDesignResults.PassiveCenterPoint.X, Is.EqualTo(50.75)); + Assert.That(result.StabilityDesignResults.SafetyFactor, Is.EqualTo(1.2812).Within(tolerance4Decimals)); + Assert.That(result.StabilityDesignResults.ActiveCenterPoint.X, Is.EqualTo(52.75).Within(tolerance4Decimals)); + Assert.That(result.StabilityDesignResults.ActiveCenterPoint.Z, Is.EqualTo(16.75).Within(tolerance4Decimals)); + Assert.That(result.StabilityDesignResults.ActiveCenterPointRadius, Is.EqualTo(17).Within(tolerance4Decimals)); + Assert.That(result.StabilityDesignResults.PassiveCenterPoint.X, Is.EqualTo(58.5)); Assert.That(result.StabilityDesignResults.PassiveCenterPoint.Z, Is.EqualTo(1.95)); - Assert.That(result.StabilityDesignResults.PassiveCenterPointRadius, Is.EqualTo(10.7)); - Assert.That(result.StabilityDesignResults.ResultSlices, Has.Count.EqualTo(36)); + Assert.That(result.StabilityDesignResults.PassiveCenterPointRadius, Is.EqualTo(2.2)); + Assert.That(result.StabilityDesignResults.ResultSlices, Has.Count.EqualTo(22)); }); Assert.Multiple(() => { Assert.That(result.StabilityDesignResults.ResultSlices[0].ShearStrengthModel, Is.EqualTo(ShearStrengthModel.CPhi)); - Assert.That(result.StabilityDesignResults.ResultSlices[0].EffectiveStress, Is.EqualTo(17.1930).Within(tolerance4Decimals)); + Assert.That(result.StabilityDesignResults.ResultSlices[0].EffectiveStress, Is.EqualTo(0.3364).Within(tolerance4Decimals)); Assert.That(result.StabilityDesignResults.ResultSlices[0].FrictionAngleInput, Is.EqualTo(31).Within(tolerance4Decimals)); Assert.That(result.StabilityDesignResults.ResultSlices[0].OCR, Is.EqualTo(double.NaN).Within(tolerance4Decimals)); - Assert.That(result.StabilityDesignResults.ResultSlices[0].NormalStress, Is.EqualTo(9.8692).Within(tolerance4Decimals)); - Assert.That(result.StabilityDesignResults.ResultSlices[0].TopLeftPoint.X, Is.EqualTo(31.2948).Within(tolerance4Decimals)); - Assert.That(result.StabilityDesignResults.ResultSlices[0].TopLeftPoint.Z, Is.EqualTo(4.3446).Within(tolerance4Decimals)); - Assert.That(result.StabilityDesignResults.ResultSlices[0].Width, Is.EqualTo(0.7994).Within(tolerance4Decimals)); - Assert.That(result.StabilityDesignResults.ResultSlices[0].Weight, Is.EqualTo(13.7446).Within(tolerance4Decimals)); + Assert.That(result.StabilityDesignResults.ResultSlices[0].NormalStress, Is.EqualTo(0.2370).Within(tolerance4Decimals)); + Assert.That(result.StabilityDesignResults.ResultSlices[0].TopLeftPoint.X, Is.EqualTo(40.4643).Within(tolerance4Decimals)); + Assert.That(result.StabilityDesignResults.ResultSlices[0].TopLeftPoint.Z, Is.EqualTo(5.000).Within(tolerance4Decimals)); + Assert.That(result.StabilityDesignResults.ResultSlices[0].Width, Is.EqualTo(0.0357).Within(tolerance4Decimals)); + Assert.That(result.StabilityDesignResults.ResultSlices[0].Weight, Is.EqualTo(0.0120).Within(tolerance4Decimals)); }); - var index = 21; + var index = 11; Assert.Multiple(() => { Assert.That(result.StabilityDesignResults.ResultSlices[index].ShearStrengthModel, Is.EqualTo(ShearStrengthModel.CPhi)); - Assert.That(result.StabilityDesignResults.ResultSlices[index].EffectiveStress, Is.EqualTo(91.9128).Within(tolerance4Decimals)); - Assert.That(result.StabilityDesignResults.ResultSlices[index].FrictionAngleInput, Is.EqualTo(10).Within(tolerance4Decimals)); + Assert.That(result.StabilityDesignResults.ResultSlices[index].EffectiveStress, Is.EqualTo(3.4795).Within(tolerance4Decimals)); + Assert.That(result.StabilityDesignResults.ResultSlices[index].FrictionAngleInput, Is.EqualTo(31).Within(tolerance4Decimals)); Assert.That(result.StabilityDesignResults.ResultSlices[index].OCR, Is.EqualTo(double.NaN).Within(tolerance4Decimals)); - Assert.That(result.StabilityDesignResults.ResultSlices[index].NormalStress, Is.EqualTo(90.8542).Within(tolerance4Decimals)); - Assert.That(result.StabilityDesignResults.ResultSlices[index].TopLeftPoint.X, Is.EqualTo(48.6818).Within(tolerance4Decimals)); - Assert.That(result.StabilityDesignResults.ResultSlices[index].TopLeftPoint.Z, Is.EqualTo(0.9091).Within(tolerance4Decimals)); - Assert.That(result.StabilityDesignResults.ResultSlices[index].Width, Is.EqualTo(0.9091).Within(tolerance4Decimals)); - Assert.That(result.StabilityDesignResults.ResultSlices[index].Weight, Is.EqualTo(160.9932).Within(tolerance4Decimals)); + Assert.That(result.StabilityDesignResults.ResultSlices[index].NormalStress, Is.EqualTo(3.2772).Within(tolerance4Decimals)); + Assert.That(result.StabilityDesignResults.ResultSlices[index].TopLeftPoint.X, Is.EqualTo(49.8453).Within(tolerance4Decimals)); + Assert.That(result.StabilityDesignResults.ResultSlices[index].TopLeftPoint.Z, Is.EqualTo(0.3274).Within(tolerance4Decimals)); + Assert.That(result.StabilityDesignResults.ResultSlices[index].Width, Is.EqualTo(0.6547).Within(tolerance4Decimals)); + Assert.That(result.StabilityDesignResults.ResultSlices[index].Weight, Is.EqualTo(2.6007).Within(tolerance4Decimals)); }); index = result.StabilityDesignResults.ResultSlices.Count - 1; Assert.Multiple(() => { Assert.That(result.StabilityDesignResults.ResultSlices[index].ShearStrengthModel, Is.EqualTo(ShearStrengthModel.CPhi)); - Assert.That(result.StabilityDesignResults.ResultSlices[index].EffectiveStress, Is.EqualTo(5.1450).Within(tolerance4Decimals)); + Assert.That(result.StabilityDesignResults.ResultSlices[index].EffectiveStress, Is.EqualTo(1.2862).Within(tolerance4Decimals)); Assert.That(result.StabilityDesignResults.ResultSlices[index].FrictionAngleInput, Is.EqualTo(31).Within(tolerance4Decimals)); Assert.That(result.StabilityDesignResults.ResultSlices[index].OCR, Is.EqualTo(double.NaN).Within(tolerance4Decimals)); - Assert.That(result.StabilityDesignResults.ResultSlices[index].NormalStress, Is.EqualTo(6.8085).Within(tolerance4Decimals)); - Assert.That(result.StabilityDesignResults.ResultSlices[index].TopLeftPoint.X, Is.EqualTo(60.2362).Within(tolerance4Decimals)); - Assert.That(result.StabilityDesignResults.ResultSlices[index].TopLeftPoint.Z, Is.EqualTo(-2.0000).Within(tolerance4Decimals)); - Assert.That(result.StabilityDesignResults.ResultSlices[index].Width, Is.EqualTo(0.4580).Within(tolerance4Decimals)); - Assert.That(result.StabilityDesignResults.ResultSlices[index].Weight, Is.EqualTo(4.6034).Within(tolerance4Decimals)); + Assert.That(result.StabilityDesignResults.ResultSlices[index].NormalStress, Is.EqualTo(1.3009).Within(tolerance4Decimals)); + Assert.That(result.StabilityDesignResults.ResultSlices[index].TopLeftPoint.X, Is.EqualTo(58.5000).Within(tolerance4Decimals)); + Assert.That(result.StabilityDesignResults.ResultSlices[index].TopLeftPoint.Z, Is.EqualTo(0.0000).Within(tolerance4Decimals)); + Assert.That(result.StabilityDesignResults.ResultSlices[index].Width, Is.EqualTo(0.1233).Within(tolerance4Decimals)); + Assert.That(result.StabilityDesignResults.ResultSlices[index].Weight, Is.EqualTo(0.3097).Within(tolerance4Decimals)); }); } } - + [Test] - public void TestFullCalculationSucceedsWithBeeSwarmAsSearchMethod() - { - var kernelWrapper = new MacroStabilityInwardsKernelWrapper - { - FailureMechanismParametersMStab = new FailureMechanismParametersMStab - { - MStabParameters = - { - Model = MStabModelType.UpliftVan, - SearchMethod = MStabSearchMethod.BeeSwarm - } - } - }; - - // Prepare the wrapper. Result is input for the calculation dll - DamKernelInput kernelInput = CreateDamKernelInputForTest(); - kernelInput.DamFailureMechanismeCalculationSpecification.FailureMechanismParametersMStab.MStabParameters - .SearchMethod = MStabSearchMethod.BeeSwarm; - // To ensure uplift occurs, set criterion to 1.4 - kernelInput.Location.ModelFactors.UpliftCriterionStability = 1.4; - kernelInput.CurrentEmbankmentSoil = kernelInput.Location.GetDikeEmbankmentSoil(); - PrepareResult prepareResult = - kernelWrapper.Prepare(kernelInput, 0, out IKernelDataInput kernelDataInput, out IKernelDataOutput kernelDataOutput); - Assert.That(prepareResult, Is.EqualTo(PrepareResult.Successful)); - - // Validate the input - int errorCount = kernelWrapper.Validate(kernelDataInput, kernelDataOutput, out List messages); - Assert.That(errorCount, Is.EqualTo(0)); - - // Run the dll - kernelWrapper.Execute(kernelDataInput, kernelDataOutput, out messages); - var macroStabilityOutput = (MacroStabilityOutput) kernelDataOutput; - Assert.Multiple(() => - { - Assert.That(messages, Has.Count.EqualTo(3)); - Assert.That(macroStabilityOutput.CalculationResult, Is.EqualTo(CalculationResult.Succeeded)); - Assert.That(macroStabilityOutput.StabilityOutputItems, Has.Count.EqualTo(1)); - }); - // SafetyFactor as obtained when running the skx file with this input in the stability kernel directly = 1.9882432331086863 - Assert.That(macroStabilityOutput.StabilityOutputItems[0].SafetyFactor, Is.EqualTo(1.4798).Within(tolerance4Decimals)); - - // Fill the design results - var designScenario = new DesignScenario - { - LocationName = kernelInput.Location.Name - }; - kernelWrapper.PostProcess(kernelInput, macroStabilityOutput, designScenario, "", out List results); - Assert.That(results.Count, Is.GreaterThan(0)); - } - - [Test] public void CalculationUpliftBasedOnDamEngineXmlWorks() { const string calcDir = "TestStabInwardsBishop"; @@ -708,7 +669,7 @@ Assert.That(() => kernelWrapper.PostProcess(null, null, null, "", out _), Throws.InstanceOf().With.Message.EqualTo("Geen Dam invoer object gedefinieerd voor Macrostabiliteit")); } - private static DamKernelInput CreateDamKernelInputForTest() + private static DamKernelInput CreateDamKernelInputForTest(MStabModelType modelType, MStabSearchMethod searchMethod, GridSizeDetermination gridSizeDetermination) { Location location = DamEngineDataTestFactory.CreateLocation(FactoryForSurfaceLines.CreateSurfaceLineTutorial1()); // Correction needed in order to make surface line as lengthy as needed to perform a proper calculation. @@ -717,6 +678,8 @@ // now this not allowed by the kernel validator!) So that needs to be fixed in the kernel). location.SurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DitchPolderSide).X = 62.5; location.SurfaceLine.Geometry.SyncCalcPoints(); + // To ensure uplift occurs, set criterion to 1.4 + location.ModelFactors.UpliftCriterionStability = 1.4; SoilProfile1D soilProfile = DamEngineDataTestFactory.CreateSoilProfile1D(location.SoilList); SetWaterPressureInterpolationModel(soilProfile.Layers); @@ -753,9 +716,13 @@ sd.UpliftVanRightGridVerticalPointDistance = 1; sd.UpliftVanTangentLinesDefinition = TangentLinesDefinition.OnBoundaryLines; sd.UpliftVanTangentLinesDistance = 1; - sd.GridSizeDetermination = GridSizeDetermination.Specified; - damKernelInput.DamFailureMechanismeCalculationSpecification.FailureMechanismParametersMStab.MStabParameters.Model = - MStabModelType.UpliftVan; + sd.GridSizeDetermination = gridSizeDetermination; + + damKernelInput.DamFailureMechanismeCalculationSpecification.FailureMechanismParametersMStab.MStabParameters.Model = modelType; + damKernelInput.DamFailureMechanismeCalculationSpecification.FailureMechanismParametersMStab.MStabParameters.SearchMethod = searchMethod; + + damKernelInput.CurrentEmbankmentSoil = damKernelInput.Location.GetDikeEmbankmentSoil(); + return damKernelInput; } Index: DamEngine/trunk/src/Deltares.DamEngine.Calculators/KernelWrappers/MacroStabilityInwards/MacroStabilityInwardsKernelWrapper.cs =================================================================== diff -u -r5504 -r5627 --- DamEngine/trunk/src/Deltares.DamEngine.Calculators/KernelWrappers/MacroStabilityInwards/MacroStabilityInwardsKernelWrapper.cs (.../MacroStabilityInwardsKernelWrapper.cs) (revision 5504) +++ DamEngine/trunk/src/Deltares.DamEngine.Calculators/KernelWrappers/MacroStabilityInwards/MacroStabilityInwardsKernelWrapper.cs (.../MacroStabilityInwardsKernelWrapper.cs) (revision 5627) @@ -134,7 +134,7 @@ return PrepareResult.NotRelevant; } - fillMacroStabilityWrapperFromEngine.UpliftVanCalculationGrid = FillUpliftVanCalculationGrid(damKernelInput); + fillMacroStabilityWrapperFromEngine.UpliftVanCalculationGrid = FillUpliftVanCalculationGrid(damKernelInput, upliftSituation.XCoordinateLowestUpliftFactorPoint); } FailureMechanismParametersMStab.MStabParameters.Model = model; @@ -470,10 +470,11 @@ } } - private UpliftVanCalculationGrid FillUpliftVanCalculationGrid(DamKernelInput damKernelInput) + private static UpliftVanCalculationGrid FillUpliftVanCalculationGrid(DamKernelInput damKernelInput, double xCoordinateLastUpliftPoint) { SlipCircleDefinition slipCircleDefinition = damKernelInput.DamFailureMechanismeCalculationSpecification .FailureMechanismParametersMStab.MStabParameters.SlipCircleDefinition; + slipCircleDefinition.XCoordinateLowestUpliftFactorPoint = xCoordinateLastUpliftPoint; UpliftVanCalculationGrid upliftVanCalculationGrid = UpliftVanGridCreator.DetermineGridsFromSettings( slipCircleDefinition, damKernelInput.Location.SurfaceLine); double centerOfLeftGridXCoordinate = Index: DamEngine/trunk/src/Deltares.DamEngine.Calculators/Uplift/UpliftLocationDeterminator.cs =================================================================== diff -u -r4540 -r5627 --- DamEngine/trunk/src/Deltares.DamEngine.Calculators/Uplift/UpliftLocationDeterminator.cs (.../UpliftLocationDeterminator.cs) (revision 4540) +++ DamEngine/trunk/src/Deltares.DamEngine.Calculators/Uplift/UpliftLocationDeterminator.cs (.../UpliftLocationDeterminator.cs) (revision 5627) @@ -179,10 +179,10 @@ } /// - /// Determine location with lowest upliftfactor + /// Determine location with the lowest uplift factor /// - /// location and upliftfactor - public UpliftLocationAndResult GetLocationAtWithLowestUpliftFactor() + /// location and uplift factor + public UpliftLocationAndResult GetLocationWithLowestUpliftFactor() { double? lowestUpliftFactor = null; @@ -195,11 +195,10 @@ where point.X >= startSurfacePoint.X orderby point.X select point; - UpliftLocationAndResult upliftLocationAndResult = null; UpliftLocationAndResult lowestUpliftLocationAndResult = null; foreach (GeometryPoint surfacePoint in relevantSurfacePointsList) { - upliftLocationAndResult = GetUpliftFactorAtPoint(surfacePoint); + UpliftLocationAndResult upliftLocationAndResult = GetUpliftFactorAtPoint(surfacePoint); if (upliftLocationAndResult != null) { if (!lowestUpliftFactor.HasValue || upliftLocationAndResult.UpliftFactor < lowestUpliftFactor) Index: DamEngine/trunk/src/Deltares.DamEngine.Calculators/KernelWrappers/MacroStabilityInwards/UpliftVanGridCreator.cs =================================================================== diff -u -r5540 -r5627 --- DamEngine/trunk/src/Deltares.DamEngine.Calculators/KernelWrappers/MacroStabilityInwards/UpliftVanGridCreator.cs (.../UpliftVanGridCreator.cs) (revision 5540) +++ DamEngine/trunk/src/Deltares.DamEngine.Calculators/KernelWrappers/MacroStabilityInwards/UpliftVanGridCreator.cs (.../UpliftVanGridCreator.cs) (revision 5627) @@ -74,10 +74,10 @@ // X-coordinates settings of the grid double gridWidth = slipCircleDefinition.UpliftVanRightGridHorizontalPointDistance * (slipCircleDefinition.UpliftVanRightGridHorizontalPointCount - 1); - // The grid starts at either last uplift point X-coordinate - gridWidth or dike toe at polder X-coordinate, whichever is largest - double gridXCoordinate = Math.Max(slipCircleDefinition.XCoordinateLastUpliftPoint - gridWidth, dikeToeAtPolder.X); + // The grid starts at either lowest uplift factor point X-coordinate - gridWidth or dike toe at polder X-coordinate, whichever is largest + double gridXCoordinate = Math.Max(slipCircleDefinition.XCoordinateLowestUpliftFactorPoint - gridWidth, dikeToeAtPolder.X); upliftVanCalculationGrid.RightGridXLeft = gridXCoordinate; - // The grid is limited to the right boundary of the surfaceline + // The grid is limited to the right boundary of the surface line double boundaryRight = surfaceLine.CharacteristicPoints.Geometry.GetGeometryBounds().Right; upliftVanCalculationGrid.RightGridXRight = Math.Min(gridXCoordinate + gridWidth, boundaryRight); upliftVanCalculationGrid.RightGridXCount = slipCircleDefinition.UpliftVanRightGridHorizontalPointCount; Index: DamEngine/trunk/src/Deltares.DamEngine.Data/General/UpliftSituation.cs =================================================================== diff -u -r4540 -r5627 --- DamEngine/trunk/src/Deltares.DamEngine.Data/General/UpliftSituation.cs (.../UpliftSituation.cs) (revision 4540) +++ DamEngine/trunk/src/Deltares.DamEngine.Data/General/UpliftSituation.cs (.../UpliftSituation.cs) (revision 5627) @@ -33,4 +33,5 @@ public double Pl4MinUplift { get; set; } public double Pl4HeadAdjusted { get; set; } public double Pl4LocationXMinUplift { get; set; } + public double XCoordinateLowestUpliftFactorPoint { get; set; } } \ No newline at end of file Index: DamEngine/trunk/src/Deltares.DamEngine.Calculators.Tests/KernelWrappers/MacroStabilityInwards/UpliftVanGridCreatorTests.cs =================================================================== diff -u -r5557 -r5627 --- DamEngine/trunk/src/Deltares.DamEngine.Calculators.Tests/KernelWrappers/MacroStabilityInwards/UpliftVanGridCreatorTests.cs (.../UpliftVanGridCreatorTests.cs) (revision 5557) +++ DamEngine/trunk/src/Deltares.DamEngine.Calculators.Tests/KernelWrappers/MacroStabilityInwards/UpliftVanGridCreatorTests.cs (.../UpliftVanGridCreatorTests.cs) (revision 5627) @@ -76,7 +76,7 @@ { // Given SlipCircleDefinition slipCircleDefinition = CreateSlipCircleDefinitionSpecified(); - slipCircleDefinition.XCoordinateLastUpliftPoint = 75.0; + slipCircleDefinition.XCoordinateLowestUpliftFactorPoint = 75.0; SurfaceLine2 surfaceLine = FactoryForSurfaceLines.CreateSurfaceLineForTestingGrid(10.0, 80.0); // When UpliftVanCalculationGrid upliftVanCalculationGrid = UpliftVanGridCreator.DetermineGridsFromSettings(slipCircleDefinition, surfaceLine); Index: DamEngine/trunk/src/Deltares.DamEngine.IntegrationTests/IntegrationTests/MacroStabilityInwardsTests.cs =================================================================== diff -u -r5600 -r5627 --- DamEngine/trunk/src/Deltares.DamEngine.IntegrationTests/IntegrationTests/MacroStabilityInwardsTests.cs (.../MacroStabilityInwardsTests.cs) (revision 5600) +++ DamEngine/trunk/src/Deltares.DamEngine.IntegrationTests/IntegrationTests/MacroStabilityInwardsTests.cs (.../MacroStabilityInwardsTests.cs) (revision 5627) @@ -401,9 +401,9 @@ // Set UseNewMinDistanceDikeToeStartDitch(Use new allowed distance toe-ditch) = true (to force value to be written to XML) // // Parameters: CalcDir - StabilityModel - DesignStrategy - CalculationResult - FoS - EntryPointX - ExitPointX - DikeLength - ShoulderHeight - Iterations - ResultMessage - [TestCase("TestStabInwardsBishopDesignSequential", "Bishop", "SlopeAdaptionBeforeShoulderAdaption", CalculationResult.Succeeded, 1.462, 45.387, 2.799, 5, "")] - [TestCase("TestStabInwardsBishopDesignOptimized", "Bishop", "OptimizedSlopeAndShoulderAdaption", CalculationResult.Succeeded, 1.483, 43.760, 3.889, 4, "")] - [TestCase("TestStabInwardsUpliftVanDesignSequential", "UpliftVan", "SlopeAdaptionBeforeShoulderAdaption", CalculationResult.Succeeded, 1.447, 47.737, 3.132, 6, "")] + [TestCase("TestStabInwardsBishopDesignSequential", "Bishop", "SlopeAdaptionBeforeShoulderAdaption", CalculationResult.Succeeded, 1.497, 45.387, 2.799, 5, "")] + [TestCase("TestStabInwardsBishopDesignOptimized", "Bishop", "OptimizedSlopeAndShoulderAdaption", CalculationResult.Succeeded, 1.482, 43.760, 3.889, 4, "")] + [TestCase("TestStabInwardsUpliftVanDesignSequential", "UpliftVan", "SlopeAdaptionBeforeShoulderAdaption", CalculationResult.Succeeded, 1.480, 47.737, 3.132, 6, "")] //ToDo MWDAM-2474 UpliftVan Optimized does not give expected result // [TestCase("TestStabInwardsUpliftVanDesignOptimized", "UpliftVan", "OptimizedSlopeAndShoulderAdaption", CalculationResult.RunFailed, 1.214, 0.0, 0.0, 4, "The new shoulder height with topslope exceeds the allowed maximum height.")] public void CanPerformStabilityInwardsDesignTutorialDesignOptimizedSlopeAndShoulderAdaption_OneLocation(