Index: DamEngine/trunk/src/Deltares.DamEngine.Calculators/KernelWrappers/MacroStabilityCommon/MacroStabilityCommonHelper.cs =================================================================== diff -u -r5932 -r5941 --- DamEngine/trunk/src/Deltares.DamEngine.Calculators/KernelWrappers/MacroStabilityCommon/MacroStabilityCommonHelper.cs (.../MacroStabilityCommonHelper.cs) (revision 5932) +++ DamEngine/trunk/src/Deltares.DamEngine.Calculators/KernelWrappers/MacroStabilityCommon/MacroStabilityCommonHelper.cs (.../MacroStabilityCommonHelper.cs) (revision 5941) @@ -432,14 +432,14 @@ ThrowWhenSoilProfile2DIsNull(damKernelInput.SubSoilScenario); - if (damKernelInput.SubSoilScenario.SoilProfile1D != null) - { - SurfaceLine2 surfaceLine = damKernelInput.Location.SurfaceLine; + SurfaceLine2 surfaceLine = damKernelInput.Location.SurfaceLine; + if (damKernelInput.SubSoilScenario.SoilProfile1D != null) { + return PlLinesToWaternetConverter.CreateWaternetBasedOnPlLines(plLines, damKernelInput.SubSoilScenario.SoilProfile1D, surfaceLine, penetrationLength, pressureType); } SoilProfile2D soilProfile2D = damKernelInput.SubSoilScenario.SoilProfile2D; - return PlLinesToWaternetConverter.CreateWaternetBasedOnPlLines(plLines, soilProfile2D, penetrationLength, pressureType); + return PlLinesToWaternetConverter.CreateWaternetBasedOnPlLines(plLines, soilProfile2D, surfaceLine, penetrationLength, pressureType); } /// Index: DamEngine/trunk/src/Deltares.DamEngine.TestHelpers/Factories/FactoryForSoilProfiles.cs =================================================================== diff -u -r5760 -r5941 --- DamEngine/trunk/src/Deltares.DamEngine.TestHelpers/Factories/FactoryForSoilProfiles.cs (.../FactoryForSoilProfiles.cs) (revision 5760) +++ DamEngine/trunk/src/Deltares.DamEngine.TestHelpers/Factories/FactoryForSoilProfiles.cs (.../FactoryForSoilProfiles.cs) (revision 5941) @@ -120,7 +120,7 @@ Name = GetNewUniqueLayerId(soilProfile) }; layer.TopLevel = topLevelSandLayer; - layer.Soil = new Soil("Alg-zand (0-30)", 22.0, 20.0); + layer.Soil = soil2; layer.IsAquifer = true; soilProfile.Layers.Add(layer); soilProfile.BottomLevel = -10.0; @@ -288,65 +288,46 @@ } /// - /// Create five layer soil profile with 1 aquifer + /// Create 4 layers soil profile with 1 aquifer at the bottom /// /// soil profile - public static SoilProfile1D Create5LayerProfileWith1Aquifer() + public static SoilProfile1D Create4LayersProfileWith1BottomAquifer(double level1 = 0.0, double level2= -5.0, double level3 = -10.0, double level4 = -15.0, double bottomLevel5 = -20.0, bool isInBetweenAquiferPresent = false) { var soilProfile = new SoilProfile1D(); var layer = new SoilLayer1D { - Name = GetNewUniqueLayerId(soilProfile) + Name = GetNewUniqueLayerId(soilProfile), + TopLevel = level1, + IsAquifer = false }; - layer.TopLevel = 10.0; - layer.Soil = new Soil("HW-OBO", 12.0, 10.0); - layer.Soil.DryUnitWeight = 0.01; - layer.IsAquifer = false; soilProfile.Layers.Add(layer); layer = new SoilLayer1D { - Name = GetNewUniqueLayerId(soilProfile) + Name = GetNewUniqueLayerId(soilProfile), + TopLevel = level2, + IsAquifer = isInBetweenAquiferPresent }; - layer.TopLevel = 1.0; - layer.Soil = new Soil("Alg-zand (0-30)", 10.0, 20.0); - layer.Soil.DryUnitWeight = 0.01; - layer.IsAquifer = false; soilProfile.Layers.Add(layer); layer = new SoilLayer1D { - Name = GetNewUniqueLayerId(soilProfile) + Name = GetNewUniqueLayerId(soilProfile), + TopLevel = level3, + IsAquifer = false }; - layer.TopLevel = -1.5; - layer.Soil = new Soil("HW-DUN", 16.8, 15.8); - layer.Soil.DryUnitWeight = 0.01; - layer.IsAquifer = false; soilProfile.Layers.Add(layer); layer = new SoilLayer1D { - Name = GetNewUniqueLayerId(soilProfile) + Name = GetNewUniqueLayerId(soilProfile), + TopLevel = level4, + IsAquifer = true }; - layer.TopLevel = -5.0; - layer.Soil = new Soil("Alg-zand (0-30)", 22.0, 20.0); - layer.Soil.DryUnitWeight = 0.01; - layer.IsAquifer = true; soilProfile.Layers.Add(layer); + soilProfile.BottomLevel = bottomLevel5; - layer = new SoilLayer1D - { - Name = GetNewUniqueLayerId(soilProfile) - }; - layer.TopLevel = -7.0; - layer.Soil = new Soil("HW-DUN", 16.8, 15.8); - layer.Soil.DryUnitWeight = 0.01; - layer.IsAquifer = false; - soilProfile.Layers.Add(layer); - - soilProfile.BottomLevel = -10.0; - return soilProfile; } Index: DamEngine/trunk/src/Deltares.DamEngine.Calculators/KernelWrappers/MacroStabilityCommon/PlLinesToWaternetConverter.cs =================================================================== diff -u -r5923 -r5941 --- DamEngine/trunk/src/Deltares.DamEngine.Calculators/KernelWrappers/MacroStabilityCommon/PlLinesToWaternetConverter.cs (.../PlLinesToWaternetConverter.cs) (revision 5923) +++ DamEngine/trunk/src/Deltares.DamEngine.Calculators/KernelWrappers/MacroStabilityCommon/PlLinesToWaternetConverter.cs (.../PlLinesToWaternetConverter.cs) (revision 5941) @@ -126,12 +126,13 @@ /// /// The to convert. /// The to convert the with. + /// The surface line. /// The penetration length. /// The type of distribution of the vertical water pressures. /// A . /// Thrown when or /// is null. - public static Waternet CreateWaternetBasedOnPlLines(PlLines plLines, SoilProfile2D soilProfile, double penetrationLength, IntrusionVerticalWaterPressureType? pressureType) + public static Waternet CreateWaternetBasedOnPlLines(PlLines plLines, SoilProfile2D soilProfile, SurfaceLine2 surfaceLine, double penetrationLength, IntrusionVerticalWaterPressureType? pressureType) { // The validation of the soil profile was already performed in the Pl-lines creator. // Here we only have to check that the PL-lines were indeed created. @@ -174,7 +175,7 @@ waternet.WaternetLineList.Add(waternetLine); } - CreateWaternetLinesForInBetweenAquifers(waternet, soilProfile, plLines.Lines[PlLineType.Pl4], pressureType); + CreateWaternetLinesForInBetweenAquifers(waternet, soilProfile, surfaceLine, plLines.Lines[PlLineType.Pl4], pressureType); AdjustWaternetLineOfPhreaticLineWhenCoincidingWithOtherWaternetLines(waternet); @@ -222,7 +223,7 @@ } } - private static void CreateWaternetLinesForInBetweenAquifers(Waternet waternet, SoilProfile2D soilProfile, PlLine plLine4, + private static void CreateWaternetLinesForInBetweenAquifers(Waternet waternet, SoilProfile2D soilProfile, SurfaceLine2 surfaceLine, PlLine plLine4, IntrusionVerticalWaterPressureType? pressureType) { if (plLine4 == null) @@ -245,19 +246,23 @@ var headLine = CreateLine(plLine4, headLine4Name); waternet.HeadLineList.Add(headLine); - for (var i = 0; i < inBetweenAquiferUpperCoordinates.Count; i++) + var count = 0; + foreach (GeometryPointString topLine in inBetweenAquiferUpperCoordinates.Where(topLine => IsLineEndingInPolderSide(topLine, surfaceLine))) { - WaternetLine waternetLineTop = CreateWaternetLine(inBetweenAquiferUpperCoordinates[i].CalcPoints); + count += 1; + WaternetLine waternetLineTop = CreateWaternetLine(topLine.CalcPoints); waternetLineTop.HeadLine = headLine; - waternetLineTop.Name = waternetLine4TopName + " (" + (i + 1) + ")"; + waternetLineTop.Name = waternetLine4TopName + " (" + count + ")"; waternet.WaternetLineList.Add(waternetLineTop); } - for (var i = 0; i < inBetweenAquiferLowerCoordinates.Count; i++) + count = 0; + foreach (GeometryPointString bottomLine in inBetweenAquiferLowerCoordinates.Where(bottomLine => IsLineEndingInPolderSide(bottomLine, surfaceLine))) { - WaternetLine waternetLineBottom = CreateWaternetLine(inBetweenAquiferLowerCoordinates[i].CalcPoints); + count += 1; + WaternetLine waternetLineBottom = CreateWaternetLine(bottomLine.CalcPoints); waternetLineBottom.HeadLine = headLine; - waternetLineBottom.Name = waternetLine4BottomName + " (" + (i + 1) + ")"; + waternetLineBottom.Name = waternetLine4BottomName + " (" + count + ")"; waternet.WaternetLineList.Add(waternetLineBottom); } } @@ -600,4 +605,10 @@ } } } + + private static bool IsLineEndingInPolderSide(GeometryPointString line, SurfaceLine2 surfaceLine) + { + GeometryPoint dikeToeAtPolder = surfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DikeToeAtPolder); + return dikeToeAtPolder.X.IsLessThan(line.CalcPoints.Last().X, toleranceAlmostEqual); + } } \ No newline at end of file Index: DamEngine/trunk/src/Deltares.DamEngine.Calculators.Tests/KernelWrappers/MacroStabilityCommon/PlLinesToWaternetConverterTests.cs =================================================================== diff -u -r5923 -r5941 --- DamEngine/trunk/src/Deltares.DamEngine.Calculators.Tests/KernelWrappers/MacroStabilityCommon/PlLinesToWaternetConverterTests.cs (.../PlLinesToWaternetConverterTests.cs) (revision 5923) +++ DamEngine/trunk/src/Deltares.DamEngine.Calculators.Tests/KernelWrappers/MacroStabilityCommon/PlLinesToWaternetConverterTests.cs (.../PlLinesToWaternetConverterTests.cs) (revision 5941) @@ -378,7 +378,8 @@ public class Given2DSoilProfileWithTwoClustersOfInBetweenAquifersAndVerticalLayerSeparations { - private readonly SoilProfile2D soilProfile = Create2DSoilProfileWithTwoClustersOfInBetweenAquifersAndVerticalLayerSeparations(); + private static readonly SoilProfile2D soilProfile = Create2DSoilProfileWithTwoClustersOfInBetweenAquifersAndVerticalLayerSeparations(); + private readonly SurfaceLine2 surfaceLine = FactoryForSurfaceLines.CreateHorizontalSurfaceLine(20, leftCoordinate, rightCoordinate); [TestCase(IntrusionVerticalWaterPressureType.Standard, -9.999, 6, 2)] [TestCase(IntrusionVerticalWaterPressureType.Linear, 20.000, 6, 2)] @@ -391,7 +392,7 @@ PlLines plLines = CreateAllPlLines(); // Call - Waternet waternet = PlLinesToWaternetConverter.CreateWaternetBasedOnPlLines(plLines, soilProfile, penetrationZone, pressureType); + Waternet waternet = PlLinesToWaternetConverter.CreateWaternetBasedOnPlLines(plLines, soilProfile, surfaceLine, penetrationZone, pressureType); // Assert AssertGeometry(plLines.Lines[PlLineType.Pl1].Points, waternet.PhreaticLine.Points); @@ -488,7 +489,7 @@ PlLines plLines = CreateAllPlLines(-32); // Call - Waternet waternet = PlLinesToWaternetConverter.CreateWaternetBasedOnPlLines(plLines, soilProfile, 0, pressureType); + Waternet waternet = PlLinesToWaternetConverter.CreateWaternetBasedOnPlLines(plLines, soilProfile, surfaceLine, 0, pressureType); // Assert AssertGeometry(plLines.Lines[PlLineType.Pl1].Points, waternet.PhreaticLine.Points); @@ -751,11 +752,11 @@ /// /// PL 1 - /// ==========================================\\ + /// ==========================================\\ Level 2 m /// B /------------------\ C \\ Level 0 m /// | / Dike \ \\ E J /// |--------------/----------------------\------\\----\ /-------| Level -5 m - /// | A Layer 1 D \\====\==========/========| + /// | A Layer 1 D \\====\==========/========| Level -6 m /// | \ / | /// |-----------------------------------------------------\ F I /----------| Level -10 m /// | Layer 2 G \----/ H | Level -12.5 m @@ -767,73 +768,25 @@ 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, -15) - } - ], null); - SoilLayer2D soilBottomAquifer = FactoryForSoilProfiles.CreateRectangularSoilLayer2D(-15, -20, xLeft, xRight, null, null, true); - var soilProfile = new SoilProfile2D + SurfaceLine2 surfaceLine = FactoryForSurfaceLines.CreateSurfaceLineWithDikeAndDitch(0, -12.5); + SoilProfile1D soilProfile1D = FactoryForSoilProfiles.Create4LayersProfileWith1BottomAquifer(); + var soilSurfaceProfile = new SoilSurfaceProfile { - Geometry = new GeometryData - { - Left = xLeft, - Right = xRight, - Bottom = -20 - }, - Name = "SoilProfileTest" + SoilProfile = soilProfile1D, + SurfaceLine2 = surfaceLine, + DikeEmbankmentMaterial = new Soil(), + Name = "Test" }; - soilProfile.Surfaces.Add(soilDike); - soilProfile.Surfaces.Add(soilLayer1A); - soilProfile.Surfaces.Add(soilLayer1B); - soilProfile.Surfaces.Add(soilLayer2); - soilProfile.Surfaces.Add(soilBottomAquifer); - soilProfile.Geometry.Surfaces.Add(soilDike.GeometrySurface); - soilProfile.Geometry.Surfaces.Add(soilLayer1A.GeometrySurface); - soilProfile.Geometry.Surfaces.Add(soilLayer1B.GeometrySurface); - soilProfile.Geometry.Surfaces.Add(soilLayer2.GeometrySurface); - soilProfile.Geometry.Surfaces.Add(soilBottomAquifer.GeometrySurface); + SoilProfile2D soilProfile2D = soilSurfaceProfile.ConvertToSoilProfile2D(); - 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(); + const double xLeft = 0; + const double xPointF = 59.3; + const double xPointG = 59.5; + const double xPointH = 61.5; + const double xPointI = 61.7; + const double xPl1A = -30; + const double xPl1B = -20; + const double xRight = 75; var plLine = new PlLine { @@ -845,7 +798,7 @@ plLine.Points.Add(new PlLinePoint(xRight, -6)); // Call - WaternetLine waternetLine = PlLinesToWaternetConverter.CreateWaternetLineForPhreaticLineForDamStandard(soilProfile, plLine); + WaternetLine waternetLine = PlLinesToWaternetConverter.CreateWaternetLineForPhreaticLineForDamStandard(soilProfile2D, plLine); // Assert Assert.That(waternetLine, Has.Count.EqualTo(6)); @@ -865,7 +818,125 @@ Assert.That(waternetLine.Points[5].Z, Is.EqualTo(-10).Within(precision3Decimals)); }); } + + + /// + /// _______ Level 10 m + /// / Clay \ + /// /---------\ Level 6 m + /// / Aquifer \ + /// /-------------\ X=58.5 X=62.5 Level 2 m + /// -----------/ Clay \------\ /-------- Level 0 m + /// -----------------------------------\ /--------- Level -2 m + /// In between aquifer \ / + /// -------------------------------------\ /----------- Level -4 m + /// Clay \ / + /// ---------------------------------------\ /------------- Level -6 m + /// \_____/ Level -8 m + /// Bottom aquifer X=59.5 X=61.5 + /// ------------------------------------------------------------- Level -10 m + /// + [Test] + public void GivenSoilProfile2DWithAquiferInDikeBodyAndAquifersCuttingTheDitch_WhenCreatingWaternetLine_ThenExpectedWaternetLineReturned() + { + SurfaceLine2 surfaceLine = FactoryForSurfaceLines.CreateSurfaceLineWithDikeAndDitch(10, -8); + SoilProfile1D soilProfile1D = FactoryForSoilProfiles.CreateClaySandClaySandClaySandProfile(10, 6, 2, 0 -2, -4, -6); + soilProfile1D.BottomLevel = -10; + var soilSurfaceProfile = new SoilSurfaceProfile + { + SoilProfile = soilProfile1D, + SurfaceLine2 = surfaceLine, + DikeEmbankmentMaterial = new Soil(), + Name = "Test" + }; + SoilProfile2D soilProfile2D = soilSurfaceProfile.ConvertToSoilProfile2D(); + const double pL1Level = 0; + + PlLines plLines = CreateAllPlLines(pL1Level); + + // Call + Waternet waternet = PlLinesToWaternetConverter.CreateWaternetBasedOnPlLines(plLines, soilProfile2D, surfaceLine, 0, IntrusionVerticalWaterPressureType.Standard); + // Assert + Assert.That(waternet.WaternetLineList, Has.Count.EqualTo(6)); + // phreatic line (PL 1) + Assert.Multiple(() => + { + + Assert.That(waternet.PhreaticLine.Points, Has.Count.EqualTo(2)); + WaternetLine waternetLinePl1 = waternet.WaternetLineList.Find(waternetLine => waternetLine.Name == "Waternet line phreatic line"); + Assert.That(waternetLinePl1.HeadLine.Points, Is.EqualTo(waternet.PhreaticLine.Points)); + Assert.That(waternetLinePl1.HeadLine.Name, Is.EqualTo(waternet.PhreaticLine.Name)); + Assert.That(waternetLinePl1.Points, Has.Count.EqualTo(10)); + }); + // no PL 2 + WaternetLine waternetLinePl2 = waternet.WaternetLineList.Find(waternetLine => waternetLine.Name == "Penetration zone lower aquifer"); + Assert.That(waternetLinePl2, Is.Null); + // PL 3 + WaternetLine waternetLinePl3 = waternet.WaternetLineList.Find(waternetLine => waternetLine.Name == "Waternet line lower aquifer"); + Assert.Multiple(() => + { + Assert.That(waternetLinePl3.HeadLine.Name, Is.EqualTo("Head line 3 (PL 3)")); + Assert.That(waternetLinePl3.Points, Has.Count.EqualTo(6)); + Assert.That(waternetLinePl3.Points[0].X, Is.EqualTo(0)); + Assert.That(waternetLinePl3.Points[0].Z, Is.EqualTo(-6)); + Assert.That(waternetLinePl3.Points[1].X, Is.EqualTo(59.25)); + Assert.That(waternetLinePl3.Points[1].Z, Is.EqualTo(-6)); + Assert.That(waternetLinePl3.Points[2].X, Is.EqualTo(59.5)); + Assert.That(waternetLinePl3.Points[2].Z, Is.EqualTo(-8)); + Assert.That(waternetLinePl3.Points[3].X, Is.EqualTo(61.5)); + Assert.That(waternetLinePl3.Points[3].Z, Is.EqualTo(-8)); + Assert.That(waternetLinePl3.Points[4].X, Is.EqualTo(61.75)); + Assert.That(waternetLinePl3.Points[4].Z, Is.EqualTo(-6)); + Assert.That(waternetLinePl3.Points[5].X, Is.EqualTo(75)); + Assert.That(waternetLinePl3.Points[5].Z, Is.EqualTo(-6)); + }); + // PL 4: 4 waternet lines expected at top and bottom and at both sides of the ditch + // No waternet line expected for the in-between aquifer in the dike body + WaternetLine waternetLinePl4LeftDitchTop = waternet.WaternetLineList.Find(waternetLine => waternetLine.Name == "Waternet line in-between aquifer top (1)"); + WaternetLine waternetLinePl4LeftDitchBottom = waternet.WaternetLineList.Find(waternetLine => waternetLine.Name == "Waternet line in-between aquifer bottom (1)"); + WaternetLine waternetLinePl4RightDitchTop = waternet.WaternetLineList.Find(waternetLine => waternetLine.Name == "Waternet line in-between aquifer top (2)"); + WaternetLine waternetLinePl4RightDitchBottom = waternet.WaternetLineList.Find(waternetLine => waternetLine.Name == "Waternet line in-between aquifer bottom (2)"); + Assert.Multiple(() => + { + Assert.That(waternetLinePl4LeftDitchTop.HeadLine.Name, Is.EqualTo("Head line 4 (PL 4)")); + Assert.That(waternetLinePl4LeftDitchTop.Points, Has.Count.EqualTo(3)); + Assert.That(waternetLinePl4LeftDitchBottom.HeadLine.Name, Is.EqualTo("Head line 4 (PL 4)")); + Assert.That(waternetLinePl4LeftDitchBottom.Points, Has.Count.EqualTo(2)); + Assert.That(waternetLinePl4RightDitchTop.HeadLine.Name, Is.EqualTo("Head line 4 (PL 4)")); + Assert.That(waternetLinePl4RightDitchTop.Points, Has.Count.EqualTo(3)); + Assert.That(waternetLinePl4RightDitchBottom.HeadLine.Name, Is.EqualTo("Head line 4 (PL 4)")); + Assert.That(waternetLinePl4RightDitchBottom.Points, Has.Count.EqualTo(2)); + + }); + Assert.Multiple(() => + { + Assert.That(waternetLinePl4LeftDitchTop.Points[0].X, Is.EqualTo(0).Within(precision3Decimals)); + Assert.That(waternetLinePl4LeftDitchTop.Points[0].Z, Is.EqualTo(-2).Within(precision3Decimals)); + Assert.That(waternetLinePl4LeftDitchTop.Points[1].X, Is.EqualTo(58.75).Within(precision3Decimals)); + Assert.That(waternetLinePl4LeftDitchTop.Points[1].Z, Is.EqualTo(-2).Within(precision3Decimals)); + Assert.That(waternetLinePl4LeftDitchTop.Points[2].X, Is.EqualTo(59).Within(precision3Decimals)); + Assert.That(waternetLinePl4LeftDitchTop.Points[2].Z, Is.EqualTo(-4).Within(precision3Decimals)); + + Assert.That(waternetLinePl4LeftDitchBottom.Points[0].X, Is.EqualTo(0).Within(precision3Decimals)); + Assert.That(waternetLinePl4LeftDitchBottom.Points[0].Z, Is.EqualTo(-4).Within(precision3Decimals)); + Assert.That(waternetLinePl4LeftDitchBottom.Points[1].X, Is.EqualTo(59).Within(precision3Decimals)); + Assert.That(waternetLinePl4LeftDitchBottom.Points[1].Z, Is.EqualTo(-4).Within(precision3Decimals)); + + Assert.That(waternetLinePl4RightDitchTop.Points[0].X, Is.EqualTo(62).Within(precision3Decimals)); + Assert.That(waternetLinePl4RightDitchTop.Points[0].Z, Is.EqualTo(-4).Within(precision3Decimals)); + Assert.That(waternetLinePl4RightDitchTop.Points[1].X, Is.EqualTo(62.25).Within(precision3Decimals)); + Assert.That(waternetLinePl4RightDitchTop.Points[1].Z, Is.EqualTo(-2).Within(precision3Decimals)); + Assert.That(waternetLinePl4RightDitchTop.Points[2].X, Is.EqualTo(75).Within(precision3Decimals)); + Assert.That(waternetLinePl4RightDitchTop.Points[2].Z, Is.EqualTo(-2).Within(precision3Decimals)); + + Assert.That(waternetLinePl4RightDitchBottom.Points[0].X, Is.EqualTo(62).Within(precision3Decimals)); + Assert.That(waternetLinePl4RightDitchBottom.Points[0].Z, Is.EqualTo(-4).Within(precision3Decimals)); + Assert.That(waternetLinePl4RightDitchBottom.Points[1].X, Is.EqualTo(75).Within(precision3Decimals)); + Assert.That(waternetLinePl4RightDitchBottom.Points[1].Z, Is.EqualTo(-4).Within(precision3Decimals)); + }); + } + private static SoilLayer2D CreateSoilLayer2D(Point2D topLeftCoordinate, Point2D topRightCoordinate, Point2D bottomRightCoordinate, Point2D bottomLeftCoordinate, bool isAquifer) {