Index: DamEngine/trunk/src/Deltares.DamEngine.Data/Geotechnics/LayerDetector.cs =================================================================== diff -u -r3522 -r3790 --- DamEngine/trunk/src/Deltares.DamEngine.Data/Geotechnics/LayerDetector.cs (.../LayerDetector.cs) (revision 3522) +++ DamEngine/trunk/src/Deltares.DamEngine.Data/Geotechnics/LayerDetector.cs (.../LayerDetector.cs) (revision 3790) @@ -19,7 +19,9 @@ // Stichting Deltares and remain full property of Stichting Deltares at all times. // All rights reserved. +using System; using System.Collections.Generic; +using System.Linq; using Deltares.DamEngine.Data.Geometry; using Deltares.DamEngine.Data.Standard; @@ -87,12 +89,40 @@ DeleteDuplicateCurve(); } + private void FillCurveListBasedOnPoints(GeometryLoop loop) + { + var tel = 0; + GeometryCurve curve = new GeometryCurve(); + foreach (var loopCalcPoint in loop.CalcPoints) + { + if (tel == 0) //(tel % 2 == 0) + { + curve.HeadPoint = loopCalcPoint; + } + else + { + curve.EndPoint = loopCalcPoint; + loop.CurveList.Add(curve); + curve = new GeometryCurve(); + curve.HeadPoint = loopCalcPoint; + } + tel++; + } + //curve = new GeometryCurve(loop.CurveList.Last().EndPoint, loop.CurveList.First().HeadPoint); + curve.EndPoint = loop.CurveList.First().HeadPoint; + loop.CurveList.Add(curve); + } + private void GetIntersectionPointList() { foreach (var surface in soilSurfaces) { if (intersectionSurfacesList.Contains(surface) == false) { + if (surface.GeometrySurface.OuterLoop.CurveList.Count == 0) + { + FillCurveListBasedOnPoints(surface.GeometrySurface.OuterLoop); + } foreach (var curve in surface.GeometrySurface.OuterLoop.CurveList) { FindIntersections(curve.HeadPoint, curve.EndPoint, surface); Index: DamEngine/trunk/src/Deltares.DamEngine.Calculators/KernelWrappers/MacroStabilityInwards/MacroStabilityInwardsKernelWrapper.cs =================================================================== diff -u -r3782 -r3790 --- DamEngine/trunk/src/Deltares.DamEngine.Calculators/KernelWrappers/MacroStabilityInwards/MacroStabilityInwardsKernelWrapper.cs (.../MacroStabilityInwardsKernelWrapper.cs) (revision 3782) +++ DamEngine/trunk/src/Deltares.DamEngine.Calculators/KernelWrappers/MacroStabilityInwards/MacroStabilityInwardsKernelWrapper.cs (.../MacroStabilityInwardsKernelWrapper.cs) (revision 3790) @@ -763,8 +763,6 @@ // In the following prepareDesign calls just return the stored embankmentDesignParameters embankmentDesignParameters = FailureMechanismParametersMStab.EmbankmentDesignParameters; } - - throw new MacroStabilityException(Resources.MacroStabilityKernelWrapper_PrepareForMacroStabilityDidNotSucceed); } /// Index: DamEngine/trunk/src/Deltares.DamEngine.Data/Geotechnics/SoilProfile2D.cs =================================================================== diff -u -r3522 -r3790 --- DamEngine/trunk/src/Deltares.DamEngine.Data/Geotechnics/SoilProfile2D.cs (.../SoilProfile2D.cs) (revision 3522) +++ DamEngine/trunk/src/Deltares.DamEngine.Data/Geotechnics/SoilProfile2D.cs (.../SoilProfile2D.cs) (revision 3790) @@ -21,6 +21,7 @@ using System; using System.Collections.Generic; +using System.Linq; using Deltares.DamEngine.Data.Geometry; using Deltares.DamEngine.Data.Standard.Language; using Deltares.DamEngine.Data.Standard.Validation; @@ -84,7 +85,44 @@ public virtual SoilProfile1D GetSoilProfile1D(double x) { const double diff = 0.001; - + if (Geometry.Surfaces.Count == 0) + { + + foreach (var soilLayer2D in Surfaces) + { + var loop = new GeometryLoop(); + var tel = 0; + GeometryCurve curve = new GeometryCurve(); + foreach (var outerLoopCalcPoint in soilLayer2D.GeometrySurface.OuterLoop.CalcPoints) + { + Geometry.Points.Add(outerLoopCalcPoint); + loop.CalcPoints.Add(outerLoopCalcPoint); + Geometry.Surfaces.Add(soilLayer2D.GeometrySurface); + if (tel == 0) + { + curve.HeadPoint = outerLoopCalcPoint; + } + else + { + curve.EndPoint = outerLoopCalcPoint; + loop.CurveList.Add(curve); + curve = new GeometryCurve(); + curve.HeadPoint = outerLoopCalcPoint; + } + tel++; + } + curve.EndPoint = loop.CurveList.First().HeadPoint; + Geometry.Curves.Add(curve); + loop.CurveList.Add(curve); + Geometry.Loops.Add(loop); + var surface = new GeometrySurface(); + surface.OuterLoop = loop; + Geometry.Surfaces.Add(surface); + } + + Geometry.Right = Geometry.MaxGeometryPointsX; + Geometry.Left = Geometry.MinGeometryPointsX; + } var soilProfile = new SoilProfile1D { Name = "Generated at x = " + x + " from " + Name Index: DamEngine/trunk/src/Deltares.DamEngine.Calculators/DikesDesign/DesignCalculatorShoulderPerPoint.cs =================================================================== diff -u -r3522 -r3790 --- DamEngine/trunk/src/Deltares.DamEngine.Calculators/DikesDesign/DesignCalculatorShoulderPerPoint.cs (.../DesignCalculatorShoulderPerPoint.cs) (revision 3522) +++ DamEngine/trunk/src/Deltares.DamEngine.Calculators/DikesDesign/DesignCalculatorShoulderPerPoint.cs (.../DesignCalculatorShoulderPerPoint.cs) (revision 3790) @@ -65,7 +65,7 @@ var designResults = new List(); var location = damKernelInput.Location; var subSoilScenario = damKernelInput.SubSoilScenario; - var surfaceLine = designScenario.GetMostRecentSurfaceLine(subSoilScenario.SoilProfile1D, subSoilScenario.StiFileName); + var surfaceLine = designScenario.GetMostRecentSurfaceLine(subSoilScenario.SoilProfile1D, subSoilScenario.SoilProfile2D); damKernelInput.Location.SurfaceLine = surfaceLine; try { Index: DamEngine/trunk/src/Deltares.DamEngine.Calculators/DikesDesign/DesignCalculatorCombinedSlopeAndShoulderAdaption.cs =================================================================== diff -u -r3522 -r3790 --- DamEngine/trunk/src/Deltares.DamEngine.Calculators/DikesDesign/DesignCalculatorCombinedSlopeAndShoulderAdaption.cs (.../DesignCalculatorCombinedSlopeAndShoulderAdaption.cs) (revision 3522) +++ DamEngine/trunk/src/Deltares.DamEngine.Calculators/DikesDesign/DesignCalculatorCombinedSlopeAndShoulderAdaption.cs (.../DesignCalculatorCombinedSlopeAndShoulderAdaption.cs) (revision 3790) @@ -72,7 +72,7 @@ // Prepare the kernel for design kernelWrapper.PrepareDesign(kernelDataInput, kernelDataOutput, damKernelInput, iterationIndex, out embankmentDesignParameters); - SurfaceLine2 surfaceLine = designScenario.GetMostRecentSurfaceLine(subSoilScenario.SoilProfile1D, subSoilScenario.StiFileName).FullDeepClone(); + SurfaceLine2 surfaceLine = designScenario.GetMostRecentSurfaceLine(subSoilScenario.SoilProfile1D, subSoilScenario.SoilProfile2D).FullDeepClone(); try { iterationIndex = 1; @@ -89,7 +89,7 @@ if (!isRedesignRequired && surfaceLine != null) { // Set redesigned surfaceline to original, so in case no redesign is needed, the original surfaceline will be returned - designScenario.SetRedesignedSurfaceLine(subSoilScenario.SoilProfile1D, subSoilScenario.StiFileName, surfaceLine); + designScenario.SetRedesignedSurfaceLine(subSoilScenario.SoilProfile1D, subSoilScenario.SoilProfile2D, surfaceLine); } else { @@ -123,7 +123,7 @@ throw new SurfaceLineException(validationError.Text); } - designScenario.SetRedesignedSurfaceLine(subSoilScenario.SoilProfile1D, subSoilScenario.StiFileName, surfaceLine); + designScenario.SetRedesignedSurfaceLine(subSoilScenario.SoilProfile1D, subSoilScenario.SoilProfile2D, surfaceLine); } else if (designAdvise == DesignAdvise.SlopeInwards) { @@ -136,7 +136,7 @@ { throw new SurfaceLineException(validationError.Text); } - designScenario.SetRedesignedSurfaceLine(subSoilScenario.SoilProfile1D, subSoilScenario.StiFileName, surfaceLine); + designScenario.SetRedesignedSurfaceLine(subSoilScenario.SoilProfile1D, subSoilScenario.SoilProfile2D, surfaceLine); } else { @@ -147,14 +147,24 @@ designScenario.Location.AlignBoundaryPointsOfPl1LineWithAdaptedSurfaceLine(surfaceLine); damKernelInput.Location.SurfaceLine = surfaceLine; kernelWrapper.PrepareDesign(kernelDataInput, kernelDataOutput, damKernelInput, iterationIndex, out embankmentDesignParameters); - DesignCalculatorUtils.KernelCalculate(out kernelDataInput, kernelWrapper, out kernelDataOutput, damKernelInput, iterationIndex, out locationCalculationMessages); + if (damKernelInput.SubSoilScenario.SoilProfileType == SoilProfileType.ProfileType2D) + { + var embankmentSoil = + damKernelInput.Location.SoilList.GetSoilByName(embankmentDesignParameters + .EmbankmentMaterialname); + damKernelInput.SubSoilScenario.SoilProfile2D = + AdaptProfile2DToNewSurfaceLine(damKernelInput.SubSoilScenario.SoilProfile2D, surfaceLine, embankmentSoil); + } + DesignCalculatorUtils.KernelCalculate(out kernelDataInput, kernelWrapper, out kernelDataOutput, damKernelInput, + iterationIndex, out locationCalculationMessages); calculationMessages.AddRange(locationCalculationMessages); - isRedesignRequired = !kernelWrapper.EvaluateDesign(damKernelInput, kernelDataInput, kernelDataOutput, out designAdvise, out evaluationMessage); + isRedesignRequired = !kernelWrapper.EvaluateDesign(damKernelInput, kernelDataInput, kernelDataOutput, out designAdvise, + out evaluationMessage); } } calculationMessages.AddRange(locationCalculationMessages); designScenario.CalculationResult = CalculationResult.Succeeded; - designScenario.SetResultMessage(subSoilScenario.SoilProfile1D, subSoilScenario.StiFileName, "Succes"); + designScenario.SetResultMessage(subSoilScenario.SoilProfile1D, subSoilScenario.SoilProfile2D, "Succes"); kernelWrapper.PostProcess(damKernelInput, kernelDataOutput, designScenario, resultMessage, out designResults); designCalculations.AddRange(designResults); } @@ -167,14 +177,40 @@ errorMessage = errorMessage + ";" + innerException.Message; innerException = innerException.InnerException; } - designScenario.SetResultMessage(subSoilScenario.SoilProfile1D, subSoilScenario.StiFileName, errorMessage); + designScenario.SetResultMessage(subSoilScenario.SoilProfile1D, subSoilScenario.SoilProfile2D, errorMessage); designScenario.CalculationResult = CalculationResult.RunFailed; // Redesign not succesful, so no redesigned surfaceline will be returned - designScenario.SetRedesignedSurfaceLine(subSoilScenario.SoilProfile1D, subSoilScenario.StiFileName, null); + designScenario.SetRedesignedSurfaceLine(subSoilScenario.SoilProfile1D, subSoilScenario.SoilProfile2D, null); kernelWrapper.PostProcess(damKernelInput, kernelDataOutput, designScenario, errorMessage, out designResults); designCalculations.AddRange(designResults); throw new DesignCalculatorException(Resources.DesignUnsuccessful + " " + errorMessage); } } + + private static SoilProfile2D AdaptProfile2DToNewSurfaceLine(SoilProfile2D soilProfile2D, SurfaceLine2 surfaceLine, Soil dikeEmbankmentSoil) + { + var topX = surfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DikeTopAtPolder).X; + var soilProfile1D = soilProfile2D.GetSoilProfile1D(topX); + var soilSurfaceProfile = new SoilSurfaceProfile + { + SoilProfile = soilProfile1D, + SurfaceLine2 = surfaceLine, + Name = soilProfile2D.Name, + DikeEmbankmentMaterial = dikeEmbankmentSoil + }; + // Convert the soilSurfaceProfile to a SoilProfile2D to be able to edit it properly. + var soilProfile2DNew = soilSurfaceProfile.ConvertToSoilProfile2D(); + var numberOfCommonSurface = Math.Min(soilProfile2DNew.Surfaces.Count, soilProfile2D.Surfaces.Count); + for (int i = 0; i < numberOfCommonSurface; i++) + { + soilProfile2DNew.Surfaces[i].WaterpressureInterpolationModel = + soilProfile2D.Surfaces[i].WaterpressureInterpolationModel; + } + for (int i = numberOfCommonSurface; i < soilProfile2DNew.Surfaces.Count; i++) + { + soilProfile2DNew.Surfaces[i].WaterpressureInterpolationModel = WaterpressureInterpolationModel.Automatic; + } + return soilProfile2DNew; + } } } Index: DamEngine/trunk/src/Deltares.DamEngine.Calculators/DikesDesign/DesignCalculatorFirstSlopeAdaptionThenShoulderAdaption.cs =================================================================== diff -u -r3522 -r3790 --- DamEngine/trunk/src/Deltares.DamEngine.Calculators/DikesDesign/DesignCalculatorFirstSlopeAdaptionThenShoulderAdaption.cs (.../DesignCalculatorFirstSlopeAdaptionThenShoulderAdaption.cs) (revision 3522) +++ DamEngine/trunk/src/Deltares.DamEngine.Calculators/DikesDesign/DesignCalculatorFirstSlopeAdaptionThenShoulderAdaption.cs (.../DesignCalculatorFirstSlopeAdaptionThenShoulderAdaption.cs) (revision 3790) @@ -71,7 +71,7 @@ // Prepare the kernel for design kernelWrapper.PrepareDesign(kernelDataInput, kernelDataOutput, damKernelInput, iterationIndex, out embankmentDesignParameters); - SurfaceLine2 surfaceLine = designScenario.GetMostRecentSurfaceLine(subSoilScenario.SoilProfile1D, subSoilScenario.StiFileName).FullDeepClone(); + SurfaceLine2 surfaceLine = designScenario.GetMostRecentSurfaceLine(subSoilScenario.SoilProfile1D, subSoilScenario.SoilProfile2D).FullDeepClone(); try { @@ -87,7 +87,7 @@ if (!isRedesignRequired && surfaceLine != null) { // Set redesigned surfaceline to original, so in case no redesign is needed, the original surfaceline will be returned - designScenario.SetRedesignedSurfaceLine(subSoilScenario.SoilProfile1D, subSoilScenario.StiFileName, surfaceLine); + designScenario.SetRedesignedSurfaceLine(subSoilScenario.SoilProfile1D, subSoilScenario.SoilProfile2D, surfaceLine); } else { @@ -126,7 +126,7 @@ throw new SurfaceLineException(validationError.Text); } designScenario.SetRedesignedSurfaceLine(subSoilScenario.SoilProfile1D, - subSoilScenario.StiFileName, surfaceLine); + subSoilScenario.SoilProfile2D, surfaceLine); // Recalculate new surfaceline location.AlignBoundaryPointsOfPl1LineWithAdaptedSurfaceLine(surfaceLine); @@ -164,7 +164,7 @@ { throw new SurfaceLineException(validationError.Text); } - designScenario.SetRedesignedSurfaceLine(subSoilScenario.SoilProfile1D, subSoilScenario.StiFileName, surfaceLine); + designScenario.SetRedesignedSurfaceLine(subSoilScenario.SoilProfile1D, subSoilScenario.SoilProfile2D, surfaceLine); // Recalculate new surfaceline designScenario.Location.AlignBoundaryPointsOfPl1LineWithAdaptedSurfaceLine(surfaceLine); @@ -175,7 +175,7 @@ isRedesignRequired = !kernelWrapper.EvaluateDesign(damKernelInput, kernelDataInput, kernelDataOutput, out designAdvise, out evaluationMessage); } } - designScenario.SetResultMessage(subSoilScenario.SoilProfile1D, subSoilScenario.StiFileName, "Succes"); + designScenario.SetResultMessage(subSoilScenario.SoilProfile1D, subSoilScenario.SoilProfile2D, "Succes"); designScenario.CalculationResult = CalculationResult.Succeeded; kernelWrapper.PostProcess(damKernelInput, kernelDataOutput, designScenario, resultMessage, out designResults); designCalculations.AddRange(designResults); @@ -189,10 +189,10 @@ errorMessage = errorMessage + ";" + innerException.Message; innerException = innerException.InnerException; } - designScenario.SetResultMessage(subSoilScenario.SoilProfile1D, subSoilScenario.StiFileName, errorMessage); + designScenario.SetResultMessage(subSoilScenario.SoilProfile1D, subSoilScenario.SoilProfile2D, errorMessage); designScenario.CalculationResult = CalculationResult.RunFailed; // Redesign not succesful, so no redesigned surfaceline will be returned - designScenario.SetRedesignedSurfaceLine(subSoilScenario.SoilProfile1D, subSoilScenario.StiFileName, null); + designScenario.SetRedesignedSurfaceLine(subSoilScenario.SoilProfile1D, subSoilScenario.SoilProfile2D, null); kernelWrapper.PostProcess(damKernelInput, kernelDataOutput, designScenario, errorMessage, out designResults); designCalculations.AddRange(designResults); throw new DesignCalculatorException(Resources.DesignUnsuccessful + " " + errorMessage); Index: DamEngine/trunk/src/Deltares.DamEngine.Calculators/DikesDesign/DesignCalculator.cs =================================================================== diff -u -r3656 -r3790 --- DamEngine/trunk/src/Deltares.DamEngine.Calculators/DikesDesign/DesignCalculator.cs (.../DesignCalculator.cs) (revision 3656) +++ DamEngine/trunk/src/Deltares.DamEngine.Calculators/DikesDesign/DesignCalculator.cs (.../DesignCalculator.cs) (revision 3790) @@ -195,7 +195,7 @@ designScenario.DikeTableHeight ?? location.SurfaceLine.GetDefaultDikeTableHeight() ?? 0); designScenario.SetRedesignedSurfaceLine(damKernelInput.SubSoilScenario.SoilProfile1D, - damKernelInput.SubSoilScenario.StiFileName, adaptedSurfaceLine); + damKernelInput.SubSoilScenario.SoilProfile2D, adaptedSurfaceLine); damKernelInput.Location.SurfaceLine = adaptedSurfaceLine; } } Index: DamEngine/trunk/src/Deltares.DamEngine.Data/Design/DesignScenario.cs =================================================================== diff -u -r3522 -r3790 --- DamEngine/trunk/src/Deltares.DamEngine.Data/Design/DesignScenario.cs (.../DesignScenario.cs) (revision 3522) +++ DamEngine/trunk/src/Deltares.DamEngine.Data/Design/DesignScenario.cs (.../DesignScenario.cs) (revision 3790) @@ -522,11 +522,11 @@ /// Get Result Message /// /// - /// + /// /// - public string GetResultMessage(SoilProfile1D soilProfile, string soilGeometry2DName) + public string GetResultMessage(SoilProfile1D soilProfile, SoilProfile2D soilProfile2D) { - Object objectAsKey = GetObjectAsKey(soilProfile, soilGeometry2DName); + Object objectAsKey = GetObjectAsKey(soilProfile, soilProfile2D); return GetResultMessage(objectAsKey); } @@ -544,11 +544,11 @@ /// Set Result Message /// /// - /// + /// /// - public void SetResultMessage(SoilProfile1D soilProfile, string soilGeometry2DName, string resultMessage) + public void SetResultMessage(SoilProfile1D soilProfile, SoilProfile2D soilProfile2D, string resultMessage) { - Object objectAsKey = GetObjectAsKey(soilProfile, soilGeometry2DName); + Object objectAsKey = GetObjectAsKey(soilProfile, soilProfile2D); SetResultMessage(objectAsKey, resultMessage); } @@ -566,11 +566,11 @@ /// Set Redesigned surfaceline /// /// - /// + /// /// - public void SetRedesignedSurfaceLine(SoilProfile1D soilProfile, string soilGeometry2DName, SurfaceLine2 surfaceLine) + public void SetRedesignedSurfaceLine(SoilProfile1D soilProfile, SoilProfile2D soilProfile2D, SurfaceLine2 surfaceLine) { - Object objectAsKey = GetObjectAsKey(soilProfile, soilGeometry2DName); + Object objectAsKey = GetObjectAsKey(soilProfile, soilProfile2D); SetRedesignedSurfaceLine(objectAsKey, surfaceLine); } @@ -583,18 +583,18 @@ { if (objectAsKey != null) { - return redesignedSurfaceLines.ContainsKey(objectAsKey) ? redesignedSurfaceLines[objectAsKey] ?? Location.SurfaceLine : Location.SurfaceLine; + //return redesignedSurfaceLines.ContainsKey(objectAsKey) ? redesignedSurfaceLines[objectAsKey] ?? Location.SurfaceLine : Location.SurfaceLine; // For debugging: following code is the same as above, but better debuggable - // SurfaceLine2 surfaceline = Location.SurfaceLine; - // if (redesignedSurfaceLines.ContainsKey(objectAsKey)) - // { - // var s = redesignedSurfaceLines[objectAsKey]; - // if (s != null) - // { - // surfaceline = s; - // } - // } - // return surfaceline; + SurfaceLine2 surfaceline = Location.SurfaceLine; + if (redesignedSurfaceLines.ContainsKey(objectAsKey)) + { + var s = redesignedSurfaceLines[objectAsKey]; + if (s != null) + { + surfaceline = s; + } + } + return surfaceline; } return null; } @@ -603,12 +603,12 @@ /// Get Most recent surfaceline /// /// - /// + /// /// - public SurfaceLine2 GetMostRecentSurfaceLine(SoilProfile soilProfile, string soilGeometry2DName) + public SurfaceLine2 GetMostRecentSurfaceLine(SoilProfile soilProfile, SoilProfile2D soilProfile2D) { var profile1D = soilProfile as SoilProfile1D; - Object objectAsKey = GetObjectAsKey(profile1D, soilGeometry2DName); + Object objectAsKey = GetObjectAsKey(profile1D, soilProfile2D); return GetMostRecentSurfaceLine(objectAsKey); } @@ -617,15 +617,15 @@ /// /// /// - /// + /// /// - private Object GetObjectAsKey(SoilProfile1D soilProfile, string soilGeometry2DName) + private Object GetObjectAsKey(SoilProfile1D soilProfile, SoilProfile2D soilProfile2D) { if (soilProfile != null) { return soilProfile; } - return soilGeometry2DName; + return soilProfile2D; } ///