// 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;
}
}