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