Index: DamEngine/trunk/src/Deltares.DamEngine.Data/Geometry/GeometrySurface.cs =================================================================== diff -u -r6245 -r6291 --- DamEngine/trunk/src/Deltares.DamEngine.Data/Geometry/GeometrySurface.cs (.../GeometrySurface.cs) (revision 6245) +++ DamEngine/trunk/src/Deltares.DamEngine.Data/Geometry/GeometrySurface.cs (.../GeometrySurface.cs) (revision 6291) @@ -67,6 +67,15 @@ /// All internal loops encompassed by . /// public List InnerLoops { get; } = new List(); + + /// + /// Determines if there are any inner loops in this surface + /// + /// true when at least 1 inner loop is available else false + public bool HasInnerLoops() + { + return InnerLoops.Any(); + } /// /// Placeholder for the previous outer loop. Index: DamEngine/trunk/src/Deltares.DamEngine.Calculators/KernelWrappers/Common/SoilProfile2DHelper.cs =================================================================== diff -u -r6245 -r6291 --- DamEngine/trunk/src/Deltares.DamEngine.Calculators/KernelWrappers/Common/SoilProfile2DHelper.cs (.../SoilProfile2DHelper.cs) (revision 6245) +++ DamEngine/trunk/src/Deltares.DamEngine.Calculators/KernelWrappers/Common/SoilProfile2DHelper.cs (.../SoilProfile2DHelper.cs) (revision 6291) @@ -124,7 +124,8 @@ SoilProfile2D soilProfileWithoutInnerLoops = soilProfile.Clone(); var innerSurfaces = new List(); - foreach (GeometrySurface geometrySurface in soilProfileWithoutInnerLoops.Geometry.Surfaces.Where(surface => surface.InnerLoops.Count > 0)) + IEnumerable geometrySurfaces = soilProfileWithoutInnerLoops.Geometry.Surfaces.Where(surface => surface.InnerLoops.Any()); + foreach (GeometrySurface geometrySurface in geometrySurfaces) { foreach (GeometryLoop innerLoop in geometrySurface.InnerLoops) { @@ -141,7 +142,8 @@ innerSurfaces.Clear(); var innerSoiLayers2D = new List(); - foreach (SoilLayer2D surface in soilProfileWithoutInnerLoops.Surfaces.Where(surface => surface.GeometrySurface.InnerLoops.Count > 0)) + IEnumerable surfaces = soilProfileWithoutInnerLoops.Surfaces.Where(surface => surface.GeometrySurface.InnerLoops.Any()); + foreach (SoilLayer2D surface in surfaces) { foreach (GeometryLoop innerLoop in surface.GeometrySurface.InnerLoops) { Index: DamEngine/trunk/src/Deltares.DamEngine.Data/Geotechnics/SoilProfile2DSurfaceLineHelper.cs =================================================================== diff -u -r6276 -r6291 --- DamEngine/trunk/src/Deltares.DamEngine.Data/Geotechnics/SoilProfile2DSurfaceLineHelper.cs (.../SoilProfile2DSurfaceLineHelper.cs) (revision 6276) +++ DamEngine/trunk/src/Deltares.DamEngine.Data/Geotechnics/SoilProfile2DSurfaceLineHelper.cs (.../SoilProfile2DSurfaceLineHelper.cs) (revision 6291) @@ -99,7 +99,6 @@ result.Geometry.Rebox(); result.Geometry.UpdateSurfaceLine(); RoundCoordinates(result.Geometry); - CorrectSurfacelinePointsForGeometryCoordinates(result.Geometry, surfaceLine); return result; } @@ -137,24 +136,9 @@ if (surfaceLine != null) { surfaceLine.RoundPointsCoordinates(GeometryConstants.Accuracy); - CorrectSurfacelinePointsForGeometryCoordinates(geometry, surfaceLine); } } - private static void CorrectSurfacelinePointsForGeometryCoordinates(GeometryData geometry, GeometryPointString surfaceLine) - { - foreach (Point2D surfaceLinePoint in surfaceLine.Points) - { - var point = geometry.GetPointAtLocation(surfaceLinePoint, GeometryConstants.Accuracy * 1.5); - if (point != null) - { - surfaceLinePoint.X = point.X; - surfaceLinePoint.Z = point.Z; - } - } - surfaceLine.RemovePointsAtSameXLocation(); - } - private static GeometryData CreateNewGeometryForSoilProfile2DByCombiningItsGeometryWithSurfaceLine( GeometryPointString surfaceLine, GeometryData originalGeometry) { Index: DamEngine/trunk/src/Deltares.DamEngine.Data/Geometry/GeometryPointString.cs =================================================================== diff -u -r6276 -r6291 --- DamEngine/trunk/src/Deltares.DamEngine.Data/Geometry/GeometryPointString.cs (.../GeometryPointString.cs) (revision 6276) +++ DamEngine/trunk/src/Deltares.DamEngine.Data/Geometry/GeometryPointString.cs (.../GeometryPointString.cs) (revision 6291) @@ -482,31 +482,6 @@ } /// - /// Removes points with same X coordinates and different Z - /// - public void RemovePointsAtSameXLocation() - { - var pointsToDelete = new List(); - Point2D[] pointsAsArray = Points.ToArray(); - for (var i = 0; i < pointsAsArray.Length; i++) - { - for (int j = i; j < pointsAsArray.Length; j++) - { - if (i != j && Math.Abs(pointsAsArray[i].X - pointsAsArray[j].X) < GeometryConstants.Accuracy && - Math.Abs(pointsAsArray[i].Z - pointsAsArray[j].Z) > GeometryConstants.Accuracy && !pointsToDelete.Contains(pointsAsArray[j])) - { - pointsToDelete.Add(pointsAsArray[j]); - } - } - } - - foreach (Point2D point in pointsToDelete) - { - Points.Remove(point); - } - } - - /// /// Finds all intersections in the XZ-plane the given list. /// /// The list. Index: DamEngine/trunk/src/Deltares.DamEngine.IntegrationTests/IntegrationTests/IssuesTests.cs =================================================================== diff -u -r6276 -r6291 --- DamEngine/trunk/src/Deltares.DamEngine.IntegrationTests/IntegrationTests/IssuesTests.cs (.../IssuesTests.cs) (revision 6276) +++ DamEngine/trunk/src/Deltares.DamEngine.IntegrationTests/IntegrationTests/IssuesTests.cs (.../IssuesTests.cs) (revision 6291) @@ -19,12 +19,8 @@ // Stichting Deltares and remain full property of Stichting Deltares at all times. // All rights reserved. -using System.Globalization; using System.IO; -using System.Linq; -using System.Threading; -using Deltares.DamEngine.Data.Geometry; -using Deltares.DamEngine.Data.GeometryExport; +using Deltares.DamEngine.Calculators.KernelWrappers.MacroStabilityCommon; using Deltares.DamEngine.Data.Geotechnics; using Deltares.DamEngine.Interface; using Deltares.DamEngine.TestHelpers; @@ -44,7 +40,7 @@ [TestCase("DWP_7", 6,9, 65, 57, 37, 1.264)] [TestCase("DWP_8", 7,27, 117, 91, 46, 0.989)] [TestCase("DWP_16", 15,26, 99, 74, 39, 0.849)] - [TestCase("DWP_17", 16,18, 79, 62, 31, 1.256)] + [TestCase("DWP_17", 16,19, 82, 64, 32, 1.256)] [TestCase("DWP_20", 19,24, 102, 79, 46, 1.523)] public void TestGeometryAndResultForIssueWithDwpsFromTutorial(string location, int segmentIndex, int surfaceCount, int curveCount, int pointCount, int surfaceLinePointCount, double safetyFactor) { @@ -63,8 +59,7 @@ string soilName = engineInterface.DamProjectData.Dike.Locations[0].DikeEmbankmentMaterial; Soil soil = engineInterface.DamProjectData.Dike.SoilList.GetSoilByName(soilName); // To be able to check the geometry, create it here. - SoilProfile2D soilProfile2D = SoilProfile2DSurfaceLineHelper.CombineSurfaceLineWithSoilProfile2D(surfaceLine.Geometry, - engineInterface.DamProjectData.Segments[segmentIndex].SoilProfileProbabilities[0].SoilProfile2D, soil); + SoilProfile2D soilProfile2D = MacroStabilityCommonHelper.CombineSoilProfileWithSurfaceLine(engineInterface.DamProjectData.Segments[segmentIndex].SoilProfileProbabilities[0], surfaceLine, soil); // For debugging purposes //geometry = soilProfile2D.Geometry; //GeometryExporter.ExportToFile(geometry, GeometryExporter.VisualizationFolder + location + "GeometryEnd.txt"); Index: DamEngine/trunk/src/Deltares.DamEngine.Calculators/KernelWrappers/MacroStabilityOutwards/MacroStabilityOutwardsKernelWrapper.cs =================================================================== diff -u -r6264 -r6291 --- DamEngine/trunk/src/Deltares.DamEngine.Calculators/KernelWrappers/MacroStabilityOutwards/MacroStabilityOutwardsKernelWrapper.cs (.../MacroStabilityOutwardsKernelWrapper.cs) (revision 6264) +++ DamEngine/trunk/src/Deltares.DamEngine.Calculators/KernelWrappers/MacroStabilityOutwards/MacroStabilityOutwardsKernelWrapper.cs (.../MacroStabilityOutwardsKernelWrapper.cs) (revision 6291) @@ -157,7 +157,7 @@ /// public int Validate(IKernelDataInput kernelDataInput, IKernelDataOutput kernelDataOutput, out List messages) { - return macroStabilityCommonHelper.Validate(kernelDataInput, kernelDataOutput, out messages); + return MacroStabilityCommonHelper.Validate(kernelDataInput, kernelDataOutput, out messages); } /// Index: DamEngine/trunk/src/Deltares.DamEngine.Calculators/DikesDesign/DesignCalculator.cs =================================================================== diff -u -r6191 -r6291 --- DamEngine/trunk/src/Deltares.DamEngine.Calculators/DikesDesign/DesignCalculator.cs (.../DesignCalculator.cs) (revision 6191) +++ DamEngine/trunk/src/Deltares.DamEngine.Calculators/DikesDesign/DesignCalculator.cs (.../DesignCalculator.cs) (revision 6291) @@ -292,9 +292,8 @@ damKernelInput, calculationMessages, designResults); break; case AnalysisType.NoAdaption: - DesignCalculatorSingle calculatorSingle = new DesignCalculatorSingle(); - calculatorSingle.PerformSingleCalculation(kernelWrapper, kernelDataInput, kernelDataOutput, - damKernelInput, calculationMessages, designResults); + DesignCalculatorSingle.PerformSingleCalculation(kernelWrapper, kernelDataInput, kernelDataOutput, + damKernelInput, calculationMessages, designResults); break; } } Index: DamEngine/trunk/src/Deltares.DamEngine.Calculators/KernelWrappers/MacroStabilityCommon/MacroStabilityCommonHelper.cs =================================================================== diff -u -r6264 -r6291 --- DamEngine/trunk/src/Deltares.DamEngine.Calculators/KernelWrappers/MacroStabilityCommon/MacroStabilityCommonHelper.cs (.../MacroStabilityCommonHelper.cs) (revision 6264) +++ DamEngine/trunk/src/Deltares.DamEngine.Calculators/KernelWrappers/MacroStabilityCommon/MacroStabilityCommonHelper.cs (.../MacroStabilityCommonHelper.cs) (revision 6291) @@ -23,6 +23,7 @@ using System.Collections.Generic; using System.Data; using System.IO; +using System.Linq; using System.Text.RegularExpressions; using Deltares.DamEngine.Calculators.KernelWrappers.Common; using Deltares.DamEngine.Calculators.KernelWrappers.Interfaces; @@ -44,6 +45,7 @@ using Deltares.StixFileWriter; using CharacteristicPointType = Deltares.DamEngine.Data.Geotechnics.CharacteristicPointType; using MacroStabilityOutput = Deltares.DamEngine.Calculators.KernelWrappers.MacroStabilityInwards.MacroStabilityOutput; +using Point2D = Deltares.Geo.Common.Geometry.Point2D; using Soil = Deltares.DamEngine.Data.Geotechnics.Soil; namespace Deltares.DamEngine.Calculators.KernelWrappers.MacroStabilityCommon; @@ -297,7 +299,7 @@ /// /// Zero when there are no errors, one when there are errors that prevent a calculation /// - public int Validate(IKernelDataInput kernelDataInput, IKernelDataOutput kernelDataOutput, out List messages) + public static int Validate(IKernelDataInput kernelDataInput, IKernelDataOutput kernelDataOutput, out List messages) { var macroStabilityKernelDataInput = (MacroStabilityKernelDataInput) kernelDataInput; messages = new List(); @@ -379,6 +381,8 @@ messages = new List(); try { + //string helperFile = fileName.Replace(".skx", ".testIn.xml"); + //calculator.FileName = helperFile; MacroStability.CSharpWrapper.Output.MacroStabilityOutput macroStabilityOutputKernel = calculator.Calculate(); string outputAsXml = calculator.KernelOutputXml; string outputFileName = fileName.Replace(".skx", ".out.xml"); @@ -463,8 +467,58 @@ ValidateForCombineSoilProfile2DWithSurfaceLine(subSoilScenario, surfaceLine2, dikeEmbankmentSoil); subSoilScenario.SoilProfile2D = SoilProfile2DSurfaceLineHelper.CombineSurfaceLineWithSoilProfile2D(surfaceLine2.Geometry, subSoilScenario.SoilProfile2D, dikeEmbankmentSoil); + CorrectSurfacelinePointsForGeometryCoordinates(subSoilScenario.SoilProfile2D.Geometry, surfaceLine2); } + + private static void CorrectSurfacelinePointsForGeometryCoordinates(GeometryData geometry, SurfaceLine2 surfaceLine) + { + foreach (Data.Geometry.Point2D surfaceLinePoint in surfaceLine.Geometry.Points) + { + var point = geometry.GetPointAtLocation(surfaceLinePoint, GeometryConstants.Accuracy * 1.5); + if (point != null) + { + surfaceLinePoint.X = point.X; + surfaceLinePoint.Z = point.Z; + } + } + RemovePointsAtSameXLocation(surfaceLine); + } + + /// + /// Removes points with same X coordinates and different Z + /// + private static void RemovePointsAtSameXLocation(SurfaceLine2 surfaceLine) + { + var pointsToDelete = new List(); + CharacteristicPoint[] pointsAsArray = surfaceLine.CharacteristicPoints.ToArray(); + for (var i = 0; i < pointsAsArray.Length; i++) + { + for (int j = i; j < pointsAsArray.Length; j++) + { + if (i != j && Math.Abs(pointsAsArray[i].Point.X - pointsAsArray[j].Point.X) < GeometryConstants.Accuracy && + Math.Abs(pointsAsArray[i].Point.Z - pointsAsArray[j].Point.Z) > GeometryConstants.Accuracy && !pointsToDelete.Contains(pointsAsArray[j])) + { + if (pointsAsArray[j].CharacteristicPointType == CharacteristicPointType.None) + { + pointsToDelete.Add(pointsAsArray[j]); + } + else + { + if (pointsAsArray[i].CharacteristicPointType == CharacteristicPointType.None) + { + pointsToDelete.Add(pointsAsArray[i]); + } + } + } + } + } + foreach (CharacteristicPoint point in pointsToDelete) + { + surfaceLine.CharacteristicPoints.Remove(point); + } + } + private static void ValidateForCombineSoilProfile2DWithSurfaceLine(SoilGeometryProbability subSoilScenario, SurfaceLine2 surfaceLine2, Soil dikeEmbankmentSoil) { ThrowWhenSoilProfile2DIsNull(subSoilScenario); Index: DamEngine/trunk/src/Deltares.DamEngine.Calculators/DikesDesign/DesignCalculatorSingle.cs =================================================================== diff -u -r6191 -r6291 --- DamEngine/trunk/src/Deltares.DamEngine.Calculators/DikesDesign/DesignCalculatorSingle.cs (.../DesignCalculatorSingle.cs) (revision 6191) +++ DamEngine/trunk/src/Deltares.DamEngine.Calculators/DikesDesign/DesignCalculatorSingle.cs (.../DesignCalculatorSingle.cs) (revision 6291) @@ -47,7 +47,7 @@ /// The design scenario. /// The calculation messages. /// The design calculations. - public void PerformSingleCalculation(IKernelWrapper kernelWrapper, IKernelDataInput kernelDataInput, + public static void PerformSingleCalculation(IKernelWrapper kernelWrapper, IKernelDataInput kernelDataInput, IKernelDataOutput kernelDataOutput, DamKernelInput damKernelInput, List calculationMessages, List designCalculations) { Index: DamEngine/trunk/src/Deltares.DamEngine.Calculators/KernelWrappers/MacroStabilityInwards/MacroStabilityInwardsKernelWrapper.cs =================================================================== diff -u -r6264 -r6291 --- DamEngine/trunk/src/Deltares.DamEngine.Calculators/KernelWrappers/MacroStabilityInwards/MacroStabilityInwardsKernelWrapper.cs (.../MacroStabilityInwardsKernelWrapper.cs) (revision 6264) +++ DamEngine/trunk/src/Deltares.DamEngine.Calculators/KernelWrappers/MacroStabilityInwards/MacroStabilityInwardsKernelWrapper.cs (.../MacroStabilityInwardsKernelWrapper.cs) (revision 6291) @@ -206,7 +206,7 @@ /// public int Validate(IKernelDataInput kernelDataInput, IKernelDataOutput kernelDataOutput, out List messages) { - return macroStabilityCommonHelper.Validate(kernelDataInput, kernelDataOutput, out messages); + return MacroStabilityCommonHelper.Validate(kernelDataInput, kernelDataOutput, out messages); } ///