Index: DamEngine/trunk/src/Deltares.DamEngine.Calculators.Tests/KernelWrappers/MacroStabilityCommon/MacroStabilityIo/EngineToMacroStabilityKernelInputTests.cs =================================================================== diff -u -r6522 -r6523 --- DamEngine/trunk/src/Deltares.DamEngine.Calculators.Tests/KernelWrappers/MacroStabilityCommon/MacroStabilityIo/EngineToMacroStabilityKernelInputTests.cs (.../EngineToMacroStabilityKernelInputTests.cs) (revision 6522) +++ DamEngine/trunk/src/Deltares.DamEngine.Calculators.Tests/KernelWrappers/MacroStabilityCommon/MacroStabilityIo/EngineToMacroStabilityKernelInputTests.cs (.../EngineToMacroStabilityKernelInputTests.cs) (revision 6523) @@ -52,15 +52,17 @@ "UseDefaultShearStrengthModel" ]; - [Test] - public void GivenDamEngineDataModelWhenTransferToKernelInputThenDataIsEqual() + [TestCase(StabilityModelType.UpliftVan, TangentLinesDefinition.OnBoundaryLines)] + [TestCase(StabilityModelType.UpliftVan, TangentLinesDefinition.Specified)] + [TestCase(StabilityModelType.Bishop, TangentLinesDefinition.Specified)] + public void GivenDamEngineDataModelWhenTransferToKernelInputThenDataIsEqual(StabilityModelType stabilityModelType, TangentLinesDefinition tangentLinesDefinition) { // When transfer to kernel input DamProjectData expectedDamProjectData = FactoryForDamProjectData.CreateExampleDamProjectData(); expectedDamProjectData.DamProjectCalculationSpecification.DamCalculationSpecifications[0] - .StabilityModelType = StabilityModelType.UpliftVan; + .StabilityModelType = stabilityModelType; Waternet expectedWaternet = CreateExampleWaternet(); - + Location expectedLocation = expectedDamProjectData.Dike.Locations[0]; SoilList expectedSoilList = expectedDamProjectData.Dike.SoilList; SoilProfile2D expectedSoilProfile2D = expectedLocation.Segment.SoilProfileProbabilities[0].SoilProfile2D; @@ -74,10 +76,22 @@ DamFailureMechanismeCalculationSpecification = expectedDamProjectData.DamProjectCalculationSpecification.CurrentSpecification }; - // Determine the proper values for grid and traffic load using the helper methods - double xCoordinateLowestUpliftFactorPoint = (expectedSurfaceLine2D.CharacteristicPoints.GetPoint2D(CharacteristicPointType.DikeTopAtPolder).X + - expectedSurfaceLine2D.CharacteristicPoints.GetPoint2D(CharacteristicPointType.DikeToeAtPolder).X) * 0.5; - UpliftVanCalculationGrid expectedUpliftVanCalculationGrid = MacroStabilityCommonHelper.FillUpliftVanCalculationGrid(damKernelInput, xCoordinateLowestUpliftFactorPoint); + // Determine the proper values for grid and traffic load using the helper methods + UpliftVanCalculationGrid expectedUpliftVanCalculationGrid = null; + BishopCalculationGrid expectedBishopCalculationGrid = null; + double xCoordinateLowestUpliftFactorPoint = 0.0; + if (stabilityModelType == StabilityModelType.UpliftVan) + { + damKernelInput.DamFailureMechanismeCalculationSpecification.FailureMechanismParametersMStab.MStabParameters.SlipCircleDefinition.UpliftVanTangentLinesDefinition = tangentLinesDefinition; + xCoordinateLowestUpliftFactorPoint = (expectedSurfaceLine2D.CharacteristicPoints.GetPoint2D(CharacteristicPointType.DikeTopAtPolder).X + + expectedSurfaceLine2D.CharacteristicPoints.GetPoint2D(CharacteristicPointType.DikeToeAtPolder).X) * 0.5; + expectedUpliftVanCalculationGrid = MacroStabilityCommonHelper.FillUpliftVanCalculationGrid(damKernelInput, xCoordinateLowestUpliftFactorPoint); + } + else + { + //Note: Bishop only uses auto search area setting, not the tangent line definition + expectedBishopCalculationGrid = MacroStabilityCommonHelper.FillBishopCalculationGrid(damKernelInput); + } TrafficLoad expectedTrafficLoad = MacroStabilityCommonHelper.FillTrafficLoad(damKernelInput); // Create the Macrostability kernel model @@ -93,10 +107,19 @@ CompareTrafficLoad(expectedTrafficLoad, fullInputModel.StabilityModel.ConstructionStages[0].UniformLoads[0]); CompareTrafficLoadDegreeOfConsolidations(expectedConsolidationValues, fullInputModel.StabilityModel.ConstructionStages[0].ConsolidationValues, fullInputModel.StabilityModel.ConstructionStages[0].SoilProfile.SoilSurfaces, fullInputModel.StabilityModel.Soils); - SlipCircleDefinition expectedUpliftVanCalculationGridSettings = expectedParametersMStab.MStabParameters.SlipCircleDefinition; - CompareUpliftVanCalculationGridSettings(expectedUpliftVanCalculationGridSettings, fullInputModel.PreprocessingInput.SearchAreaConditions); - bool areTangentLineSpecified = expectedUpliftVanCalculationGridSettings.UpliftVanTangentLinesDefinition == TangentLinesDefinition.Specified; - CompareUpliftVanCalculationGrid(expectedUpliftVanCalculationGrid, fullInputModel.StabilityModel.UpliftVanCalculationGrid, areTangentLineSpecified); + if (stabilityModelType == StabilityModelType.UpliftVan) + { + SlipCircleDefinition expectedUpliftVanCalculationGridSettings = expectedParametersMStab.MStabParameters.SlipCircleDefinition; + CompareUpliftVanCalculationGridSettings(expectedUpliftVanCalculationGridSettings, fullInputModel.PreprocessingInput.SearchAreaConditions); + bool areTangentLineSpecified = expectedUpliftVanCalculationGridSettings.UpliftVanTangentLinesDefinition == TangentLinesDefinition.Specified; + CompareUpliftVanCalculationGrid(expectedUpliftVanCalculationGrid, fullInputModel.StabilityModel.UpliftVanCalculationGrid, areTangentLineSpecified); + } + else + { + SlipCircleDefinition expectedBishopCalculationGridSettings = expectedParametersMStab.MStabParameters.SlipCircleDefinition; + CompareBishopCalculationGridSettings(expectedBishopCalculationGridSettings, fullInputModel.PreprocessingInput.SearchAreaConditions); + CompareBishopCalculationGrid(expectedBishopCalculationGrid, fullInputModel.StabilityModel.BishopCalculationCircle); + } CompareWaternet(expectedWaternet, fullInputModel.StabilityModel.ConstructionStages[0].Waternet); } @@ -208,6 +231,13 @@ Assert.That(expectedSlipCircleDefinition.UpliftVanTangentLinesDefinition, Is.EqualTo(TangentLinesDefinition.Specified)); } } + + private static void CompareBishopCalculationGridSettings(SlipCircleDefinition expectedSlipCircleDefinition, + SearchAreaConditionsType actualSlipCircleDefinition) + { + Assert.That(actualSlipCircleDefinition.AutoSearchArea, Is.EqualTo(expectedSlipCircleDefinition.BishopSearchAreaDetermination == GridSizeDetermination.Automatic)); + Assert.That(actualSlipCircleDefinition.AutoTangentLines, Is.False); + } private static void CompareUpliftVanCalculationGrid(UpliftVanCalculationGrid expectedSlipPlaneUpliftVan, UpliftVanCalculationGridType actualSlipPlaneUpliftVan, bool areTangentLineSpecified) @@ -234,7 +264,23 @@ Assert.That(actualSlipPlaneUpliftVan.TangentLines, Is.EqualTo(expectedSlipPlaneUpliftVan.TangentLineLevels).AsCollection); } } + + private static void CompareBishopCalculationGrid(BishopCalculationGrid expectedSlipCircleBishop, + BishopCalculationCircle actualSlipCircleBishop) + { + Assert.Multiple(() => + { + Assert.That(actualSlipCircleBishop.Grid.GridXLeft, Is.EqualTo(expectedSlipCircleBishop.GridXLeft)); + Assert.That(actualSlipCircleBishop.Grid.GridXRight, Is.EqualTo(expectedSlipCircleBishop.GridXRight)); + Assert.That(actualSlipCircleBishop.Grid.GridZTop, Is.EqualTo(expectedSlipCircleBishop.GridZTop)); + Assert.That(actualSlipCircleBishop.Grid.GridZBottom, Is.EqualTo(expectedSlipCircleBishop.GridZBottom)); + Assert.That(actualSlipCircleBishop.Grid.GridXNumber, Is.EqualTo(expectedSlipCircleBishop.GridXCount)); + Assert.That(actualSlipCircleBishop.Grid.GridZNumber, Is.EqualTo(expectedSlipCircleBishop.GridZCount)); + }); + Assert.That(actualSlipCircleBishop.TangentLines, Is.EqualTo(expectedSlipCircleBishop.TangentLineLevels).AsCollection); + } + private static void CompareWaternet(Waternet expectedWaternet, WaternetType actualWaternet) { Assert.That(actualWaternet.Name, Is.EqualTo(expectedWaternet.Name)); Index: DamEngine/trunk/src/Deltares.DamEngine.TestHelpers/Factories/FactoryForDamProjectData.cs =================================================================== diff -u -r6404 -r6523 --- DamEngine/trunk/src/Deltares.DamEngine.TestHelpers/Factories/FactoryForDamProjectData.cs (.../FactoryForDamProjectData.cs) (revision 6404) +++ DamEngine/trunk/src/Deltares.DamEngine.TestHelpers/Factories/FactoryForDamProjectData.cs (.../FactoryForDamProjectData.cs) (revision 6523) @@ -38,10 +38,12 @@ public static DamProjectData CreateExampleDamProjectData() { - var damProjectData = new DamProjectData(); - damProjectData.ProjectPath = @"D:\TestDir"; - damProjectData.CalculationMap = @"Sub\Calc"; - damProjectData.MaxCalculationCores = 3; + var damProjectData = new DamProjectData + { + ProjectPath = @"D:\TestDir", + CalculationMap = @"Sub\Calc", + MaxCalculationCores = 3 + }; FillAnalysisSpecification(damProjectData); FillStabilityParameters(damProjectData); @@ -71,10 +73,10 @@ Name = "Sensor 1", RelativeLocation = 12.2, SensorType = SensorType.WaterLevel, - PlLineMappings = new[] - { + PlLineMappings = + [ PlLineType.Pl1 - } + ] }; sensorData.Sensors.Add(sensor1); var sensor2 = new Sensor @@ -83,20 +85,20 @@ Name = "Sensor 2", RelativeLocation = 24.2, SensorType = SensorType.PolderLevel, - PlLineMappings = new[] - { + PlLineMappings = + [ PlLineType.Pl1 - } + ] }; sensorData.Sensors.Add(sensor2); var sensorGroup1 = new SensorGroup { ID = 1, - SensorArray = new[] - { + SensorArray = + [ sensor1, sensor2 - } + ] }; sensorData.SensorGroups.Add(sensorGroup1); var sensorLocation1 = new SensorLocation @@ -121,20 +123,20 @@ Name = "Sensor 3", RelativeLocation = 8.8, SensorType = SensorType.PiezometricHead, - PlLineMappings = new[] - { + PlLineMappings = + [ PlLineType.Pl3, PlLineType.Pl4 - } + ] }; sensorData.Sensors.Add(sensor3); var sensorGroup2 = new SensorGroup { ID = 2, - SensorArray = new[] - { + SensorArray = + [ sensor3 - } + ] }; sensorData.SensorGroups.Add(sensorGroup2); var sensorLocation2 = new SensorLocation @@ -201,17 +203,19 @@ damProjectData.DamProjectType = DamProjectType.Design; damProjectData.DamProjectCalculationSpecification = new DamProjectCalculationSpecification(); DamProjectCalculationSpecification.SelectedAnalysisType = ExpectedAnalysisType; - var calculationSpecification = new DamFailureMechanismeCalculationSpecification(); - calculationSpecification.FailureMechanismSystemType = FailureMechanismSystemType.Piping; - calculationSpecification.CalculationModel = PipingModelType.Bligh; + var calculationSpecification = new DamFailureMechanismeCalculationSpecification + { + FailureMechanismSystemType = FailureMechanismSystemType.Piping, + CalculationModel = PipingModelType.Bligh + }; damProjectData.DamProjectCalculationSpecification.DamCalculationSpecifications.Add(calculationSpecification); } private static void FillStabilityParameters(DamProjectData damProjectData) { // Note: DamProjectCalculationSpecification created and filled by FillAnalysisSpecification - DamFailureMechanismeCalculationSpecification curspec = damProjectData.DamProjectCalculationSpecification.CurrentSpecification; - curspec.FailureMechanismParametersMStab = new FailureMechanismParametersMStab + DamFailureMechanismeCalculationSpecification currentSpecification = damProjectData.DamProjectCalculationSpecification.CurrentSpecification; + currentSpecification.FailureMechanismParametersMStab = new FailureMechanismParametersMStab { MStabParameters = new MStabParameters { @@ -309,8 +313,10 @@ const int surfaceLineCount = 3; for (var i = 0; i < surfaceLineCount; i++) { - var surfaceLine = new SurfaceLine2(); - surfaceLine.Name = $"SurfaceLine {i}"; + var surfaceLine = new SurfaceLine2 + { + Name = $"SurfaceLine {i}" + }; surfaceLine.CharacteristicPoints.Geometry = surfaceLine.Geometry; AddPointsToSurfaceLines(surfaceLine); dike.SurfaceLines2.Add(surfaceLine); @@ -346,17 +352,22 @@ const int locationCount = 3; for (var i = 0; i < locationCount; i++) { - var location = new Location(); - location.Name = "Location " + (i + 1); - location.ModelParametersForPlLines.PlLineCreationMethod = (PlLineCreationMethod) i; - location.IntrusionVerticalWaterPressure = (IntrusionVerticalWaterPressureType) i; - location.DistanceToEntryPoint = 1.2 * i + 0.56; - location.ModelParametersForPlLines.DampingFactorPl4 = 1.0 * i + 0.12; - location.ModelParametersForPlLines.DampingFactorPl3 = 1.0 * i + 0.13; - location.ModelParametersForPlLines.PenetrationLength = 1.0 * i + 0.14; - location.SlopeDampingPiezometricHeightPolderSide = 1.0 * i + 0.19; - location.SurfaceLine = dike.SurfaceLines2[i]; - location.Segment = segments[i % 2]; // alternate between the 2 available segments + var location = new Location + { + Name = "Location " + (i + 1), + ModelParametersForPlLines = + { + PlLineCreationMethod = (PlLineCreationMethod) i, + DampingFactorPl4 = 1.0 * i + 0.12, + DampingFactorPl3 = 1.0 * i + 0.13, + PenetrationLength = 1.0 * i + 0.14 + }, + IntrusionVerticalWaterPressure = (IntrusionVerticalWaterPressureType) i, + DistanceToEntryPoint = 1.2 * i + 0.56, + SlopeDampingPiezometricHeightPolderSide = 1.0 * i + 0.19, + SurfaceLine = dike.SurfaceLines2[i], + Segment = segments[i % 2] // alternate between the 2 available segments + }; for (var j = 0; j < 3; j++) { DesignScenario designScenario = FillDesignScenario(location, i, j); @@ -414,9 +425,11 @@ const int profilesCount = 2; for (var i = 0; i < profilesCount; i++) { - var profile = new SoilProfile1D(); - profile.Name = "Profile1D " + (i + 1); - profile.BottomLevel = -21.12 * (i + 1); + var profile = new SoilProfile1D + { + Name = "Profile1D " + (i + 1), + BottomLevel = -21.12 * (i + 1) + }; const int layerCount = 3; for (var j = 0; j < layerCount; j++) { @@ -448,29 +461,31 @@ { // The parameter factor is used to create unique data for the design scenario int factor = (locationIndex + 1) * (scenarioIndex + 1); - var designScenario = new DesignScenario(); - designScenario.LocationScenarioID = scenarioIndex.ToString(); - designScenario.RiverLevel = 1.0 * factor + 0.51; - designScenario.RiverLevelLow = 1.0 * factor + 0.52; - designScenario.DikeTableHeight = 1.0 * factor + 0.53; - designScenario.PlLineOffsetBelowDikeTopAtRiver = 1.0 * factor + 0.54; - designScenario.PlLineOffsetBelowDikeTopAtPolder = 1.0 * factor + 0.55; - designScenario.PlLineOffsetBelowShoulderBaseInside = 1.0 * factor + 0.56; - designScenario.PlLineOffsetBelowDikeToeAtPolder = 1.0 * factor + 0.57; - designScenario.PlLineOffsetBelowDikeCrestMiddle = 1.0 * factor + 0.58; - designScenario.UsePlLineOffsetBelowDikeCrestMiddle = true; - designScenario.PlLineOffsetFactorBelowShoulderCrest = 1.0 * factor + 0.59; - designScenario.UsePlLineOffsetFactorBelowShoulderCrest = true; - designScenario.PolderLevel = 1.0 * factor + 1.24; - designScenario.HeadPl2 = 1.0 * factor + 0.28; - designScenario.HeadPl3 = 1.0 * factor + 0.60; - designScenario.HeadPl4 = 1.0 * factor + 0.61; - designScenario.UpliftCriterionStability = 1.0 * factor + 0.62; - designScenario.UpliftCriterionPiping = 1.0 * factor + 0.63; - designScenario.RequiredSafetyFactorStabilityInnerSlope = 1.0 * factor + 0.64; - designScenario.RequiredSafetyFactorStabilityOuterSlope = 1.0 * factor + 0.65; - designScenario.RequiredSafetyFactorPiping = 1.0 * factor + 0.66; - designScenario.LocationName = location.Name; + var designScenario = new DesignScenario + { + LocationScenarioID = scenarioIndex.ToString(), + RiverLevel = 1.0 * factor + 0.51, + RiverLevelLow = 1.0 * factor + 0.52, + DikeTableHeight = 1.0 * factor + 0.53, + PlLineOffsetBelowDikeTopAtRiver = 1.0 * factor + 0.54, + PlLineOffsetBelowDikeTopAtPolder = 1.0 * factor + 0.55, + PlLineOffsetBelowShoulderBaseInside = 1.0 * factor + 0.56, + PlLineOffsetBelowDikeToeAtPolder = 1.0 * factor + 0.57, + PlLineOffsetBelowDikeCrestMiddle = 1.0 * factor + 0.58, + UsePlLineOffsetBelowDikeCrestMiddle = true, + PlLineOffsetFactorBelowShoulderCrest = 1.0 * factor + 0.59, + UsePlLineOffsetFactorBelowShoulderCrest = true, + PolderLevel = 1.0 * factor + 1.24, + HeadPl2 = 1.0 * factor + 0.28, + HeadPl3 = 1.0 * factor + 0.60, + HeadPl4 = 1.0 * factor + 0.61, + UpliftCriterionStability = 1.0 * factor + 0.62, + UpliftCriterionPiping = 1.0 * factor + 0.63, + RequiredSafetyFactorStabilityInnerSlope = 1.0 * factor + 0.64, + RequiredSafetyFactorStabilityOuterSlope = 1.0 * factor + 0.65, + RequiredSafetyFactorPiping = 1.0 * factor + 0.66, + LocationName = location.Name + }; return designScenario; } @@ -501,10 +516,10 @@ const int layerCount = 4; var point1 = new Point2D(0, 0); var point2 = new Point2D(0, 10); - var point3 = new Point2D(10, 10); + var point3 = new Point2D(100, 10); var point4 = new Point2D(1, 1); var point5 = new Point2D(1, 9); - var point6 = new Point2D(9, 9); + var point6 = new Point2D(90, 9); profile.Geometry.Points.Add(point1); profile.Geometry.Points.Add(point2); profile.Geometry.Points.Add(point3); @@ -597,8 +612,10 @@ var segmentCount = 2; for (var i = 0; i < segmentCount; i++) { - var segment = new Segment(); - segment.Name = "Segment " + i; + var segment = new Segment + { + Name = "Segment " + i + }; var soilProfileProbability = new SoilGeometryProbability(); if (i == 0) {