Index: DamEngine/trunk/src/Deltares.DamEngine.IntegrationTests/IntegrationTests/IssuesTests.cs =================================================================== diff -u -r6245 -r6276 --- DamEngine/trunk/src/Deltares.DamEngine.IntegrationTests/IntegrationTests/IssuesTests.cs (.../IssuesTests.cs) (revision 6245) +++ DamEngine/trunk/src/Deltares.DamEngine.IntegrationTests/IntegrationTests/IssuesTests.cs (.../IssuesTests.cs) (revision 6276) @@ -44,7 +44,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,19, 82, 64, 32, 1.256)] + [TestCase("DWP_17", 16,18, 79, 62, 31, 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) { Index: DamEngine/trunk/src/Deltares.DamEngine.IntegrationTests/IntegrationTests/MacroStabilityInwardsTests.cs =================================================================== diff -u -r6274 -r6276 --- DamEngine/trunk/src/Deltares.DamEngine.IntegrationTests/IntegrationTests/MacroStabilityInwardsTests.cs (.../MacroStabilityInwardsTests.cs) (revision 6274) +++ DamEngine/trunk/src/Deltares.DamEngine.IntegrationTests/IntegrationTests/MacroStabilityInwardsTests.cs (.../MacroStabilityInwardsTests.cs) (revision 6276) @@ -383,7 +383,7 @@ Output output = GeneralHelper.RunAfterInputValidation(inputString); - Assert.That(output.Results.CalculationResults.First().StabilityDesignResults.SafetyFactor, Is.EqualTo(2.062).Within(tolerance)); + Assert.That(output.Results.CalculationResults.First().StabilityDesignResults.SafetyFactor, Is.EqualTo(2.061).Within(tolerance)); } [Test] @@ -396,10 +396,10 @@ // Set UseNewMinDistanceDikeToeStartDitch(Use new allowed distance toe-ditch) = true (to force value to be written to XML) // // Parameters: CalcDir - StabilityModel - DesignStrategy - CalculationResult - FoS - EntryPointX - ExitPointX - DikeLength - ShoulderHeight - Iterations - ResultMessage - [TestCase("TestStabInwardsBishopDesignSequential", "Bishop", "SlopeAdaptionBeforeShoulderAdaption", CalculationResult.Succeeded, 1.467, 45.387, 2.799, 5, "")] + [TestCase("TestStabInwardsBishopDesignSequential", "Bishop", "SlopeAdaptionBeforeShoulderAdaption", CalculationResult.Succeeded, 1.467, 45.385, 2.799, 5, "")] [TestCase("TestStabInwardsBishopDesignOptimized", "Bishop", "OptimizedSlopeAndShoulderAdaption", CalculationResult.Succeeded, 1.483, 43.760, 3.889, 4, "")] - [TestCase("TestStabInwardsUpliftVanDesignSequential", "UpliftVan", "SlopeAdaptionBeforeShoulderAdaption", CalculationResult.Succeeded, 1.428, 47.737, 3.132, 6, "")] - [TestCase("TestStabInwardsUpliftVanDesignOptimized", "UpliftVan", "OptimizedSlopeAndShoulderAdaption", CalculationResult.RunFailed, 1.342, 80.402, 4.545, 20, "After height adaption ditch does not fit inside surfaceline anymore.")] + [TestCase("TestStabInwardsUpliftVanDesignSequential", "UpliftVan", "SlopeAdaptionBeforeShoulderAdaption", CalculationResult.Succeeded, 1.427, 47.735, 3.132, 6, "")] + [TestCase("TestStabInwardsUpliftVanDesignOptimized", "UpliftVan", "OptimizedSlopeAndShoulderAdaption", CalculationResult.RunFailed, 1.342, 80.417, 4.545, 20, "After height adaption ditch does not fit inside surfaceline anymore.")] public void CanPerformStabilityInwardsDesignTutorialDesignWithAdaption_OneLocation( string calcDir, string stabilityModel, string designStrategy, CalculationResult calculationResult, double expectedSafetyFactor, @@ -937,13 +937,13 @@ } [Test, Category(Categories.Slow)] - [TestCase("DWP_1", InputStabilityModelType.Bishop, "SlopeAdaptionBeforeShoulderAdaption", CalculationResult.Succeeded, 1.4, 1.493, 5)] + [TestCase("DWP_1", InputStabilityModelType.Bishop, "SlopeAdaptionBeforeShoulderAdaption", CalculationResult.Succeeded, 1.4, 1.492, 5)] [TestCase("DWP_1", InputStabilityModelType.Bishop, "OptimizedSlopeAndShoulderAdaption", CalculationResult.Succeeded, 1.4, 1.545, 4)] [TestCase("DWP_2", InputStabilityModelType.Bishop, "SlopeAdaptionBeforeShoulderAdaption", CalculationResult.Succeeded, 1.5, 1.546, 9)] [TestCase("DWP_2", InputStabilityModelType.Bishop, "OptimizedSlopeAndShoulderAdaption", CalculationResult.RunFailed, 1.5, 1.176, 17, "Location 'DWP_2', subsoil scenario 'DWP_2.stix', design scenario '1': The calculation failed with error message 'The design was not successful. After height adaption ditch does not fit inside surfaceline anymore.'")] [TestCase("DWP_13", InputStabilityModelType.Bishop, "OptimizedSlopeAndShoulderAdaption", CalculationResult.RunFailed, 1.5, 0.936, 23, "The characteristic points of the surfaceline are not ascending in X-direction.")] [TestCase("DWP_10", InputStabilityModelType.Bishop, "OptimizedSlopeAndShoulderAdaption", CalculationResult.RunFailed, 1.5, 1.308, 16, "Location 'DWP_10', subsoil scenario 'DWP_10.stix', design scenario '3': The calculation failed with error message 'The design was not successful. After height adaption ditch does not fit inside surfaceline anymore.'")] - [TestCase("DWP_1", InputStabilityModelType.BishopUpliftVan, "SlopeAdaptionBeforeShoulderAdaption", CalculationResult.Succeeded, 1.4, 1.406, 6)] + [TestCase("DWP_1", InputStabilityModelType.BishopUpliftVan, "SlopeAdaptionBeforeShoulderAdaption", CalculationResult.Succeeded, 1.4, 1.405, 6)] public void GivenTutorialDesign_WhenSpecifiedLocationRunWithGeometryAdaption_ThenGivesExpectedResults(string locationId, InputStabilityModelType stabilityModelType, string designMethod, CalculationResult calculationResult, double requiredSafetyFactor, double actualSafetyFactor, int iterationCount, string errorMessage = "", string firstStabilityMessage = "") { Index: DamEngine/trunk/src/Deltares.DamEngine.Data/Geotechnics/SoilProfile2DSurfaceLineHelper.cs =================================================================== diff -u -r6245 -r6276 --- DamEngine/trunk/src/Deltares.DamEngine.Data/Geotechnics/SoilProfile2DSurfaceLineHelper.cs (.../SoilProfile2DSurfaceLineHelper.cs) (revision 6245) +++ DamEngine/trunk/src/Deltares.DamEngine.Data/Geotechnics/SoilProfile2DSurfaceLineHelper.cs (.../SoilProfile2DSurfaceLineHelper.cs) (revision 6276) @@ -99,6 +99,7 @@ result.Geometry.Rebox(); result.Geometry.UpdateSurfaceLine(); RoundCoordinates(result.Geometry); + CorrectSurfacelinePointsForGeometryCoordinates(result.Geometry, surfaceLine); return result; } @@ -136,9 +137,24 @@ 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 -r6245 -r6276 --- DamEngine/trunk/src/Deltares.DamEngine.Data/Geometry/GeometryPointString.cs (.../GeometryPointString.cs) (revision 6245) +++ DamEngine/trunk/src/Deltares.DamEngine.Data/Geometry/GeometryPointString.cs (.../GeometryPointString.cs) (revision 6276) @@ -482,6 +482,31 @@ } /// + /// 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/CheckLargeResultsSets.cs =================================================================== diff -u -r6274 -r6276 --- DamEngine/trunk/src/Deltares.DamEngine.IntegrationTests/IntegrationTests/CheckLargeResultsSets.cs (.../CheckLargeResultsSets.cs) (revision 6274) +++ DamEngine/trunk/src/Deltares.DamEngine.IntegrationTests/IntegrationTests/CheckLargeResultsSets.cs (.../CheckLargeResultsSets.cs) (revision 6276) @@ -176,7 +176,7 @@ { Assert.Multiple(() => { - Assert.That(designResult.StabilityDesignResults.SafetyFactor, Is.EqualTo(8.437).Within(tolerance)); + Assert.That(designResult.StabilityDesignResults.SafetyFactor, Is.EqualTo(8.438).Within(tolerance)); Assert.That(designResult.ScenarioName, Is.EqualTo("3")); Assert.That(designResult.StabilityDesignResults.UpliftSituation.Pl3HeadAdjusted, Is.EqualTo(-1.03).Within(tol2Digits)); }); @@ -187,7 +187,7 @@ { Assert.Multiple(() => { - Assert.That(designResult.StabilityDesignResults.SafetyFactor, Is.EqualTo(8.437).Within(tolerance)); + Assert.That(designResult.StabilityDesignResults.SafetyFactor, Is.EqualTo(8.438).Within(tolerance)); Assert.That(designResult.ScenarioName, Is.EqualTo("4")); Assert.That(designResult.StabilityDesignResults.UpliftSituation.Pl3HeadAdjusted, Is.EqualTo(-0.57).Within(tol2Digits)); }); Index: DamEngine/trunk/src/Deltares.DamEngine.Data/Geometry/GeometryData.cs =================================================================== diff -u -r6245 -r6276 --- DamEngine/trunk/src/Deltares.DamEngine.Data/Geometry/GeometryData.cs (.../GeometryData.cs) (revision 6245) +++ DamEngine/trunk/src/Deltares.DamEngine.Data/Geometry/GeometryData.cs (.../GeometryData.cs) (revision 6276) @@ -191,12 +191,13 @@ /// Finds the point at location. /// /// Point location to be found. + /// Maximum allowed distance between the points /// The point at the location; if not found returns null. - public Point2D GetPointAtLocation(Point2D point2D) + public Point2D GetPointAtLocation(Point2D point2D, double distance = GeometryConstants.Accuracy) { for (var i = 0; i < Points.Count; i++) { - if (Routines2D.DetermineIfPointsCoincide(point2D.X, point2D.Z, Points[i].X, Points[i].Z, GeometryConstants.Accuracy)) + if (Routines2D.DetermineIfPointsCoincide(point2D.X, point2D.Z, Points[i].X, Points[i].Z, distance)) { return Points[i]; } @@ -983,12 +984,16 @@ private void RemoveDoublesFromNewlyEffectedPoints() { var pointsToDelete = new List(); + double minDist = GeometryConstants.Accuracy * 9; Point2D[] pointsAsArray = NewlyEffectedPoints.ToArray(); for (var i = 0; i < pointsAsArray.Length; i++) { for (int j = i; j < pointsAsArray.Length; j++) { - if (i != j && pointsAsArray[i].LocationEquals(pointsAsArray[j]) && !pointsToDelete.Contains(pointsAsArray[j])) + if (i != j && + (pointsAsArray[i].LocationEquals(pointsAsArray[j]) || + Routines2D.Compute2DDistance(pointsAsArray[i].X, pointsAsArray[i].Z, pointsAsArray[j].X, pointsAsArray[j].Z) < minDist) + && !pointsToDelete.Contains(pointsAsArray[j])) { pointsToDelete.Add(pointsAsArray[j]); }