// Copyright (C) Stichting Deltares 2025. All rights reserved. // // This file is part of the Dam Engine. // // The Dam Engine is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . // // All names, logos, and references to "Deltares" are registered trademarks of // Stichting Deltares and remain full property of Stichting Deltares at all times. // All rights reserved. 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; namespace Deltares.DamEngine.Calculators.KernelWrappers.MacroStabilityCommon.MacroStabilityIo; public static class FillEngineFromMacroStabilityKernelOutput { /// /// Transfer all properties from the kernel output to the dam project data. /// /// The kernel output data /// The Engine output data /// The log messages public static void FillDamProjectDataFromKernelModel(FullOutputModelType fullOutputModel, MacroStabilityOutput macroStabilityOutput, out List logMessages) { logMessages = new List(); macroStabilityOutput.StabilityOutputItems.Add(new MacroStabilityOutputItem()); TransferProperties(fullOutputModel.StabilityOutput, macroStabilityOutput.StabilityOutputItems[^1]); macroStabilityOutput.CalculationResult = CalculationResult.Succeeded; } private static void TransferProperties(StabilityOutputType stabilityOutput, MacroStabilityOutputItem macroStabilityOutputItem) { macroStabilityOutputItem.CalculationResult = stabilityOutput.Succeeded ? CalculationResult.Succeeded : CalculationResult.RunFailed; macroStabilityOutputItem.SafetyFactor = stabilityOutput.SafetyFactor; macroStabilityOutputItem.StabilityModelType = OutputConversionHelper.ConvertToStabilityModelType(stabilityOutput.ModelOption); if (stabilityOutput.MinimumSafetyCurve != null) { if (stabilityOutput.ModelOption == StabilityModelOption.Bishop) { TransferPropertiesBishopSlipPlane(stabilityOutput, macroStabilityOutputItem); } else if (stabilityOutput.ModelOption == StabilityModelOption.UpliftVan) { TransferPropertiesUpliftVanSlipPlane(stabilityOutput, macroStabilityOutputItem); } if (stabilityOutput.MinimumSafetyCurve.Slices != null) { TransferPropertiesSlices(stabilityOutput, macroStabilityOutputItem); } } } private static void TransferPropertiesSlices(StabilityOutputType stabilityOutput, MacroStabilityOutputItem macroStabilityOutputItem) { 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); } macroStabilityOutputItem.CircleSurfacePointRightXCoordinate = stabilityOutput.MinimumSafetyCurve.Slices[^1].TopRightPoint.X; } private static void TransferPropertiesUpliftVanSlipPlane(StabilityOutputType stabilityOutput, MacroStabilityOutputItem macroStabilityOutputItem) { 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; } private static void TransferPropertiesBishopSlipPlane(StabilityOutputType stabilityOutput, MacroStabilityOutputItem macroStabilityOutputItem) { var slidingCircleMinimumSafetyCurve = (SlidingCircleMinimumSafetyCurveType) stabilityOutput.MinimumSafetyCurve; macroStabilityOutputItem.StabilityModelType = StabilityModelType.Bishop; macroStabilityOutputItem.ActiveCenterPoint = new Point2D(slidingCircleMinimumSafetyCurve.Center.X, slidingCircleMinimumSafetyCurve.Center.Z); macroStabilityOutputItem.ActiveCenterPointRadius = slidingCircleMinimumSafetyCurve.Radius; } }