Index: DamEngine/trunk/src/Deltares.DamEngine.Calculators.Tests/KernelWrappers/MacroStabilityCommon/PlLinesToWaternetConverterTests.cs =================================================================== diff -u -r2978 -r2979 --- DamEngine/trunk/src/Deltares.DamEngine.Calculators.Tests/KernelWrappers/MacroStabilityCommon/PlLinesToWaternetConverterTests.cs (.../PlLinesToWaternetConverterTests.cs) (revision 2978) +++ DamEngine/trunk/src/Deltares.DamEngine.Calculators.Tests/KernelWrappers/MacroStabilityCommon/PlLinesToWaternetConverterTests.cs (.../PlLinesToWaternetConverterTests.cs) (revision 2979) @@ -724,6 +724,293 @@ } [Test] + public void ConvertPlLineToWaternet_ValidPLLinesAndSoilProfile2DWithContinuousInBetweenAquiferLayerRightLayerEnvelopedByLeftLayer_ReturnsExpectedWaternet() + { + // Setup + var random = new Random(21); + double leftCoordinate = random.NextDouble(); + double rightCoordinate = leftCoordinate + 1; + double penetrationLength = random.NextDouble(); + + var topLeftUpperLayer = new Point2D(leftCoordinate, 0); + var topRightUpperLayer = new Point2D(rightCoordinate, 0); + var bottomRightUpperLayer = new Point2D(rightCoordinate, -15); + var bottomIntermediateLowerUpperLayer = new Point2D(rightCoordinate / 2, -15); + var bottomIntermediateUpperUpperLayer = new Point2D(rightCoordinate / 2, -10); + var bottomLeftUpperLayer = new Point2D(leftCoordinate, -10); + var soilLayer = new SoilLayer2D + { + GeometrySurface = new GeometrySurface + { + OuterLoop = new GeometryLoop + { + CurveList = + { + new GeometryCurve(topLeftUpperLayer, topRightUpperLayer), + new GeometryCurve(topRightUpperLayer, bottomRightUpperLayer), + new GeometryCurve(bottomRightUpperLayer, bottomIntermediateLowerUpperLayer), + new GeometryCurve(bottomIntermediateLowerUpperLayer, bottomIntermediateUpperUpperLayer), + new GeometryCurve(bottomIntermediateUpperUpperLayer, bottomLeftUpperLayer), + new GeometryCurve(bottomLeftUpperLayer, topLeftUpperLayer) + } + } + } + }; + + var bottomRightInBetweenAquiferLayerLeft = new Point2D(rightCoordinate / 2, -20); + var bottomLeftInBetweenAquiferLayerLeft = new Point2D(leftCoordinate, -20); + SoilLayer2D soilLayerAquiferInBetweenLeft = CreateSoilLayer2D(bottomLeftUpperLayer, bottomIntermediateUpperUpperLayer, bottomRightInBetweenAquiferLayerLeft, bottomLeftInBetweenAquiferLayerLeft); + soilLayerAquiferInBetweenLeft.IsAquifer = true; + + var bottomRightInBetweenAquiferLayerRight = new Point2D(rightCoordinate, -17); + var bottomLeftInBetweenAquiferLayerRight = new Point2D(rightCoordinate / 2, -17); + SoilLayer2D soilLayerAquiferInBetweenRight = CreateSoilLayer2D(bottomIntermediateLowerUpperLayer, bottomRightUpperLayer, bottomRightInBetweenAquiferLayerRight, bottomLeftInBetweenAquiferLayerRight); + soilLayerAquiferInBetweenRight.IsAquifer = true; + + var bottomRightInBetweenLayer = new Point2D(rightCoordinate, -25); + var bottomLeftInBetweenLayer = new Point2D(leftCoordinate, -25); + var soilLayerInBetween = new SoilLayer2D + { + GeometrySurface = new GeometrySurface + { + OuterLoop = new GeometryLoop + { + CurveList = + { + new GeometryCurve(bottomLeftInBetweenAquiferLayerLeft, bottomRightInBetweenAquiferLayerLeft), + new GeometryCurve(bottomRightInBetweenAquiferLayerLeft, bottomLeftInBetweenAquiferLayerRight), + new GeometryCurve(bottomLeftInBetweenAquiferLayerRight, bottomRightInBetweenAquiferLayerRight), + new GeometryCurve(bottomRightInBetweenAquiferLayerRight, bottomRightInBetweenLayer), + new GeometryCurve(bottomRightInBetweenLayer, bottomLeftInBetweenLayer), + new GeometryCurve(bottomLeftInBetweenLayer, bottomLeftInBetweenAquiferLayerLeft) + } + } + } + }; + + var topRightBottomAquiferLayer = new Point2D(rightCoordinate, -25); + var bottomRightBottomAquiferLayer = new Point2D(rightCoordinate, -30); + var bottomLeftBottomAquiferLayer = new Point2D(leftCoordinate, -30); + SoilLayer2D soilLayerAquiferBottom = CreateSoilLayer2D(bottomLeftInBetweenLayer, topRightBottomAquiferLayer, bottomRightBottomAquiferLayer, bottomLeftBottomAquiferLayer); + soilLayerAquiferBottom.IsAquifer = true; + + var soilProfile = new SoilProfile2D + { + Geometry = new GeometryData + { + Left = leftCoordinate, + Right = rightCoordinate, + Bottom = -20 + } + }; + soilProfile.Surfaces.Add(soilLayer); + soilProfile.Surfaces.Add(soilLayerAquiferInBetweenLeft); + soilProfile.Surfaces.Add(soilLayerAquiferInBetweenRight); + soilProfile.Surfaces.Add(soilLayerInBetween); + soilProfile.Surfaces.Add(soilLayerAquiferBottom); + + var plLines = new PlLines(); + PlLine plLine = plLines.Lines[PlLineType.Pl1]; + plLine.Points.Add(new PlLinePoint(leftCoordinate, -5)); + plLine.Points.Add(new PlLinePoint(rightCoordinate, -5)); + + plLine = plLines.Lines[PlLineType.Pl2]; + plLine.Points.Add(new PlLinePoint(leftCoordinate, -6)); + plLine.Points.Add(new PlLinePoint(rightCoordinate, -6)); + + plLine = plLines.Lines[PlLineType.Pl3]; + plLine.Points.Add(new PlLinePoint(leftCoordinate, -7)); + plLine.Points.Add(new PlLinePoint(rightCoordinate, -7)); + + plLine = plLines.Lines[PlLineType.Pl4]; + plLine.Points.Add(new PlLinePoint(leftCoordinate, -8)); + plLine.Points.Add(new PlLinePoint(rightCoordinate, -8)); + + // Call + Waternet waternet = PlLinesToWaternetConverter.ConvertPlLineToWaternet(plLines, soilProfile, penetrationLength); + + // Assert + AssertGeometry(plLines.Lines[PlLineType.Pl1].Points, waternet.PhreaticLine.Points); + + Assert.AreEqual(3, waternet.HeadLineList.Count); + AssertGeometry(plLines.Lines[PlLineType.Pl2].Points, waternet.HeadLineList[0].Points); + AssertGeometry(plLines.Lines[PlLineType.Pl3].Points, waternet.HeadLineList[1].Points); + AssertGeometry(plLines.Lines[PlLineType.Pl4].Points, waternet.HeadLineList[2].Points); + + Assert.AreEqual(3, waternet.WaternetLineList.Count); + + var expectedBottomAquiferCoordinates = new[] + { + new GeometryPoint(leftCoordinate, -25), + new GeometryPoint(rightCoordinate / 2, -25), + new GeometryPoint(rightCoordinate, -25) + }; + + WaternetLine pl2WaternetLine = waternet.WaternetLineList[0]; + Assert.AreSame(waternet.HeadLineList[0], pl2WaternetLine.HeadLine); + var offSetAquiferCoordinates = expectedBottomAquiferCoordinates.Select(aquiferCoordinate => new GeometryPoint(aquiferCoordinate.X, aquiferCoordinate.Z + penetrationLength)) + .ToArray(); + AssertGeometry(offSetAquiferCoordinates, pl2WaternetLine.Points); + + WaternetLine pl3WaternetLine = waternet.WaternetLineList[1]; + Assert.AreSame(waternet.HeadLineList[1], pl3WaternetLine.HeadLine); + AssertGeometry(expectedBottomAquiferCoordinates, pl3WaternetLine.Points); + + WaternetLine pl4WaternetLine = waternet.WaternetLineList[2]; + Assert.AreSame(waternet.HeadLineList[2], pl4WaternetLine.HeadLine); + AssertGeometry(new[] + { + new GeometryPoint(leftCoordinate, -10), + new GeometryPoint(rightCoordinate / 2, -10), + new GeometryPoint(rightCoordinate, -15) + }, pl4WaternetLine.Points); + } + + + [Test] + public void ConvertPlLineToWaternet_ValidPLLinesAndSoilProfile2DWithContinuousInBetweenAquiferLayerRightLayerEnvelopesLeftLayer_ReturnsExpectedWaternet() + { + // Setup + var random = new Random(21); + double leftCoordinate = random.NextDouble(); + double rightCoordinate = leftCoordinate + 1; + double penetrationLength = random.NextDouble(); + + var topLeftUpperLayer = new Point2D(leftCoordinate, 0); + var topRightUpperLayer = new Point2D(rightCoordinate, 0); + var bottomRightUpperLayer = new Point2D(rightCoordinate, -5); + var bottomIntermediateLowerUpperLayer = new Point2D(rightCoordinate / 2, -5); + var bottomIntermediateUpperUpperLayer = new Point2D(rightCoordinate / 2, -10); + var bottomLeftUpperLayer = new Point2D(leftCoordinate, -10); + var soilLayer = new SoilLayer2D + { + GeometrySurface = new GeometrySurface + { + OuterLoop = new GeometryLoop + { + CurveList = + { + new GeometryCurve(topLeftUpperLayer, topRightUpperLayer), + new GeometryCurve(topRightUpperLayer, bottomRightUpperLayer), + new GeometryCurve(bottomRightUpperLayer, bottomIntermediateLowerUpperLayer), + new GeometryCurve(bottomIntermediateLowerUpperLayer, bottomIntermediateUpperUpperLayer), + new GeometryCurve(bottomIntermediateUpperUpperLayer, bottomLeftUpperLayer), + new GeometryCurve(bottomLeftUpperLayer, topLeftUpperLayer) + } + } + } + }; + + var bottomRightInBetweenAquiferLayerLeft = new Point2D(rightCoordinate / 2, -20); + var bottomLeftInBetweenAquiferLayerLeft = new Point2D(leftCoordinate, -20); + SoilLayer2D soilLayerAquiferInBetweenLeft = CreateSoilLayer2D(bottomLeftUpperLayer, bottomIntermediateUpperUpperLayer, bottomRightInBetweenAquiferLayerLeft, bottomLeftInBetweenAquiferLayerLeft); + soilLayerAquiferInBetweenLeft.IsAquifer = true; + + var bottomRightInBetweenAquiferLayerRight = new Point2D(rightCoordinate, -21); + var bottomLeftInBetweenAquiferLayerRight = new Point2D(rightCoordinate / 2, -21); + SoilLayer2D soilLayerAquiferInBetweenRight = CreateSoilLayer2D(bottomIntermediateLowerUpperLayer, bottomRightUpperLayer, bottomRightInBetweenAquiferLayerRight, bottomLeftInBetweenAquiferLayerRight); + soilLayerAquiferInBetweenRight.IsAquifer = true; + + var bottomRightInBetweenLayer = new Point2D(rightCoordinate, -25); + var bottomLeftInBetweenLayer = new Point2D(leftCoordinate, -25); + var soilLayerInBetween = new SoilLayer2D + { + GeometrySurface = new GeometrySurface + { + OuterLoop = new GeometryLoop + { + CurveList = + { + new GeometryCurve(bottomLeftInBetweenAquiferLayerLeft, bottomRightInBetweenAquiferLayerLeft), + new GeometryCurve(bottomRightInBetweenAquiferLayerLeft, bottomLeftInBetweenAquiferLayerRight), + new GeometryCurve(bottomLeftInBetweenAquiferLayerRight, bottomRightInBetweenAquiferLayerRight), + new GeometryCurve(bottomRightInBetweenAquiferLayerRight, bottomRightInBetweenLayer), + new GeometryCurve(bottomRightInBetweenLayer, bottomLeftInBetweenLayer), + new GeometryCurve(bottomLeftInBetweenLayer, bottomLeftInBetweenAquiferLayerLeft) + } + } + } + }; + + var topRightBottomAquiferLayer = new Point2D(rightCoordinate, -25); + var bottomRightBottomAquiferLayer = new Point2D(rightCoordinate, -30); + var bottomLeftBottomAquiferLayer = new Point2D(leftCoordinate, -30); + SoilLayer2D soilLayerAquiferBottom = CreateSoilLayer2D(bottomLeftInBetweenLayer, topRightBottomAquiferLayer, bottomRightBottomAquiferLayer, bottomLeftBottomAquiferLayer); + soilLayerAquiferBottom.IsAquifer = true; + + var soilProfile = new SoilProfile2D + { + Geometry = new GeometryData + { + Left = leftCoordinate, + Right = rightCoordinate, + Bottom = -20 + } + }; + soilProfile.Surfaces.Add(soilLayer); + soilProfile.Surfaces.Add(soilLayerAquiferInBetweenLeft); + soilProfile.Surfaces.Add(soilLayerAquiferInBetweenRight); + soilProfile.Surfaces.Add(soilLayerInBetween); + soilProfile.Surfaces.Add(soilLayerAquiferBottom); + + var plLines = new PlLines(); + PlLine plLine = plLines.Lines[PlLineType.Pl1]; + plLine.Points.Add(new PlLinePoint(leftCoordinate, -5)); + plLine.Points.Add(new PlLinePoint(rightCoordinate, -5)); + + plLine = plLines.Lines[PlLineType.Pl2]; + plLine.Points.Add(new PlLinePoint(leftCoordinate, -6)); + plLine.Points.Add(new PlLinePoint(rightCoordinate, -6)); + + plLine = plLines.Lines[PlLineType.Pl3]; + plLine.Points.Add(new PlLinePoint(leftCoordinate, -7)); + plLine.Points.Add(new PlLinePoint(rightCoordinate, -7)); + + plLine = plLines.Lines[PlLineType.Pl4]; + plLine.Points.Add(new PlLinePoint(leftCoordinate, -8)); + plLine.Points.Add(new PlLinePoint(rightCoordinate, -8)); + + // Call + Waternet waternet = PlLinesToWaternetConverter.ConvertPlLineToWaternet(plLines, soilProfile, penetrationLength); + + // Assert + AssertGeometry(plLines.Lines[PlLineType.Pl1].Points, waternet.PhreaticLine.Points); + + Assert.AreEqual(3, waternet.HeadLineList.Count); + AssertGeometry(plLines.Lines[PlLineType.Pl2].Points, waternet.HeadLineList[0].Points); + AssertGeometry(plLines.Lines[PlLineType.Pl3].Points, waternet.HeadLineList[1].Points); + AssertGeometry(plLines.Lines[PlLineType.Pl4].Points, waternet.HeadLineList[2].Points); + + Assert.AreEqual(3, waternet.WaternetLineList.Count); + + var expectedBottomAquiferCoordinates = new[] + { + new GeometryPoint(leftCoordinate, -25), + new GeometryPoint(rightCoordinate / 2, -25), + new GeometryPoint(rightCoordinate, -25) + }; + + WaternetLine pl2WaternetLine = waternet.WaternetLineList[0]; + Assert.AreSame(waternet.HeadLineList[0], pl2WaternetLine.HeadLine); + var offSetAquiferCoordinates = expectedBottomAquiferCoordinates.Select(aquiferCoordinate => new GeometryPoint(aquiferCoordinate.X, aquiferCoordinate.Z + penetrationLength)) + .ToArray(); + AssertGeometry(offSetAquiferCoordinates, pl2WaternetLine.Points); + + WaternetLine pl3WaternetLine = waternet.WaternetLineList[1]; + Assert.AreSame(waternet.HeadLineList[1], pl3WaternetLine.HeadLine); + AssertGeometry(expectedBottomAquiferCoordinates, pl3WaternetLine.Points); + + WaternetLine pl4WaternetLine = waternet.WaternetLineList[2]; + Assert.AreSame(waternet.HeadLineList[2], pl4WaternetLine.HeadLine); + AssertGeometry(new[] + { + new GeometryPoint(leftCoordinate, -10), + new GeometryPoint(rightCoordinate / 2, -5), + new GeometryPoint(rightCoordinate, -5) + }, pl4WaternetLine.Points); + } + + [Test] [TestCase(true, false)] [TestCase(false, true)] public void ConvertPlLineToWaternet_ValidPLLinesAndSoilProfile2DWithDiscontinuousInBetweenAquiferLayer_ReturnsExpectedWaternet(