Index: DamEngine/trunk/src/Deltares.DamEngine.Interface.Tests/ConversionHelperTests.cs =================================================================== diff -u -r5372 -r5662 --- DamEngine/trunk/src/Deltares.DamEngine.Interface.Tests/ConversionHelperTests.cs (.../ConversionHelperTests.cs) (revision 5372) +++ DamEngine/trunk/src/Deltares.DamEngine.Interface.Tests/ConversionHelperTests.cs (.../ConversionHelperTests.cs) (revision 5662) @@ -361,16 +361,16 @@ } [Test] - [TestCase(TangentLinesDefinition.OnBoundaryLines, ConversionHelper.InputTangentLinesSpecified)] - [TestCase(TangentLinesDefinition.Specified, ConversionHelper.InputTangentLinesOnBoundaryLines)] + [TestCase(TangentLinesDefinition.OnBoundaryLines, ConversionHelper.InputTangentLinesOnBoundaryLines)] + [TestCase(TangentLinesDefinition.Specified, ConversionHelper.InputTangentLinesSpecified)] public void CanConvertToInputTangentLinesDefinition(TangentLinesDefinition tangentLineType, int inputTangentLineType) { Assert.That(ConversionHelper.ConvertToInputTangentLinesDefinition(tangentLineType), Is.EqualTo(inputTangentLineType)); } [Test] - [TestCase(ConversionHelper.InputGridTypeSpecified, TangentLinesDefinition.OnBoundaryLines)] - [TestCase(ConversionHelper.InputGridTypeAutomatic, TangentLinesDefinition.Specified)] + [TestCase(ConversionHelper.InputTangentLinesOnBoundaryLines, TangentLinesDefinition.OnBoundaryLines)] + [TestCase(ConversionHelper.InputTangentLinesSpecified, TangentLinesDefinition.Specified)] public void CanConvertToTangentLinesDefinition(int inputTangentLineType, TangentLinesDefinition tangentLineType) { Assert.That(ConversionHelper.ConvertToTangentLinesDefinition(inputTangentLineType), Is.EqualTo(tangentLineType)); Index: DamEngine/trunk/src/Deltares.DamEngine.Interface/ConversionHelper.cs =================================================================== diff -u -r5448 -r5662 --- DamEngine/trunk/src/Deltares.DamEngine.Interface/ConversionHelper.cs (.../ConversionHelper.cs) (revision 5448) +++ DamEngine/trunk/src/Deltares.DamEngine.Interface/ConversionHelper.cs (.../ConversionHelper.cs) (revision 5662) @@ -104,7 +104,7 @@ public const int InputGridTypeSpecified = 1; /// - /// The input tangent lines on boundaty lines + /// The input tangent lines on boundary lines /// public const int InputTangentLinesOnBoundaryLines = 0; Index: DamEngine/trunk/src/Deltares.DamEngine.Calculators.Tests/KernelWrappers/MacroStabilityInwards/BishopGridCreatorTests.cs =================================================================== diff -u --- DamEngine/trunk/src/Deltares.DamEngine.Calculators.Tests/KernelWrappers/MacroStabilityInwards/BishopGridCreatorTests.cs (revision 0) +++ DamEngine/trunk/src/Deltares.DamEngine.Calculators.Tests/KernelWrappers/MacroStabilityInwards/BishopGridCreatorTests.cs (revision 5662) @@ -0,0 +1,164 @@ +// Copyright (C) Stichting Deltares 2024. All rights reserved. +// +// This file is part of the Dam Engine. +// +// The Dam Engine is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . +// +// All names, logos, and references to "Deltares" are registered trademarks of +// Stichting Deltares and remain full property of Stichting Deltares at all times. +// All rights reserved. + +using System; +using Deltares.DamEngine.Calculators.KernelWrappers.MacroStabilityCommon; +using Deltares.DamEngine.Calculators.KernelWrappers.MacroStabilityInwards; +using Deltares.DamEngine.Data.General; +using Deltares.DamEngine.Data.Geometry; +using Deltares.DamEngine.Data.Geotechnics; +using Deltares.DamEngine.TestHelpers.Factories; +using NUnit.Framework; +using CharacteristicPointType = Deltares.DamEngine.Data.Geotechnics.CharacteristicPointType; + +namespace Deltares.DamEngine.Calculators.Tests.KernelWrappers.MacroStabilityInwards; + +[TestFixture] +public class BishopGridCreatorTests +{ + private const double tolerance = 0.0001; + private const double specifiedGridHeight = 10; + private const int specifiedGridZPoints = 6; + private const double specifiedGridWidth = 6; + private const int specifiedGridXPoints = 3; + private const double specifiedTangentDistance = 1.5; + private const double surfaceLevelSoilProfile1D = 0; + private const double bottomLayerSoilProfile1D = -10; + + [Test] + [TestCase(MStabGridPosition.Right, true)] + [TestCase(MStabGridPosition.Left, true)] + [TestCase(MStabGridPosition.Right, false)] + [TestCase(MStabGridPosition.Left, false)] + public void GivenSlipCircleDefinition_WhenDetermineGrid_ThenGridIsAsExpected(MStabGridPosition gridPosition, bool isGridSpecified) + { + // Given + SlipCircleDefinition slipCircleDefinition = CreateSlipCircleDefinition(isGridSpecified, true); + SurfaceLine2 surfaceLine = FactoryForSurfaceLines.CreateSurfaceLineForTestingGrid(10.0, 80.0); + // When + BishopCalculationGrid bishopCalculationGrid = BishopGridCreator.DetermineGridsFromSettings(gridPosition, slipCircleDefinition, surfaceLine); + // Then + Assert.Multiple(() => + { + Assert.That(bishopCalculationGrid.IsGridsAutomatic, Is.Not.EqualTo(isGridSpecified)); + CheckValuesGrid(bishopCalculationGrid, surfaceLine, gridPosition); + }); + } + + [Test] + [TestCase(true)] + [TestCase(false)] + public void GivenSlipCircleDefinitionAndSoilProfile1D_WhenDetermineTangentLines_ThenTangentLinesAreAsExpected(bool isTangentLinesSpecified) + { + // Given + SlipCircleDefinition slipCircleDefinition = CreateSlipCircleDefinition(true, isTangentLinesSpecified); + SoilProfile1D soilProfile1D = FactoryForSoilProfiles.CreateClaySandProfile(out _, surfaceLevelSoilProfile1D, bottomLayerSoilProfile1D); + + // When + var bishopCalculationGrid = new BishopCalculationGrid(); + BishopGridCreator.DetermineTangentLines(bishopCalculationGrid, slipCircleDefinition, soilProfile1D); + // Then + Assert.Multiple(() => + { + Assert.That(bishopCalculationGrid.IsTangentLinesAutomatic, Is.Not.EqualTo(isTangentLinesSpecified)); + CheckValuesTangentLines(bishopCalculationGrid); + }); + } + + private static void CheckValuesGrid(BishopCalculationGrid bishopCalculationGrid, SurfaceLine2 surfaceLine, MStabGridPosition gridPosition) + { + var expectedXLeft = 0.0; + var expectedXRight = 0.0; + var expectedXCount = 0; + var expectedZBottom = 0.0; + var expectedZTop = 0.0; + var expectedZCount = 0; + if (!bishopCalculationGrid.IsGridsAutomatic) + { + GeometryPoint dikeTopAtRiver = surfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DikeTopAtRiver); + GeometryPoint dikeTopAtPolder = surfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DikeTopAtPolder); + double middleX = 0.5 * (dikeTopAtRiver.X + dikeTopAtPolder.X); + switch (gridPosition) + { + case MStabGridPosition.Left: + expectedXRight = middleX; + expectedXLeft = middleX - specifiedGridWidth; + break; + case MStabGridPosition.Right: + expectedXLeft = middleX; + expectedXRight = middleX + specifiedGridWidth; + break; + } + expectedXCount = 3; + expectedZBottom = 0.5 * (dikeTopAtRiver.Z + dikeTopAtPolder.Z); + expectedZTop = expectedZBottom + specifiedGridHeight; + expectedZCount = 6; + } + + Assert.Multiple(() => + { + Assert.That(bishopCalculationGrid.GridXLeft, Is.EqualTo(expectedXLeft).Within(tolerance)); + Assert.That(bishopCalculationGrid.GridXRight, Is.EqualTo(expectedXRight).Within(tolerance)); + Assert.That(bishopCalculationGrid.GridXCount, Is.EqualTo(expectedXCount)); + Assert.That(bishopCalculationGrid.GridZBottom, Is.EqualTo(expectedZBottom).Within(tolerance)); + Assert.That(bishopCalculationGrid.GridZTop, Is.EqualTo(expectedZTop).Within(tolerance)); + Assert.That(bishopCalculationGrid.GridZCount, Is.EqualTo(expectedZCount)); + }); + } + + private static void CheckValuesTangentLines(BishopCalculationGrid bishopCalculationGrid) + { + var expectedZBottom = 0.0; + var expectedZTop = 0.0; + var expectedCount = 0; + + if (!bishopCalculationGrid.IsTangentLinesAutomatic) + { + expectedZBottom = bottomLayerSoilProfile1D - specifiedTangentDistance; + expectedCount = (int) Math.Round((surfaceLevelSoilProfile1D - expectedZBottom) / specifiedTangentDistance) + 1; + expectedZTop = expectedZBottom + (expectedCount - 1) * specifiedTangentDistance; + } + + Assert.Multiple(() => + { + Assert.That(bishopCalculationGrid.TangentLineZTop, Is.EqualTo(expectedZTop).Within(tolerance)); + Assert.That(bishopCalculationGrid.TangentLineZBottom, Is.EqualTo(expectedZBottom).Within(tolerance)); + Assert.That(bishopCalculationGrid.TangentLineCount, Is.EqualTo(expectedCount)); + Assert.That(bishopCalculationGrid.TangentLineLevels, Is.Empty); + }); + } + + private static SlipCircleDefinition CreateSlipCircleDefinition(bool isGridSpecified, bool isTangentLinesSpecified) +{ + var slipCircleDefinition = new SlipCircleDefinition + { + GridSizeDetermination = isGridSpecified ? GridSizeDetermination.Specified : GridSizeDetermination.Automatic, + BishopGridVerticalPointCount = specifiedGridZPoints, + BishopGridVerticalPointDistance = specifiedGridHeight / (specifiedGridZPoints - 1), + BishopGridHorizontalPointCount = specifiedGridXPoints, + BishopGridHorizontalPointDistance = specifiedGridWidth / (specifiedGridXPoints - 1), + BishopTangentLinesDefinition = isTangentLinesSpecified ? TangentLinesDefinition.Specified: TangentLinesDefinition.OnBoundaryLines, + BishopTangentLinesDistance = specifiedTangentDistance + }; + return slipCircleDefinition; +} + +} \ No newline at end of file Index: DamEngine/trunk/src/Deltares.DamEngine.Calculators/KernelWrappers/MacroStabilityCommon/MacroStabilityIo/FillMacroStabilityWrapperInputFromEngine.cs =================================================================== diff -u -r5598 -r5662 --- DamEngine/trunk/src/Deltares.DamEngine.Calculators/KernelWrappers/MacroStabilityCommon/MacroStabilityIo/FillMacroStabilityWrapperInputFromEngine.cs (.../FillMacroStabilityWrapperInputFromEngine.cs) (revision 5598) +++ DamEngine/trunk/src/Deltares.DamEngine.Calculators/KernelWrappers/MacroStabilityCommon/MacroStabilityIo/FillMacroStabilityWrapperInputFromEngine.cs (.../FillMacroStabilityWrapperInputFromEngine.cs) (revision 5662) @@ -102,28 +102,17 @@ lastStage.Waternet = new KernelWaternet(); TransferWaternet(waterNet, lastStage.Waternet); - double top = damKernelInput.Location.SurfaceLine.CharacteristicPoints - .GetGeometryPoint(CharacteristicPointType.DikeToeAtPolder).Z; - double bottom = damKernelInput.SubSoilScenario.SoilProfile2D.Geometry.MinGeometryPointsZ; - SlipCircleDefinition slipCircleDefinition = damKernelInput.DamFailureMechanismeCalculationSpecification - .FailureMechanismParametersMStab.MStabParameters.SlipCircleDefinition; SearchAreaConditions preprocessingSearchAreaConditions = macroStabilityInput.PreprocessingInput.SearchAreaConditions; switch (mStabParameters.Model) { case MStabModelType.Bishop: - TransferBishopCalculationGridSettings(slipCircleDefinition, top, bottom, - preprocessingSearchAreaConditions); - TransferBishopCalculationCircle(BishopCalculationGrid, - macroStabilityInput.StabilityModel.BishopCalculationCircle, - preprocessingSearchAreaConditions.AutoTangentLines); + TransferBishopSearchAreaSettings(preprocessingSearchAreaConditions); + TransferBishopCalculationGrid(macroStabilityInput.StabilityModel.BishopCalculationCircle); break; case MStabModelType.UpliftVan: - TransferUpliftVanCalculationGridSettings(slipCircleDefinition, top, bottom, - preprocessingSearchAreaConditions); - TransferUpliftVanCalculationGrid(UpliftVanCalculationGrid, - macroStabilityInput.StabilityModel.UpliftVanCalculationGrid, - preprocessingSearchAreaConditions.AutoTangentLines); + TransferUpliftVanSearchAreaSettings(preprocessingSearchAreaConditions); + TransferUpliftVanCalculationGrid(macroStabilityInput.StabilityModel.UpliftVanCalculationGrid); break; default: throw new NotImplementedException(nameof(mStabParameters.Model)); @@ -140,7 +129,7 @@ kernelStabilityInput.MoveGrid = true; // is not in DamEngine but MUST be true as we use the brute force approach. kernelStabilityInput.MaximumSliceWidth = 1.0; // is not in DamEngine datamodel // For Bishop, only Grid is possible however if Bishop/UpliftVan was selected, then the SearchAlgorithm concerns only Uplift-Van - kernelStabilityInput.SearchAlgorithm = mStabParameters.Model == MStabModelType.Bishop ? SearchAlgorithm.Grid: ConversionHelper.ConvertToMacroStabilitySearchMethod(mStabParameters.SearchMethod); + kernelStabilityInput.SearchAlgorithm = mStabParameters.Model == MStabModelType.Bishop ? SearchAlgorithm.Grid : ConversionHelper.ConvertToMacroStabilitySearchMethod(mStabParameters.SearchMethod); if (kernelStabilityInput.SearchAlgorithm == SearchAlgorithm.BeeswarmAndLevenbergMarquardt) { CreateDefaultBeeSwarmOptions(kernelStabilityInput); @@ -158,8 +147,8 @@ { return; } - slipPlaneConstraints.SlipPlaneMinDepth = location.StabilityOptions.MinimalCircleDepth?? 0.0; - if ((location.StabilityOptions.StabilityZoneType == MStabZonesType.ForbiddenZone) && + slipPlaneConstraints.SlipPlaneMinDepth = location.StabilityOptions.MinimalCircleDepth ?? 0.0; + if ((location.StabilityOptions.StabilityZoneType == MStabZonesType.ForbiddenZone) && location.StabilityOptions.ForbiddenZoneFactor.HasValue) { CharacteristicPointSet characteristicPoints = location.SurfaceLine.CharacteristicPoints; @@ -205,7 +194,7 @@ } } } - + private static void TransferTrafficLoadDegreeOfConsolidation(IList damDegreeOfConsolidations, ConstructionStage stage) { if (damDegreeOfConsolidations != null && stage.UniformLoads.Count == 1) @@ -342,7 +331,7 @@ PhreaticLine phreaticLine = damWaternet.PhreaticLine; kernelWaternet.PhreaticLine = CreateLine(phreaticLine); headLineMapping.Add(damWaternet.PhreaticLine, kernelWaternet.PhreaticLine); - + // Head Lines foreach (HeadLine damHeadLine in damWaternet.HeadLineList) { @@ -372,54 +361,29 @@ return line; } - private void TransferBishopCalculationGridSettings(SlipCircleDefinition slipCircleDefinition, double top, double bottom, SearchAreaConditions kernelSearchAreaConditions) + private void TransferBishopSearchAreaSettings(SearchAreaConditions kernelSearchAreaConditions) { - kernelSearchAreaConditions.AutoSearchArea = - slipCircleDefinition.GridSizeDetermination == GridSizeDetermination.Automatic; - kernelSearchAreaConditions.AutoTangentLines = - slipCircleDefinition.BishopTangentLinesDefinition == TangentLinesDefinition.OnBoundaryLines; - if (kernelSearchAreaConditions.AutoTangentLines) - { - kernelSearchAreaConditions.TangentLineNumber = - Convert.ToInt32(Math.Floor((top - bottom) / slipCircleDefinition.BishopTangentLinesDistance) + 1); - kernelSearchAreaConditions.TangentLineZTop = top; - kernelSearchAreaConditions.TangentLineZBottom = bottom; - } - else - { - kernelSearchAreaConditions.TangentLineNumber = BishopCalculationGrid.TangentLineCount; - kernelSearchAreaConditions.TangentLineZTop = BishopCalculationGrid.TangentLineZTop; - kernelSearchAreaConditions.TangentLineZBottom = BishopCalculationGrid.TangentLineZBottom; - } + kernelSearchAreaConditions.AutoTangentLines = BishopCalculationGrid.IsTangentLinesAutomatic; + kernelSearchAreaConditions.AutoSearchArea = BishopCalculationGrid.IsGridsAutomatic; + kernelSearchAreaConditions.TangentLineNumber = BishopCalculationGrid.TangentLineCount; + kernelSearchAreaConditions.TangentLineZTop = BishopCalculationGrid.TangentLineZTop; + kernelSearchAreaConditions.TangentLineZBottom = BishopCalculationGrid.TangentLineZBottom; } - private void TransferUpliftVanCalculationGridSettings(SlipCircleDefinition slipCircleDefinition, double top, double bottom, SearchAreaConditions kernelSearchAreaConditions) + private void TransferUpliftVanSearchAreaSettings(SearchAreaConditions kernelSearchAreaConditions) { - kernelSearchAreaConditions.AutoSearchArea = - slipCircleDefinition.GridSizeDetermination == GridSizeDetermination.Automatic; - kernelSearchAreaConditions.AutoTangentLines = - slipCircleDefinition.UpliftVanTangentLinesDefinition == TangentLinesDefinition.OnBoundaryLines; - if (kernelSearchAreaConditions.AutoTangentLines) - { - kernelSearchAreaConditions.TangentLineNumber = - Convert.ToInt32(Math.Floor((top - bottom) / slipCircleDefinition.UpliftVanTangentLinesDistance) + 1); - kernelSearchAreaConditions.TangentLineZTop = top; - kernelSearchAreaConditions.TangentLineZBottom = bottom; - } - else - { - kernelSearchAreaConditions.TangentLineNumber = UpliftVanCalculationGrid.TangentLineCount; - kernelSearchAreaConditions.TangentLineZTop = UpliftVanCalculationGrid.TangentLineZTop; - kernelSearchAreaConditions.TangentLineZBottom = UpliftVanCalculationGrid.TangentLineZBottom; - } + kernelSearchAreaConditions.AutoTangentLines = UpliftVanCalculationGrid.IsTangentLinesAutomatic; + kernelSearchAreaConditions.AutoSearchArea = UpliftVanCalculationGrid.IsGridsAutomatic; + kernelSearchAreaConditions.TangentLineNumber = UpliftVanCalculationGrid.TangentLineCount; + kernelSearchAreaConditions.TangentLineZTop = UpliftVanCalculationGrid.TangentLineZTop; + kernelSearchAreaConditions.TangentLineZBottom = UpliftVanCalculationGrid.TangentLineZBottom; } - private void TransferBishopCalculationCircle(BishopCalculationGrid damBishopCalculationGrid, - BishopCalculationCircle kernelBishopCalculationCircle, bool isAutoTangentLines) + private void TransferBishopCalculationGrid(BishopCalculationCircle kernelBishopCalculationCircle) { - if (damBishopCalculationGrid == null) + if (BishopCalculationGrid == null) { - throw new ArgumentNullException(nameof(damBishopCalculationGrid)); + throw new ArgumentNullException(nameof(BishopCalculationGrid)); } if (kernelBishopCalculationCircle == null) @@ -429,26 +393,20 @@ kernelBishopCalculationCircle.Grid = new CalculationGrid { - GridXNumber = damBishopCalculationGrid.GridXCount, - GridXLeft = damBishopCalculationGrid.GridXLeft, - GridXRight = damBishopCalculationGrid.GridXRight, - GridZNumber = damBishopCalculationGrid.GridZCount, - GridZTop = damBishopCalculationGrid.GridZTop, - GridZBottom = damBishopCalculationGrid.GridZBottom + GridXNumber = BishopCalculationGrid.GridXCount, + GridXLeft = BishopCalculationGrid.GridXLeft, + GridXRight = BishopCalculationGrid.GridXRight, + GridZNumber = BishopCalculationGrid.GridZCount, + GridZTop = BishopCalculationGrid.GridZTop, + GridZBottom = BishopCalculationGrid.GridZBottom }; - - if (!isAutoTangentLines) - { - kernelBishopCalculationCircle.TangentLines = damBishopCalculationGrid.TangentLineLevels.ToArray(); - } } - private void TransferUpliftVanCalculationGrid(UpliftVanCalculationGrid damUpliftVanCalculationGrid, - KernelUpliftVanCalculationGrid kernelUpliftVanCalculationGrid, bool isAutoTangentLines) + private void TransferUpliftVanCalculationGrid(KernelUpliftVanCalculationGrid kernelUpliftVanCalculationGrid) { - if (damUpliftVanCalculationGrid == null) + if (UpliftVanCalculationGrid == null) { - throw new ArgumentNullException(nameof(damUpliftVanCalculationGrid)); + throw new ArgumentNullException(nameof(UpliftVanCalculationGrid)); } if (kernelUpliftVanCalculationGrid == null) @@ -458,28 +416,23 @@ kernelUpliftVanCalculationGrid.LeftGrid = new CalculationGrid { - GridXNumber = damUpliftVanCalculationGrid.LeftGridXCount, - GridXLeft = damUpliftVanCalculationGrid.LeftGridXLeft, - GridXRight = damUpliftVanCalculationGrid.LeftGridXRight, - GridZNumber = damUpliftVanCalculationGrid.LeftGridZCount, - GridZTop = damUpliftVanCalculationGrid.LeftGridZTop, - GridZBottom = damUpliftVanCalculationGrid.LeftGridZBottom + GridXNumber = UpliftVanCalculationGrid.LeftGridXCount, + GridXLeft = UpliftVanCalculationGrid.LeftGridXLeft, + GridXRight = UpliftVanCalculationGrid.LeftGridXRight, + GridZNumber = UpliftVanCalculationGrid.LeftGridZCount, + GridZTop = UpliftVanCalculationGrid.LeftGridZTop, + GridZBottom = UpliftVanCalculationGrid.LeftGridZBottom }; kernelUpliftVanCalculationGrid.RightGrid = new CalculationGrid { - GridXNumber = damUpliftVanCalculationGrid.RightGridXCount, - GridXLeft = damUpliftVanCalculationGrid.RightGridXLeft, - GridXRight = damUpliftVanCalculationGrid.RightGridXRight, - GridZNumber = damUpliftVanCalculationGrid.RightGridZCount, - GridZTop = damUpliftVanCalculationGrid.RightGridZTop, - GridZBottom = damUpliftVanCalculationGrid.RightGridZBottom + GridXNumber = UpliftVanCalculationGrid.RightGridXCount, + GridXLeft = UpliftVanCalculationGrid.RightGridXLeft, + GridXRight = UpliftVanCalculationGrid.RightGridXRight, + GridZNumber = UpliftVanCalculationGrid.RightGridZCount, + GridZTop = UpliftVanCalculationGrid.RightGridZTop, + GridZBottom = UpliftVanCalculationGrid.RightGridZBottom }; - - if (!isAutoTangentLines) - { - kernelUpliftVanCalculationGrid.TangentLines = damUpliftVanCalculationGrid.TangentLineLevels.ToArray(); - } } private void TransferUniformLoads(TrafficLoad damTrafficLoad, ICollection kernelUniformLoads) Index: DamEngine/trunk/src/Deltares.DamEngine.Calculators.Tests/KernelWrappers/MacroStabilityInwards/UpliftVanGridCreatorTests.cs =================================================================== diff -u -r5627 -r5662 --- DamEngine/trunk/src/Deltares.DamEngine.Calculators.Tests/KernelWrappers/MacroStabilityInwards/UpliftVanGridCreatorTests.cs (.../UpliftVanGridCreatorTests.cs) (revision 5627) +++ DamEngine/trunk/src/Deltares.DamEngine.Calculators.Tests/KernelWrappers/MacroStabilityInwards/UpliftVanGridCreatorTests.cs (.../UpliftVanGridCreatorTests.cs) (revision 5662) @@ -19,10 +19,10 @@ // Stichting Deltares and remain full property of Stichting Deltares at all times. // All rights reserved. +using System; using Deltares.DamEngine.Calculators.KernelWrappers.MacroStabilityCommon; using Deltares.DamEngine.Calculators.KernelWrappers.MacroStabilityInwards; using Deltares.DamEngine.Data.General; -using Deltares.DamEngine.Data.Geometry; using Deltares.DamEngine.Data.Geotechnics; using Deltares.DamEngine.TestHelpers.Factories; using NUnit.Framework; @@ -32,15 +32,20 @@ [TestFixture] public class UpliftVanGridCreatorTests { - [Test] - public void GivenGridSpecified_WhenDetermineGridsFromSettings_ThenGridsAreAsExpected() - { - // Given - SlipCircleDefinition slipCircleDefinition = CreateSlipCircleDefinitionSpecified(); - SurfaceLine2 surfaceLine = FactoryForSurfaceLines.CreateSurfaceLineForTestingGrid(10.0, 80.0); - // When - UpliftVanCalculationGrid upliftVanCalculationGrid = UpliftVanGridCreator.DetermineGridsFromSettings(slipCircleDefinition, surfaceLine); - // Then + private const double tolerance = 0.0001; + private const double specifiedTangentDistance = 1.5; + private const double surfaceLevelSoilProfile1D = 0; + private const double bottomLayerSoilProfile1D = -10; + + [Test] + public void GivenGridSpecified_WhenDetermineGridsFromSettings_ThenGridsAreAsExpected() + { + // Given + SlipCircleDefinition slipCircleDefinition = CreateSlipCircleDefinitionSpecified(true, true); + SurfaceLine2 surfaceLine = FactoryForSurfaceLines.CreateSurfaceLineForTestingGrid(10.0, 80.0); + // When + UpliftVanCalculationGrid upliftVanCalculationGrid = UpliftVanGridCreator.DetermineGridsFromSettings(slipCircleDefinition, surfaceLine); + // Then Assert.Multiple(() => { Assert.That(upliftVanCalculationGrid.IsGridsAutomatic, Is.False); @@ -53,131 +58,170 @@ }); } - [Test] - public void GivenGridSpecifiedWithRightGridOverRightBoundary_WhenDetermineGridsFromSettings_ThenRightGridLimitedToRightBoundary() - { - // Given - SlipCircleDefinition slipCircleDefinition = CreateSlipCircleDefinitionSpecified(); - SurfaceLine2 surfaceLine = FactoryForSurfaceLines.CreateSurfaceLineForTestingGrid(10.0, 65.0); - // When - UpliftVanCalculationGrid upliftVanCalculationGrid = UpliftVanGridCreator.DetermineGridsFromSettings(slipCircleDefinition, surfaceLine); - // Then - Assert.Multiple(() => - { - Assert.That(upliftVanCalculationGrid.IsGridsAutomatic, Is.False); - CheckValuesLeftGrid(upliftVanCalculationGrid); - // The right grid is limited to right boundary 65.0 - CheckValuesRightGrid(upliftVanCalculationGrid, 59.96, 65.0); - }); - } + [Test] + public void GivenGridSpecifiedWithRightGridOverRightBoundary_WhenDetermineGridsFromSettings_ThenRightGridLimitedToRightBoundary() + { + // Given + SlipCircleDefinition slipCircleDefinition = CreateSlipCircleDefinitionSpecified(true, true); + SurfaceLine2 surfaceLine = FactoryForSurfaceLines.CreateSurfaceLineForTestingGrid(10.0, 65.0); + // When + UpliftVanCalculationGrid upliftVanCalculationGrid = UpliftVanGridCreator.DetermineGridsFromSettings(slipCircleDefinition, surfaceLine); + // Then + Assert.Multiple(() => + { + Assert.That(upliftVanCalculationGrid.IsGridsAutomatic, Is.False); + CheckValuesLeftGrid(upliftVanCalculationGrid); + // The right grid is limited to right boundary 65.0 + CheckValuesRightGrid(upliftVanCalculationGrid, 59.96, 65.0); + }); + } - [Test] - public void GivenGridSpecifiedWithUpliftPoint_WhenDetermineGridsFromSettings_ThenRightGridStartsAsExpected() - { - // Given - SlipCircleDefinition slipCircleDefinition = CreateSlipCircleDefinitionSpecified(); - slipCircleDefinition.XCoordinateLowestUpliftFactorPoint = 75.0; - SurfaceLine2 surfaceLine = FactoryForSurfaceLines.CreateSurfaceLineForTestingGrid(10.0, 80.0); - // When - UpliftVanCalculationGrid upliftVanCalculationGrid = UpliftVanGridCreator.DetermineGridsFromSettings(slipCircleDefinition, surfaceLine); - // Then - Assert.Multiple(() => - { - Assert.That(upliftVanCalculationGrid.IsGridsAutomatic, Is.False); - CheckValuesLeftGrid(upliftVanCalculationGrid); + [Test] + public void GivenGridSpecifiedWithUpliftPoint_WhenDetermineGridsFromSettings_ThenRightGridStartsAsExpected() + { + // Given + SlipCircleDefinition slipCircleDefinition = CreateSlipCircleDefinitionSpecified(true, true); + slipCircleDefinition.XCoordinateLowestUpliftFactorPoint = 75.0; + SurfaceLine2 surfaceLine = FactoryForSurfaceLines.CreateSurfaceLineForTestingGrid(10.0, 80.0); + // When + UpliftVanCalculationGrid upliftVanCalculationGrid = UpliftVanGridCreator.DetermineGridsFromSettings(slipCircleDefinition, surfaceLine); + // Then + Assert.Multiple(() => + { + Assert.That(upliftVanCalculationGrid.IsGridsAutomatic, Is.False); + CheckValuesLeftGrid(upliftVanCalculationGrid); - // The right grid starts at either last uplift point X-coordinate - gridWidth or dike toe at polder X-coordinate, whichever is largest - // last uplift point X-coordinate - gridWidth = 75.0 - 10.0 = 65.0 - // dike toe at polder X-coordinate = 59.96 - CheckValuesRightGrid(upliftVanCalculationGrid, 65.0, 75.0); - }); - } + // The right grid starts at either last uplift point X-coordinate - gridWidth or dike toe at polder X-coordinate, whichever is largest + // last uplift point X-coordinate - gridWidth = 75.0 - 10.0 = 65.0 + // dike toe at polder X-coordinate = 59.96 + CheckValuesRightGrid(upliftVanCalculationGrid, 65.0, 75.0); + }); + } - [Test] - public void GivenGridAutomatic_WhenDetermineGridsFromSettings_ThenIsGridsAutomatic() - { - // Given - var slipCircleDefinition = new SlipCircleDefinition - { - GridSizeDetermination = GridSizeDetermination.Automatic - }; - SurfaceLine2 surfaceLine = FactoryForSurfaceLines.CreateSurfaceLineForTestingGrid(10.0, 80.0); - // When - UpliftVanCalculationGrid upliftVanCalculationGrid = UpliftVanGridCreator.DetermineGridsFromSettings(slipCircleDefinition, surfaceLine); - // Then - Assert.That(upliftVanCalculationGrid.IsGridsAutomatic, Is.True); - CheckValuesLeftGrid(upliftVanCalculationGrid, true); - CheckValuesRightGrid(upliftVanCalculationGrid, 0.0, 0.0, true); - } + [Test] + public void GivenGridAutomatic_WhenDetermineGridsFromSettings_ThenIsGridsAutomatic() + { + // Given + SlipCircleDefinition slipCircleDefinition = CreateSlipCircleDefinitionSpecified(false, true); + SurfaceLine2 surfaceLine = FactoryForSurfaceLines.CreateSurfaceLineForTestingGrid(10.0, 80.0); + // When + UpliftVanCalculationGrid upliftVanCalculationGrid = UpliftVanGridCreator.DetermineGridsFromSettings(slipCircleDefinition, surfaceLine); + // Then + Assert.That(upliftVanCalculationGrid.IsGridsAutomatic, Is.True); + CheckValuesLeftGrid(upliftVanCalculationGrid, true); + CheckValuesRightGrid(upliftVanCalculationGrid, 0.0, 0.0, true); + } + + [Test] + [TestCase(true)] + [TestCase(false)] + public void GivenSlipCircleDefinitionAndSoilProfile1D_WhenDetermineTangentLines_ThenTangentLinesAreAsExpected(bool isTangentLinesSpecified) + { + // Given + SlipCircleDefinition slipCircleDefinition = CreateSlipCircleDefinitionSpecified(true, isTangentLinesSpecified); + SoilProfile1D soilProfile1D = FactoryForSoilProfiles.CreateClaySandProfile(out _, surfaceLevelSoilProfile1D, bottomLayerSoilProfile1D); + + // When + var upliftVanCalculationGrid = new UpliftVanCalculationGrid(); + UpliftVanGridCreator.DetermineTangentLines(upliftVanCalculationGrid, slipCircleDefinition, soilProfile1D); + // Then + Assert.Multiple(() => + { + Assert.That(upliftVanCalculationGrid.IsTangentLinesAutomatic, Is.Not.EqualTo(isTangentLinesSpecified)); + CheckValuesTangentLines(upliftVanCalculationGrid); + }); + } - private static void CheckValuesLeftGrid(UpliftVanCalculationGrid upliftVanCalculationGrid, bool isGridsAutomatic = false) - { - const double tolerance = 0.0001; - var expectedXLeft = 0.0; - var expectedXRight = 0.0; - var expectedXCount= 0; - var expectedZBottom = 0.0; - var expectedZTop = 0.0; - var expectedZCount = 0; - if (!isGridsAutomatic) - { - expectedXLeft = 31.52; - expectedXRight = 57.52; - expectedXCount= 14; - expectedZBottom = 3.775; - expectedZTop = 73.775; - expectedZCount = 36; - } - Assert.Multiple(() => - { - Assert.That(upliftVanCalculationGrid.LeftGridXLeft, Is.EqualTo(expectedXLeft).Within(tolerance)); - Assert.That(upliftVanCalculationGrid.LeftGridXRight, Is.EqualTo(expectedXRight).Within(tolerance)); - Assert.That(upliftVanCalculationGrid.LeftGridXCount, Is.EqualTo(expectedXCount)); - Assert.That(upliftVanCalculationGrid.LeftGridZBottom, Is.EqualTo(expectedZBottom).Within(tolerance)); - Assert.That(upliftVanCalculationGrid.LeftGridZTop, Is.EqualTo(expectedZTop).Within(tolerance)); - Assert.That(upliftVanCalculationGrid.LeftGridZCount, Is.EqualTo(expectedZCount)); - }); - } + private static void CheckValuesLeftGrid(UpliftVanCalculationGrid upliftVanCalculationGrid, bool isGridsAutomatic = false) + { + var expectedXLeft = 0.0; + var expectedXRight = 0.0; + var expectedXCount= 0; + var expectedZBottom = 0.0; + var expectedZTop = 0.0; + var expectedZCount = 0; + if (!isGridsAutomatic) + { + expectedXLeft = 31.52; + expectedXRight = 57.52; + expectedXCount= 14; + expectedZBottom = 3.775; + expectedZTop = 73.775; + expectedZCount = 36; + } + Assert.Multiple(() => + { + Assert.That(upliftVanCalculationGrid.LeftGridXLeft, Is.EqualTo(expectedXLeft).Within(tolerance)); + Assert.That(upliftVanCalculationGrid.LeftGridXRight, Is.EqualTo(expectedXRight).Within(tolerance)); + Assert.That(upliftVanCalculationGrid.LeftGridXCount, Is.EqualTo(expectedXCount)); + Assert.That(upliftVanCalculationGrid.LeftGridZBottom, Is.EqualTo(expectedZBottom).Within(tolerance)); + Assert.That(upliftVanCalculationGrid.LeftGridZTop, Is.EqualTo(expectedZTop).Within(tolerance)); + Assert.That(upliftVanCalculationGrid.LeftGridZCount, Is.EqualTo(expectedZCount)); + }); + } - private static void CheckValuesRightGrid(UpliftVanCalculationGrid upliftVanCalculationGrid, double expectedXLeft, double expectedXRight, bool isGridsAutomatic = false) - { - const double tolerance = 0.0001; - var expectedXCount= 0; - var expectedZBottom = 0.0; - var expectedZTop = 0.0; - var expectedZCount = 0; - if (!isGridsAutomatic) - { - expectedXCount= 6; - expectedZBottom = -0.09; - expectedZTop = 3.91; - expectedZCount = 3; - } - Assert.Multiple(() => - { - Assert.That(upliftVanCalculationGrid.RightGridXLeft, Is.EqualTo(expectedXLeft).Within(tolerance)); - Assert.That(upliftVanCalculationGrid.RightGridXRight, Is.EqualTo(expectedXRight).Within(tolerance)); - Assert.That(upliftVanCalculationGrid.RightGridXCount, Is.EqualTo(expectedXCount)); - Assert.That(upliftVanCalculationGrid.RightGridZBottom, Is.EqualTo(expectedZBottom).Within(tolerance)); - Assert.That(upliftVanCalculationGrid.RightGridZTop, Is.EqualTo(expectedZTop).Within(tolerance)); - Assert.That(upliftVanCalculationGrid.RightGridZCount, Is.EqualTo(expectedZCount)); - }); - } + private static void CheckValuesRightGrid(UpliftVanCalculationGrid upliftVanCalculationGrid, double expectedXLeft, double expectedXRight, bool isGridsAutomatic = false) + { + var expectedXCount= 0; + var expectedZBottom = 0.0; + var expectedZTop = 0.0; + var expectedZCount = 0; + if (!isGridsAutomatic) + { + expectedXCount= 6; + expectedZBottom = -0.09; + expectedZTop = 3.91; + expectedZCount = 3; + } + Assert.Multiple(() => + { + Assert.That(upliftVanCalculationGrid.RightGridXLeft, Is.EqualTo(expectedXLeft).Within(tolerance)); + Assert.That(upliftVanCalculationGrid.RightGridXRight, Is.EqualTo(expectedXRight).Within(tolerance)); + Assert.That(upliftVanCalculationGrid.RightGridXCount, Is.EqualTo(expectedXCount)); + Assert.That(upliftVanCalculationGrid.RightGridZBottom, Is.EqualTo(expectedZBottom).Within(tolerance)); + Assert.That(upliftVanCalculationGrid.RightGridZTop, Is.EqualTo(expectedZTop).Within(tolerance)); + Assert.That(upliftVanCalculationGrid.RightGridZCount, Is.EqualTo(expectedZCount)); + }); + } - private static SlipCircleDefinition CreateSlipCircleDefinitionSpecified() - { - var slipCircleDefinition = new SlipCircleDefinition - { - GridSizeDetermination = GridSizeDetermination.Specified, - UpliftVanLeftGridVerticalPointCount = 36, - UpliftVanLeftGridVerticalPointDistance = 2, - UpliftVanLeftGridHorizontalPointCount = 14, - UpliftVanLeftGridHorizontalPointDistance = 2, - UpliftVanRightGridVerticalPointCount = 3, - UpliftVanRightGridVerticalPointDistance = 2, - UpliftVanRightGridHorizontalPointCount = 6, - UpliftVanRightGridHorizontalPointDistance = 2 - }; - return slipCircleDefinition; - } + private static void CheckValuesTangentLines(UpliftVanCalculationGrid upliftVanCalculationGrid) + { + var expectedZBottom = 0.0; + var expectedZTop = 0.0; + var expectedCount = 0; + + if (!upliftVanCalculationGrid.IsTangentLinesAutomatic) + { + expectedZBottom = bottomLayerSoilProfile1D - specifiedTangentDistance; + expectedCount = (int) Math.Round((surfaceLevelSoilProfile1D - expectedZBottom) / specifiedTangentDistance) + 1; + expectedZTop = expectedZBottom + (expectedCount - 1) * specifiedTangentDistance; + } + + Assert.Multiple(() => + { + Assert.That(upliftVanCalculationGrid.TangentLineZTop, Is.EqualTo(expectedZTop).Within(tolerance)); + Assert.That(upliftVanCalculationGrid.TangentLineZBottom, Is.EqualTo(expectedZBottom).Within(tolerance)); + Assert.That(upliftVanCalculationGrid.TangentLineCount, Is.EqualTo(expectedCount)); + Assert.That(upliftVanCalculationGrid.TangentLineLevels, Is.Empty); + }); + } + + private static SlipCircleDefinition CreateSlipCircleDefinitionSpecified(bool isGridSpecified, bool isTangentLinesSpecified) + { + var slipCircleDefinition = new SlipCircleDefinition + { + GridSizeDetermination = isGridSpecified ? GridSizeDetermination.Specified : GridSizeDetermination.Automatic, + UpliftVanLeftGridVerticalPointCount = 36, + UpliftVanLeftGridVerticalPointDistance = 2, + UpliftVanLeftGridHorizontalPointCount = 14, + UpliftVanLeftGridHorizontalPointDistance = 2, + UpliftVanRightGridVerticalPointCount = 3, + UpliftVanRightGridVerticalPointDistance = 2, + UpliftVanRightGridHorizontalPointCount = 6, + UpliftVanRightGridHorizontalPointDistance = 2, + UpliftVanTangentLinesDefinition = isTangentLinesSpecified ? TangentLinesDefinition.Specified: TangentLinesDefinition.OnBoundaryLines, + UpliftVanTangentLinesDistance = specifiedTangentDistance + }; + return slipCircleDefinition; + } } \ No newline at end of file Index: DamEngine/trunk/src/Deltares.DamEngine.Calculators/KernelWrappers/MacroStabilityCommon/MacroStabilityIo/FillEngineFromMacroStabilityWrapperInput.cs =================================================================== diff -u -r5516 -r5662 --- DamEngine/trunk/src/Deltares.DamEngine.Calculators/KernelWrappers/MacroStabilityCommon/MacroStabilityIo/FillEngineFromMacroStabilityWrapperInput.cs (.../FillEngineFromMacroStabilityWrapperInput.cs) (revision 5516) +++ DamEngine/trunk/src/Deltares.DamEngine.Calculators/KernelWrappers/MacroStabilityCommon/MacroStabilityIo/FillEngineFromMacroStabilityWrapperInput.cs (.../FillEngineFromMacroStabilityWrapperInput.cs) (revision 5662) @@ -179,13 +179,13 @@ if (kernelSearchAreaConditions.AutoTangentLines) { SlipCircleDefinition.UpliftVanTangentLinesDefinition = TangentLinesDefinition.OnBoundaryLines; - SlipCircleDefinition.UpliftVanTangentLinesDistance = - (kernelSearchAreaConditions.TangentLineZTop - kernelSearchAreaConditions.TangentLineZBottom) / - kernelSearchAreaConditions.TangentLineNumber; } else { SlipCircleDefinition.UpliftVanTangentLinesDefinition = TangentLinesDefinition.Specified; + SlipCircleDefinition.UpliftVanTangentLinesDistance = + (kernelSearchAreaConditions.TangentLineZTop - kernelSearchAreaConditions.TangentLineZBottom) / + (kernelSearchAreaConditions.TangentLineNumber - 1); } } Index: DamEngine/trunk/src/Deltares.DamEngine.Calculators/KernelWrappers/MacroStabilityInwards/BishopGridCreator.cs =================================================================== diff -u -r5627 -r5662 --- DamEngine/trunk/src/Deltares.DamEngine.Calculators/KernelWrappers/MacroStabilityInwards/BishopGridCreator.cs (.../BishopGridCreator.cs) (revision 5627) +++ DamEngine/trunk/src/Deltares.DamEngine.Calculators/KernelWrappers/MacroStabilityInwards/BishopGridCreator.cs (.../BishopGridCreator.cs) (revision 5662) @@ -40,50 +40,55 @@ { var bishopCalculationGrid = new BishopCalculationGrid { - IsGridsAutomatic = false, - IsTangentLinesAutomatic = false + IsGridsAutomatic = slipCircleDefinition.GridSizeDetermination == GridSizeDetermination.Automatic, + IsTangentLinesAutomatic = slipCircleDefinition.BishopTangentLinesDefinition == TangentLinesDefinition.OnBoundaryLines, + GridXLeft = 0, + GridXRight = 0, + GridXCount = 0, + GridZBottom = 0, + GridZTop = 0, + GridZCount = 0, + TangentLineZTop = 0, + TangentLineZBottom = 0, + TangentLineCount = 0 }; - if (slipCircleDefinition.GridSizeDetermination == GridSizeDetermination.Specified) + if (slipCircleDefinition.GridSizeDetermination == GridSizeDetermination.Automatic) { - // Define specified active (left) grid - if (surfaceLine != null) - { - // Use middle of the dike for X-coordinate - GeometryPoint dikeTopAtRiverPoint = surfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DikeTopAtRiver); - GeometryPoint dikeTopAtPolderPoint = surfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DikeTopAtPolder); - double gridXCoordinate = (dikeTopAtRiverPoint.X + dikeTopAtPolderPoint.X) * 0.5; - double gridYCoordinate = surfaceLine.Geometry.GetZatX(gridXCoordinate); - double gridWidth = slipCircleDefinition.BishopGridHorizontalPointDistance * - (slipCircleDefinition.BishopGridHorizontalPointCount - 1); - double gridHeight = slipCircleDefinition.BishopGridVerticalPointDistance * - (slipCircleDefinition.BishopGridVerticalPointCount - 1); - if (gridPosition == MStabGridPosition.Right) - { - bishopCalculationGrid.GridXLeft = gridXCoordinate; - bishopCalculationGrid.GridXRight = gridXCoordinate + gridWidth; - } - else - { - bishopCalculationGrid.GridXLeft = Math.Max(surfaceLine.Geometry[0].X, gridXCoordinate - gridWidth); - bishopCalculationGrid.GridXRight = gridXCoordinate; - } + return bishopCalculationGrid; + } - bishopCalculationGrid.GridXCount = slipCircleDefinition.BishopGridHorizontalPointCount; - bishopCalculationGrid.GridZBottom = gridYCoordinate; - bishopCalculationGrid.GridZTop = gridYCoordinate + gridHeight; - bishopCalculationGrid.GridZCount = slipCircleDefinition.BishopGridVerticalPointCount; + // Define specified active (left) grid + if (surfaceLine != null) + { + // Use middle of the dike for X-coordinate + GeometryPoint dikeTopAtRiverPoint = surfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DikeTopAtRiver); + GeometryPoint dikeTopAtPolderPoint = surfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DikeTopAtPolder); + double gridXCoordinate = (dikeTopAtRiverPoint.X + dikeTopAtPolderPoint.X) * 0.5; + double gridYCoordinate = surfaceLine.Geometry.GetZatX(gridXCoordinate); + double gridWidth = slipCircleDefinition.BishopGridHorizontalPointDistance * + (slipCircleDefinition.BishopGridHorizontalPointCount - 1); + double gridHeight = slipCircleDefinition.BishopGridVerticalPointDistance * + (slipCircleDefinition.BishopGridVerticalPointCount - 1); + if (gridPosition == MStabGridPosition.Right) + { + bishopCalculationGrid.GridXLeft = gridXCoordinate; + bishopCalculationGrid.GridXRight = gridXCoordinate + gridWidth; } + else + { + bishopCalculationGrid.GridXLeft = Math.Max(surfaceLine.Geometry[0].X, gridXCoordinate - gridWidth); + bishopCalculationGrid.GridXRight = gridXCoordinate; + } - // Tangent lines are defined in another method + bishopCalculationGrid.GridXCount = slipCircleDefinition.BishopGridHorizontalPointCount; + bishopCalculationGrid.GridZBottom = gridYCoordinate; + bishopCalculationGrid.GridZTop = gridYCoordinate + gridHeight; + bishopCalculationGrid.GridZCount = slipCircleDefinition.BishopGridVerticalPointCount; } - else - { - // code for slipCircleDefinition.GridSizeDetermination == GridSizeDetermination.Automatic - bishopCalculationGrid.GridXLeft = 0; - bishopCalculationGrid.IsGridsAutomatic = true; - } + // Tangent lines are defined in another method + return bishopCalculationGrid; } @@ -97,10 +102,11 @@ switch (slipCircleDefinition.BishopTangentLinesDefinition) { case TangentLinesDefinition.OnBoundaryLines: - // In the kernel, the tangent lines are set to the boundaries, no need to do anything here. - bishopCalculationGrid.IsTangentLinesAutomatic = false; + // In the Macrostability kernel, the automatic tangent lines are set to the boundaries, no need to do anything here. + bishopCalculationGrid.IsTangentLinesAutomatic = true; break; case TangentLinesDefinition.Specified: + bishopCalculationGrid.IsTangentLinesAutomatic = false; DetermineTangentLinesSpecified(bishopCalculationGrid, soilProfile1D, slipCircleDefinition.BishopTangentLinesDistance); break; @@ -126,15 +132,12 @@ bottomTangentLines = Math.Min(bottomTangentLines, surfaceLevel); double topTangentLines = bottomTangentLines; var tangentLinesCount = 1; - bishopCalculationGrid.TangentLineLevels.Add(topTangentLines); while (topTangentLines < surfaceLevel) { topTangentLines += distance; - bishopCalculationGrid.TangentLineLevels.Add(topTangentLines); tangentLinesCount++; } - bishopCalculationGrid.TangentLineLevels.Reverse(); bishopCalculationGrid.TangentLineCount = tangentLinesCount; bishopCalculationGrid.TangentLineZTop = topTangentLines; bishopCalculationGrid.TangentLineZBottom = bottomTangentLines; Index: DamEngine/trunk/src/Deltares.DamEngine.TestHelpers/Factories/FactoryForSoilProfiles.cs =================================================================== diff -u -r5634 -r5662 --- DamEngine/trunk/src/Deltares.DamEngine.TestHelpers/Factories/FactoryForSoilProfiles.cs (.../FactoryForSoilProfiles.cs) (revision 5634) +++ DamEngine/trunk/src/Deltares.DamEngine.TestHelpers/Factories/FactoryForSoilProfiles.cs (.../FactoryForSoilProfiles.cs) (revision 5662) @@ -95,7 +95,7 @@ /// Create two layer soil profile with pleistocene sand layer only /// /// soil profile - public static SoilProfile1D CreateClaySandProfile(out SoilList soilList, double topLevelSandLayer = -5) + public static SoilProfile1D CreateClaySandProfile(out SoilList soilList, double topLevelClayLayer = 10, double topLevelSandLayer = -5) { var soilProfile = new SoilProfile1D(); @@ -111,7 +111,7 @@ { Name = GetNewUniqueLayerId(soilProfile) }; - layer.TopLevel = 10.0; + layer.TopLevel = topLevelClayLayer; layer.Soil = soil1; layer.IsAquifer = false; soilProfile.Layers.Add(layer); Index: DamEngine/trunk/src/Deltares.DamEngine.Calculators/KernelWrappers/MacroStabilityInwards/UpliftVanGridCreator.cs =================================================================== diff -u -r5627 -r5662 --- DamEngine/trunk/src/Deltares.DamEngine.Calculators/KernelWrappers/MacroStabilityInwards/UpliftVanGridCreator.cs (.../UpliftVanGridCreator.cs) (revision 5627) +++ DamEngine/trunk/src/Deltares.DamEngine.Calculators/KernelWrappers/MacroStabilityInwards/UpliftVanGridCreator.cs (.../UpliftVanGridCreator.cs) (revision 5662) @@ -39,65 +39,77 @@ { var upliftVanCalculationGrid = new UpliftVanCalculationGrid { - IsGridsAutomatic = false, - IsTangentLinesAutomatic = false + IsGridsAutomatic = slipCircleDefinition.GridSizeDetermination == GridSizeDetermination.Automatic, + IsTangentLinesAutomatic = slipCircleDefinition.UpliftVanTangentLinesDefinition == TangentLinesDefinition.OnBoundaryLines, + RightGridXLeft = 0, + RightGridXRight = 0, + RightGridXCount = 0, + RightGridZTop = 0, + RightGridZBottom = 0, + RightGridZCount = 0, + LeftGridXLeft = 0, + LeftGridXRight = 0, + LeftGridXCount = 0, + LeftGridZBottom = 0, + LeftGridZTop = 0, + LeftGridZCount = 0, + TangentLineZTop = 0, + TangentLineZBottom = 0, + TangentLineCount = 0 }; - if (slipCircleDefinition.GridSizeDetermination == GridSizeDetermination.Specified) + if (slipCircleDefinition.GridSizeDetermination == GridSizeDetermination.Automatic) { - // Define specified active (left) grid - if (surfaceLine != null) - { - // Use middle of the dike for X-coordinate - GeometryPoint dikeTopAtRiverPoint = surfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DikeTopAtRiver); - GeometryPoint dikeTopAtPolderPoint = surfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DikeTopAtPolder); - double gridXCoordinate = (dikeTopAtRiverPoint.X + dikeTopAtPolderPoint.X) * 0.5; - double gridYCoordinate = surfaceLine.Geometry.GetZatX(gridXCoordinate); - double gridWidth = slipCircleDefinition.UpliftVanLeftGridHorizontalPointDistance * - (slipCircleDefinition.UpliftVanLeftGridHorizontalPointCount - 1); - double gridHeight = slipCircleDefinition.UpliftVanLeftGridVerticalPointDistance * - (slipCircleDefinition.UpliftVanLeftGridVerticalPointCount - 1); - upliftVanCalculationGrid.LeftGridXLeft = gridXCoordinate; - upliftVanCalculationGrid.LeftGridXRight = gridXCoordinate + gridWidth; - upliftVanCalculationGrid.LeftGridXCount = slipCircleDefinition.UpliftVanLeftGridHorizontalPointCount; - upliftVanCalculationGrid.LeftGridZBottom = gridYCoordinate; - upliftVanCalculationGrid.LeftGridZTop = gridYCoordinate + gridHeight; - upliftVanCalculationGrid.LeftGridZCount = slipCircleDefinition.UpliftVanLeftGridVerticalPointCount; - } + return upliftVanCalculationGrid; + } - // Define specified passive (right) grid - if (surfaceLine != null) - { - const double gridOffset = 0.2; - GeometryPoint dikeToeAtPolder = surfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DikeToeAtPolder); + // Define specified active (left) grid + if (surfaceLine != null) + { + // Use middle of the dike for X-coordinate + GeometryPoint dikeTopAtRiverPoint = surfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DikeTopAtRiver); + GeometryPoint dikeTopAtPolderPoint = surfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DikeTopAtPolder); + double gridXCoordinate = (dikeTopAtRiverPoint.X + dikeTopAtPolderPoint.X) * 0.5; + double gridYCoordinate = surfaceLine.Geometry.GetZatX(gridXCoordinate); + double gridWidth = slipCircleDefinition.UpliftVanLeftGridHorizontalPointDistance * + (slipCircleDefinition.UpliftVanLeftGridHorizontalPointCount - 1); + double gridHeight = slipCircleDefinition.UpliftVanLeftGridVerticalPointDistance * + (slipCircleDefinition.UpliftVanLeftGridVerticalPointCount - 1); + upliftVanCalculationGrid.LeftGridXLeft = gridXCoordinate; + upliftVanCalculationGrid.LeftGridXRight = gridXCoordinate + gridWidth; + upliftVanCalculationGrid.LeftGridXCount = slipCircleDefinition.UpliftVanLeftGridHorizontalPointCount; + upliftVanCalculationGrid.LeftGridZBottom = gridYCoordinate; + upliftVanCalculationGrid.LeftGridZTop = gridYCoordinate + gridHeight; + upliftVanCalculationGrid.LeftGridZCount = slipCircleDefinition.UpliftVanLeftGridVerticalPointCount; + } - // X-coordinates settings of the grid - double gridWidth = slipCircleDefinition.UpliftVanRightGridHorizontalPointDistance * - (slipCircleDefinition.UpliftVanRightGridHorizontalPointCount - 1); - // 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 surface line - double boundaryRight = surfaceLine.CharacteristicPoints.Geometry.GetGeometryBounds().Right; - upliftVanCalculationGrid.RightGridXRight = Math.Min(gridXCoordinate + gridWidth, boundaryRight); - upliftVanCalculationGrid.RightGridXCount = slipCircleDefinition.UpliftVanRightGridHorizontalPointCount; + // Define specified passive (right) grid + if (surfaceLine != null) + { + const double gridOffset = 0.2; + GeometryPoint dikeToeAtPolder = surfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DikeToeAtPolder); - // Z-coordinates settings of the grid - double gridHeight = slipCircleDefinition.UpliftVanRightGridVerticalPointDistance * - (slipCircleDefinition.UpliftVanRightGridVerticalPointCount - 1); - upliftVanCalculationGrid.RightGridZBottom = dikeToeAtPolder.Z + gridOffset; - upliftVanCalculationGrid.RightGridZTop = upliftVanCalculationGrid.RightGridZBottom + gridHeight; - upliftVanCalculationGrid.RightGridZCount = slipCircleDefinition.UpliftVanRightGridVerticalPointCount; - } + // X-coordinates settings of the grid + double gridWidth = slipCircleDefinition.UpliftVanRightGridHorizontalPointDistance * + (slipCircleDefinition.UpliftVanRightGridHorizontalPointCount - 1); + // 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 surface line + double boundaryRight = surfaceLine.CharacteristicPoints.Geometry.GetGeometryBounds().Right; + upliftVanCalculationGrid.RightGridXRight = Math.Min(gridXCoordinate + gridWidth, boundaryRight); + upliftVanCalculationGrid.RightGridXCount = slipCircleDefinition.UpliftVanRightGridHorizontalPointCount; - // Tangent lines are defined in another method + // Z-coordinates settings of the grid + double gridHeight = slipCircleDefinition.UpliftVanRightGridVerticalPointDistance * + (slipCircleDefinition.UpliftVanRightGridVerticalPointCount - 1); + upliftVanCalculationGrid.RightGridZBottom = dikeToeAtPolder.Z + gridOffset; + upliftVanCalculationGrid.RightGridZTop = upliftVanCalculationGrid.RightGridZBottom + gridHeight; + upliftVanCalculationGrid.RightGridZCount = slipCircleDefinition.UpliftVanRightGridVerticalPointCount; } - else - { - // code for slipCircleDefinition.GridSizeDetermination == GridSizeDetermination.Automatic - upliftVanCalculationGrid.IsGridsAutomatic = true; - } + // Tangent lines are defined in another method + return upliftVanCalculationGrid; } @@ -111,10 +123,11 @@ switch (slipCircleDefinition.UpliftVanTangentLinesDefinition) { case TangentLinesDefinition.OnBoundaryLines: - // In the kernel, the tangent lines are set to the boundaries, no need to do anything here. - upliftVanCalculationGrid.IsTangentLinesAutomatic = false; + // In the Macrostability kernel, the automatic tangent lines are set to the boundaries, no need to do anything here. + upliftVanCalculationGrid.IsTangentLinesAutomatic = true; break; case TangentLinesDefinition.Specified: + upliftVanCalculationGrid.IsTangentLinesAutomatic = false; DetermineTangentLinesSpecified(upliftVanCalculationGrid, soilProfile1D, slipCircleDefinition.UpliftVanTangentLinesDistance); break; @@ -140,15 +153,12 @@ bottomTangentLines = Math.Min(bottomTangentLines, surfaceLevel); double topTangentLines = bottomTangentLines; var tangentLinesCount = 1; - upliftVanCalculationGrid.TangentLineLevels.Add(topTangentLines); while (topTangentLines < surfaceLevel) { topTangentLines += distance; - upliftVanCalculationGrid.TangentLineLevels.Add(topTangentLines); tangentLinesCount++; } - - upliftVanCalculationGrid.TangentLineLevels.Reverse(); + upliftVanCalculationGrid.TangentLineCount = tangentLinesCount; upliftVanCalculationGrid.TangentLineZTop = topTangentLines; upliftVanCalculationGrid.TangentLineZBottom = bottomTangentLines; Index: DamEngine/trunk/src/Deltares.DamEngine.Calculators.Tests/KernelWrappers/MacroStabilityInwards/MacroStabilityInwardsKernelWrapperTests.cs =================================================================== diff -u -r5627 -r5662 --- DamEngine/trunk/src/Deltares.DamEngine.Calculators.Tests/KernelWrappers/MacroStabilityInwards/MacroStabilityInwardsKernelWrapperTests.cs (.../MacroStabilityInwardsKernelWrapperTests.cs) (revision 5627) +++ DamEngine/trunk/src/Deltares.DamEngine.Calculators.Tests/KernelWrappers/MacroStabilityInwards/MacroStabilityInwardsKernelWrapperTests.cs (.../MacroStabilityInwardsKernelWrapperTests.cs) (revision 5662) @@ -47,8 +47,8 @@ public class MacroStabilityInwardsKernelWrapperTests { private const string testFolder = @"..\..\..\Deltares.DamEngine.IntegrationTests\TestFiles"; - private readonly string inputXmlForDamEngine = Path.Combine(testFolder, "StabilityDesign1Dbased.xml"); private const double tolerance4Decimals = 0.000051; + private readonly string inputXmlForDamEngine = Path.Combine(testFolder, "StabilityDesign1Dbased.xml"); [Test] [TestCase(0.8, true, false, PrepareResult.NotRelevant)] @@ -57,7 +57,7 @@ public void TestPrepare(double upliftCriterionStability, bool isInputValid, bool expectedIsUplift, PrepareResult expectedPrepareResult) { // Setup - DamKernelInput kernelInput = CreateDamKernelInputForTest(MStabModelType.UpliftVan, MStabSearchMethod.Grid, GridSizeDetermination.Specified); + DamKernelInput kernelInput = CreateDamKernelInputForTest(MStabModelType.UpliftVan); kernelInput.Location.ModelFactors.UpliftCriterionStability = upliftCriterionStability; var kernelWrapper = new MacroStabilityInwardsKernelWrapper { @@ -74,10 +74,10 @@ { kernelInput.Location.SurfaceLine.CharacteristicPoints.Clear(); } - + // Call PrepareResult prepareResult = kernelWrapper.Prepare(kernelInput, 0, out _, out IKernelDataOutput kernelDataOutput); - + // Assert var damMacroStabilityOutput = (MacroStabilityOutput) kernelDataOutput; Assert.Multiple(() => @@ -116,16 +116,16 @@ }); // Validate the input when valid input is provided. Expected no messages. - DamKernelInput kernelInput = CreateDamKernelInputForTest(MStabModelType.UpliftVan, MStabSearchMethod.Grid, GridSizeDetermination.Specified); + DamKernelInput kernelInput = CreateDamKernelInputForTest(MStabModelType.UpliftVan); 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.Multiple(() => { Assert.That(errorCount, Is.EqualTo(0)); - Assert.That(((MacroStabilityOutput)kernelDataOutput).CalculationResult, Is.EqualTo(CalculationResult.NoRun)); + Assert.That(((MacroStabilityOutput) kernelDataOutput).CalculationResult, Is.EqualTo(CalculationResult.NoRun)); }); } @@ -135,7 +135,7 @@ [TestCase(MStabModelType.BishopUpliftVan)] public void TestPostProcess(MStabModelType modelType) { - DamKernelInput kernelInput = CreateDamKernelInputForTest(modelType, MStabSearchMethod.Grid, GridSizeDetermination.Specified); + DamKernelInput kernelInput = CreateDamKernelInputForTest(modelType); var kernelWrapper = new MacroStabilityInwardsKernelWrapper { FailureMechanismParametersMStab = new FailureMechanismParametersMStab @@ -147,7 +147,7 @@ } } }; - + var macroStabilityOutput = new MacroStabilityOutput { CalculationResult = CalculationResult.Succeeded, @@ -335,7 +335,7 @@ Assert.Multiple(() => { Assert.That(result.CalculationResult, Is.EqualTo(CalculationResult.Succeeded)); - Assert.That(((UpliftSituation)result.StabilityDesignResults.UpliftSituation).IsUplift, Is.True); + Assert.That(((UpliftSituation) result.StabilityDesignResults.UpliftSituation).IsUplift, Is.True); }); if (index == 0) { @@ -465,7 +465,7 @@ public void TestFullCalculationSucceedsWithWarningsWithBadTangentLines() { // Prepare the wrapper. Result is input for the calculation dll - DamKernelInput kernelInput = CreateDamKernelInputForTest(MStabModelType.UpliftVan, MStabSearchMethod.Grid, GridSizeDetermination.Specified); + DamKernelInput kernelInput = CreateDamKernelInputForTest(MStabModelType.UpliftVan); var kernelWrapper = new MacroStabilityInwardsKernelWrapper { FailureMechanismParametersMStab = new FailureMechanismParametersMStab @@ -502,14 +502,18 @@ } [Test] - [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) + [TestCase(MStabSearchMethod.Grid, GridSizeDetermination.Specified, TangentLinesDefinition.OnBoundaryLines, 1.2812, 4)] + [TestCase(MStabSearchMethod.Grid, GridSizeDetermination.Automatic, TangentLinesDefinition.OnBoundaryLines, 1.4752, 3)] + [TestCase(MStabSearchMethod.BeeSwarm, GridSizeDetermination.Specified, TangentLinesDefinition.OnBoundaryLines, 2.2763, 3)] + [TestCase(MStabSearchMethod.BeeSwarm, GridSizeDetermination.Automatic, TangentLinesDefinition.OnBoundaryLines, 1.1205, 926)] + [TestCase(MStabSearchMethod.Grid, GridSizeDetermination.Specified, TangentLinesDefinition.Specified, 0.4909, 24)] + [TestCase(MStabSearchMethod.Grid, GridSizeDetermination.Automatic, TangentLinesDefinition.Specified, 1.1475, 3)] + [TestCase(MStabSearchMethod.BeeSwarm, GridSizeDetermination.Specified, TangentLinesDefinition.Specified, 1.7680, 4)] + [TestCase(MStabSearchMethod.BeeSwarm, GridSizeDetermination.Automatic, TangentLinesDefinition.Specified, 1.1146, 827)] + public void TestFullCalculationSucceedsWithUpliftVan(MStabSearchMethod searchMethod, GridSizeDetermination gridSizeDetermination, TangentLinesDefinition tangentLinesDefinition, double expectedSafetyFactor, int expectedLogMessageCount) { // Prepare the wrapper. Result is input for the calculation dll - DamKernelInput kernelInput = CreateDamKernelInputForTest(MStabModelType.UpliftVan, searchMethod, gridSizeDetermination); + DamKernelInput kernelInput = CreateDamKernelInputForTest(MStabModelType.UpliftVan, searchMethod, gridSizeDetermination, tangentLinesDefinition); var kernelWrapper = new MacroStabilityInwardsKernelWrapper { FailureMechanismParametersMStab = new FailureMechanismParametersMStab @@ -521,7 +525,7 @@ } } }; - + PrepareResult prepareResult = kernelWrapper.Prepare(kernelInput, 0, out IKernelDataInput kernelDataInput, out IKernelDataOutput kernelDataOutput); Assert.That(prepareResult, Is.EqualTo(PrepareResult.Successful)); @@ -540,12 +544,69 @@ }); Assert.That(macroStabilityOutput.StabilityOutputItems[0].SafetyFactor, Is.EqualTo(expectedSafetyFactor).Within(tolerance4Decimals)); - if (searchMethod == MStabSearchMethod.Grid && gridSizeDetermination == GridSizeDetermination.Specified) + if (searchMethod == MStabSearchMethod.Grid && + gridSizeDetermination == GridSizeDetermination.Specified && + tangentLinesDefinition == TangentLinesDefinition.OnBoundaryLines) { CheckDesignResultsForUpliftVanSpecifiedGrid(kernelInput, kernelWrapper, macroStabilityOutput); } } + [Test] + public void CalculationUpliftBasedOnDamEngineXmlWorks() + { + const string calcDir = "TestStabInwardsBishop"; + if (Directory.Exists(calcDir)) + { + Directory.Delete(calcDir, true); // delete previous results + } + + Directory.CreateDirectory(calcDir); + string inputString = File.ReadAllText(inputXmlForDamEngine); + inputString = XmlAdapter.ChangeValueInXml(inputString, "ProjectPath", ""); // Current directory will be used + inputString = XmlAdapter.ChangeValueInXml(inputString, "CalculationMap", calcDir); // Current directory will be used + var engineInterface = new EngineInterface(inputString); + Assert.That(engineInterface.DamProjectData, Is.Not.Null); + engineInterface.DamProjectData.DamProjectCalculationSpecification.CurrentSpecification.StabilityModelType = + MStabModelType.UpliftVan; + + Output output = GeneralHelper.RunAfterInputValidation(engineInterface); + + Assert.That(output.Results.CalculationResults[0].StabilityDesignResults.SafetyFactor, Is.EqualTo(1.6099).Within(tolerance4Decimals)); + } + + [Test] + [SetUICulture("nl-NL")] + public void TestLanguageNLThrowsExceptionWhenInputIsNull() + { + var kernelWrapper = new MacroStabilityInwardsKernelWrapper(); + Assert.That(() => kernelWrapper.Execute(null, null, out _), Throws.InstanceOf().With.Message.EqualTo("Geen invoer object gedefinieerd voor Macrostabiliteit")); + } + + [Test] + [SetUICulture("en-US")] + public void TestLanguageENThrowsExceptionWhenStabilityInputIsNull() + { + var kernelWrapper = new MacroStabilityInwardsKernelWrapper(); + Assert.That(() => kernelWrapper.Execute(null, null, out _), Throws.InstanceOf().With.Message.EqualTo("No input object defined for Macro Stability")); + } + + [Test] + [SetUICulture("nl-NL")] + public void TestThrowsExceptionWhenStabilityOutputIsNull() + { + var kernelWrapper = new MacroStabilityInwardsKernelWrapper(); + Assert.That(() => kernelWrapper.PostProcess(new DamKernelInput(), null, null, "", out _), Throws.InstanceOf().With.Message.EqualTo("Geen uitvoer object gedefinieerd voor Macrostabiliteit")); + } + + [Test] + [SetUICulture("nl-NL")] + public void TestThrowsExceptionWhenDamKernelInputIsNull() + { + var kernelWrapper = new MacroStabilityInwardsKernelWrapper(); + Assert.That(() => kernelWrapper.PostProcess(null, null, null, "", out _), Throws.InstanceOf().With.Message.EqualTo("Geen Dam invoer object gedefinieerd voor Macrostabiliteit")); + } + private static void CheckDesignResultsForUpliftVanSpecifiedGrid(DamKernelInput kernelInput, MacroStabilityInwardsKernelWrapper kernelWrapper, MacroStabilityOutput macroStabilityOutput) { // Fill the design results @@ -613,64 +674,9 @@ }); } } - - [Test] - public void CalculationUpliftBasedOnDamEngineXmlWorks() - { - const string calcDir = "TestStabInwardsBishop"; - if (Directory.Exists(calcDir)) - { - Directory.Delete(calcDir, true); // delete previous results - } - Directory.CreateDirectory(calcDir); - string inputString = File.ReadAllText(inputXmlForDamEngine); - inputString = XmlAdapter.ChangeValueInXml(inputString, "ProjectPath", ""); // Current directory will be used - inputString = XmlAdapter.ChangeValueInXml(inputString, "CalculationMap", calcDir); // Current directory will be used - var engineInterface = new EngineInterface(inputString); - Assert.That(engineInterface.DamProjectData, Is.Not.Null); - engineInterface.DamProjectData.DamProjectCalculationSpecification.CurrentSpecification.StabilityModelType = - MStabModelType.UpliftVan; - - Output output = GeneralHelper.RunAfterInputValidation(engineInterface); - - Assert.That(output.Results.CalculationResults[0].StabilityDesignResults.SafetyFactor, Is.EqualTo(1.6099).Within(tolerance4Decimals)); - } - - [Test] - [SetUICulture("nl-NL")] - public void TestLanguageNLThrowsExceptionWhenInputIsNull() + private static DamKernelInput CreateDamKernelInputForTest(MStabModelType modelType, MStabSearchMethod searchMethod = MStabSearchMethod.Grid, GridSizeDetermination gridSizeDetermination = GridSizeDetermination.Specified, TangentLinesDefinition tangentLinesDefinition = TangentLinesDefinition.OnBoundaryLines) { - var kernelWrapper = new MacroStabilityInwardsKernelWrapper(); - Assert.That(() => kernelWrapper.Execute(null, null, out _), Throws.InstanceOf().With.Message.EqualTo("Geen invoer object gedefinieerd voor Macrostabiliteit")); - } - - [Test] - [SetUICulture("en-US")] - public void TestLanguageENThrowsExceptionWhenStabilityInputIsNull() - { - var kernelWrapper = new MacroStabilityInwardsKernelWrapper(); - Assert.That(() => kernelWrapper.Execute(null, null, out _), Throws.InstanceOf().With.Message.EqualTo("No input object defined for Macro Stability")); - } - - [Test] - [SetUICulture("nl-NL")] - public void TestThrowsExceptionWhenStabilityOutputIsNull() - { - var kernelWrapper = new MacroStabilityInwardsKernelWrapper(); - Assert.That(() => kernelWrapper.PostProcess(new DamKernelInput(), null, null, "", out _), Throws.InstanceOf().With.Message.EqualTo("Geen uitvoer object gedefinieerd voor Macrostabiliteit")); - } - - [Test] - [SetUICulture("nl-NL")] - public void TestThrowsExceptionWhenDamKernelInputIsNull() - { - var kernelWrapper = new MacroStabilityInwardsKernelWrapper(); - Assert.That(() => kernelWrapper.PostProcess(null, null, null, "", out _), Throws.InstanceOf().With.Message.EqualTo("Geen Dam invoer object gedefinieerd voor Macrostabiliteit")); - } - - 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. location.SurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.SurfaceLevelInside).X = 100; @@ -714,15 +720,15 @@ sd.UpliftVanRightGridVerticalPointCount = 3; sd.UpliftVanRightGridHorizontalPointDistance = 1; sd.UpliftVanRightGridVerticalPointDistance = 1; - sd.UpliftVanTangentLinesDefinition = TangentLinesDefinition.OnBoundaryLines; + sd.UpliftVanTangentLinesDefinition = tangentLinesDefinition; sd.UpliftVanTangentLinesDistance = 1; sd.GridSizeDetermination = gridSizeDetermination; - + damKernelInput.DamFailureMechanismeCalculationSpecification.FailureMechanismParametersMStab.MStabParameters.Model = modelType; damKernelInput.DamFailureMechanismeCalculationSpecification.FailureMechanismParametersMStab.MStabParameters.SearchMethod = searchMethod; - - damKernelInput.CurrentEmbankmentSoil = damKernelInput.Location.GetDikeEmbankmentSoil(); - + + damKernelInput.CurrentEmbankmentSoil = damKernelInput.Location.GetDikeEmbankmentSoil(); + return damKernelInput; }