Index: DamEngine/trunk/src/Deltares.DamEngine.Calculators/KernelWrappers/MacroStabilityCommon/PlLinesToWaternetConverter.cs =================================================================== diff -u -r5252 -r5268 --- DamEngine/trunk/src/Deltares.DamEngine.Calculators/KernelWrappers/MacroStabilityCommon/PlLinesToWaternetConverter.cs (.../PlLinesToWaternetConverter.cs) (revision 5252) +++ DamEngine/trunk/src/Deltares.DamEngine.Calculators/KernelWrappers/MacroStabilityCommon/PlLinesToWaternetConverter.cs (.../PlLinesToWaternetConverter.cs) (revision 5268) @@ -61,21 +61,22 @@ /// /// The pl lines. /// The 1D soil profile. - /// The points of the surface line. + /// The surface line. /// Length of the penetration. - /// Left side of the 2D profile. - /// Right side of the 2D profile. /// The type of distribution of the vertical water pressures. /// A . /// Thrown when , or /// is null. - public static Waternet CreateWaternetBasedOnPlLines(PlLines plLines, SoilProfile1D soilProfile1D, GeometryPointString surfaceLine, - double penetrationLength, double xLeft, double xRight, IntrusionVerticalWaterPressureType? pressureType) + public static Waternet CreateWaternetBasedOnPlLines(PlLines plLines, SoilProfile1D soilProfile1D, SurfaceLine2 surfaceLine, + double penetrationLength, IntrusionVerticalWaterPressureType? pressureType) { ThrowWhenPlLinesIsNull(plLines); ThrowWhenSoilProfileIsNull(soilProfile1D); ThrowWhenSurfaceLineIsNull(surfaceLine); + double xLeft = surfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.SurfaceLevelOutside).X; + double xRight = surfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.SurfaceLevelInside).X; + if (soilProfile1D.BottomAquiferLayer == null) { throw new NoNullAllowedException(string.Format(Resources.NoBottomAquiferLayer, soilProfile1D.Name)); @@ -88,7 +89,7 @@ if (plLine != null && !IsBelowSoilProfile(soilProfile1D, plLine)) { waternet.PhreaticLine = CreateLine(plLine, headLine1Name); - WaternetLine waternetLine = CreateWaternetLineForPhreaticLine(soilProfile1D, surfaceLine, headLine, xLeft, xRight, pressureType); + WaternetLine waternetLine = CreateWaternetLineForPhreaticLine(soilProfile1D, surfaceLine.Geometry, headLine, xLeft, xRight, pressureType); waternetLine.Name = waternetLine1Name; waternetLine.HeadLine = headLine; waternetLine.HeadLine.SyncCalcPoints(); @@ -693,7 +694,7 @@ /// /// The surface line. /// - private static void ThrowWhenSurfaceLineIsNull(GeometryPointString surfaceLine) + private static void ThrowWhenSurfaceLineIsNull(SurfaceLine2 surfaceLine) { if (surfaceLine == null) { Index: DamEngine/trunk/src/Deltares.DamEngine.Calculators.Tests/KernelWrappers/MacroStabilityCommon/PlLinesToWaternetConverterTests.cs =================================================================== diff -u -r5252 -r5268 --- DamEngine/trunk/src/Deltares.DamEngine.Calculators.Tests/KernelWrappers/MacroStabilityCommon/PlLinesToWaternetConverterTests.cs (.../PlLinesToWaternetConverterTests.cs) (revision 5252) +++ DamEngine/trunk/src/Deltares.DamEngine.Calculators.Tests/KernelWrappers/MacroStabilityCommon/PlLinesToWaternetConverterTests.cs (.../PlLinesToWaternetConverterTests.cs) (revision 5268) @@ -94,7 +94,7 @@ public void GivenPlLinesFullyDefinedAtOrBelowBottomSoil1DProfile_WhenCreatingWaternetBasedOnPlLinesAnd1DSoilProfile_ThenReturnsEmptyWaternet(double offsetFromBottomOfProfile) { // Setup - SoilProfile1D soilProfile = CreateSoilProfile1DWithTwoClustersOfInBetweenAquifers(out GeometryPointString surfaceLine); + SoilProfile1D soilProfile = CreateSoilProfile1DWithTwoClustersOfInBetweenAquifers(out SurfaceLine2 surfaceLine); double bottomLevel = soilProfile.BottomLevel; double plLineZCoordinate = bottomLevel - offsetFromBottomOfProfile; @@ -116,7 +116,7 @@ plLine.Points.Add(new PlLinePoint(rightCoordinate, plLineZCoordinate)); // Call - Waternet waternet = PlLinesToWaternetConverter.CreateWaternetBasedOnPlLines(plLines, soilProfile, surfaceLine, penetrationLength, leftCoordinate, rightCoordinate, IntrusionVerticalWaterPressureType.Standard); + Waternet waternet = PlLinesToWaternetConverter.CreateWaternetBasedOnPlLines(plLines, soilProfile, surfaceLine, penetrationLength, IntrusionVerticalWaterPressureType.Standard); Assert.Multiple(() => { @@ -129,7 +129,7 @@ public class Given1DSoilProfileWithTwoClustersOfInBetweenAquifers { - private static GeometryPointString surfaceLine; + private static SurfaceLine2 surfaceLine; private readonly SoilProfile1D soilProfile1D = CreateSoilProfile1DWithTwoClustersOfInBetweenAquifers(out surfaceLine); [TestCase(IntrusionVerticalWaterPressureType.Standard, -2.110, 6)] @@ -153,9 +153,7 @@ }); const double penetrateLength = 2.1; - const double left = 0; - const double right = 100; - Waternet waternet = PlLinesToWaternetConverter.CreateWaternetBasedOnPlLines(plLines, soilProfile1D, surfaceLine, penetrateLength, left, right, pressureType); + Waternet waternet = PlLinesToWaternetConverter.CreateWaternetBasedOnPlLines(plLines, soilProfile1D, surfaceLine, penetrateLength, pressureType); // Pl 1 is the phreatic line and gets waternet line to bottom level of the deepest layer where PL 1 lies // Pl 2 gets waternet line to level of BottomAquiferLayer.TopLevel + penetrationLength @@ -294,7 +292,7 @@ const double penetrateLength = 2.1; const double left = 0; const double right = 100; - Waternet waternet = PlLinesToWaternetConverter.CreateWaternetBasedOnPlLines(plLines, soilProfile1D, surfaceLine, penetrateLength, left, right, pressureType); + Waternet waternet = PlLinesToWaternetConverter.CreateWaternetBasedOnPlLines(plLines, soilProfile1D, surfaceLine, penetrateLength, pressureType); // Expected: waternet line connected to pl1 has level: // - for DAM Standard and Semi time dependent types, -6.111 m + 1 mm (Pl1 is in bottom aquifer) @@ -319,8 +317,8 @@ public void GivenNullPlLines_WhenCreatingWaternetBasedOnPlLinesAnd1DSoilProfile_ThenReturnsNoHeadLines() { PlLines plLines = CreateAllPlLines(); - SoilProfile1D soilProfile1D = CreateSoilProfile1DWithTwoClustersOfInBetweenAquifers(out GeometryPointString surfaceLine); - Waternet waternet = PlLinesToWaternetConverter.CreateWaternetBasedOnPlLines(plLines, soilProfile1D, surfaceLine, 0.5, 0, 0, IntrusionVerticalWaterPressureType.SemiTimeDependent); + SoilProfile1D soilProfile1D = CreateSoilProfile1DWithTwoClustersOfInBetweenAquifers(out SurfaceLine2 surfaceLine); + Waternet waternet = PlLinesToWaternetConverter.CreateWaternetBasedOnPlLines(plLines, soilProfile1D, surfaceLine, 0.5, IntrusionVerticalWaterPressureType.SemiTimeDependent); // head lines Assert.That(waternet.HeadLineList, Has.Count.EqualTo(3)); Assert.Multiple(() => @@ -335,7 +333,7 @@ // check that no headline are added when Pl2, Pl3 or Pl4 does not exist or has no points plLines.Lines[PlLineType.Pl3] = null; plLines.Lines[PlLineType.Pl4].Points.Clear(); - waternet = PlLinesToWaternetConverter.CreateWaternetBasedOnPlLines(plLines, soilProfile1D, surfaceLine, 0.5, 0, 0, IntrusionVerticalWaterPressureType.SemiTimeDependent); + waternet = PlLinesToWaternetConverter.CreateWaternetBasedOnPlLines(plLines, soilProfile1D, surfaceLine, 0.5, IntrusionVerticalWaterPressureType.SemiTimeDependent); // head lines Assert.That(waternet.HeadLineList, Has.Count.EqualTo(1)); Assert.Multiple(() => @@ -351,9 +349,9 @@ public void Given1DSoilProfileWithoutAquifer_WhenCreatingWaternetBasedOnPlLinesAnd1DSoilProfile_ThenReturnsException() { PlLines plLines = CreateAllPlLines(); - SoilProfile1D soilProfile1D = CreateSoilProfile1DWithTwoClustersOfInBetweenAquifers(out GeometryPointString surfaceLine); + SoilProfile1D soilProfile1D = CreateSoilProfile1DWithTwoClustersOfInBetweenAquifers(out SurfaceLine2 surfaceLine); const double penetrateLength = 2.1; - Waternet waternet = PlLinesToWaternetConverter.CreateWaternetBasedOnPlLines(plLines, soilProfile1D, surfaceLine, penetrateLength, 0, 0, IntrusionVerticalWaterPressureType.SemiTimeDependent); + Waternet waternet = PlLinesToWaternetConverter.CreateWaternetBasedOnPlLines(plLines, soilProfile1D, surfaceLine, penetrateLength, IntrusionVerticalWaterPressureType.SemiTimeDependent); Assert.Multiple(() => { Assert.That(waternet.HeadLineList, Has.Count.EqualTo(3)); @@ -362,7 +360,7 @@ // check that no waternet lines are added for pl4 when InBetweenAquiferLayer is null soilProfile1D = CreateSoilProfile1DWith1AquiferForTest(); - waternet = PlLinesToWaternetConverter.CreateWaternetBasedOnPlLines(plLines, soilProfile1D, surfaceLine, penetrateLength, 0, 0, IntrusionVerticalWaterPressureType.SemiTimeDependent); + waternet = PlLinesToWaternetConverter.CreateWaternetBasedOnPlLines(plLines, soilProfile1D, surfaceLine, penetrateLength, IntrusionVerticalWaterPressureType.SemiTimeDependent); Assert.Multiple(() => { Assert.That(waternet.HeadLineList, Has.Count.EqualTo(3)); @@ -380,7 +378,7 @@ // check that an exception is raised when no aquifer present soilProfile1D = CreateSoilProfile1DWithoutAquifersForTest(); - Assert.That(() => PlLinesToWaternetConverter.CreateWaternetBasedOnPlLines(plLines, soilProfile1D, surfaceLine, penetrationLength, 0, 0, IntrusionVerticalWaterPressureType.Standard), + Assert.That(() => PlLinesToWaternetConverter.CreateWaternetBasedOnPlLines(plLines, soilProfile1D, surfaceLine, penetrationLength, IntrusionVerticalWaterPressureType.Standard), Throws.InstanceOf().With.Message.EqualTo("The deepest layer is not an aquifer in soilprofile 'DefaultNameSoilProfile1D'.")); } @@ -1310,15 +1308,15 @@ public void GivenSoilProfile1DIsNull_WhenCreatingWaternetBasedOnPlLinesAndOn1DProfile_ThenLanguageNLThrowsException() { var plLines = new PlLines(); - Assert.That(() => PlLinesToWaternetConverter.CreateWaternetBasedOnPlLines(plLines, null, null, 0, 0, 0, IntrusionVerticalWaterPressureType.Standard), Throws.InstanceOf().With.Message.EqualTo("Geen ondergrond profiel gedefinieerd")); + Assert.That(() => PlLinesToWaternetConverter.CreateWaternetBasedOnPlLines(plLines, null, null, 0, IntrusionVerticalWaterPressureType.Standard), Throws.InstanceOf().With.Message.EqualTo("Geen ondergrond profiel gedefinieerd")); } [Test] [SetUICulture("nl-NL")] public void GivenPlLinesIsNull_WhenCreatingWaternetBasedOnPlLinesAndOn1DProfile_ThenLanguageNLThrowsException() { var soilProfile1D = new SoilProfile1D(); - Assert.That(() => PlLinesToWaternetConverter.CreateWaternetBasedOnPlLines(null, soilProfile1D, null, 0, 0, 0, IntrusionVerticalWaterPressureType.Standard), Throws.InstanceOf().With.Message.EqualTo("Geen object voor pn-lijnen gedefinieerd")); + Assert.That(() => PlLinesToWaternetConverter.CreateWaternetBasedOnPlLines(null, soilProfile1D, null, 0, IntrusionVerticalWaterPressureType.Standard), Throws.InstanceOf().With.Message.EqualTo("Geen object voor pn-lijnen gedefinieerd")); } [Test] @@ -1327,7 +1325,7 @@ { var soilProfile1D = new SoilProfile1D(); var plLines = new PlLines(); - Assert.That(() => PlLinesToWaternetConverter.CreateWaternetBasedOnPlLines(plLines, soilProfile1D, null, 0, 0, 0, IntrusionVerticalWaterPressureType.Standard), Throws.InstanceOf().With.Message.EqualTo("Geen object voor maaiveld gedefinieerd")); + Assert.That(() => PlLinesToWaternetConverter.CreateWaternetBasedOnPlLines(plLines, soilProfile1D, null, 0, IntrusionVerticalWaterPressureType.Standard), Throws.InstanceOf().With.Message.EqualTo("Geen object voor maaiveld gedefinieerd")); } [Test] @@ -1482,12 +1480,12 @@ }); } - private static SoilProfile1D CreateSoilProfile1DWithTwoClustersOfInBetweenAquifers(out GeometryPointString surfaceLine) + private static SoilProfile1D CreateSoilProfile1DWithTwoClustersOfInBetweenAquifers(out SurfaceLine2 surfaceLine) { const double topLevel = 1.212; - surfaceLine = new GeometryPointString(); - surfaceLine.Points.Add(new PlLinePoint(0, topLevel)); - surfaceLine.Points.Add(new PlLinePoint(100, topLevel)); + surfaceLine = new SurfaceLine2(); + surfaceLine.EnsurePointOfType(0, topLevel, CharacteristicPointType.SurfaceLevelOutside); + surfaceLine.EnsurePointOfType(100, topLevel, CharacteristicPointType.SurfaceLevelInside); var soilProfile1D = new SoilProfile1D { Index: DamEngine/trunk/src/Deltares.DamEngine.Calculators/KernelWrappers/MacroStabilityCommon/MacroStabilityCommonHelper.cs =================================================================== diff -u -r5249 -r5268 --- DamEngine/trunk/src/Deltares.DamEngine.Calculators/KernelWrappers/MacroStabilityCommon/MacroStabilityCommonHelper.cs (.../MacroStabilityCommonHelper.cs) (revision 5249) +++ DamEngine/trunk/src/Deltares.DamEngine.Calculators/KernelWrappers/MacroStabilityCommon/MacroStabilityCommonHelper.cs (.../MacroStabilityCommonHelper.cs) (revision 5268) @@ -31,10 +31,10 @@ using Deltares.DamEngine.Calculators.Properties; using Deltares.DamEngine.Data.Design; using Deltares.DamEngine.Data.General; +using Deltares.DamEngine.Data.General.PlLines; using Deltares.DamEngine.Data.General.Results; using Deltares.DamEngine.Data.Geometry; using Deltares.DamEngine.Data.Geotechnics; -using Deltares.DamEngine.Data.Standard; using Deltares.DamEngine.Data.Standard.Calculation; using Deltares.DamEngine.Data.Standard.Language; using Deltares.DamEngine.Data.Standard.Logging; @@ -411,10 +411,38 @@ } /// - /// Combines the surfaceline with the SoilProfile2D. + /// Create the waternet using the 1D soil profile if available, otherwise the 2D soil profile. /// + /// + /// + /// The waternet. + public static Waternet CreateWaternet(DamKernelInput damKernelInput, PlLines plLines) + { + double penetrationLength = damKernelInput.Location.ModelParametersForPlLines.PenetrationLength; + IntrusionVerticalWaterPressureType? pressureType = damKernelInput.Location.IntrusionVerticalWaterPressure; + + if (damKernelInput.SubSoilScenario.SoilProfile2D == null) + { + return null; + } + + if (damKernelInput.SubSoilScenario.SoilProfile1D != null) + { + SurfaceLine2 surfaceLine = damKernelInput.Location.SurfaceLine; + SoilProfile1D soilProfile1D = damKernelInput.SubSoilScenario.SoilProfile2D.GetSoilProfile1D( + damKernelInput.Location.SurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DikeToeAtPolder).X); + return PlLinesToWaternetConverter.CreateWaternetBasedOnPlLines(plLines, soilProfile1D, surfaceLine, penetrationLength, pressureType); + } + + SoilProfile2D soilProfile2D = damKernelInput.SubSoilScenario.SoilProfile2D; + return PlLinesToWaternetConverter.CreateWaternetBasedOnPlLines(plLines, soilProfile2D, penetrationLength, pressureType); + } + + /// + /// Combines the surface line with the SoilProfile2D. + /// /// The sub soil scenario. - /// The surfaceline. + /// The surface line. /// The dike embankment soil. /// Thrown when no SoilProfile2D is defined private static void CombineSoilProfile2DWithSurfaceLine(SoilGeometryProbability subSoilScenario, SurfaceLine2 surfaceLine2, @@ -482,7 +510,6 @@ subSoilScenario.SoilProfile2D = soilProfile2DNew; subSoilScenario.SoilProfile2DName = soilProfile2DNew.Name; subSoilScenario.SoilProfileType = SoilProfileType.ProfileType2D; - subSoilScenario.SoilProfile1D = null; } } Index: DamEngine/trunk/src/Deltares.DamEngine.Calculators/KernelWrappers/MacroStabilityInwards/MacroStabilityInwardsKernelWrapper.cs =================================================================== diff -u -r5056 -r5268 --- DamEngine/trunk/src/Deltares.DamEngine.Calculators/KernelWrappers/MacroStabilityInwards/MacroStabilityInwardsKernelWrapper.cs (.../MacroStabilityInwardsKernelWrapper.cs) (revision 5056) +++ DamEngine/trunk/src/Deltares.DamEngine.Calculators/KernelWrappers/MacroStabilityInwards/MacroStabilityInwardsKernelWrapper.cs (.../MacroStabilityInwardsKernelWrapper.cs) (revision 5268) @@ -121,6 +121,8 @@ PlLines plLines = upliftHelper.DeterminePlLinesForStability(damKernelInput, useRiverLevelLow, out UpliftSituation upliftSituation); upliftSituation.IsUplift = upliftHelper.DetermineIsUplift(plLines, damKernelInput.Location, damKernelInput.SubSoilScenario); macroStabilityOutput.UpliftSituation = upliftSituation; + + Waternet waterNet = MacroStabilityCommonHelper.CreateWaternet(damKernelInput, plLines); var fillMacroStabilityWrapperFromEngine = new FillMacroStabilityWrapperInputFromEngine { @@ -146,11 +148,6 @@ FailureMechanismParametersMStab.MStabParameters.Model = model; - double penetrationLength = damKernelInput.Location.ModelParametersForPlLines.PenetrationLength; - SoilProfile2D soilProfile2D = damKernelInput.SubSoilScenario.SoilProfile2D; - IntrusionVerticalWaterPressureType? pressureType = damKernelInput.Location.IntrusionVerticalWaterPressure; - Waternet waterNet = PlLinesToWaternetConverter.CreateWaternetBasedOnPlLines(plLines, soilProfile2D, penetrationLength, pressureType); - macroStabilityInput.Input = fillMacroStabilityWrapperFromEngine.CreateMacroStabilityInput(damKernelInput, FailureMechanismParametersMStab.MStabParameters, waterNet); fileNameForCalculation = MacroStabilityCommonHelper.GetStabilityInputFileName(damKernelInput, iterationIndex, FailureMechanismParametersMStab.MStabParameters.Model); stabilityCalculator = new Calculator(macroStabilityInput.Input); Index: DamEngine/trunk/src/Deltares.DamEngine.Calculators/KernelWrappers/MacroStabilityOutwards/MacroStabilityOutwardsKernelWrapper.cs =================================================================== diff -u -r5055 -r5268 --- DamEngine/trunk/src/Deltares.DamEngine.Calculators/KernelWrappers/MacroStabilityOutwards/MacroStabilityOutwardsKernelWrapper.cs (.../MacroStabilityOutwardsKernelWrapper.cs) (revision 5055) +++ DamEngine/trunk/src/Deltares.DamEngine.Calculators/KernelWrappers/MacroStabilityOutwards/MacroStabilityOutwardsKernelWrapper.cs (.../MacroStabilityOutwardsKernelWrapper.cs) (revision 5268) @@ -101,9 +101,10 @@ damKernelInput.Location.GetDikeEmbankmentSoil()); const bool useRiverLevelLow = true; - //Determine pl Lines. + // Determine PL-lines and create waternet var upliftHelper = new UpliftHelper(); PlLines plLines = upliftHelper.DeterminePlLinesForStability(damKernelInput, useRiverLevelLow, out _); + Waternet waterNet = MacroStabilityCommonHelper.CreateWaternet(damKernelInput, plLines); var fillMacroStabilityWrapperFromEngine = new FillMacroStabilityWrapperInputFromEngine { @@ -114,11 +115,6 @@ .MStabParameters.GridPosition = MStabGridPosition.Left; fillMacroStabilityWrapperFromEngine.BishopCalculationGrid = MacroStabilityCommonHelper.FillBishopCalculationGrid(damKernelInput); - double penetrationLength = damKernelInput.Location.ModelParametersForPlLines.PenetrationLength; - SoilProfile2D soilProfile2D = damKernelInput.SubSoilScenario.SoilProfile2D; - IntrusionVerticalWaterPressureType? pressureType = damKernelInput.Location.IntrusionVerticalWaterPressure; - Waternet waterNet = PlLinesToWaternetConverter.CreateWaternetBasedOnPlLines(plLines, soilProfile2D, penetrationLength, pressureType); - macroStabilityInput.Input = fillMacroStabilityWrapperFromEngine.CreateMacroStabilityInput(damKernelInput, FailureMechanismParametersMStab.MStabParameters, waterNet); fileNameForCalculation = MacroStabilityCommonHelper.GetStabilityInputFileName(damKernelInput, iterationIndex, FailureMechanismParametersMStab.MStabParameters.Model); stabilityCalculator = new Calculator(macroStabilityInput.Input);