Index: DamEngine/trunk/src/Deltares.DamEngine.Calculators/KernelWrappers/MacroStabilityInwards/UpliftVanGridCreator.cs =================================================================== diff -u -r5056 -r5540 --- DamEngine/trunk/src/Deltares.DamEngine.Calculators/KernelWrappers/MacroStabilityInwards/UpliftVanGridCreator.cs (.../UpliftVanGridCreator.cs) (revision 5056) +++ DamEngine/trunk/src/Deltares.DamEngine.Calculators/KernelWrappers/MacroStabilityInwards/UpliftVanGridCreator.cs (.../UpliftVanGridCreator.cs) (revision 5540) @@ -56,13 +56,13 @@ double gridWidth = slipCircleDefinition.UpliftVanLeftGridHorizontalPointDistance * (slipCircleDefinition.UpliftVanLeftGridHorizontalPointCount - 1); double gridHeight = slipCircleDefinition.UpliftVanLeftGridVerticalPointDistance * - (slipCircleDefinition.UpliftVanRightGridVerticalPointCount - 1); + (slipCircleDefinition.UpliftVanLeftGridVerticalPointCount - 1); upliftVanCalculationGrid.LeftGridXLeft = gridXCoordinate; upliftVanCalculationGrid.LeftGridXRight = gridXCoordinate + gridWidth; - upliftVanCalculationGrid.LeftGridXCount = slipCircleDefinition.UpliftVanRightGridHorizontalPointCount; + upliftVanCalculationGrid.LeftGridXCount = slipCircleDefinition.UpliftVanLeftGridHorizontalPointCount; upliftVanCalculationGrid.LeftGridZBottom = gridYCoordinate; upliftVanCalculationGrid.LeftGridZTop = gridYCoordinate + gridHeight; - upliftVanCalculationGrid.LeftGridZCount = slipCircleDefinition.UpliftVanRightGridVerticalPointCount; + upliftVanCalculationGrid.LeftGridZCount = slipCircleDefinition.UpliftVanLeftGridVerticalPointCount; } // Define specified passive (right) grid @@ -74,7 +74,7 @@ // X-coordinates settings of the grid double gridWidth = slipCircleDefinition.UpliftVanRightGridHorizontalPointDistance * (slipCircleDefinition.UpliftVanRightGridHorizontalPointCount - 1); - // The grid starts at either last uplift point X-coordinate or dike toe at polder X-coordinate, whichever is largest + // 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); upliftVanCalculationGrid.RightGridXLeft = gridXCoordinate; // The grid is limited to the right boundary of the surfaceline Index: DamEngine/trunk/src/Deltares.DamEngine.Calculators.Tests/KernelWrappers/MacroStabilityInwards/UpliftVanGridCreatorTests.cs =================================================================== diff -u --- DamEngine/trunk/src/Deltares.DamEngine.Calculators.Tests/KernelWrappers/MacroStabilityInwards/UpliftVanGridCreatorTests.cs (revision 0) +++ DamEngine/trunk/src/Deltares.DamEngine.Calculators.Tests/KernelWrappers/MacroStabilityInwards/UpliftVanGridCreatorTests.cs (revision 5540) @@ -0,0 +1,179 @@ +// 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 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 NUnit.Framework; + +namespace Deltares.DamEngine.Calculators.Tests.KernelWrappers.MacroStabilityInwards; + +[TestFixture] +public class UpliftVanGridCreatorTests +{ + [Test] + public void GivenGridSpecified_WhenDetermineGridsFromSettings_ThenGridsAreAsExpected() + { + // Given + SlipCircleDefinition slipCircleDefinition = CreateSlipCircleDefinitionSpecified(); + SurfaceLine2 surfaceLine = CreateSurfaceLine(); + surfaceLine.AddCharacteristicPoint(new GeometryPoint(10.0, 0.0)); + surfaceLine.AddCharacteristicPoint(new GeometryPoint(80.0, 0.0)); + surfaceLine.Geometry.SyncCalcPoints(); + // 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 = 0.0 - 10.0 = -10.0 + // dike toe at polder X-coordinate = 59.96 + // The right grid is limited to right boundary (80.0) + CheckValuesRightGrid(upliftVanCalculationGrid, 59.96, 69.96); + }); + } + + [Test] + public void GivenGridSpecifiedWithRightGridOverRightBoundary_WhenDetermineGridsFromSettings_ThenRightGridLimitedToRightBoundary() + { + // Given + SlipCircleDefinition slipCircleDefinition = CreateSlipCircleDefinitionSpecified(); + SurfaceLine2 surfaceLine = CreateSurfaceLine(); + surfaceLine.AddCharacteristicPoint(new GeometryPoint(10.0, 0.0)); + surfaceLine.AddCharacteristicPoint(new GeometryPoint(65.0, 0.0)); + surfaceLine.Geometry.SyncCalcPoints(); + // 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.XCoordinateLastUpliftPoint = 75.0; + SurfaceLine2 surfaceLine = CreateSurfaceLine(); + surfaceLine.AddCharacteristicPoint(new GeometryPoint(10.0, 0.0)); + surfaceLine.AddCharacteristicPoint(new GeometryPoint(80.0, 0.0)); + surfaceLine.Geometry.SyncCalcPoints(); + // 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); + }); + } + + [Test] + public void GivenGridAutomatic_WhenDetermineGridsFromSettings_ThenIsGridsAutomatic() + { + // Given + var slipCircleDefinition = new SlipCircleDefinition + { + GridSizeDetermination = GridSizeDetermination.Automatic + }; + SurfaceLine2 surfaceLine = CreateSurfaceLine(); + // When + UpliftVanCalculationGrid upliftVanCalculationGrid = UpliftVanGridCreator.DetermineGridsFromSettings(slipCircleDefinition, surfaceLine); + // Then + Assert.That(upliftVanCalculationGrid.IsGridsAutomatic, Is.True); + } + + private static void CheckValuesLeftGrid(UpliftVanCalculationGrid upliftVanCalculationGrid) + { + const double tolerance = 0.0001; + Assert.Multiple(() => + { + Assert.That(upliftVanCalculationGrid.LeftGridXLeft, Is.EqualTo(31.52).Within(tolerance)); + Assert.That(upliftVanCalculationGrid.LeftGridXRight, Is.EqualTo(57.52).Within(tolerance)); + Assert.That(upliftVanCalculationGrid.LeftGridXCount, Is.EqualTo(14)); + Assert.That(upliftVanCalculationGrid.LeftGridZBottom, Is.EqualTo(3.775).Within(tolerance)); + Assert.That(upliftVanCalculationGrid.LeftGridZTop, Is.EqualTo(73.775).Within(tolerance)); + Assert.That(upliftVanCalculationGrid.LeftGridZCount, Is.EqualTo(36)); + }); + } + + private static void CheckValuesRightGrid(UpliftVanCalculationGrid upliftVanCalculationGrid, double expectedXLeft, double expectedXRight) + { + const double tolerance = 0.0001; + 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(6)); + Assert.That(upliftVanCalculationGrid.RightGridZBottom, Is.EqualTo(-0.09).Within(tolerance)); + Assert.That(upliftVanCalculationGrid.RightGridZTop, Is.EqualTo(3.91).Within(tolerance)); + Assert.That(upliftVanCalculationGrid.RightGridZCount, Is.EqualTo(3)); + }); + } + + private static SurfaceLine2 CreateSurfaceLine() + { + var surfaceLine = new SurfaceLine2 + { + Geometry = new GeometryPointString(), + CharacteristicPoints = + { + GeometryMustContainPoint = true + } + }; + surfaceLine.EnsurePointOfType(29.86, 3.74, CharacteristicPointType.DikeTopAtRiver); + surfaceLine.EnsurePointOfType(33.18, 3.81, CharacteristicPointType.DikeTopAtPolder); + surfaceLine.EnsurePointOfType(59.96, -0.29, CharacteristicPointType.DikeToeAtPolder); + return surfaceLine; + } + + 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; + } +} \ No newline at end of file