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;
}
}