// 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;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using Deltares.DamEngine.Calculators.KernelWrappers.Common;
using Deltares.DamEngine.Data.General;
using Deltares.DamEngine.Data.Geometry;
using Deltares.DamEngine.Data.Geotechnics;
using Deltares.DamEngine.Data.Standard;
using Deltares.MacroStability.Io;
using Deltares.MacroStability.Io.XmlInput;
using CharacteristicPoint = Deltares.DamEngine.Data.Geotechnics.CharacteristicPoint;
using CharacteristicPointSet = Deltares.DamEngine.Data.Geotechnics.CharacteristicPointSet;
using CharacteristicPointType = Deltares.DamEngine.Data.Geotechnics.CharacteristicPointType;
using GeometryCurve = Deltares.DamEngine.Data.Geometry.GeometryCurve;
using GeometryLoop = Deltares.DamEngine.Data.Geometry.GeometryLoop;
using GeometrySurface = Deltares.DamEngine.Data.Geometry.GeometrySurface;
using Point2D = Deltares.DamEngine.Data.Geometry.Point2D;
using PreConsolidationStress = Deltares.DamEngine.Data.Geotechnics.PreConsolidationStress;
using SoilLayer2D = Deltares.DamEngine.Data.Geotechnics.SoilLayer2D;
using SoilProfile2D = Deltares.DamEngine.Data.Geotechnics.SoilProfile2D;
using SoilProfileType = Deltares.MacroStability.Io.XmlInput.SoilProfileType;
using SoilType = Deltares.MacroStability.Io.XmlInput.SoilType;
using SurfaceLine2 = Deltares.DamEngine.Data.Geotechnics.SurfaceLine2;
using Waternet = Deltares.DamEngine.Data.Geometry.Waternet;
namespace Deltares.DamEngine.Calculators.KernelWrappers.MacroStabilityCommon.MacroStabilityIo;
///
/// Class to create macro stability kernel input from dam engine data.
///
public static class FillMacroStabilityKernelInputFromEngine
{
///
/// Creates a full input model data object for Macro stability kernel based on DamEngineData.
///
///
///
///
///
/// FullInputModelType
public static FullInputModelType CreateFullInputModel(DamKernelInput damKernelInput, MStabParameters mStabParameters,
Waternet damWaterNet, double xCoordinateLowestUpliftFactorPoint)
{
// The objectRegistry is to be used to keep track of all keys of some of the referenced objects
var objectRegistry = new ObjectRegistry();
BishopCalculationGrid bishopCalculationGrid = null;
UpliftVanCalculationGrid upliftVanCalculationGrid = null;
if (mStabParameters.Model == StabilityModelType.Bishop)
{
bishopCalculationGrid = MacroStabilityCommonHelper.FillBishopCalculationGrid(damKernelInput);
}
if (mStabParameters.Model == StabilityModelType.UpliftVan)
{
upliftVanCalculationGrid = MacroStabilityCommonHelper.FillUpliftVanCalculationGrid(damKernelInput, xCoordinateLowestUpliftFactorPoint);
}
var fullInputModelType = new FullInputModelType
{
PreprocessingInput = TransferPreprocessingInput(damKernelInput, mStabParameters, bishopCalculationGrid, upliftVanCalculationGrid),
StabilityModel = TransferStabilityModel(damKernelInput, mStabParameters, damWaterNet, objectRegistry, bishopCalculationGrid, upliftVanCalculationGrid),
VersionInfo = TransferVersionInfo()
};
return fullInputModelType;
}
private static PreprocessingInputType TransferPreprocessingInput(DamKernelInput damKernelInput, MStabParameters mStabParameters,
BishopCalculationGrid bishopCalculationGrid,
UpliftVanCalculationGrid upliftVanCalculationGrid)
{
if (damKernelInput == null)
{
return null;
}
var preprocessingInputType = new PreprocessingInputType
{
PreConstructionStages = new PreConstructionStageType[1]
};
preprocessingInputType.PreConstructionStages[0] = new PreConstructionStageType();
PreConstructionStageType preConstructionLastStage = preprocessingInputType.PreConstructionStages[0];
preConstructionLastStage.Surfaceline = new SurfaceLineType();
preConstructionLastStage.CreateWaternet = false;
TransferSurfaceLine(damKernelInput.Location.SurfaceLine, preConstructionLastStage.Surfaceline);
preprocessingInputType.SearchAreaConditions = TransferSearchAreaCondition(mStabParameters, bishopCalculationGrid, upliftVanCalculationGrid);
return preprocessingInputType;
}
private static SearchAreaConditionsType TransferSearchAreaCondition(MStabParameters mStabParameters,
BishopCalculationGrid bishopCalculationGrid,
UpliftVanCalculationGrid upliftVanCalculationGrid)
{
var preprocessingSearchAreaConditions = new SearchAreaConditionsType
{
AutoGeneticAlgorithmOptions = false,
AutoGeneticAlgorithmOptionsSpecified = true,
AutoLevenbergMarquardtOptions = false,
AutoLevenbergMarquardtOptionsSpecified = true,
AutoSearchAreaSpecified = true,
AutoTangentLinesSpecified = true,
AutomaticForbiddenZones = false,
AutomaticForbiddenZonesSpecified = true,
MaxSpacingBetweenBoundariesSpecified = true,
OnlyAbovePleistoceenSpecified = true,
SlipPlanePosition = SearchAreaConditionsTypeSlipPlanePosition.High,
SlipPlanePositionSpecified = true,
TangentLineNumberSpecified = true,
TangentLineZBottomSpecified = true,
TangentLineZTopSpecified = true
};
switch (mStabParameters.Model)
{
case StabilityModelType.Bishop:
TransferBishopSearchAreaSettings(preprocessingSearchAreaConditions, bishopCalculationGrid);
break;
case StabilityModelType.UpliftVan:
TransferUpliftVanSearchAreaSettings(preprocessingSearchAreaConditions, upliftVanCalculationGrid);
break;
default:
throw new NotImplementedException(nameof(mStabParameters.Model));
}
return preprocessingSearchAreaConditions;
}
private static void TransferBishopSearchAreaSettings(SearchAreaConditionsType kernelSearchAreaConditions, BishopCalculationGrid bishopCalculationGrid)
{
// In the Macrostability kernel, for Bishop, the automatic tangent lines are set by AutoSearchArea = True.
// Setting AutoTangentLines to true will create the automatic tangent lines of Uplift-Van which is not desired.
kernelSearchAreaConditions.AutoTangentLines = false;
kernelSearchAreaConditions.AutoSearchArea = bishopCalculationGrid.IsSearchAreaAutomatic;
kernelSearchAreaConditions.TangentLineNumber = bishopCalculationGrid.TangentLineCount;
kernelSearchAreaConditions.TangentLineZTop = bishopCalculationGrid.TangentLineZTop;
kernelSearchAreaConditions.TangentLineZBottom = bishopCalculationGrid.TangentLineZBottom;
kernelSearchAreaConditions.MaxSpacingBetweenBoundaries = 10.0;
}
private static void TransferUpliftVanSearchAreaSettings(SearchAreaConditionsType kernelSearchAreaConditions, UpliftVanCalculationGrid upliftVanCalculationGrid)
{
kernelSearchAreaConditions.AutoTangentLines = upliftVanCalculationGrid.TangentLinesCreationMethod is TangentLinesDefinition.Automatic or TangentLinesDefinition.OnBoundaryLines;
kernelSearchAreaConditions.AutoSearchArea = upliftVanCalculationGrid.IsGridsAutomatic;
kernelSearchAreaConditions.OnlyAbovePleistoceen = upliftVanCalculationGrid.TangentLinesCreationMethod == TangentLinesDefinition.Automatic;
kernelSearchAreaConditions.TangentLineNumber = upliftVanCalculationGrid.TangentLineCount;
kernelSearchAreaConditions.TangentLineZTop = upliftVanCalculationGrid.TangentLineZTop;
kernelSearchAreaConditions.TangentLineZBottom = upliftVanCalculationGrid.TangentLineZBottom;
kernelSearchAreaConditions.MaxSpacingBetweenBoundaries = 0.8;
}
private static BishopCalculationCircle TransferBishopCalculationGrid(BishopCalculationGrid bishopCalculationGrid)
{
if (bishopCalculationGrid == null)
{
throw new ArgumentNullException(nameof(bishopCalculationGrid));
}
var kernelBishopCalculationCircle = new BishopCalculationCircle
{
Grid = new CalculationGridType
{
GridXNumber = bishopCalculationGrid.GridXCount,
GridXLeft = bishopCalculationGrid.GridXLeft,
GridXRight = bishopCalculationGrid.GridXRight,
GridZNumber = bishopCalculationGrid.GridZCount,
GridZTop = bishopCalculationGrid.GridZTop,
GridZBottom = bishopCalculationGrid.GridZBottom
}
};
if (!bishopCalculationGrid.IsSearchAreaAutomatic)
{
kernelBishopCalculationCircle.TangentLines = new double[bishopCalculationGrid.TangentLineLevels.Count];
kernelBishopCalculationCircle.TangentLines = bishopCalculationGrid.TangentLineLevels.ToArray();
}
else
{
kernelBishopCalculationCircle.TangentLines = [];
}
return kernelBishopCalculationCircle;
}
private static UpliftVanCalculationGridType TransferUpliftVanCalculationGrid(UpliftVanCalculationGrid upliftVanCalculationGrid)
{
if (upliftVanCalculationGrid == null)
{
throw new ArgumentNullException(nameof(upliftVanCalculationGrid));
}
var kernelUpliftVanCalculationGrid = new UpliftVanCalculationGridType
{
LeftGrid = new CalculationGridType
{
GridXNumber = upliftVanCalculationGrid.LeftGridXCount,
GridXLeft = upliftVanCalculationGrid.LeftGridXLeft,
GridXRight = upliftVanCalculationGrid.LeftGridXRight,
GridZNumber = upliftVanCalculationGrid.LeftGridZCount,
GridZTop = upliftVanCalculationGrid.LeftGridZTop,
GridZBottom = upliftVanCalculationGrid.LeftGridZBottom
},
RightGrid = new CalculationGridType
{
GridXNumber = upliftVanCalculationGrid.RightGridXCount,
GridXLeft = upliftVanCalculationGrid.RightGridXLeft,
GridXRight = upliftVanCalculationGrid.RightGridXRight,
GridZNumber = upliftVanCalculationGrid.RightGridZCount,
GridZTop = upliftVanCalculationGrid.RightGridZTop,
GridZBottom = upliftVanCalculationGrid.RightGridZBottom
}
};
if (upliftVanCalculationGrid.TangentLinesCreationMethod == TangentLinesDefinition.Specified)
{
kernelUpliftVanCalculationGrid.TangentLines = new double[upliftVanCalculationGrid.TangentLineLevels.Count];
kernelUpliftVanCalculationGrid.TangentLines = upliftVanCalculationGrid.TangentLineLevels.ToArray();
}
else
{
kernelUpliftVanCalculationGrid.TangentLines = [];
}
return kernelUpliftVanCalculationGrid;
}
private static void TransferSurfaceLine(SurfaceLine2 damSurfaceLine, SurfaceLineType kernelSurfaceLine)
{
kernelSurfaceLine.CharacteristicPoints = new SurfaceLineTypeCharacteristicPoint[damSurfaceLine.CharacteristicPoints.Count];
var i = 0;
foreach (CharacteristicPoint damCharPoint in damSurfaceLine.CharacteristicPoints)
{
var kernelCharPoint = new SurfaceLineTypeCharacteristicPoint
{
CharacteristicPointType = InputConversionHelper.ConvertToMacroStabilityCharacteristicPointType(damCharPoint.CharacteristicPointType),
GeometryPoint = new Point2DType
{
X = damCharPoint.Point.X,
Z = damCharPoint.Point.Z
}
};
kernelSurfaceLine.CharacteristicPoints[i] = kernelCharPoint;
i++;
}
}
private static StabilityInputType TransferStabilityModel(DamKernelInput damKernelInput, MStabParameters mStabParameters,
Waternet damWaterNet, ObjectRegistry registry,
BishopCalculationGrid bishopCalculationGrid,
UpliftVanCalculationGrid upliftVanCalculationGrid)
{
if (damKernelInput == null || mStabParameters == null)
{
return null;
}
TrafficLoad trafficLoad = MacroStabilityCommonHelper.FillTrafficLoad(damKernelInput);
var kernelStabilityInput = new StabilityInputType
{
ConstructionStages = new ConstructionStageInputType[1],
SlipPlaneConstraints = new SlipPlaneConstraintsType()
};
switch (mStabParameters.Model)
{
case StabilityModelType.Bishop:
kernelStabilityInput.BishopCalculationCircle = TransferBishopCalculationGrid(bishopCalculationGrid);
break;
case StabilityModelType.UpliftVan:
kernelStabilityInput.UpliftVanCalculationGrid = TransferUpliftVanCalculationGrid(upliftVanCalculationGrid);
break;
default:
throw new NotImplementedException(nameof(mStabParameters.Model));
}
DetermineSlipPlaneConstraints(damKernelInput.Location, kernelStabilityInput.SlipPlaneConstraints);
TransferStabilityModelProperties(mStabParameters, kernelStabilityInput);
kernelStabilityInput.ConstructionStages[0] = new ConstructionStageInputType();
ConstructionStageInputType lastStage = kernelStabilityInput.ConstructionStages[0];
kernelStabilityInput.Soils = new SoilType[damKernelInput.Location.SoilList.Soils.Count];
lastStage.FixedSoilStresses = new FixedSoilStressType[damKernelInput.Location.SoilList.Soils.Count];
TransferSoils(damKernelInput.Location.SoilList, kernelStabilityInput.Soils, lastStage.FixedSoilStresses, registry);
lastStage.SoilProfile = new SoilProfileType();
lastStage.PreconsolidationStresses = new PreconsolidationStressType[damKernelInput.SubSoilScenario.SoilProfile2D.PreconsolidationStresses.Count];
lastStage.WaterDefinition = WaterDefinitionType.WaterNet;
TransferSoilProfile(damKernelInput.SubSoilScenario.SoilProfile2D, damKernelInput.Location.SoilList, lastStage.SoilProfile,
lastStage.PreconsolidationStresses, registry);
lastStage.UniformLoads = TransferUniformLoads(trafficLoad, registry);
TransferTrafficLoadDegreeOfConsolidation(trafficLoad, damKernelInput.SubSoilScenario.SoilProfile2D,
damKernelInput.Location.TrafficLoadDegreeOfConsolidations, lastStage, registry);
lastStage.Waternet = new WaternetType();
TransferWaternet(damWaterNet, lastStage.Waternet, registry);
// Unused options
lastStage.Earthquake = null;
lastStage.ForbiddenLines = null;
lastStage.Geotextiles = null;
lastStage.LineLoads = null;
lastStage.MultiplicationFactorsCPhiForUplift = null;
lastStage.Nails = null;
lastStage.TreesOnSlope = null;
lastStage.WaterMesh = null;
lastStage.YieldStressField = null;
return kernelStabilityInput;
}
private static VersionInfoType TransferVersionInfo()
{
var versionInfoType = new VersionInfoType
{
FileVersion = MacroStabilityXmlSerialization.fileVersion,
AssemblyName = Assembly.GetExecutingAssembly().GetName().Name,
AssemblyVersion = Assembly.GetExecutingAssembly().GetName().Version!.ToString()
};
return versionInfoType;
}
private static void TransferStabilityModelProperties(MStabParameters mStabParameters, StabilityInputType kernelStabilityInput)
{
kernelStabilityInput.Orientation = InputConversionHelper.ConvertToMacroStabilityGridOrientation(mStabParameters.GridPosition);
kernelStabilityInput.ModelOption = InputConversionHelper.ConvertToMacroStabilityModelOption(mStabParameters.Model);
// For Bishop, only Grid is possible however if Bishop/UpliftVan was selected, then the SearchAlgorithm concerns only Uplift-Van
kernelStabilityInput.SearchAlgorithm = mStabParameters.Model == StabilityModelType.Bishop ? SearchAlgorithmType.Grid : InputConversionHelper.ConvertToMacroStabilitySearchMethod(mStabParameters.SearchMethod);
if (kernelStabilityInput.SearchAlgorithm == SearchAlgorithmType.BeeswarmAndLevenbergMarquardt)
{
CreateDefaultBeeSwarmOptions(kernelStabilityInput);
}
kernelStabilityInput.GeneticAlgorithmOptions = null;
kernelStabilityInput.LevenbergMarquardtOptions = null;
kernelStabilityInput.MaximumSliceWidthSpecified = true;
kernelStabilityInput.MaximumSliceWidth = 1.0;
kernelStabilityInput.MoveGridSpecified = true;
kernelStabilityInput.MoveGrid = true; // Is not in DamEngine but MUST be true as we use the brute force approach.
kernelStabilityInput.MaxAllowedAngleBetweenSlicesSpecified = true;
kernelStabilityInput.MaxAllowedAngleBetweenSlices = 0;
kernelStabilityInput.RequiredForcePointsInSlicesSpecified = true;
kernelStabilityInput.RequiredForcePointsInSlices = 0;
kernelStabilityInput.TraversalGridPointsSpecified = true;
kernelStabilityInput.TraversalGridPoints = 2;
kernelStabilityInput.TraversalRefinementsSpecified = true;
kernelStabilityInput.TraversalRefinements = 0;
kernelStabilityInput.MaxGridMovesSpecified = true;
kernelStabilityInput.MaxGridMoves = 50;
kernelStabilityInput.NumberOfRefinementsGridSpecified = true;
kernelStabilityInput.NumberOfRefinementsGrid = 2;
kernelStabilityInput.NumberOfRefinementsTangentLinesSpecified = true;
kernelStabilityInput.NumberOfRefinementsTangentLines = 2;
}
internal static void DetermineSlipPlaneConstraints(Location damLocation, SlipPlaneConstraintsType kernelSlipPlaneConstraints)
{
if (damLocation.StabilityOptions == null)
{
return;
}
kernelSlipPlaneConstraints.SlipPlaneMinDepth = damLocation.StabilityOptions.MinimalCircleDepth ?? 0.0;
if ((damLocation.StabilityOptions.StabilityZoneType == StabilityZoneType.ForbiddenZone) &&
damLocation.StabilityOptions.ForbiddenZoneFactor.HasValue)
{
CharacteristicPointSet characteristicPoints = damLocation.SurfaceLine.CharacteristicPoints;
kernelSlipPlaneConstraints.XEntryMin = characteristicPoints.GetPoint2D(CharacteristicPointType.DikeTopAtRiver).X;
double xDikeTopAtPolder = characteristicPoints.GetPoint2D(CharacteristicPointType.DikeTopAtPolder).X;
double xDikeToeAtPolder = characteristicPoints.GetPoint2D(CharacteristicPointType.DikeToeAtPolder).X;
double factor = damLocation.StabilityOptions.ForbiddenZoneFactor.Value;
kernelSlipPlaneConstraints.XEntryMax = (xDikeToeAtPolder * factor) + ((1 - factor) * xDikeTopAtPolder);
}
}
private static void CreateDefaultBeeSwarmOptions(StabilityInputType kernelStabilityInput)
{
kernelStabilityInput.BeeswarmAlgorithmOptions = new BeeSwarmAlgorithmOptionsType
{
EliteCount = 2,
Seed = 1,
CrossOver = 0.3,
Beta = 0.4,
Delta = 0.7,
DifferentialWeight = 0.3,
MaximumNonImprovingGenerations = 10,
PopulationCount = 200,
GenerationCount = 40
};
}
private static void TransferSoils(SoilList damSoilList, SoilType[] kernelSoils, FixedSoilStressType[] kernelFixedSoilStresses,
ObjectRegistry registry)
{
if (damSoilList != null)
{
var i = 0;
foreach (Soil damSoil in damSoilList.Soils)
{
SoilType kernelSoil = CreateSoil(damSoil, registry);
kernelSoils[i] = kernelSoil;
var kernelFixedSoilStressType = new FixedSoilStressType
{
POP = damSoil.PoP,
Soil = kernelSoil.Key
};
kernelFixedSoilStresses[i] = kernelFixedSoilStressType;
i++;
}
}
}
private static SoilType CreateSoil(Soil damSoil, ObjectRegistry registry)
{
SoilType kernelSoil = InputConversionHelper.ConvertToMacroStabilitySoil(damSoil);
kernelSoil.Key = registry.GetId(damSoil);
return kernelSoil;
}
private static void TransferSoilProfile(SoilProfile2D damSoilProfile2D, SoilList soilList, SoilProfileType kernelSoilProfile,
PreconsolidationStressType[] kernelPreConsolidationStresses, ObjectRegistry registry)
{
// Add points
kernelSoilProfile.Geometry = new GeometryType
{
Bottom = damSoilProfile2D.Geometry.Bottom,
Left = damSoilProfile2D.Geometry.Left,
Right = damSoilProfile2D.Geometry.Right,
Points = new PointType[damSoilProfile2D.Geometry.Points.Count],
Curves = new CurveType[damSoilProfile2D.Geometry.Curves.Count],
Loops = new LoopType[damSoilProfile2D.Geometry.Loops.Count],
GeometrySurfaces = new GeometrySurfaceType[damSoilProfile2D.Geometry.Surfaces.Count]
};
kernelSoilProfile.SoilSurfaces = new SoilSurfaceType[damSoilProfile2D.Surfaces.Count];
TransferSoilProfileGeometryPoints(damSoilProfile2D, kernelSoilProfile, registry);
TransferSoilProfileGeometryCurves(damSoilProfile2D, kernelSoilProfile, registry);
TransferSoilProfileGeometryLoops(damSoilProfile2D, kernelSoilProfile, registry);
TransferSoilProfileGeometrySurfaces(damSoilProfile2D, kernelSoilProfile, registry);
TransferSoilProfileSoilLayers2D(damSoilProfile2D, soilList, kernelSoilProfile, registry);
TransferSoilProfilePreConsolidationStresses(damSoilProfile2D, kernelPreConsolidationStresses);
}
private static void TransferSoilProfilePreConsolidationStresses(SoilProfile2D damSoilProfile2D,
PreconsolidationStressType[] kernelPreConsolidationStresses)
{
var i = 0;
foreach (PreConsolidationStress preConsolidationStress in damSoilProfile2D.PreconsolidationStresses)
{
var kernelPreConsolidationStressType = new PreconsolidationStressType
{
Point = new Point2DType
{
X = preConsolidationStress.X,
Z = preConsolidationStress.Z
},
StressValue = preConsolidationStress.StressValue
};
kernelPreConsolidationStresses[i] = kernelPreConsolidationStressType;
i++;
}
}
private static void TransferSoilProfileSoilLayers2D(SoilProfile2D damSoilProfile2D, SoilList soilList,
SoilProfileType kernelSoilProfile, ObjectRegistry registry)
{
var i = 0;
foreach (SoilLayer2D damSoilLayer2D in damSoilProfile2D.Surfaces)
{
var soil = soilList.GetSoilByName(damSoilLayer2D.Name);
var kernelSoilLayer2D = new SoilSurfaceType
{
Key = registry.GetId(damSoilLayer2D),
Name = damSoilLayer2D.Name,
IsAquifer = damSoilLayer2D.IsAquifer,
GeometrySurface = registry.GetId(damSoilLayer2D.GeometrySurface),
Soil = registry.GetId(soil),
WaterPressureInterpolationModelSpecified = true,
WaterPressureInterpolationModel = InputConversionHelper.ConvertToMacroStabilityWaterPressureInterpolationModel(
damSoilLayer2D.WaterpressureInterpolationModel)
};
kernelSoilProfile.SoilSurfaces[i] = kernelSoilLayer2D;
i++;
}
}
private static void TransferSoilProfileGeometrySurfaces(SoilProfile2D damSoilProfile2D, SoilProfileType kernelSoilProfile,
ObjectRegistry registry)
{
var i = 0;
foreach (GeometrySurface geometrySurface in damSoilProfile2D.Geometry.Surfaces)
{
var kernelGeometrySurface = new GeometrySurfaceType
{
Key = registry.GetId(geometrySurface)
};
kernelGeometrySurface.OuterLoop = registry.GetId(geometrySurface.OuterLoop);
kernelGeometrySurface.InnerLoops = new GeometrySurfaceTypeInnerLoop[geometrySurface.InnerLoops.Count];
var j = 0;
foreach (GeometryLoop damSurfaceInnerLoop in geometrySurface.InnerLoops)
{
kernelGeometrySurface.InnerLoops[j] = new GeometrySurfaceTypeInnerLoop
{
Loop = registry.GetId(damSurfaceInnerLoop)
};
j++;
}
kernelSoilProfile.Geometry.GeometrySurfaces[i] = kernelGeometrySurface;
i++;
}
}
private static void TransferSoilProfileGeometryLoops(SoilProfile2D damSoilProfile2D, SoilProfileType kernelSoilProfile,
ObjectRegistry registry)
{
var i = 0;
foreach (GeometryLoop damLoop in damSoilProfile2D.Geometry.Loops)
{
var kernelLoop = new LoopType
{
Key = registry.GetId(damLoop),
Curves = new LoopTypeCurve[damLoop.CurveList.Count]
};
var j = 0;
foreach (GeometryCurve damCurve in damLoop.CurveList)
{
var kernelCurve = new LoopTypeCurve
{
Curve = registry.GetId(damCurve)
};
kernelLoop.Curves[j] = kernelCurve;
j++;
}
kernelSoilProfile.Geometry.Loops[i] = kernelLoop;
i++;
}
}
private static void TransferSoilProfileGeometryCurves(SoilProfile2D damSoilProfile2D, SoilProfileType kernelSoilProfile,
ObjectRegistry registry)
{
var i = 0;
foreach (GeometryCurve damCurve in damSoilProfile2D.Geometry.Curves)
{
var kernelCurve = new CurveType
{
HeadPoint = registry.GetId(damCurve.HeadPoint),
EndPoint = registry.GetId(damCurve.EndPoint),
Key = registry.GetId(damCurve)
};
kernelSoilProfile.Geometry.Curves[i] = kernelCurve;
i++;
}
}
private static void TransferSoilProfileGeometryPoints(SoilProfile2D damSoilProfile2D, SoilProfileType kernelSoilProfile,
ObjectRegistry registry)
{
var i = 0;
foreach (Point2D damPoint in damSoilProfile2D.Geometry.Points)
{
var kernelPoint = new PointType
{
X = damPoint.X,
Z = damPoint.Z,
Key = registry.GetId(damPoint)
};
kernelSoilProfile.Geometry.Points[i] = kernelPoint;
i++;
}
}
private static UniformLoadType[] TransferUniformLoads(TrafficLoad damTrafficLoad, ObjectRegistry registry)
{
if (damTrafficLoad != null)
{
var kernelUniformLoads = new UniformLoadType[1];
var kernelUniformLoad = new UniformLoadType
{
XStart = damTrafficLoad.XStart,
XEnd = damTrafficLoad.XEnd,
Pressure = damTrafficLoad.Pressure,
DistributionAngle = 0.0,
Key = registry.GetId(damTrafficLoad)
};
kernelUniformLoads[0] = kernelUniformLoad;
return kernelUniformLoads;
}
return [];
}
private static void TransferTrafficLoadDegreeOfConsolidation(TrafficLoad damTrafficLoad, SoilProfile2D damSoilProfile,
IList damDegreeOfConsolidations,
ConstructionStageInputType kernelStage, ObjectRegistry registry)
{
if (damTrafficLoad != null && damDegreeOfConsolidations != null && kernelStage.UniformLoads.Length == 1)
{
var i = 0;
kernelStage.ConsolidationValues = new ConsolidationValuesTypeConsolidationValue[damSoilProfile.Surfaces.Count];
foreach (SoilLayer2D damSurface in damSoilProfile.Surfaces)
{
kernelStage.ConsolidationValues[i] = new ConsolidationValuesTypeConsolidationValue
{
Consolidator = registry.GetId(damTrafficLoad),
Consolidated = registry.GetId(damSurface),
Value = damDegreeOfConsolidations.Find(t => t.SoilName == damSurface.Soil.Name).DegreeOfConsolidation
};
i++;
}
}
}
private static void TransferWaternet(Waternet damWaternet, WaternetType kernelWaternet, ObjectRegistry registry)
{
kernelWaternet.Name = damWaternet.Name;
kernelWaternet.UnitWeightWater = damWaternet.UnitWeight;
kernelWaternet.UnitWeightWaterSpecified = true;
// Phreatic Line
kernelWaternet.PhreaticLine = CreatePhreaticLine(damWaternet.PhreaticLine, registry);
// Head Lines
kernelWaternet.HeadLines = new HeadLineType[damWaternet.HeadLineList.Count];
var i = 0;
foreach (HeadLine damHeadLine in damWaternet.HeadLineList)
{
HeadLineType kernelHeadLine = CreateHeadLine(damHeadLine, registry);
kernelWaternet.HeadLines[i] = kernelHeadLine;
i++;
}
// Waternet Lines
kernelWaternet.WaternetLines = new WaternetTypeWaternetLine[damWaternet.WaternetLineList.Count];
i = 0;
foreach (WaternetLine damWaternetLine in damWaternet.WaternetLineList)
{
WaternetTypeWaternetLine waternetTypeWaternetLine = CreateWaternetTypeWaternetLine(damWaternetLine, registry);
kernelWaternet.WaternetLines[i] = waternetTypeWaternetLine;
i++;
}
}
private static HeadLineType CreatePhreaticLine(PhreaticLine damPhreaticLine, ObjectRegistry registry)
{
return new HeadLineType
{
Key = registry.GetId(damPhreaticLine),
WaternetLine = CreateWaternetLineType(damPhreaticLine)
};
}
private static HeadLineType CreateHeadLine(HeadLine damHeadLine, ObjectRegistry registry)
{
return new HeadLineType
{
Key = registry.GetId(damHeadLine),
WaternetLine = CreateWaternetLineType(damHeadLine)
};
}
private static WaternetTypeWaternetLine CreateWaternetTypeWaternetLine(WaternetLine damWaternetLine, ObjectRegistry registry)
{
var waternetTypeWaternetLine = new WaternetTypeWaternetLine
{
Name = damWaternetLine.Name,
AssociatedHeadLineSpecified = true,
AssociatedHeadLine = registry.GetId(damWaternetLine.HeadLine),
Points = new Point2DType[damWaternetLine.Points.Count]
};
for (var i = 0; i < damWaternetLine.Points.Count; i++)
{
waternetTypeWaternetLine.Points[i] = CreateWaternetLinePoint(damWaternetLine.Points[i]);
}
return waternetTypeWaternetLine;
}
private static WaternetLineType CreateWaternetLineType(GeometryPointString damWaternetLine)
{
var waternetLineType = new WaternetLineType
{
Name = damWaternetLine.Name,
Points = new Point2DType[damWaternetLine.Points.Count]
};
for (var i = 0; i < damWaternetLine.Points.Count; i++)
{
waternetLineType.Points[i] = CreateWaternetLinePoint(damWaternetLine.Points[i]);
}
return waternetLineType;
}
private static Point2DType CreateWaternetLinePoint(Point2D damPoint)
{
if (damPoint == null)
{
return null;
}
return new Point2DType
{
X = damPoint.X,
Z = damPoint.Z
};
}
}