Index: DamEngine/trunk/src/Deltares.DamEngine.Calculators.Tests/KernelWrappers/MacroStabilityCommon/PlLinesToWaternetConverterTests.cs =================================================================== diff -u -r5091 -r5093 --- DamEngine/trunk/src/Deltares.DamEngine.Calculators.Tests/KernelWrappers/MacroStabilityCommon/PlLinesToWaternetConverterTests.cs (.../PlLinesToWaternetConverterTests.cs) (revision 5091) +++ DamEngine/trunk/src/Deltares.DamEngine.Calculators.Tests/KernelWrappers/MacroStabilityCommon/PlLinesToWaternetConverterTests.cs (.../PlLinesToWaternetConverterTests.cs) (revision 5093) @@ -349,167 +349,201 @@ } - /// X_a X_b - /// --------------------------------------------------- Level 20 m - /// Aquitard 1 - /// --------------------------------------------------- Level 10 m - /// Aquifer 2a | Aquifer 2b | Aquifer 2c - /// --------------------------------------------------- Level 0 m - /// Aquitard 3 - /// --------------------------------------------------- Level -10 m - /// Aquifer 4a | Aquifer 4b | Aquifer 4c - /// --------------------------------------------------- Level -20 m - /// Aquitard 5 - /// --------------------------------------------------- Level -25 m - /// Aquifer 6a | Aquifer 6b | Aquifer 6c - /// --------------------------------------------------- Level -30 m - /// Aquifer 7a | Aquifer 7b | Aquifer 7c - /// --------------------------------------------------- Level -35 m - /// - [TestCase(IntrusionVerticalWaterPressureType.Standard, -9.999, 6, 2, -5)] - [TestCase(IntrusionVerticalWaterPressureType.Standard, -24.999, 6, 2, -32)] - [TestCase(IntrusionVerticalWaterPressureType.Linear, 20.000, 6, 2, -5)] - [TestCase(IntrusionVerticalWaterPressureType.HydroStatic, 10.001, 6, 2, -5)] - [TestCase(IntrusionVerticalWaterPressureType.FullHydroStatic, -35.000, 1, 0, -5)] - [TestCase(IntrusionVerticalWaterPressureType.SemiTimeDependent, -24.999, 7, 3, -28, penetrationLength)] - [TestCase(IntrusionVerticalWaterPressureType.SemiTimeDependent, 10.001, 6, 2, 15, 0)] - public void Given2DSoilProfileWithTwoInBetweenAquifers_WhenCreatingWaternetBasedOnPlLinesAnd2DSoilProfile_ThenReturnsValidWaternet(IntrusionVerticalWaterPressureType? pressureType, double levelWaternetPl1, int waternetLineCount, int headlineCount, double pL1Level, double penetrationZone = double.NaN) + public class Given2DSoilProfileWithTwoClustersOfInBetweenAquifersAndVerticalLayerSeparations { - double xA = leftCoordinate + (rightCoordinate - leftCoordinate) / 3; - double xB = rightCoordinate - (rightCoordinate - leftCoordinate) / 3; - // Setup - SoilLayer2D aquitard1 = CreateRectangularSoilLayer2D(20, 10, leftCoordinate, rightCoordinate, false); - SoilLayer2D aquifer2A = CreateRectangularSoilLayer2D(10, 0, leftCoordinate, xA, true); - SoilLayer2D aquifer2B = CreateRectangularSoilLayer2D(10, 0, xA, xB, true); - SoilLayer2D aquifer2C = CreateRectangularSoilLayer2D(10, 0, xB, rightCoordinate, true); - SoilLayer2D aquitard3 = CreateRectangularSoilLayer2D(0, -10, leftCoordinate, rightCoordinate, false); - SoilLayer2D aquifer4A = CreateRectangularSoilLayer2D(-10, -20, leftCoordinate, xA, true); - SoilLayer2D aquifer4B = CreateRectangularSoilLayer2D(-10, -20, xA, xB, true); - SoilLayer2D aquifer4C = CreateRectangularSoilLayer2D(-10, -20, xB, rightCoordinate, true); - SoilLayer2D aquitard5 = CreateRectangularSoilLayer2D(-20, -25, leftCoordinate, rightCoordinate, false); - SoilLayer2D aquifer6A = CreateRectangularSoilLayer2D(-25, -30, leftCoordinate, xA, true); - SoilLayer2D aquifer6B = CreateRectangularSoilLayer2D(-25, -30, xA, xB, true); - SoilLayer2D aquifer6C = CreateRectangularSoilLayer2D(-25, -30, xB, rightCoordinate, true); - SoilLayer2D aquifer7A = CreateRectangularSoilLayer2D(-30, -35, leftCoordinate, xA, true); - SoilLayer2D aquifer7B = CreateRectangularSoilLayer2D(-30, -35, xA, xB, true); - SoilLayer2D aquifer7C = CreateRectangularSoilLayer2D(-30, -35, xB, rightCoordinate, true); + private readonly SoilProfile2D soilProfile = Create2DSoilProfileWithTwoClustersOfInBetweenAquifersAndVerticalLayerSeparations(); - var soilProfile = new SoilProfile2D + [TestCase(IntrusionVerticalWaterPressureType.Standard, -9.999, 6, 2)] + [TestCase(IntrusionVerticalWaterPressureType.Linear, 20.000, 6, 2)] + [TestCase(IntrusionVerticalWaterPressureType.HydroStatic, 10.001, 6, 2)] + [TestCase(IntrusionVerticalWaterPressureType.FullHydroStatic, -35.000, 1, 0)] + [TestCase(IntrusionVerticalWaterPressureType.SemiTimeDependent, -9.999, 7, 3, penetrationLength)] + [TestCase(IntrusionVerticalWaterPressureType.SemiTimeDependent, -9.999, 6, 2, 0)] + public void WhenCreatingWaternetBasedOnPlLinesWithPhreaticLineInAquitardNr3_ThenReturnsValidWaternet(IntrusionVerticalWaterPressureType? pressureType, double levelWaternetPl1, int waternetLineCount, int headlineCount, double penetrationZone = double.NaN) { - Geometry = new GeometryData + PlLines plLines = CreateAllPlLines(); + + // Call + Waternet waternet = PlLinesToWaternetConverter.CreateWaternetBasedOnPlLines(plLines, soilProfile, penetrationZone, pressureType); + + // Assert + AssertGeometry(plLines.Lines[PlLineType.Pl1].Points, waternet.PhreaticLine.Points); + + Assert.That(waternet.HeadLineList, Has.Count.EqualTo(headlineCount)); + var indexHeadlinePl3 = 0; + var indexHeadlinePl4 = 1; + if (pressureType == IntrusionVerticalWaterPressureType.SemiTimeDependent && penetrationZone > 0) { - Left = leftCoordinate, - Right = rightCoordinate, - Bottom = -35 + AssertGeometry(plLines.Lines[PlLineType.Pl2].Points, waternet.HeadLineList[0].Points); + indexHeadlinePl3 += 1; + indexHeadlinePl4 += 1; } - }; - soilProfile.Surfaces.Add(aquitard1); - soilProfile.Surfaces.Add(aquifer2A); - soilProfile.Surfaces.Add(aquifer2B); - soilProfile.Surfaces.Add(aquifer2C); - soilProfile.Surfaces.Add(aquitard3); - soilProfile.Surfaces.Add(aquifer4A); - soilProfile.Surfaces.Add(aquifer4B); - soilProfile.Surfaces.Add(aquifer4C); - soilProfile.Surfaces.Add(aquitard5); - soilProfile.Surfaces.Add(aquifer6A); - soilProfile.Surfaces.Add(aquifer6B); - soilProfile.Surfaces.Add(aquifer6C); - soilProfile.Surfaces.Add(aquifer7A); - soilProfile.Surfaces.Add(aquifer7B); - soilProfile.Surfaces.Add(aquifer7C); - soilProfile.Geometry.Surfaces.Add(new GeometrySurface()); - soilProfile.Geometry.SurfaceLine.CalcPoints.Add(new Point2D(leftCoordinate, 20)); - soilProfile.Geometry.SurfaceLine.CalcPoints.Add(new Point2D(rightCoordinate, 20)); - soilProfile.Geometry.SurfaceLine.SyncPoints(); - PlLines plLines = CreateAllPlLines(pL1Level); + if (pressureType != IntrusionVerticalWaterPressureType.FullHydroStatic) + { + AssertGeometry(plLines.Lines[PlLineType.Pl3].Points, waternet.HeadLineList[indexHeadlinePl3].Points); + AssertGeometry(plLines.Lines[PlLineType.Pl4].Points, waternet.HeadLineList[indexHeadlinePl4].Points); + } - // Call - Waternet waternet = PlLinesToWaternetConverter.CreateWaternetBasedOnPlLines(plLines, soilProfile, penetrationZone, pressureType); + Assert.That(waternet.WaternetLineList, Has.Count.EqualTo(waternetLineCount)); - // Assert - AssertGeometry(plLines.Lines[PlLineType.Pl1].Points, waternet.PhreaticLine.Points); + WaternetLine pl1WaternetLine = waternet.WaternetLineList.Find(w => w.HeadLine.Name == waternet.PhreaticLine.Name); + Assert.That(pl1WaternetLine.HeadLine.Name, Is.SameAs(waternet.PhreaticLine.Name)); + Point2D[] expectedWaternetLine1 = + [ + new(leftCoordinate, levelWaternetPl1), + new(rightCoordinate, levelWaternetPl1) + ]; + AssertGeometry(expectedWaternetLine1, pl1WaternetLine.Points); - Assert.That(waternet.HeadLineList, Has.Count.EqualTo(headlineCount)); - var indexHeadlinePl3 = 0; - var indexHeadlinePl4 = 1; - if (pressureType == IntrusionVerticalWaterPressureType.SemiTimeDependent && penetrationZone > 0) - { - AssertGeometry(plLines.Lines[PlLineType.Pl2].Points, waternet.HeadLineList[0].Points); - indexHeadlinePl3 += 1; - indexHeadlinePl4 += 1; - } + Point2D[] expectedBottomAquiferCoordinates = + [ + new(leftCoordinate, -25), + new(rightCoordinate, -25) + ]; - if (pressureType != IntrusionVerticalWaterPressureType.FullHydroStatic) - { - AssertGeometry(plLines.Lines[PlLineType.Pl3].Points, waternet.HeadLineList[indexHeadlinePl3].Points); - AssertGeometry(plLines.Lines[PlLineType.Pl4].Points, waternet.HeadLineList[indexHeadlinePl4].Points); - } + WaternetLine pl2WaternetLine = waternet.WaternetLineList.Find(w => w.HeadLine.Name == "Head line 2 (PL 2)"); + if (pressureType == IntrusionVerticalWaterPressureType.SemiTimeDependent && penetrationZone > 0) + { + Assert.That(pl2WaternetLine.HeadLine, Is.SameAs(waternet.HeadLineList[0])); + GeometryPoint[] offSetAquiferCoordinates = expectedBottomAquiferCoordinates.Select(aquiferCoordinate => new GeometryPoint(aquiferCoordinate.X, aquiferCoordinate.Z + penetrationLength)) + .ToArray(); + AssertGeometry(offSetAquiferCoordinates, pl2WaternetLine.Points); + } + else + { + Assert.That(pl2WaternetLine, Is.Null); + } - Assert.That(waternet.WaternetLineList, Has.Count.EqualTo(waternetLineCount)); + if (waternetLineCount > 1) + { + WaternetLine pl3WaternetLine = waternet.WaternetLineList.Find(w => w.HeadLine.Name == "Head line 3 (PL 3)"); + Assert.That(pl3WaternetLine.HeadLine, Is.SameAs(waternet.HeadLineList[indexHeadlinePl3])); + AssertGeometry(expectedBottomAquiferCoordinates, pl3WaternetLine.Points); - WaternetLine pl1WaternetLine = waternet.WaternetLineList.Find(w => w.HeadLine.Name == waternet.PhreaticLine.Name); - Assert.That(pl1WaternetLine.HeadLine.Name, Is.SameAs(waternet.PhreaticLine.Name)); - Point2D[] expectedWaternetLine1 = - [ - new(leftCoordinate, levelWaternetPl1), - new(rightCoordinate, levelWaternetPl1) - ]; - AssertGeometry(expectedWaternetLine1, pl1WaternetLine.Points); + WaternetLine pl4WaternetLine1Top = waternet.WaternetLineList.Find(w => w.Name == "Waternet line in-between aquifer top (1)"); + Assert.That(pl4WaternetLine1Top.HeadLine, Is.SameAs(waternet.HeadLineList[indexHeadlinePl4])); + AssertGeometry([ + new Point2D(leftCoordinate, 10), + new Point2D(rightCoordinate, 10) + ], pl4WaternetLine1Top.Points); - Point2D[] expectedBottomAquiferCoordinates = - [ - new(leftCoordinate, -25), - new(rightCoordinate, -25) - ]; + WaternetLine pl4WaternetLineBottom = waternet.WaternetLineList.Find(w => w.Name == "Waternet line in-between aquifer bottom (1)"); + Assert.That(pl4WaternetLineBottom.HeadLine, Is.SameAs(waternet.HeadLineList[indexHeadlinePl4])); + AssertGeometry([ + new Point2D(leftCoordinate, 0), + new Point2D(rightCoordinate, 0) + ], pl4WaternetLineBottom.Points); - WaternetLine pl2WaternetLine = waternet.WaternetLineList.Find(w => w.HeadLine.Name == "Head line 2 (PL 2)"); - if (pressureType == IntrusionVerticalWaterPressureType.SemiTimeDependent && penetrationZone > 0) - { - Assert.That(pl2WaternetLine.HeadLine, Is.SameAs(waternet.HeadLineList[0])); - GeometryPoint[] offSetAquiferCoordinates = expectedBottomAquiferCoordinates.Select(aquiferCoordinate => new GeometryPoint(aquiferCoordinate.X, aquiferCoordinate.Z + penetrationLength)) - .ToArray(); - AssertGeometry(offSetAquiferCoordinates, pl2WaternetLine.Points); + WaternetLine pl4WaternetLine2Top = waternet.WaternetLineList.Find(w => w.Name == "Waternet line in-between aquifer top (2)"); + Assert.That(pl4WaternetLine2Top.HeadLine, Is.SameAs(waternet.HeadLineList[indexHeadlinePl4])); + AssertGeometry([ + new Point2D(leftCoordinate, -10), + new Point2D(rightCoordinate, -10) + ], pl4WaternetLine2Top.Points); + + WaternetLine pl4WaternetLine2Bottom = waternet.WaternetLineList.Find(w => w.Name == "Waternet line in-between aquifer bottom (2)"); + Assert.That(pl4WaternetLine2Bottom.HeadLine, Is.SameAs(waternet.HeadLineList[indexHeadlinePl4])); + AssertGeometry([ + new Point2D(leftCoordinate, -20), + new Point2D(rightCoordinate, -20) + ], pl4WaternetLine2Bottom.Points); + } } - else + + [TestCase(IntrusionVerticalWaterPressureType.Standard, -24.999)] + [TestCase(IntrusionVerticalWaterPressureType.Linear, 20.000)] + [TestCase(IntrusionVerticalWaterPressureType.HydroStatic, 10.001)] + [TestCase(IntrusionVerticalWaterPressureType.FullHydroStatic, -35.000)] + [TestCase(IntrusionVerticalWaterPressureType.SemiTimeDependent, -24.999)] + public void WhenPhreaticLineGoesThroughBottomAquifer_ThenExpectedPlLine1IsReturned(IntrusionVerticalWaterPressureType? pressureType, double expectedLevelWaternetPl1) { - Assert.That(pl2WaternetLine, Is.Null); + PlLines plLines = CreateAllPlLines(-32); + + // Call + Waternet waternet = PlLinesToWaternetConverter.CreateWaternetBasedOnPlLines(plLines, soilProfile, 0, pressureType); + + // Assert + AssertGeometry(plLines.Lines[PlLineType.Pl1].Points, waternet.PhreaticLine.Points); + WaternetLine pl1WaternetLine = waternet.WaternetLineList.Find(w => w.HeadLine.Name == waternet.PhreaticLine.Name); + Assert.That(pl1WaternetLine.HeadLine.Name, Is.SameAs(waternet.PhreaticLine.Name)); + Point2D[] expectedWaternetLine1 = + [ + new(leftCoordinate, expectedLevelWaternetPl1), + new(rightCoordinate, expectedLevelWaternetPl1) + ]; + AssertGeometry(expectedWaternetLine1, pl1WaternetLine.Points); } - if (waternetLineCount > 1) + /// + /// X_a X_b + /// --------------------------------------------------- Level 20 m + /// Aquitard 1 + /// ----------------|----------------|----------------- Level 10 m + /// Aquifer 2a | Aquifer 2b | Aquifer 2c + /// ----------------|----------------|----------------- Level 0 m + /// Aquitard 3 + /// ----------------|----------------|----------------- Level -10 m + /// Aquifer 4a | Aquifer 4b | Aquifer 4c + /// ----------------|----------------|----------------- Level -20 m + /// Aquitard 5 + /// ----------------|----------------|----------------- Level -25 m + /// Aquifer 6a | Aquifer 6b | Aquifer 6c + /// ----------------|----------------|----------------- Level -30 m + /// Aquifer 7a | Aquifer 7b | Aquifer 7c + /// ----------------|----------------|----------------- Level -35 m + /// + private static SoilProfile2D Create2DSoilProfileWithTwoClustersOfInBetweenAquifersAndVerticalLayerSeparations() { - WaternetLine pl3WaternetLine = waternet.WaternetLineList.Find(w => w.HeadLine.Name == "Head line 3 (PL 3)"); - Assert.That(pl3WaternetLine.HeadLine, Is.SameAs(waternet.HeadLineList[indexHeadlinePl3])); - AssertGeometry(expectedBottomAquiferCoordinates, pl3WaternetLine.Points); + double xA = leftCoordinate + (rightCoordinate - leftCoordinate) / 3; + double xB = rightCoordinate - (rightCoordinate - leftCoordinate) / 3; + // Setup + SoilLayer2D aquitard1 = CreateRectangularSoilLayer2D(20, 10, leftCoordinate, rightCoordinate, false); + SoilLayer2D aquifer2A = CreateRectangularSoilLayer2D(10, 0, leftCoordinate, xA, true); + SoilLayer2D aquifer2B = CreateRectangularSoilLayer2D(10, 0, xA, xB, true); + SoilLayer2D aquifer2C = CreateRectangularSoilLayer2D(10, 0, xB, rightCoordinate, true); + SoilLayer2D aquitard3 = CreateRectangularSoilLayer2D(0, -10, leftCoordinate, rightCoordinate, false); + SoilLayer2D aquifer4A = CreateRectangularSoilLayer2D(-10, -20, leftCoordinate, xA, true); + SoilLayer2D aquifer4B = CreateRectangularSoilLayer2D(-10, -20, xA, xB, true); + SoilLayer2D aquifer4C = CreateRectangularSoilLayer2D(-10, -20, xB, rightCoordinate, true); + SoilLayer2D aquitard5 = CreateRectangularSoilLayer2D(-20, -25, leftCoordinate, rightCoordinate, false); + SoilLayer2D aquifer6A = CreateRectangularSoilLayer2D(-25, -30, leftCoordinate, xA, true); + SoilLayer2D aquifer6B = CreateRectangularSoilLayer2D(-25, -30, xA, xB, true); + SoilLayer2D aquifer6C = CreateRectangularSoilLayer2D(-25, -30, xB, rightCoordinate, true); + SoilLayer2D aquifer7A = CreateRectangularSoilLayer2D(-30, -35, leftCoordinate, xA, true); + SoilLayer2D aquifer7B = CreateRectangularSoilLayer2D(-30, -35, xA, xB, true); + SoilLayer2D aquifer7C = CreateRectangularSoilLayer2D(-30, -35, xB, rightCoordinate, true); - WaternetLine pl4WaternetLine1Top = waternet.WaternetLineList.Find(w => w.Name == "Waternet line in-between aquifer top (1)"); - Assert.That(pl4WaternetLine1Top.HeadLine, Is.SameAs(waternet.HeadLineList[indexHeadlinePl4])); - AssertGeometry([ - new Point2D(leftCoordinate, 10), - new Point2D(rightCoordinate, 10) - ], pl4WaternetLine1Top.Points); - - WaternetLine pl4WaternetLineBottom = waternet.WaternetLineList.Find(w => w.Name == "Waternet line in-between aquifer bottom (1)"); - Assert.That(pl4WaternetLineBottom.HeadLine, Is.SameAs(waternet.HeadLineList[indexHeadlinePl4])); - AssertGeometry([ - new Point2D(leftCoordinate, 0), - new Point2D(rightCoordinate, 0) - ], pl4WaternetLineBottom.Points); + var soilProfile = new SoilProfile2D + { + Geometry = new GeometryData + { + Left = leftCoordinate, + Right = rightCoordinate, + Bottom = -35 + } + }; + soilProfile.Surfaces.Add(aquitard1); + soilProfile.Surfaces.Add(aquifer2A); + soilProfile.Surfaces.Add(aquifer2B); + soilProfile.Surfaces.Add(aquifer2C); + soilProfile.Surfaces.Add(aquitard3); + soilProfile.Surfaces.Add(aquifer4A); + soilProfile.Surfaces.Add(aquifer4B); + soilProfile.Surfaces.Add(aquifer4C); + soilProfile.Surfaces.Add(aquitard5); + soilProfile.Surfaces.Add(aquifer6A); + soilProfile.Surfaces.Add(aquifer6B); + soilProfile.Surfaces.Add(aquifer6C); + soilProfile.Surfaces.Add(aquifer7A); + soilProfile.Surfaces.Add(aquifer7B); + soilProfile.Surfaces.Add(aquifer7C); + soilProfile.Geometry.Surfaces.Add(new GeometrySurface()); + soilProfile.Geometry.SurfaceLine.CalcPoints.Add(new Point2D(leftCoordinate, 20)); + soilProfile.Geometry.SurfaceLine.CalcPoints.Add(new Point2D(rightCoordinate, 20)); + soilProfile.Geometry.SurfaceLine.SyncPoints(); - WaternetLine pl4WaternetLine2Top = waternet.WaternetLineList.Find(w => w.Name == "Waternet line in-between aquifer top (2)"); - Assert.That(pl4WaternetLine2Top.HeadLine, Is.SameAs(waternet.HeadLineList[indexHeadlinePl4])); - AssertGeometry([ - new Point2D(leftCoordinate, -10), - new Point2D(rightCoordinate, -10) - ], pl4WaternetLine2Top.Points); - - WaternetLine pl4WaternetLine2Bottom = waternet.WaternetLineList.Find(w => w.Name == "Waternet line in-between aquifer bottom (2)"); - Assert.That(pl4WaternetLine2Bottom.HeadLine, Is.SameAs(waternet.HeadLineList[indexHeadlinePl4])); - AssertGeometry([ - new Point2D(leftCoordinate, -20), - new Point2D(rightCoordinate, -20) - ], pl4WaternetLine2Bottom.Points); + return soilProfile; } }