Index: DamEngine/trunk/src/Deltares.DamEngine.Calculators/PlLinesCreator/PlLinesCreator.cs =================================================================== diff -u -r4540 -r4934 --- DamEngine/trunk/src/Deltares.DamEngine.Calculators/PlLinesCreator/PlLinesCreator.cs (.../PlLinesCreator.cs) (revision 4540) +++ DamEngine/trunk/src/Deltares.DamEngine.Calculators/PlLinesCreator/PlLinesCreator.cs (.../PlLinesCreator.cs) (revision 4934) @@ -741,7 +741,7 @@ GeometryPoint characteristicGeometryPoint = SurfaceLine.CharacteristicPoints.GetGeometryPoint(characteristicPointType); SoilProfile1D actualSoilProfile = GetSoilProfileBelowPoint(characteristicGeometryPoint.X); - double bottomLevel = actualSoilProfile.GetTopLevelOfHighestAquifer(); + double bottomLevel = actualSoilProfile.GetHighestAquifer().TopLevel; double topLevel = characteristicGeometryPoint.Z; return topLevel - bottomLevel; } Index: DamEngine/trunk/src/Deltares.DamEngine.Calculators/KernelWrappers/MacroStabilityCommon/PlLinesToWaternetConverter.cs =================================================================== diff -u -r4928 -r4934 --- DamEngine/trunk/src/Deltares.DamEngine.Calculators/KernelWrappers/MacroStabilityCommon/PlLinesToWaternetConverter.cs (.../PlLinesToWaternetConverter.cs) (revision 4928) +++ DamEngine/trunk/src/Deltares.DamEngine.Calculators/KernelWrappers/MacroStabilityCommon/PlLinesToWaternetConverter.cs (.../PlLinesToWaternetConverter.cs) (revision 4934) @@ -38,7 +38,8 @@ { BottomAquifer, TopLayerInBetweenAquiferCluster, - BottomLayerInBetweenAquiferCluster + BottomLayerInBetweenAquiferCluster, + HighestAquifer } private const double epsilon = 1e-9; @@ -74,17 +75,7 @@ if (plLine != null && !IsBelowSoilProfile(soilProfile1D, plLine)) { waternet.PhreaticLine = CreateLine(plLine, headLine1Name); - WaternetLine waternetLine; - if (pressureType == IntrusionVerticalWaterPressureType.Linear) - { - List coordinates = surfaceLine.Points.Select(point => new Point2D(point.X, point.Z)).ToList(); - waternetLine = CreateWaternetLine(coordinates); - } - else - { - double level = soilProfile1D.GetLayerAt(headLine.GetMinZ()).BottomLevel; - waternetLine = CreateWaternetLine(level, xLeft, xRight); - } + WaternetLine waternetLine = CreateWaternetLineForPhreaticLine(soilProfile1D, surfaceLine, headLine, xLeft, xRight, pressureType); waternetLine.Name = waternetLine1Name; waternetLine.HeadLine = headLine; waternetLine.HeadLine.SyncCalcPoints(); @@ -395,7 +386,7 @@ if (currentAquifer != null) { previousAquiferLayer = currentAquifer; - coordinates.Add(layerType is LayerType.BottomAquifer or LayerType.TopLayerInBetweenAquiferCluster ? new Point2D(xCoordinate, currentAquifer.TopLevel) : new Point2D(xCoordinate, currentAquifer.BottomLevel)); + coordinates.Add(layerType is LayerType.BottomLayerInBetweenAquiferCluster? new Point2D(xCoordinate, currentAquifer.BottomLevel) : new Point2D(xCoordinate, currentAquifer.TopLevel)); } } @@ -425,20 +416,85 @@ return soilProfile1D.GetInBetweenAquiferClusters[indexInBetweenAquifer].Item1; case LayerType.BottomLayerInBetweenAquiferCluster: return soilProfile1D.GetInBetweenAquiferClusters[indexInBetweenAquifer].Item2; + case LayerType.HighestAquifer: + return soilProfile1D.GetHighestAquifer(); } return null; } + /// + /// The position of the waternet line associated to the phreatic line depends on the water pressure type: + /// - For DAM Standard type, this line lies on the bottom of the soil layers “in which the phreatic plane lies”. + /// - For Linear type, it is the surface line. + /// - For Hydrostatic type, it is the top of the highest aquifer. + /// + /// + /// + /// + /// + /// + /// + /// + private static WaternetLine CreateWaternetLineForPhreaticLine(SoilProfile1D soilProfile1D, GeometryPointString surfaceLine, HeadLine phreaticLine, double xLeft, double xRight, IntrusionVerticalWaterPressureType? pressureType) + { + if (pressureType == IntrusionVerticalWaterPressureType.Linear) + { + List coordinates = surfaceLine.Points.Select(point => new Point2D(point.X, point.Z)).ToList(); + return CreateWaternetLine(coordinates); + } + + if (pressureType == IntrusionVerticalWaterPressureType.HydroStatic) + { + double topAquiferLevel = soilProfile1D.GetHighestAquifer().TopLevel; + return CreateWaternetLine(topAquiferLevel, xLeft, xRight); + } + + double level = soilProfile1D.GetLayerAt(phreaticLine.GetMinZ()).BottomLevel; + return CreateWaternetLine(level, xLeft, xRight); + + } + + /// + /// The position of the waternet line associated to the phreatic line depends on the water pressure type: + /// - For DAM Standard type, this line lies on the bottom of the soil layers “in which the phreatic plane lies”. + /// - For Linear type, it is the surface line. + /// - For Hydrostatic type, it is the top of the highest aquifer. + /// + /// + /// + /// + /// + /// private static WaternetLine CreateWaternetLineForPhreaticLine(SoilProfile2D soilProfile2D, PlLine plLine, IntrusionVerticalWaterPressureType? pressureType) { - if (pressureType != IntrusionVerticalWaterPressureType.Linear) + switch (pressureType) { - return CreateWaternetLineForPhreaticLineForDamStandard(soilProfile2D, plLine); + case IntrusionVerticalWaterPressureType.HydroStatic: + { + double[] xCoordinates = DetermineAllXCoordinatesOfSoilProfile(soilProfile2D); + Point2D[] highestAquiferCoordinates = DetermineLayerBoundaryCoordinates(LayerType.HighestAquifer, xCoordinates, soilProfile2D).ToArray(); + return CreateWaternetLine(highestAquiferCoordinates); + } + case IntrusionVerticalWaterPressureType.Linear: + { + List coordinates = soilProfile2D.Geometry.SurfaceLine.Points.Select(point => new Point2D(point.X, point.Z)).ToList(); + return CreateWaternetLine(coordinates); + } + case IntrusionVerticalWaterPressureType.Standard: + break; + case IntrusionVerticalWaterPressureType.FullHydroStatic: + break; + case IntrusionVerticalWaterPressureType.SemiTimeDependent: + break; + case null: + break; + default: + throw new ArgumentOutOfRangeException(nameof(pressureType), pressureType, null); } - List coordinates = soilProfile2D.Geometry.SurfaceLine.Points.Select(point => new Point2D(point.X, point.Z)).ToList(); - return CreateWaternetLine(coordinates); + return CreateWaternetLineForPhreaticLineForDamStandard(soilProfile2D, plLine); + } /// Index: DamEngine/trunk/src/Deltares.DamEngine.Calculators.Tests/KernelWrappers/MacroStabilityCommon/PlLinesToWaternetConverterTests.cs =================================================================== diff -u -r4928 -r4934 --- DamEngine/trunk/src/Deltares.DamEngine.Calculators.Tests/KernelWrappers/MacroStabilityCommon/PlLinesToWaternetConverterTests.cs (.../PlLinesToWaternetConverterTests.cs) (revision 4928) +++ DamEngine/trunk/src/Deltares.DamEngine.Calculators.Tests/KernelWrappers/MacroStabilityCommon/PlLinesToWaternetConverterTests.cs (.../PlLinesToWaternetConverterTests.cs) (revision 4934) @@ -82,6 +82,7 @@ [TestCase(IntrusionVerticalWaterPressureType.Standard, -2.110)] [TestCase(IntrusionVerticalWaterPressureType.Linear, 1.212)] + [TestCase(IntrusionVerticalWaterPressureType.HydroStatic, -2.110)] public void TestConvertPlLinesToWaternet_1DSoilProfile(IntrusionVerticalWaterPressureType? pressureType, double levelWaternetPl1) { PlLines plLines = CreatePlLinesForTest(); @@ -442,6 +443,7 @@ /// [TestCase(IntrusionVerticalWaterPressureType.Standard, -9.999)] [TestCase(IntrusionVerticalWaterPressureType.Linear, 0)] + [TestCase(IntrusionVerticalWaterPressureType.HydroStatic, -9.999)] public void CreateWaternetBasedOnPlLines_ValidPLLinesAndSoilProfile2DWithContinuousInBetweenAquiferLayerConsistOfOnePart_ReturnsExpectedWaternet(IntrusionVerticalWaterPressureType? pressureType, double levelWaternetPl1) { // Setup Index: DamEngine/trunk/src/Deltares.DamEngine.Data.Tests/Geotechnics/SoilProfile1DTests.cs =================================================================== diff -u -r4927 -r4934 --- DamEngine/trunk/src/Deltares.DamEngine.Data.Tests/Geotechnics/SoilProfile1DTests.cs (.../SoilProfile1DTests.cs) (revision 4927) +++ DamEngine/trunk/src/Deltares.DamEngine.Data.Tests/Geotechnics/SoilProfile1DTests.cs (.../SoilProfile1DTests.cs) (revision 4934) @@ -44,6 +44,8 @@ { Assert.That(soilProfile1D.GetInBetweenAquiferClusters, Is.Empty); Assert.That(soilProfile1D.InBetweenAquiferLayer, Is.Null); + Assert.That(soilProfile1D.GetHighestAquifer().TopLevel, Is.EqualTo(topLevelLayer3)); + Assert.That(soilProfile1D.GetHighestAquifer().BottomLevel, Is.EqualTo(topLevelLayer4)); Assert.That(soilProfile1D.BottomAquiferLayer.TopLevel, Is.EqualTo(topLevelLayer3)); Assert.That(soilProfile1D.BottomAquiferLayer.BottomLevel, Is.EqualTo(topLevelLayer4)); }); @@ -54,6 +56,8 @@ { Assert.That(soilProfile1D.GetInBetweenAquiferClusters, Is.Empty); Assert.That(soilProfile1D.InBetweenAquiferLayer, Is.Null); + Assert.That(soilProfile1D.GetHighestAquifer().TopLevel, Is.EqualTo(topLevelLayer5)); + Assert.That(soilProfile1D.GetHighestAquifer().BottomLevel, Is.EqualTo(topLevelLayer6)); Assert.That(soilProfile1D.BottomAquiferLayer.TopLevel, Is.EqualTo(topLevelLayer5)); Assert.That(soilProfile1D.BottomAquiferLayer.BottomLevel, Is.EqualTo(topLevelLayer6)); }); @@ -64,6 +68,8 @@ { Assert.That(soilProfile1D.GetInBetweenAquiferClusters, Is.Empty); Assert.That(soilProfile1D.InBetweenAquiferLayer, Is.Null); + Assert.That(soilProfile1D.GetHighestAquifer().TopLevel, Is.EqualTo(topLevelLayer1)); + Assert.That(soilProfile1D.GetHighestAquifer().BottomLevel, Is.EqualTo(topLevelLayer2)); Assert.That(soilProfile1D.BottomAquiferLayer.TopLevel, Is.EqualTo(topLevelLayer1)); Assert.That(soilProfile1D.BottomAquiferLayer.BottomLevel, Is.EqualTo(topLevelLayer2)); }); @@ -74,6 +80,7 @@ { Assert.That(soilProfile1D.GetInBetweenAquiferClusters, Is.Empty); Assert.That(soilProfile1D.InBetweenAquiferLayer, Is.Null); + Assert.That(soilProfile1D.GetHighestAquifer(), Is.Null); Assert.That(soilProfile1D.BottomAquiferLayer, Is.Null); }); @@ -83,6 +90,8 @@ { Assert.That(soilProfile1D.GetInBetweenAquiferClusters, Is.Empty); Assert.That(soilProfile1D.InBetweenAquiferLayer, Is.Null); + Assert.That(soilProfile1D.GetHighestAquifer().TopLevel, Is.EqualTo(topLevelLayer3)); + Assert.That(soilProfile1D.GetHighestAquifer().BottomLevel, Is.EqualTo(topLevelLayer4)); Assert.That(soilProfile1D.BottomAquiferLayer.TopLevel, Is.EqualTo(topLevelLayer3)); Assert.That(soilProfile1D.BottomAquiferLayer.BottomLevel, Is.EqualTo(topLevelLayer4)); }); @@ -93,6 +102,8 @@ { Assert.That(soilProfile1D.GetInBetweenAquiferClusters, Is.Empty); Assert.That(soilProfile1D.InBetweenAquiferLayer, Is.Null); + Assert.That(soilProfile1D.GetHighestAquifer().TopLevel, Is.EqualTo(topLevelLayer4)); + Assert.That(soilProfile1D.GetHighestAquifer().BottomLevel, Is.EqualTo(topLevelLayer5)); Assert.That(soilProfile1D.BottomAquiferLayer.TopLevel, Is.EqualTo(topLevelLayer4)); Assert.That(soilProfile1D.BottomAquiferLayer.BottomLevel, Is.EqualTo(topLevelLayer5)); }); @@ -108,6 +119,8 @@ Assert.That(soilProfile1D.GetInBetweenAquiferClusters[1].Item2.BottomLevel, Is.EqualTo(topLevelLayer5)); Assert.That(soilProfile1D.InBetweenAquiferLayer.TopLevel, Is.EqualTo(topLevelLayer2)); Assert.That(soilProfile1D.InBetweenAquiferLayer.BottomLevel, Is.EqualTo(topLevelLayer3)); + Assert.That(soilProfile1D.GetHighestAquifer().TopLevel, Is.EqualTo(topLevelLayer2)); + Assert.That(soilProfile1D.GetHighestAquifer().BottomLevel, Is.EqualTo(topLevelLayer3)); Assert.That(soilProfile1D.BottomAquiferLayer.TopLevel, Is.EqualTo(topLevelLayer6)); Assert.That(soilProfile1D.BottomAquiferLayer.BottomLevel, Is.EqualTo(bottomLevelLayer6)); }); @@ -121,6 +134,8 @@ Assert.That(soilProfile1D.GetInBetweenAquiferClusters[0].Item2.BottomLevel, Is.EqualTo(topLevelLayer5)); Assert.That(soilProfile1D.InBetweenAquiferLayer.TopLevel, Is.EqualTo(topLevelLayer2)); Assert.That(soilProfile1D.InBetweenAquiferLayer.BottomLevel, Is.EqualTo(topLevelLayer3)); + Assert.That(soilProfile1D.GetHighestAquifer().TopLevel, Is.EqualTo(topLevelLayer2)); + Assert.That(soilProfile1D.GetHighestAquifer().BottomLevel, Is.EqualTo(topLevelLayer3)); Assert.That(soilProfile1D.BottomAquiferLayer.TopLevel, Is.EqualTo(topLevelLayer6)); Assert.That(soilProfile1D.BottomAquiferLayer.BottomLevel, Is.EqualTo(bottomLevelLayer6)); }); @@ -134,6 +149,8 @@ Assert.That(soilProfile1D.GetInBetweenAquiferClusters[0].Item2.BottomLevel, Is.EqualTo(topLevelLayer3)); Assert.That(soilProfile1D.InBetweenAquiferLayer.TopLevel, Is.EqualTo(topLevelLayer2)); Assert.That(soilProfile1D.InBetweenAquiferLayer.BottomLevel, Is.EqualTo(topLevelLayer3)); + Assert.That(soilProfile1D.GetHighestAquifer().TopLevel, Is.EqualTo(topLevelLayer2)); + Assert.That(soilProfile1D.GetHighestAquifer().BottomLevel, Is.EqualTo(topLevelLayer3)); Assert.That(soilProfile1D.BottomAquiferLayer.TopLevel, Is.EqualTo(topLevelLayer4)); Assert.That(soilProfile1D.BottomAquiferLayer.BottomLevel, Is.EqualTo(topLevelLayer5)); }); Index: DamEngine/trunk/src/Deltares.DamEngine.Data/Geotechnics/SoilProfile1D.cs =================================================================== diff -u -r4927 -r4934 --- DamEngine/trunk/src/Deltares.DamEngine.Data/Geotechnics/SoilProfile1D.cs (.../SoilProfile1D.cs) (revision 4927) +++ DamEngine/trunk/src/Deltares.DamEngine.Data/Geotechnics/SoilProfile1D.cs (.../SoilProfile1D.cs) (revision 4934) @@ -512,19 +512,19 @@ } /// - /// Gets the top level of highest aquifer. + /// Gets the highest aquifer. /// /// - public double GetTopLevelOfHighestAquifer() + public SoilLayer1D GetHighestAquifer() { - double topLevel; + SoilLayer1D topLevel; if (InBetweenAquiferLayer != null) { - topLevel = InBetweenAquiferLayer.TopLevel; + topLevel = InBetweenAquiferLayer; } else { - topLevel = BottomAquiferLayer.TopLevel; + topLevel = BottomAquiferLayer; } return topLevel;