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