Index: DamEngine/trunk/src/Deltares.DamEngine.Calculators/KernelWrappers/MacroStabilityInwards/UpliftVanGridCreator.cs =================================================================== diff -u -r3522 -r3676 --- DamEngine/trunk/src/Deltares.DamEngine.Calculators/KernelWrappers/MacroStabilityInwards/UpliftVanGridCreator.cs (.../UpliftVanGridCreator.cs) (revision 3522) +++ DamEngine/trunk/src/Deltares.DamEngine.Calculators/KernelWrappers/MacroStabilityInwards/UpliftVanGridCreator.cs (.../UpliftVanGridCreator.cs) (revision 3676) @@ -21,9 +21,10 @@ using System; using System.Linq; -using Deltares.DamEngine.Calculators.KernelWrappers.MacroStabilityCommon; using Deltares.DamEngine.Data.General; using Deltares.DamEngine.Data.Geotechnics; +using CharacteristicPointType = Deltares.DamEngine.Data.Geotechnics.CharacteristicPointType; +using UpliftVanCalculationGrid = Deltares.DamEngine.Calculators.KernelWrappers.MacroStabilityCommon.UpliftVanCalculationGrid; namespace Deltares.DamEngine.Calculators.KernelWrappers.MacroStabilityInwards { @@ -100,6 +101,60 @@ return upliftVanCalculationGrid; } + /// Determines the Uplift Van grid from used from writing the input stix file. + /// The implementation should be identical as used in the MacroStability kernel. + /// the slip circle definition + /// The surface line. + /// The Uplift Van calculation grid. + /// + public static void DetermineStixGrids(SlipCircleDefinition slipCircleDefinition, SurfaceLine2 surfaceLine, Deltares.MacroStability.CSharpWrapper.UpliftVanCalculationGrid upliftVanCalculationGrid) + { + // Define specified active (left) grid + if (surfaceLine != null) + { + // 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.UpliftVanLeftGridHorizontalPointCount - 1); + double gridHeight = slipCircleDefinition.UpliftVanLeftGridVerticalPointDistance * + (slipCircleDefinition.UpliftVanRightGridVerticalPointCount - 1); + upliftVanCalculationGrid.LeftGrid.GridXLeft = gridXCoordinate; + upliftVanCalculationGrid.LeftGrid.GridXRight = gridXCoordinate + gridWidth; + upliftVanCalculationGrid.LeftGrid.GridXNumber = slipCircleDefinition.UpliftVanRightGridHorizontalPointCount; + upliftVanCalculationGrid.LeftGrid.GridZBottom = gridYCoordinate; + upliftVanCalculationGrid.LeftGrid.GridZTop = gridYCoordinate + gridHeight; + upliftVanCalculationGrid.LeftGrid.GridZNumber = slipCircleDefinition.UpliftVanRightGridVerticalPointCount; + } + + // Define specified passive (right) grid + if (surfaceLine != null) + { + const double gridOffset = 0.2; + var dikeToeAtPolder = surfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DikeToeAtPolder); + + // 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.RightGrid.GridXLeft = gridXCoordinate; + // The grid is limited to the right boundary of the surfaceline + double boundaryRight = surfaceLine.CharacteristicPoints.Geometry.GetGeometryBounds().Right; + upliftVanCalculationGrid.RightGrid.GridXRight = Math.Min(gridXCoordinate + gridWidth, boundaryRight); + upliftVanCalculationGrid.RightGrid.GridXNumber = slipCircleDefinition.UpliftVanRightGridHorizontalPointCount; + + // Z-coordinates settings of the grid + double gridHeight = slipCircleDefinition.UpliftVanRightGridVerticalPointDistance * + (slipCircleDefinition.UpliftVanRightGridVerticalPointCount - 1); + upliftVanCalculationGrid.RightGrid.GridZBottom = dikeToeAtPolder.Z + gridOffset; + upliftVanCalculationGrid.RightGrid.GridZTop = upliftVanCalculationGrid.RightGrid.GridZBottom + gridHeight; + upliftVanCalculationGrid.RightGrid.GridZNumber = slipCircleDefinition.UpliftVanRightGridVerticalPointCount; + } + } + /// Determines the tangent lines. /// The uplift van calculation grid. /// The slip circle definition. @@ -119,7 +174,6 @@ slipCircleDefinition.UpliftVanTangentLinesDistance, minimumCircleDepth); break; } - } private static void DetermineTangentLinesSpecified(UpliftVanCalculationGrid upliftVanCalculationGrid, @@ -129,22 +183,25 @@ { throw new ArgumentException(String.Format("Vertical distance should be > 0 but is {0}", distance)); } + double topOfBottomLayer = soilProfile1D.Layers.Last().TopLevel; double surfaceLevel = soilProfile1D.Layers.First().TopLevel; double bottomTangentLines = topOfBottomLayer - distance; bottomTangentLines = Math.Min(bottomTangentLines, surfaceLevel - minimumCircleDepth); double topTangentLines = bottomTangentLines; int tangentLinesCount = 1; + upliftVanCalculationGrid.TangentLineLevels.Add(topTangentLines); while (topTangentLines < surfaceLevel) { topTangentLines += distance; + upliftVanCalculationGrid.TangentLineLevels.Add(topTangentLines); tangentLinesCount++; } + upliftVanCalculationGrid.TangentLineLevels.Reverse(); upliftVanCalculationGrid.TangentLineCount = tangentLinesCount; upliftVanCalculationGrid.TangentLineZTop = topTangentLines; upliftVanCalculationGrid.TangentLineZBottom = bottomTangentLines; - } } -} +} \ No newline at end of file Index: DamEngine/trunk/lib/StixWriter/Deltares.StixFileWriter.dll =================================================================== diff -u -r3632 -r3676 Binary files differ Index: DamEngine/trunk/src/Deltares.DamEngine.Calculators/KernelWrappers/MacroStabilityInwards/BishopGridCreator.cs =================================================================== diff -u -r3621 -r3676 --- DamEngine/trunk/src/Deltares.DamEngine.Calculators/KernelWrappers/MacroStabilityInwards/BishopGridCreator.cs (.../BishopGridCreator.cs) (revision 3621) +++ DamEngine/trunk/src/Deltares.DamEngine.Calculators/KernelWrappers/MacroStabilityInwards/BishopGridCreator.cs (.../BishopGridCreator.cs) (revision 3676) @@ -24,15 +24,16 @@ using Deltares.DamEngine.Calculators.KernelWrappers.MacroStabilityCommon; using Deltares.DamEngine.Data.General; using Deltares.DamEngine.Data.Geotechnics; +using Deltares.MacroStability.CSharpWrapper; namespace Deltares.DamEngine.Calculators.KernelWrappers.MacroStabilityInwards { public class BishopGridCreator { - /// Determines the UpliftVan grid from settings. + /// Determines the Bishop grid from settings. /// the slip circle definition /// The surface line. - /// + /// the the bishop calculation grid public static BishopCalculationGrid DetermineGridsFromSettings( SlipCircleDefinition slipCircleDefinition, SurfaceLine2 surfaceLine) { @@ -75,6 +76,35 @@ return bishopCalculationGrid; } + /// Determines the Bishop grid from used from writing the input stix file. + /// The implementation should be identical as used in the MacroStability kernel. + /// the slip circle definition + /// The surface line. + /// The calculation grid + /// + public static void DetermineStixGrid(SlipCircleDefinition slipCircleDefinition, SurfaceLine2 surfaceLine, CalculationGrid calculationGrid) + { + // Define specified active (left) grid + if (surfaceLine != null) + { + // 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.BishopGridHorizontalPointDistance * + (slipCircleDefinition.BishopGridHorizontalPointCount - 1); + double gridHeight = slipCircleDefinition.BishopGridVerticalPointDistance * + (slipCircleDefinition.BishopGridVerticalPointCount - 1); + calculationGrid.GridXLeft = gridXCoordinate; + calculationGrid.GridXRight = gridXCoordinate + gridWidth; + calculationGrid.GridXNumber = slipCircleDefinition.BishopGridHorizontalPointCount; + calculationGrid.GridZBottom = gridYCoordinate; + calculationGrid.GridZTop = gridYCoordinate + gridHeight; + calculationGrid.GridZNumber = slipCircleDefinition.BishopGridVerticalPointCount; + } + } + /// Determines the tangent lines. /// The bishop calculation grid. /// The slip circle definition. @@ -94,7 +124,6 @@ slipCircleDefinition.BishopTangentLinesDistance, minimumCircleDepth); break; } - } private static void DetermineTangentLinesSpecified(BishopCalculationGrid bishopCalculationGrid, @@ -104,21 +133,25 @@ { throw new ArgumentException(string.Format("Vertical distance should be > 0 but is {0}", distance)); } + double topOfBottomLayer = soilProfile1D.Layers.Last().TopLevel; double surfaceLevel = soilProfile1D.Layers.First().TopLevel; double bottomTangentLines = topOfBottomLayer - distance; bottomTangentLines = Math.Min(bottomTangentLines, surfaceLevel - minimumCircleDepth); double topTangentLines = bottomTangentLines; int tangentLinesCount = 1; + bishopCalculationGrid.TangentLineLevels.Add(topTangentLines); while (topTangentLines < surfaceLevel) { topTangentLines += distance; + bishopCalculationGrid.TangentLineLevels.Add(topTangentLines); tangentLinesCount++; } + bishopCalculationGrid.TangentLineLevels.Reverse(); bishopCalculationGrid.TangentLineCount = tangentLinesCount; bishopCalculationGrid.TangentLineZTop = topTangentLines; bishopCalculationGrid.TangentLineZBottom = bottomTangentLines; } } -} +} \ No newline at end of file Index: DamEngine/trunk/src/Deltares.DamEngine.Calculators/KernelWrappers/MacroStabilityInwards/MacroStabilityInwardsKernelWrapper.cs =================================================================== diff -u -r3656 -r3676 --- DamEngine/trunk/src/Deltares.DamEngine.Calculators/KernelWrappers/MacroStabilityInwards/MacroStabilityInwardsKernelWrapper.cs (.../MacroStabilityInwardsKernelWrapper.cs) (revision 3656) +++ DamEngine/trunk/src/Deltares.DamEngine.Calculators/KernelWrappers/MacroStabilityInwards/MacroStabilityInwardsKernelWrapper.cs (.../MacroStabilityInwardsKernelWrapper.cs) (revision 3676) @@ -100,13 +100,13 @@ var fillMacroStabilityWrapperFromEngine = new FillMacroStabilityWrapperInputFromEngine(); + var slipCircleDefinition = damKernelInput.DamFailureMechanismeCalculationSpecification + .FailureMechanismParametersMStab.MStabParameters.SlipCircleDefinition; switch (FailureMechanismParametersMStab.MStabParameters.Model) { case MStabModelType.Bishop: { // Define slip circle Bishop - var slipCircleDefinition = damKernelInput.DamFailureMechanismeCalculationSpecification - .FailureMechanismParametersMStab.MStabParameters.SlipCircleDefinition; var minimumCircleDepth = damKernelInput.DamFailureMechanismeCalculationSpecification .FailureMechanismParametersMStab.MStabParameters.CalculationOptions.MinimalCircleDepth; var bishopCalculationGrid = BishopGridCreator.DetermineGridsFromSettings( @@ -147,8 +147,6 @@ } // Define slip circle UpliftVan - var slipCircleDefinition = damKernelInput.DamFailureMechanismeCalculationSpecification - .FailureMechanismParametersMStab.MStabParameters.SlipCircleDefinition; var minimumCircleDepth = damKernelInput.DamFailureMechanismeCalculationSpecification .FailureMechanismParametersMStab.MStabParameters.CalculationOptions.MinimalCircleDepth; var upliftVanCalculationGrid = UpliftVanGridCreator.DetermineGridsFromSettings( @@ -171,6 +169,25 @@ macroStabilityInput.Input = fillMacroStabilityWrapperFromEngine.CreateMacroStabilityInput(damKernelInput, FailureMechanismParametersMStab, waterNet); fileNameForCalculation = GetStabilityInputFileName(damKernelInput, iterationIndex, FailureMechanismParametersMStab.MStabParameters.Model); + + var inputForStixFile = macroStabilityInput.Input; + if (slipCircleDefinition.GridSizeDetermination != GridSizeDetermination.Specified) + { + var surfaceLine = damKernelInput.Location.SurfaceLine; + switch (FailureMechanismParametersMStab.MStabParameters.Model) + { + case MStabModelType.Bishop: + BishopGridCreator.DetermineStixGrid(slipCircleDefinition, surfaceLine, inputForStixFile.StabilityModel.BishopCalculationCircle.Grid); + break; + case MStabModelType.UpliftVan: + UpliftVanGridCreator.DetermineStixGrids(slipCircleDefinition, surfaceLine, inputForStixFile.StabilityModel.UpliftVanCalculationGrid); + break; + default: + throw new ArgumentOutOfRangeException(nameof(FailureMechanismParametersMStab.MStabParameters.Model)); + } + } + WriteStixFileBasedOnInputAndSearchGrid(fileNameForCalculation, inputForStixFile); + return PrepareKernel(macroStabilityInput.Input); } catch(Exception e) @@ -214,10 +231,10 @@ var inputAsXml = stabilityCalculator.KernelInputXml; File.WriteAllText(fileNameForCalculation, inputAsXml); - //Todo #Bka : this would be the place to write the stix file based on the input. Separate method as some additional as yet unavailable data needs to be set first. - // var stixWriter = new StixWriter(); #Bka Leave this code here for now as this is the real deal as soon as the tool is finished. Do not remark this in review. - // stixWriter.FillInfo("DAMEngine", Path.GetFullPath(fileNameForCalculation)); - // stixWriter.WriteStixFile(fileNameForCalculation, input); + + + + if (inputAsXml.Length > 10) { return PrepareResult.Successful; @@ -340,6 +357,19 @@ } } + private void WriteStixFileBasedOnInputAndSearchGrid(string fileName, MacroStabilityInput input) + { + if (!(input.StabilityModel.ModelOption == StabilityModelOptionType.UpliftVan && + input.StabilityModel.SearchAlgorithm == SearchAlgorithm.Beeswarm)) + { + var fileNameForCalculationAsStix = DetermineStixFilename(fileName, "input"); + var inputStixFile = new StixWriter(); + inputStixFile.FillInfo("DAM Engine", Path.GetDirectoryName(fileName), + Path.GetFileName(fileName), true); + StixFileWrite(inputStixFile, fileNameForCalculationAsStix, input); + } + } + private void WriteStixFileBasedOnInputAndResultsSlipPlane(MacroStabilityKernelDataInput input, MacroStabilityOutput macroStabilityOutput) { @@ -350,35 +380,36 @@ macroStabilityOutputItem.CalculationPath = Path.GetDirectoryName(fileNameForCalculation); macroStabilityOutputItem.ProjectName = Path.GetFileName(fileNameForCalculation); var fileNameForCalculationAsStix = DetermineStixFilename(fileNameForCalculation, "result"); - StixWriter.FillInfo("DAM Engine", macroStabilityOutputItem.CalculationPath, + var resultStixWrite = new StixWriter(); + resultStixWrite.FillInfo("DAM Engine", macroStabilityOutputItem.CalculationPath, macroStabilityOutputItem.ProjectName, true); if (macroStabilityOutputItem.StabilityModelType == MStabModelType.Bishop) { - StixWriter.FillCalculatedCircle(macroStabilityOutputItem.ActiveCenterPoint.X, + resultStixWrite.FillCalculatedCircle(macroStabilityOutputItem.ActiveCenterPoint.X, macroStabilityOutputItem.ActiveCenterPoint.Z, macroStabilityOutputItem.ActiveCenterPointRadius); } if (macroStabilityOutputItem.StabilityModelType == MStabModelType.UpliftVan) { - StixWriter.FillCalculatedDualCircle(macroStabilityOutputItem.ActiveCenterPoint.X, + resultStixWrite.FillCalculatedDualCircle(macroStabilityOutputItem.ActiveCenterPoint.X, macroStabilityOutputItem.ActiveCenterPoint.Z, macroStabilityOutputItem.ActiveCenterPointRadius, macroStabilityOutputItem.PassiveCenterPoint.X, macroStabilityOutputItem.PassiveCenterPoint.Z); } - StixFileWrite(fileNameForCalculationAsStix, input.Input); + StixFileWrite(resultStixWrite, fileNameForCalculationAsStix, input.Input); } } } - private void StixFileWrite(string fileName, MacroStabilityInput input) + private void StixFileWrite(StixWriter stixWriter, string fileName, MacroStabilityInput input) { if (File.Exists(fileName)) { File.Delete(fileName); } - StixWriter.WriteStixFile(fileName, input); + stixWriter.WriteStixFile(fileName, input); } private string DetermineStixFilename(string fileNameForCalc, string suffix, string extension = ".stix") Index: DamEngine/trunk/src/Deltares.DamEngine.IntegrationTests/IntegrationTests/MacroStabilityInwardsTests.cs =================================================================== diff -u -r3671 -r3676 --- DamEngine/trunk/src/Deltares.DamEngine.IntegrationTests/IntegrationTests/MacroStabilityInwardsTests.cs (.../MacroStabilityInwardsTests.cs) (revision 3671) +++ DamEngine/trunk/src/Deltares.DamEngine.IntegrationTests/IntegrationTests/MacroStabilityInwardsTests.cs (.../MacroStabilityInwardsTests.cs) (revision 3676) @@ -19,7 +19,9 @@ // Stichting Deltares and remain full property of Stichting Deltares at all times. // All rights reserved. +using System.Collections.Generic; using System.IO; +using System.Linq; using System.Text.RegularExpressions; using Deltares.DamEngine.Data.General; using Deltares.DamEngine.Data.Geometry; @@ -772,12 +774,19 @@ Assert.AreEqual(1.682, result.StabilityDesignResults.SafetyFactor, Tolerance); // Stix file - var file1 = Path.Combine(Path.GetFullPath(calcDir), "Stability\\Bishop\\Loc(6-4-1-A-1-F)_Sce(1)_Pro(6-4-1-A-1-F_1_s)_result.stix"); - Assert.IsTrue(File.Exists(file1)); - var file2 = Path.Combine(Path.GetFullPath(calcDir), "Stability\\Bishop\\Loc(6-4-1-A-1-F)_Sce(1)_Pro(6-4-1-A-1-F_2_s)_result.stix"); - Assert.IsTrue(File.Exists(file2)); - var file3 = Path.Combine(Path.GetFullPath(calcDir), "Stability\\Bishop\\Loc(6-4-1-A-1-F)_Sce(1)_Pro(6-4-1-A-1-F_3_s)_result.stix"); - Assert.IsTrue(File.Exists(file3)); + var fileList = new List + { + "Stability\\Bishop\\Loc(6-4-1-A-1-F)_Sce(1)_Pro(6-4-1-A-1-F_1_s)_input.stix", + "Stability\\Bishop\\Loc(6-4-1-A-1-F)_Sce(1)_Pro(6-4-1-A-1-F_2_s)_input.stix", + "Stability\\Bishop\\Loc(6-4-1-A-1-F)_Sce(1)_Pro(6-4-1-A-1-F_3_s)_input.stix", + "Stability\\Bishop\\Loc(6-4-1-A-1-F)_Sce(1)_Pro(6-4-1-A-1-F_1_s)_result.stix", + "Stability\\Bishop\\Loc(6-4-1-A-1-F)_Sce(1)_Pro(6-4-1-A-1-F_2_s)_result.stix", + "Stability\\Bishop\\Loc(6-4-1-A-1-F)_Sce(1)_Pro(6-4-1-A-1-F_3_s)_result.stix" + }; + foreach (var file in fileList.Select(file => Path.Combine(Path.GetFullPath(calcDir), file))) + { + Assert.IsTrue(File.Exists(file), file + " does not exists"); + } } [Test, Category("Slow")] @@ -834,10 +843,18 @@ // SafetyFactor=1.551 DSTAB 1.414. 1.097 Assert.AreEqual(1.551, result.StabilityDesignResults.SafetyFactor, Tolerance); Assert.AreEqual(CalculationResult.Succeeded, ConversionHelper.ConvertToCalculationResult(result.CalculationResult)); - var file1 = Path.Combine(Path.GetFullPath(calcDir), "Stability\\UpliftVan\\Loc(6-4-1-A-1-F)_Sce(1)_Pro(6-4-1-A-1-F_1_s)_result.stix"); - Assert.IsTrue(File.Exists(file1)); - var file2 = Path.Combine(Path.GetFullPath(calcDir), "Stability\\UpliftVan\\Loc(6-4-1-A-1-F)_Sce(1)_Pro(6-4-1-A-1-F_2_s)_result.stix"); - Assert.IsTrue(File.Exists(file2)); + + var fileList = new List + { + "Stability\\UpliftVan\\Loc(6-4-1-A-1-F)_Sce(1)_Pro(6-4-1-A-1-F_1_s)_input.stix", + "Stability\\UpliftVan\\Loc(6-4-1-A-1-F)_Sce(1)_Pro(6-4-1-A-1-F_2_s)_input.stix", + "Stability\\UpliftVan\\Loc(6-4-1-A-1-F)_Sce(1)_Pro(6-4-1-A-1-F_1_s)_result.stix", + "Stability\\UpliftVan\\Loc(6-4-1-A-1-F)_Sce(1)_Pro(6-4-1-A-1-F_2_s)_result.stix" + }; + foreach (var file in fileList.Select(file => Path.Combine(Path.GetFullPath(calcDir), file))) + { + Assert.IsTrue(File.Exists(file),file + "does not exists"); + } } private static string GetOutputStringForProject(string analysisType) Index: DamEngine/trunk/lib/StixWriter/Deltares.StixFileWriter.Version.dll =================================================================== diff -u -r3632 -r3676 Binary files differ