Index: DamEngine/trunk/src/Deltares.DamEngine.Calculators.Tests/KernelWrappers/MacroStabilityCommon/MacroStabilityIo/MacroStabilityKernelOutputToEngineTests.cs =================================================================== diff -u -r6404 -r6413 --- DamEngine/trunk/src/Deltares.DamEngine.Calculators.Tests/KernelWrappers/MacroStabilityCommon/MacroStabilityIo/MacroStabilityKernelOutputToEngineTests.cs (.../MacroStabilityKernelOutputToEngineTests.cs) (revision 6404) +++ DamEngine/trunk/src/Deltares.DamEngine.Calculators.Tests/KernelWrappers/MacroStabilityCommon/MacroStabilityIo/MacroStabilityKernelOutputToEngineTests.cs (.../MacroStabilityKernelOutputToEngineTests.cs) (revision 6413) @@ -39,13 +39,13 @@ public void GivenKernelOutputWhenTransferToDamEngineThenDataIsEqual(StabilityModelOption modelOption, bool isSucceeded) { // Given - FullOutputModelType kernelOutput = CreateFullOutputModel(modelOption); + FullOutputModelType kernelOutput = CreateFullOutputModel(modelOption, isSucceeded); + // When var damEngineOutput = new MacroStabilityOutput { StabilityOutputItems = [] }; - // When FillEngineFromMacroStabilityKernelOutput.FillDamProjectDataFromKernelModel(kernelOutput, damEngineOutput, out List logMessages); // Then @@ -64,16 +64,149 @@ }); } - private static FullOutputModelType CreateFullOutputModel(StabilityModelOption modelOption) + private static FullOutputModelType CreateFullOutputModel(StabilityModelOption modelOption, bool isSucceeded) { var fullOutputModel = new FullOutputModelType { StabilityOutput = new StabilityOutputType(), PreprocessingOutput = new PreprocessingOutputType() }; fullOutputModel.StabilityOutput.SafetyFactor = 2.34; - fullOutputModel.StabilityOutput.Succeeded = false; + fullOutputModel.StabilityOutput.Succeeded = isSucceeded; fullOutputModel.StabilityOutput.ModelOption = modelOption; + switch (fullOutputModel.StabilityOutput.ModelOption) + { + case StabilityModelOption.Bishop: + fullOutputModel.StabilityOutput.MinimumSafetyCurve = CreateSlidingCircleMinimumSafetyCurve(); + break; + case StabilityModelOption.UpliftVan: + fullOutputModel.StabilityOutput.MinimumSafetyCurve = CreateDualSlidingCircleMinimumSafetyCurve(); + break; + } + + fullOutputModel.StabilityOutput.MinimumSafetyCurve.Slices = CreateSlices(); return fullOutputModel; } + + private static SlidingCircleMinimumSafetyCurveType CreateSlidingCircleMinimumSafetyCurve() + { + var slidingCircleMinimumSafetyCurve = new SlidingCircleMinimumSafetyCurveType + { + Center = new Point2DType + { + X = 1.0, + Z = 2.0 + }, + Radius = 3.0 + }; + return slidingCircleMinimumSafetyCurve; + } + + private static DualSlidingCircleMinimumSafetyCurveType CreateDualSlidingCircleMinimumSafetyCurve() + { + var dualSlidingCircleMinimumSafetyCurve = new DualSlidingCircleMinimumSafetyCurveType + { + ActiveCircleCenter = new Point2DType + { + X = 1.0, + Z = 2.0 + }, + PassiveCircleCenter = new Point2DType + { + X = 3.0, + Z = 4.0 + }, + ActiveCircleRadius = 5.0, + PassiveCircleRadius = 6.0 + }; + return dualSlidingCircleMinimumSafetyCurve; + } + + private static MinimumSafetyCurveBaseTypeSlice[] CreateSlices() + { + var slices = new List + { + new() + { + TopLeftPoint = new Point2DType + { + X = 1.0, + Z = 2.0 + }, + TopRightPoint = new Point2DType + { + X = 3.0, + Z = 4.0 + }, + BottomLeftPoint = new Point2DType + { + X = 5.0, + Z = 6.0 + }, + BottomRightPoint = new Point2DType + { + X = 7.0, + Z = 8.0 + }, + Name = "TestSlice", + Width = 9.0, + ArcLength = 10.0, + TopAngle = 11.0, + BottomAngle = 12.0, + CohesionInput = 13.0, + CohesionOutput = 14.0, + FrictionAngleInput = 15.0, + FrictionAngleOutput = 16.0, + YieldStress = 17.0, + OCR = 18.0, + POP = 19.0, + DegreeOfConsolidationPorePressure = 20.0, + PorePressureDueToDegreeOfConsolidationLoad = 21.0, + DilatancyInput = 22.0, + ExternalLoad = 23.0, + HydrostaticPorePressure = 24.0 + }, + new() + { + TopLeftPoint = new Point2DType + { + X = 10.0, + Z = 20.0 + }, + TopRightPoint = new Point2DType + { + X = 30.0, + Z = 40.0 + }, + BottomLeftPoint = new Point2DType + { + X = 50.0, + Z = 60.0 + }, + BottomRightPoint = new Point2DType + { + X = 70.0, + Z = 80.0 + }, + Name = "UpdatedTestSlice", + Width = 90.0, + ArcLength = 100.0, + TopAngle = 110.0, + BottomAngle = 120.0, + CohesionInput = 130.0, + CohesionOutput = 140.0, + FrictionAngleInput = 150.0, + FrictionAngleOutput = 160.0, + YieldStress = 170.0, + OCR = 180.0, + POP = 190.0, + DegreeOfConsolidationPorePressure = 200.0, + PorePressureDueToDegreeOfConsolidationLoad = 210.0, + DilatancyInput = 220.0, + ExternalLoad = 230.0, + HydrostaticPorePressure = 240.0 + } + }; + return slices.ToArray(); + } } \ No newline at end of file Index: DamEngine/trunk/src/Deltares.DamEngine.Calculators/KernelWrappers/MacroStabilityCommon/MacroStabilityIo/OutputConversionHelper.cs =================================================================== diff -u -r6404 -r6413 --- DamEngine/trunk/src/Deltares.DamEngine.Calculators/KernelWrappers/MacroStabilityCommon/MacroStabilityIo/OutputConversionHelper.cs (.../OutputConversionHelper.cs) (revision 6404) +++ DamEngine/trunk/src/Deltares.DamEngine.Calculators/KernelWrappers/MacroStabilityCommon/MacroStabilityIo/OutputConversionHelper.cs (.../OutputConversionHelper.cs) (revision 6413) @@ -21,18 +21,19 @@ using System.Collections.Generic; using Deltares.DamEngine.Data.General; +using Deltares.DamEngine.Data.Geotechnics; using Deltares.MacroStability.Io.XmlOutput; namespace Deltares.DamEngine.Calculators.KernelWrappers.MacroStabilityCommon.MacroStabilityIo; /// /// Conversion methods between the MacroStability kernel and the Dam Engine. /// -public abstract class OutputConversionHelper +public static class OutputConversionHelper { - /// Converts ModelOption to the StabilityModelType. + /// Converts ModelOption to the Dam StabilityModelType. /// This comes back from the kernel side so any model that can be matched is OK. - /// The model option. + /// The kernel model option. /// the Dam StabilityModelType public static StabilityModelType ConvertToStabilityModelType(StabilityModelOption stabilityModelOption) { @@ -49,10 +50,9 @@ return translationTable[stabilityModelOption]; } - /// Converts ModelOption to the StabilityModelType. - /// This comes back from the kernel side so any model that can be matched is OK. - /// The model option. - /// the Dam StabilityModelType + /// Converts ModelOption to the kernel StabilityModelType. + /// The Dam model option. + /// the kernel StabilityModelType public static StabilityModelOption ConvertToStabilityModelOption(StabilityModelType stabilityModelType) { var translationTable = new Dictionary @@ -67,4 +67,27 @@ }; return translationTable[stabilityModelType]; } + + /// Converts to Dam ShearStrengthModel. + /// The kernel ShearStrengthModel. + /// The Dam ShearStrengthModel + public static ShearStrengthModel ConvertToDamShearStrengthModel(ShearStrengthModelType kernelShearStrengthModel) + { + var translationTable = new Dictionary + { + { + ShearStrengthModelType.MohrCoulomb, ShearStrengthModel.CPhi + }, + { + ShearStrengthModelType.Shansep, ShearStrengthModel.SuCalculated + }, + { + ShearStrengthModelType.SigmaTauTable, ShearStrengthModel.SigmaTauCurve + }, + { + ShearStrengthModelType.SuTable, ShearStrengthModel.SuTable + } + }; + return translationTable[kernelShearStrengthModel]; + } } \ No newline at end of file Index: DamEngine/trunk/src/Deltares.DamEngine.Calculators/DikesDesign/DesignCalculator.cs =================================================================== diff -u -r6404 -r6413 --- DamEngine/trunk/src/Deltares.DamEngine.Calculators/DikesDesign/DesignCalculator.cs (.../DesignCalculator.cs) (revision 6404) +++ DamEngine/trunk/src/Deltares.DamEngine.Calculators/DikesDesign/DesignCalculator.cs (.../DesignCalculator.cs) (revision 6413) @@ -209,7 +209,7 @@ damProjectData.DamProjectCalculationSpecification.CurrentSpecification.FailureMechanismSystemType .ToString()) }; - damProjectData.CalculationMessages.Add(logMessage); + damProjectData.CalculationMessages.Add( logMessage); } } Index: DamEngine/trunk/src/Deltares.DamEngine.Calculators.Tests/KernelWrappers/MacroStabilityCommon/MacroStabilityIo/OutputConversionHelperTests.cs =================================================================== diff -u -r6404 -r6413 --- DamEngine/trunk/src/Deltares.DamEngine.Calculators.Tests/KernelWrappers/MacroStabilityCommon/MacroStabilityIo/OutputConversionHelperTests.cs (.../OutputConversionHelperTests.cs) (revision 6404) +++ DamEngine/trunk/src/Deltares.DamEngine.Calculators.Tests/KernelWrappers/MacroStabilityCommon/MacroStabilityIo/OutputConversionHelperTests.cs (.../OutputConversionHelperTests.cs) (revision 6413) @@ -21,6 +21,7 @@ using Deltares.DamEngine.Calculators.KernelWrappers.MacroStabilityCommon.MacroStabilityIo; using Deltares.DamEngine.Data.General; +using Deltares.DamEngine.Data.Geotechnics; using Deltares.MacroStability.Io.XmlOutput; using NUnit.Framework; @@ -43,4 +44,14 @@ { Assert.That(OutputConversionHelper.ConvertToStabilityModelOption(stabilityModelType), Is.EqualTo(modelOption)); } + + [Test] + [TestCase(ShearStrengthModelType.MohrCoulomb, ShearStrengthModel.CPhi)] + [TestCase(ShearStrengthModelType.SigmaTauTable, ShearStrengthModel.SigmaTauCurve)] + [TestCase(ShearStrengthModelType.SuTable, ShearStrengthModel.SuTable)] + [TestCase(ShearStrengthModelType.Shansep, ShearStrengthModel.SuCalculated)] + public void CanConvertToDamShearStrengthModel(ShearStrengthModelType kernelShearStrengthModel, ShearStrengthModel damShearStrengthModel) + { + Assert.That(OutputConversionHelper.ConvertToDamShearStrengthModel(kernelShearStrengthModel), Is.EqualTo(damShearStrengthModel)); + } } \ No newline at end of file Index: DamEngine/trunk/src/Deltares.DamEngine.Calculators/KernelWrappers/MacroStabilityCommon/MacroStabilityIo/FillEngineFromMacroStabilityKernelOutput.cs =================================================================== diff -u -r6404 -r6413 --- DamEngine/trunk/src/Deltares.DamEngine.Calculators/KernelWrappers/MacroStabilityCommon/MacroStabilityIo/FillEngineFromMacroStabilityKernelOutput.cs (.../FillEngineFromMacroStabilityKernelOutput.cs) (revision 6404) +++ DamEngine/trunk/src/Deltares.DamEngine.Calculators/KernelWrappers/MacroStabilityCommon/MacroStabilityIo/FillEngineFromMacroStabilityKernelOutput.cs (.../FillEngineFromMacroStabilityKernelOutput.cs) (revision 6413) @@ -21,6 +21,9 @@ using System.Collections.Generic; using Deltares.DamEngine.Calculators.KernelWrappers.MacroStabilityInwards; +using Deltares.DamEngine.Data.General; +using Deltares.DamEngine.Data.General.Results; +using Deltares.DamEngine.Data.Geometry; using Deltares.DamEngine.Data.Standard.Calculation; using Deltares.DamEngine.Data.Standard.Logging; using Deltares.MacroStability.Io.XmlOutput; @@ -48,8 +51,90 @@ macroStabilityOutputItem.CalculationResult = stabilityOutput.Succeeded ? CalculationResult.Succeeded : CalculationResult.RunFailed; macroStabilityOutputItem.SafetyFactor = stabilityOutput.SafetyFactor; macroStabilityOutputItem.StabilityModelType = OutputConversionHelper.ConvertToStabilityModelType(stabilityOutput.ModelOption); - // macroStabilityOutputItem.ActiveCenterPoint = new Point2D(stabilityOutput.BishopCalculatedSlipPlanes[0].Center.X, stabilityOutput.BishopCalculatedSlipPlanes[0].Center.Z); - // macroStabilityOutputItem.BishopCalculationCircle = new BishopCalculationGrid(); - // macroStabilityOutputItem.UpliftVanCalculationGrid = new UpliftVanCalculationGrid(); + if (stabilityOutput.MinimumSafetyCurve != null) + { + if (stabilityOutput.ModelOption == StabilityModelOption.Bishop) + { + var slidingCircleMinimumSafetyCurve = (SlidingCircleMinimumSafetyCurveType) stabilityOutput.MinimumSafetyCurve; + macroStabilityOutputItem.StabilityModelType = StabilityModelType.Bishop; + macroStabilityOutputItem.ActiveCenterPoint = new Point2D(slidingCircleMinimumSafetyCurve.Center.X, slidingCircleMinimumSafetyCurve.Center.Z); + macroStabilityOutputItem.ActiveCenterPointRadius = slidingCircleMinimumSafetyCurve.Radius; + } + else if (stabilityOutput.ModelOption == StabilityModelOption.UpliftVan) + { + var dualSlidingCircleMinimumSafetyCurve = (DualSlidingCircleMinimumSafetyCurveType) stabilityOutput.MinimumSafetyCurve; + macroStabilityOutputItem.StabilityModelType = StabilityModelType.UpliftVan; + macroStabilityOutputItem.ActiveCenterPoint = new Point2D(dualSlidingCircleMinimumSafetyCurve.ActiveCircleCenter.X, dualSlidingCircleMinimumSafetyCurve.ActiveCircleCenter.Z); + macroStabilityOutputItem.ActiveCenterPointRadius = dualSlidingCircleMinimumSafetyCurve.ActiveCircleRadius; + macroStabilityOutputItem.PassiveCenterPoint = new Point2D(dualSlidingCircleMinimumSafetyCurve.PassiveCircleCenter.X, dualSlidingCircleMinimumSafetyCurve.PassiveCircleCenter.Z); + macroStabilityOutputItem.PassiveCenterPointRadius = dualSlidingCircleMinimumSafetyCurve.PassiveCircleRadius; + } + + if (stabilityOutput.MinimumSafetyCurve.Slices != null) + { + macroStabilityOutputItem.ResultSlices = new List(); + foreach (MinimumSafetyCurveBaseTypeSlice slice in stabilityOutput.MinimumSafetyCurve.Slices) + { + var resultSlice = new StabilityResultSlice + { + TopLeftPoint = new Point2D(slice.TopLeftPoint.X, slice.TopLeftPoint.Z), + TopRightPoint = new Point2D(slice.TopRightPoint.X, slice.TopRightPoint.Z), + BottomLeftPoint = new Point2D(slice.BottomLeftPoint.X, slice.BottomLeftPoint.Z), + BottomRightPoint = new Point2D(slice.BottomRightPoint.X, slice.BottomRightPoint.Z), + Name = slice.Name, + Width = slice.Width, + ArcLength = slice.ArcLength, + TopAngle = slice.TopAngle, + BottomAngle = slice.BottomAngle, + CohesionInput = slice.CohesionInput, + CohesionOutput = slice.CohesionOutput, + FrictionAngleInput = slice.FrictionAngleInput, + FrictionAngleOutput = slice.FrictionAngleOutput, + YieldStress = slice.YieldStress, + OCR = slice.OCR, + POP = slice.POP, + DegreeOfConsolidationPorePressure = slice.DegreeOfConsolidationPorePressure, + PorePressureDueToDegreeOfConsolidationLoad = slice.PorePressureDueToDegreeOfConsolidationLoad, + DilatancyInput = slice.DilatancyInput, + ExternalLoad = slice.ExternalLoad, + HydrostaticPorePressure = slice.HydrostaticPorePressure, + LeftForce = slice.LeftForce, + LeftForceAngle = slice.LeftForceAngle, + LeftForceY = slice.LeftForceY, + RightForce = slice.RightForce, + RightForceAngle = slice.RightForceAngle, + RightForceY = slice.RightForceY, + LoadStress = slice.LoadStress, + NormalStress = slice.NormalStress, + PorePressure = slice.PorePressure, + HorizontalPorePressure = slice.HorizontalPorePressure, + VerticalPorePressure = slice.VerticalPorePressure, + PiezometricPorePressure = slice.PiezometricPorePressure, + EffectiveStress = slice.EffectiveStress, + ExcessPorePressure = slice.ExcessPorePressure, + ShearStressInput = slice.ShearStressInput, + ShearStressOutput = slice.ShearStressOutput, + SoilStress = slice.SoilStress, + TotalPorePressure = slice.TotalPorePressure, + TotalStress = slice.TotalStress, + Weight = slice.Weight, + SuInput = slice.SuInput, + SuOutput = slice.SuOutput, + ShearStrengthModel = OutputConversionHelper.ConvertToDamShearStrengthModel(slice.ShearStrengthModel), + HorizontalSoilQuakeStress = slice.HorizontalSoilQuakeStress, + StrengthIncreaseExponent = slice.StrengthIncreaseExponent, + UpliftFactor = slice.UpliftFactor, + VerticalSoilQuakeStress = slice.VerticalSoilQuakeStress, + WaterQuakeStress = slice.WaterQuakeStress, + UpliftReductionFactor = slice.UpliftReductionFactor, + RatioCuPc = slice.RatioCuPc, + ResultantForce = slice.ResultantForce, + ResultantMoment = slice.ResultantMoment, + ResultantAngle = slice.ResultantAngle + }; + macroStabilityOutputItem.ResultSlices.Add(resultSlice); + } + } + } } } \ No newline at end of file