Index: DamEngine/trunk/src/Deltares.DamEngine.Calculators/KernelWrappers/MacroStabilityInwards/MacroStabilityInwardsKernelWrapper.cs =================================================================== diff -u -r3038 -r3040 --- DamEngine/trunk/src/Deltares.DamEngine.Calculators/KernelWrappers/MacroStabilityInwards/MacroStabilityInwardsKernelWrapper.cs (.../MacroStabilityInwardsKernelWrapper.cs) (revision 3038) +++ DamEngine/trunk/src/Deltares.DamEngine.Calculators/KernelWrappers/MacroStabilityInwards/MacroStabilityInwardsKernelWrapper.cs (.../MacroStabilityInwardsKernelWrapper.cs) (revision 3040) @@ -45,13 +45,14 @@ using LogMessage = Deltares.DamEngine.Data.Standard.Logging.LogMessage; using LogMessageType = Deltares.DamEngine.Data.Standard.Logging.LogMessageType; using Soil = Deltares.DamEngine.Data.Geotechnics.Soil; +using UpliftVanCalculationGrid = Deltares.DamEngine.Calculators.KernelWrappers.MacroStabilityCommon.UpliftVanCalculationGrid; namespace Deltares.DamEngine.Calculators.KernelWrappers.MacroStabilityInwards { public class MacroStabilityInwardsKernelWrapper : IKernelWrapper { private Calculator stabilityCalculator; - + private int lastIterationIndex; /// @@ -96,10 +97,10 @@ var left = damKernelInput.Location.SurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.SurfaceLevelOutside).X; var right = damKernelInput.Location.SurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.SurfaceLevelInside).X; var penetrationLength = damKernelInput.Location.ModelParametersForPlLines.PenetrationLength; - var waterNet = PlLinesToWaternetConverter.ConvertPlLineToWaternet(plLines, damKernelInput.SubSoilScenario.SoilProfile1D, + var waterNet = PlLinesToWaternetConverter.ConvertPlLineToWaternet(plLines, damKernelInput.SubSoilScenario.SoilProfile1D, penetrationLength, left, right); TrafficLoad trafficLoad = null; - if (damKernelInput.Location.StabilityOptions != null && damKernelInput.Location.StabilityOptions.TrafficLoad.HasValue && + if (damKernelInput.Location.StabilityOptions != null && damKernelInput.Location.StabilityOptions.TrafficLoad.HasValue && !damKernelInput.Location.StabilityOptions.TrafficLoad.Value.AlmostZero()) { trafficLoad = new TrafficLoad(); @@ -110,11 +111,23 @@ .CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.TrafficLoadOutside).X; } + var slipCircleDefinition = damKernelInput.DamFailureMechanismeCalculationSpecification + .FailureMechanismParametersMStab.MStabParameters.SlipCircleDefinition; + double minimumCircleDepth = damKernelInput.DamFailureMechanismeCalculationSpecification + .FailureMechanismParametersMStab.MStabParameters.CalculationOptions.MinimalCircleDepth; + UpliftVanCalculationGrid upliftVanCalculationGrid = UpliftVanGridCreator.DetermineGridsFromSettings( + slipCircleDefinition, damKernelInput.Location.SurfaceLine); + double centerOfLeftGridXCoordinate = + (upliftVanCalculationGrid.LeftGridXLeft + upliftVanCalculationGrid.LeftGridXRight) * 0.5; + double levelBottomAquiferAtMiddleOfLeftGrid = DetermineLevelBottomLayerAtX(damKernelInput.SubSoilScenario, centerOfLeftGridXCoordinate); + double surfaceLevelAtMiddleOfLeftGrid = damKernelInput.Location.SurfaceLine.Geometry.GetZatX(centerOfLeftGridXCoordinate); + UpliftVanGridCreator.DetermineTangentLines(upliftVanCalculationGrid, slipCircleDefinition, + levelBottomAquiferAtMiddleOfLeftGrid, surfaceLevelAtMiddleOfLeftGrid, minimumCircleDepth); FillMacroStabilityWrapperInputFromEngine fillMacroStabilityWrapperFromEngine = new FillMacroStabilityWrapperInputFromEngine() { TrafficLoad = trafficLoad, - UpliftVanCalculationGrid = UpliftVanGridCreator.DetermineGridFromSettings(damKernelInput.Location.SurfaceLine) - + UpliftVanCalculationGrid = upliftVanCalculationGrid + }; // ToDo MWDAM-1373/1374: fill SoilProfile2D EnsureSoilProfile2DIsFilled(damKernelInput.SubSoilScenario, damKernelInput.Location.SurfaceLine, damKernelInput.Location.GetDikeEmbankmentSoil()); @@ -129,10 +142,28 @@ return PrepareResult.Failed; } } - kernelDataInput = null; + kernelDataInput = null; return PrepareResult.NotRelevant; } + private double DetermineLevelBottomLayerAtX(SoilGeometryProbability subSoilScenario, double xCoordinate) + { + SoilProfile1D soilProfile1D; + switch (subSoilScenario.SoilProfileType) + { + case SoilProfileType.ProfileType1D: + soilProfile1D = subSoilScenario.SoilProfile1D; + break; + case SoilProfileType.ProfileType2D: + soilProfile1D = subSoilScenario.SoilProfile2D.GetSoilProfile1D(xCoordinate); + break; + default: + throw new NotSupportedException(String.Format("{0} not supported", subSoilScenario.SoilProfileType)); + } + + return soilProfile1D.Layers.Last().TopLevel; + } + private void EnsureSoilProfile2DIsFilled(SoilGeometryProbability subSoilScenario, SurfaceLine2 surfaceLine2, Soil dikeEmbankmentSoil) { var soilProfile2D = subSoilScenario.SoilProfile2D; @@ -164,16 +195,16 @@ stabilityCalculator = new Calculator(input); // For now a simple check to see if any data has been past at all. var inputAsXml = stabilityCalculator.KernelInputXml; - File.WriteAllText("TestfileFromPrepare.xml", inputAsXml); - if (inputAsXml.Length > 10) + File.WriteAllText("TestfileFromPrepare.xml", inputAsXml); + if (inputAsXml.Length > 10) { return PrepareResult.Successful; } else { return PrepareResult.Failed; } - + } catch { @@ -208,20 +239,20 @@ switch (resultMessage.MessageType) { case MessageType.Error: - { - message.MessageType = LogMessageType.Error; - break; - } + { + message.MessageType = LogMessageType.Error; + break; + } case MessageType.Info: - { - message.MessageType = LogMessageType.Info; - break; - } + { + message.MessageType = LogMessageType.Info; + break; + } case MessageType.Warning: - { - message.MessageType = LogMessageType.Warning; - break; - } + { + message.MessageType = LogMessageType.Warning; + break; + } }; messages.Add(message); } @@ -471,9 +502,9 @@ embankmentDesignParameters = FailureMechanismParametersMStab.EmbankmentDesignParameters; embankmentDesignParametersForKernelInput = embankmentDesignParameters; } -// var xmlInput = CreateXmlInput(macroStabilityKernelDataInput, embankmentDesignParametersForKernelInput); -// var prepareResult = PrepareKernel(xmlInput); -// if (prepareResult != PrepareResult.Successful) + // var xmlInput = CreateXmlInput(macroStabilityKernelDataInput, embankmentDesignParametersForKernelInput); + // var prepareResult = PrepareKernel(xmlInput); + // if (prepareResult != PrepareResult.Successful) { throw new MacroStabilityException(Resources.MacroStabilityKernelWrapper_PrepareForMacroStabilityDidNotSucceed); } Index: DamEngine/trunk/src/Deltares.DamEngine.Calculators/KernelWrappers/MacroStabilityInwards/UpliftVanGridCreator.cs =================================================================== diff -u -r3033 -r3040 --- DamEngine/trunk/src/Deltares.DamEngine.Calculators/KernelWrappers/MacroStabilityInwards/UpliftVanGridCreator.cs (.../UpliftVanGridCreator.cs) (revision 3033) +++ DamEngine/trunk/src/Deltares.DamEngine.Calculators/KernelWrappers/MacroStabilityInwards/UpliftVanGridCreator.cs (.../UpliftVanGridCreator.cs) (revision 3040) @@ -19,44 +19,102 @@ // Stichting Deltares and remain full property of Stichting Deltares at all times. // All rights reserved. +using System; +using Deltares.DamEngine.Calculators.KernelWrappers.MacroStabilityCommon; +using Deltares.DamEngine.Data.General; using Deltares.DamEngine.Data.Geotechnics; namespace Deltares.DamEngine.Calculators.KernelWrappers.MacroStabilityInwards { public class UpliftVanGridCreator { /// Determines the UpliftVan grid from settings. + /// the slip circle definition /// The surface line. /// - public static MacroStabilityCommon.UpliftVanCalculationGrid DetermineGridFromSettings(SurfaceLine2 surfaceLine) + public static UpliftVanCalculationGrid DetermineGridsFromSettings( + SlipCircleDefinition slipCircleDefinition, SurfaceLine2 surfaceLine) { - var upliftVanCalculationGrid = new MacroStabilityCommon.UpliftVanCalculationGrid(); + var upliftVanCalculationGrid = new UpliftVanCalculationGrid() + { + IsAuto = false, + TangentLineAutomaticAtBoundaries = false + }; + + // Define specified active (left) grid if (surfaceLine != null) { - upliftVanCalculationGrid.IsAuto = false; - upliftVanCalculationGrid.LeftGridXCount = 3; - upliftVanCalculationGrid.LeftGridXLeft = surfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DikeTopAtPolder).X + 2; - upliftVanCalculationGrid.LeftGridXRight = surfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DikeToeAtPolder).X + 5; - upliftVanCalculationGrid.LeftGridZCount = 3; - upliftVanCalculationGrid.LeftGridZTop = surfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DikeTopAtPolder).Z + 6; - upliftVanCalculationGrid.LeftGridZBottom = surfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DikeTopAtPolder).Z + 0.2; + // Use middle of the dike for X-coordinate + var dikeTopAtRiverPoint = surfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DikeTopAtRiver); + var dikeTopAtPolderPoint = surfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DikeTopAtPolder); + double gridXCoordinate = (dikeTopAtRiverPoint.X + dikeTopAtPolderPoint.X) * 0.5; + double gridYCoordinate = surfaceLine.Geometry.GetZatX(gridXCoordinate); + double gridWidth = slipCircleDefinition.UpliftVanLeftGridHorizontalPointDistance * + (slipCircleDefinition.BishopGridHorizontalPointCount - 1); + double gridHeight = slipCircleDefinition.UpliftVanLeftGridVerticalPointDistance * + (slipCircleDefinition.UpliftVanRightGridVerticalPointCount - 1); + upliftVanCalculationGrid.LeftGridXLeft = gridXCoordinate; + upliftVanCalculationGrid.LeftGridXRight = gridXCoordinate + gridWidth; + upliftVanCalculationGrid.LeftGridXCount = slipCircleDefinition.UpliftVanRightGridHorizontalPointCount; + upliftVanCalculationGrid.LeftGridZBottom = gridYCoordinate; + upliftVanCalculationGrid.LeftGridZTop = gridYCoordinate + gridHeight; + upliftVanCalculationGrid.LeftGridZCount = slipCircleDefinition.UpliftVanRightGridVerticalPointCount; + } - upliftVanCalculationGrid.RightGridXCount = 3; - upliftVanCalculationGrid.RightGridXLeft = surfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DikeToeAtPolder).X + 10; - upliftVanCalculationGrid.RightGridXRight = surfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.SurfaceLevelInside).X - 5; - upliftVanCalculationGrid.RightGridZCount = 3; - upliftVanCalculationGrid.RightGridZTop = surfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DikeTopAtPolder).Z + 2; - upliftVanCalculationGrid.RightGridZBottom = surfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.SurfaceLevelInside).Z + 2; + // Define specified passive (right) grid + if (surfaceLine != null) + { + const double gridOffset = 0.2; + var dikeToeAtPolder = surfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DikeToeAtPolder); - upliftVanCalculationGrid.TangentLineAutomaticAtBoundaries = false; - upliftVanCalculationGrid.TangentLineCount = 5; - upliftVanCalculationGrid.TangentLineZTop = - surfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.SurfaceLevelInside).Z - 1; - upliftVanCalculationGrid.TangentLineZBottom = - surfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.SurfaceLevelInside).Z - 6; + // X-coordinates settings of the grid + double gridWidth = slipCircleDefinition.UpliftVanRightGridHorizontalPointDistance * + (slipCircleDefinition.UpliftVanRightGridHorizontalPointCount - 1); + // The grid starts at either last uplift point X-coordinate or dike toe at polder X-coordinate, whichever is largest + double gridXCoordinate = Math.Max(slipCircleDefinition.XCoordinateLastUpliftPoint - gridWidth, dikeToeAtPolder.X); + upliftVanCalculationGrid.RightGridXLeft = gridXCoordinate; + // The grid is limited to the right boundary of the surfaceline + double boundaryRight = surfaceLine.CharacteristicPoints.Geometry.GetGeometryBounds().Right; + upliftVanCalculationGrid.RightGridXRight = Math.Min(gridXCoordinate + gridWidth, boundaryRight); + upliftVanCalculationGrid.RightGridXCount = slipCircleDefinition.UpliftVanRightGridHorizontalPointCount; + + // Z-coordinates settings of the grid + double gridHeight = slipCircleDefinition.UpliftVanRightGridVerticalPointDistance * + (slipCircleDefinition.UpliftVanRightGridVerticalPointCount - 1); + upliftVanCalculationGrid.RightGridZBottom = dikeToeAtPolder.Z + gridOffset; + upliftVanCalculationGrid.RightGridZTop = upliftVanCalculationGrid.RightGridZBottom + gridHeight; + upliftVanCalculationGrid.RightGridZCount = slipCircleDefinition.UpliftVanRightGridVerticalPointCount; } + // Tangent lines are defined in another method + return upliftVanCalculationGrid; } + + /// Determines the tangent lines. + /// The uplift van calculation grid. + /// The slip circle definition. + /// The top bottom aquifer at middle of left grid. + /// + /// The minimum circle depth. + public static void DetermineTangentLines(UpliftVanCalculationGrid upliftVanCalculationGrid, + SlipCircleDefinition slipCircleDefinition, double bottomAquiferLevel, + double surfaceLevel, double minimumCircleDepth) + { + double bottomTangentLines = bottomAquiferLevel - slipCircleDefinition.UpliftVanTangentLinesDistance; + bottomTangentLines = Math.Min(bottomTangentLines, surfaceLevel - minimumCircleDepth); + double topTangentLines = bottomTangentLines; + int tangentLinesCount = 1; + while (topTangentLines < surfaceLevel) + { + topTangentLines += slipCircleDefinition.UpliftVanTangentLinesDistance; + tangentLinesCount++; + } + upliftVanCalculationGrid.TangentLineAutomaticAtBoundaries = true; + upliftVanCalculationGrid.TangentLineCount = tangentLinesCount; + upliftVanCalculationGrid.TangentLineZTop = topTangentLines; + upliftVanCalculationGrid.TangentLineZBottom = bottomTangentLines; + + } } }