Index: DamEngine/trunk/src/Deltares.DamEngine.TestHelpers/Factories/FactoryForSoilProfiles.cs =================================================================== diff -u -r5251 -r5275 --- DamEngine/trunk/src/Deltares.DamEngine.TestHelpers/Factories/FactoryForSoilProfiles.cs (.../FactoryForSoilProfiles.cs) (revision 5251) +++ DamEngine/trunk/src/Deltares.DamEngine.TestHelpers/Factories/FactoryForSoilProfiles.cs (.../FactoryForSoilProfiles.cs) (revision 5275) @@ -1303,7 +1303,7 @@ ], soil); } - public static SoilLayer2D CreateHexagonSoilLayer2D(Point2D point1, Point2D point2, Point2D point3, Point2D point4, Point2D point5, Point2D point6, Soil soil, bool isAquifer = false) + public static SoilLayer2D CreateHexagonSoilLayer2D(Point2D point1, Point2D point2, Point2D point3, Point2D point4, Point2D point5, Point2D point6, Soil soil = null, bool isAquifer = false) { return CreatePolygoneSoilLayer2D([ ..new[] Index: DamEngine/trunk/src/Deltares.DamEngine.Calculators.Tests/KernelWrappers/MacroStabilityCommon/PlLinesToWaternetConverterTests.cs =================================================================== diff -u -r5268 -r5275 --- DamEngine/trunk/src/Deltares.DamEngine.Calculators.Tests/KernelWrappers/MacroStabilityCommon/PlLinesToWaternetConverterTests.cs (.../PlLinesToWaternetConverterTests.cs) (revision 5268) +++ DamEngine/trunk/src/Deltares.DamEngine.Calculators.Tests/KernelWrappers/MacroStabilityCommon/PlLinesToWaternetConverterTests.cs (.../PlLinesToWaternetConverterTests.cs) (revision 5275) @@ -1407,9 +1407,11 @@ /// |-----------------------------------------------------------| Level -20 m /// [Test] + [TestCase(2, 0)] [TestCase(-5, -8)] [TestCase(-10, -12)] [TestCase(-13, -15)] + [TestCase(-17, -15)] public void Given2DProfileWithInclinedLayerSeparations_WhenCreatingTheWaternetLineForPL1ForDAMStandardOption_ThenExpectedWaternetLineReturned(double pL1Level, double expectedWaternetLineLevel) { // Setup @@ -1463,6 +1465,9 @@ soilProfile.Surfaces.Add(soilLayer9); soilProfile.Surfaces.Add(soilLayerBottom); soilProfile.Geometry.Surfaces.Add(new GeometrySurface()); + soilProfile.Geometry.SurfaceLine.Points.Add(new GeometryPoint(leftCoordinate, 0)); + soilProfile.Geometry.SurfaceLine.Points.Add(new GeometryPoint(rightCoordinate, 0)); + soilProfile.Geometry.SurfaceLine.SyncCalcPoints(); PlLines plLines = CreateAllPlLines(pL1Level); @@ -1480,6 +1485,118 @@ }); } + /// + /// PL 1 + /// ==========================================\\ + /// B /------------------\ C \\ Level 0 m + /// | / Dike \ \\ E J + /// |--------------/----------------------\------\\----\ /-------| Level -5 m + /// | A Layer 1 D \\====\==========/========| + /// | \ / | + /// |-----------------------------------------------------\ F I /----------| Level -10 m + /// | Layer 2 G \----/ H | Level -12.5 m + /// |-----------------------------------------------------------------------| Level -15 m + /// | Bottom aquifer layer | + /// |-----------------------------------------------------------------------| Level -20 m + /// + [Test] + public void Given2DProfileWithPl1AboveTheDikeAndCuttingTheDitch_WhenCreatingTheWaternetLineForPL1ForDAMStandardOption_ThenExpectedWaternetLineReturned() + { + // Setup + const double xLeft = -100; + const double xPointA = -70; + const double xPointB = -60; + const double xPointC = -50; + const double xPointD = -40; + const double xPointE = -10; + const double xPointF = -0; + const double xPointG = 5; + const double xPointH = 15; + const double xPointI = 20; + const double xPointJ = 30; + const double xPl1A = -30; + const double xPl1B = -20; + const double xRight = 40; + + + SoilLayer2D soilDike = FactoryForSoilProfiles.CreateQuadrilateralSoilLayer2D(new Point2D(xPointA, -5), new Point2D(xPointB, 0), new Point2D(xPointC, 0), new Point2D(xPointD, -5)); + SoilLayer2D soilLayer1A = FactoryForSoilProfiles.CreateHexagonSoilLayer2D(new Point2D(xLeft, -5), new Point2D(xPointA, -5), new Point2D(xPointD, -5), new Point2D(xPointE, -5), new Point2D(xPointF, -10), new Point2D(xLeft, -10)); + SoilLayer2D soilLayer1B = FactoryForSoilProfiles.CreateQuadrilateralSoilLayer2D(new Point2D(xPointJ, -5), new Point2D(xRight, -5), new Point2D(xRight, -10), new Point2D(xPointI, -10)); + SoilLayer2D soilLayer2 = FactoryForSoilProfiles.CreatePolygoneSoilLayer2D([ + ..new[] + { + new Point2D(xLeft, -10), + new Point2D(xPointF, -10), + new Point2D(xPointG, -12.5), + new Point2D(xPointH, -12.5), + new Point2D(xPointI, -10), + new Point2D(xRight, -10), + new Point2D(xRight, -15), + new Point2D(xLeft, -10) + } + ], null); + SoilLayer2D soilBottomAquifer = FactoryForSoilProfiles.CreateRectangularSoilLayer2D(-15, -20, xLeft, xRight, null, null, true); + var soilProfile = new SoilProfile2D + { + Geometry = new GeometryData + { + Left = xLeft, + Right = xRight, + Bottom = -20 + }, + Name = "SoilProfileTest" + }; + soilProfile.Surfaces.Add(soilDike); + soilProfile.Surfaces.Add(soilLayer1A); + soilProfile.Surfaces.Add(soilLayer1B); + soilProfile.Surfaces.Add(soilLayer2); + soilProfile.Surfaces.Add(soilBottomAquifer); + soilProfile.Geometry.Surfaces.Add(new GeometrySurface()); + soilProfile.Geometry.SurfaceLine.Points.Add(new GeometryPoint(xLeft, -5)); + soilProfile.Geometry.SurfaceLine.Points.Add(new GeometryPoint(xPointA, -5)); + soilProfile.Geometry.SurfaceLine.Points.Add(new GeometryPoint(xPointB, 0)); + soilProfile.Geometry.SurfaceLine.Points.Add(new GeometryPoint(xPointC, 0)); + soilProfile.Geometry.SurfaceLine.Points.Add(new GeometryPoint(xPointD, -5)); + soilProfile.Geometry.SurfaceLine.Points.Add(new GeometryPoint(xPointE, -5)); + soilProfile.Geometry.SurfaceLine.Points.Add(new GeometryPoint(xPointF, -10)); + soilProfile.Geometry.SurfaceLine.Points.Add(new GeometryPoint(xPointG, -12.5)); + soilProfile.Geometry.SurfaceLine.Points.Add(new GeometryPoint(xPointH, -12.5)); + soilProfile.Geometry.SurfaceLine.Points.Add(new GeometryPoint(xPointI, -10)); + soilProfile.Geometry.SurfaceLine.Points.Add(new GeometryPoint(xPointJ, -5)); + soilProfile.Geometry.SurfaceLine.Points.Add(new GeometryPoint(xRight, -5)); + soilProfile.Geometry.SurfaceLine.SyncCalcPoints(); + + var plLine = new PlLine + { + Name = "Phreatic line" + }; + plLine.Points.Add(new PlLinePoint(xLeft, 2)); + plLine.Points.Add(new PlLinePoint(xPl1A, 2)); + plLine.Points.Add(new PlLinePoint(xPl1B, -6)); + plLine.Points.Add(new PlLinePoint(xRight, -6)); + + // Call + WaternetLine waternetLine = PlLinesToWaternetConverter.CreateWaternetLineForPhreaticLineForDamStandard(soilProfile, plLine); + + // Assert + Assert.That(waternetLine, Has.Count.EqualTo(6)); + Assert.Multiple(() => + { + Assert.That(waternetLine.Points[0].X, Is.EqualTo(xLeft).Within(precision3Decimals)); + Assert.That(waternetLine.Points[0].Z, Is.EqualTo(-10).Within(precision3Decimals)); + Assert.That(waternetLine.Points[1].X, Is.EqualTo(xPointF).Within(precision3Decimals)); + Assert.That(waternetLine.Points[1].Z, Is.EqualTo(-10).Within(precision3Decimals)); + Assert.That(waternetLine.Points[2].X, Is.EqualTo(xPointG).Within(precision3Decimals)); + Assert.That(waternetLine.Points[2].Z, Is.EqualTo(-12.5).Within(precision3Decimals)); + Assert.That(waternetLine.Points[3].X, Is.EqualTo(xPointH).Within(precision3Decimals)); + Assert.That(waternetLine.Points[3].Z, Is.EqualTo(-12.5).Within(precision3Decimals)); + Assert.That(waternetLine.Points[4].X, Is.EqualTo(xPointI).Within(precision3Decimals)); + Assert.That(waternetLine.Points[4].Z, Is.EqualTo(-10).Within(precision3Decimals)); + Assert.That(waternetLine.Points[5].X, Is.EqualTo(xRight).Within(precision3Decimals)); + Assert.That(waternetLine.Points[5].Z, Is.EqualTo(-10).Within(precision3Decimals)); + }); + } + private static SoilProfile1D CreateSoilProfile1DWithTwoClustersOfInBetweenAquifers(out SurfaceLine2 surfaceLine) { const double topLevel = 1.212;