Index: DamEngine/trunk/src/Deltares.DamEngine.Calculators/KernelWrappers/MacroStabilityCommon/MacroStabilityIo/FillMacroStabilityKernelInputFromEngine.cs =================================================================== diff -u -r6380 -r6381 --- DamEngine/trunk/src/Deltares.DamEngine.Calculators/KernelWrappers/MacroStabilityCommon/MacroStabilityIo/FillMacroStabilityKernelInputFromEngine.cs (.../FillMacroStabilityKernelInputFromEngine.cs) (revision 6380) +++ DamEngine/trunk/src/Deltares.DamEngine.Calculators/KernelWrappers/MacroStabilityCommon/MacroStabilityIo/FillMacroStabilityKernelInputFromEngine.cs (.../FillMacroStabilityKernelInputFromEngine.cs) (revision 6381) @@ -24,6 +24,7 @@ using System.Linq; 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.XmlInput; @@ -44,6 +45,9 @@ namespace Deltares.DamEngine.Calculators.KernelWrappers.MacroStabilityCommon.MacroStabilityIo; +/// +/// Class to create macro stability kernel input from dam engine data. +/// public class FillMacroStabilityKernelInputFromEngine { /// Gets or sets the UpliftVan calculation grid. @@ -58,14 +62,21 @@ /// The traffic load. public TrafficLoad TrafficLoad { get; set; } - public FullInputModelType CreateFullInputModel(DamKernelInput damKernelInput, MStabParameters mStabParameters, Waternet waterNet) + /// + /// Creates a full input model data object for Macro stability kernel based on DamEngineData. + /// + /// + /// + /// + /// FullInputModelType + public FullInputModelType CreateFullInputModel(DamKernelInput damKernelInput, MStabParameters mStabParameters, Waternet damWaterNet) { // The objectRegistry is to be used to keep track of all keys of some of the referenced objects var objectRegistry = new ObjectRegistry(); var fullInputModelType = new FullInputModelType { PreprocessingInput = TransferPreprocessingInput(damKernelInput, mStabParameters), - StabilityModel = TransferStabilityModel(damKernelInput, mStabParameters, objectRegistry), + StabilityModel = TransferStabilityModel(damKernelInput, mStabParameters, damWaterNet, objectRegistry), VersionInfo = TransferVersionInfo() }; return fullInputModelType; @@ -85,30 +96,29 @@ preprocessingInputType.PreConstructionStages[0] = new PreConstructionStageType(); PreConstructionStageType preConstructionLastStage = preprocessingInputType.PreConstructionStages.Last(); preConstructionLastStage.Surfaceline = new SurfaceLineType(); - preConstructionLastStage.CreateWaternet = false; // #Bka: I can NOT find any use of this at the engine side so this must be false! + preConstructionLastStage.CreateWaternet = false; TransferSurfaceLine(damKernelInput.Location.SurfaceLine, preConstructionLastStage.Surfaceline); - preprocessingInputType.SearchAreaConditions = TransferSearchAreaCondition(damKernelInput, mStabParameters); + preprocessingInputType.SearchAreaConditions = TransferSearchAreaCondition(mStabParameters); return preprocessingInputType; } - private SearchAreaConditionsType TransferSearchAreaCondition(DamKernelInput damKernelInput, MStabParameters mStabParameters) + private SearchAreaConditionsType TransferSearchAreaCondition(MStabParameters mStabParameters) { var preprocessingSearchAreaConditions = new SearchAreaConditionsType { - AutoGeneticAlgorithmOptions = false, //#Bka or true? is not to be found at engine side; or just set specified to false!? + AutoGeneticAlgorithmOptions = false, AutoGeneticAlgorithmOptionsSpecified = true, - AutoLevenbergMarquardtOptions = false, //#Bka or true? is not to be found at engine side; or just set specified to false!? + AutoLevenbergMarquardtOptions = false, AutoLevenbergMarquardtOptionsSpecified = true, AutoSearchAreaSpecified = true, AutoTangentLinesSpecified = true, - AutomaticForbiddenZones = false, //#Bka or true? is not to be found at engine side; or just set specified to false!? + AutomaticForbiddenZones = false, AutomaticForbiddenZonesSpecified = true, - MaxSpacingBetweenBoundaries = 0.8, MaxSpacingBetweenBoundariesSpecified = true, OnlyAbovePleistoceenSpecified = true, - SlipPlanePosition = SearchAreaConditionsTypeSlipPlanePosition.High, //#Bka = default in C#wrapper, is not to be found at engine side; or just set specified to false!? + SlipPlanePosition = SearchAreaConditionsTypeSlipPlanePosition.High, SlipPlanePositionSpecified = true, TangentLineNumberSpecified = true, TangentLineZBottomSpecified = true, @@ -130,26 +140,27 @@ return preprocessingSearchAreaConditions; } - private void TransferBishopSearchAreaSettings(SearchAreaConditionsType searchAreaConditions) + private void TransferBishopSearchAreaSettings(SearchAreaConditionsType kernelSearchAreaConditions) { // 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. - searchAreaConditions.AutoTangentLines = false; - searchAreaConditions.AutoSearchArea = BishopCalculationGrid.IsSearchAreaAutomatic; - searchAreaConditions.TangentLineNumber = BishopCalculationGrid.TangentLineCount; - searchAreaConditions.TangentLineZTop = BishopCalculationGrid.TangentLineZTop; - searchAreaConditions.TangentLineZBottom = BishopCalculationGrid.TangentLineZBottom; + kernelSearchAreaConditions.AutoTangentLines = false; + kernelSearchAreaConditions.AutoSearchArea = BishopCalculationGrid.IsSearchAreaAutomatic; + kernelSearchAreaConditions.TangentLineNumber = BishopCalculationGrid.TangentLineCount; + kernelSearchAreaConditions.TangentLineZTop = BishopCalculationGrid.TangentLineZTop; + kernelSearchAreaConditions.TangentLineZBottom = BishopCalculationGrid.TangentLineZBottom; + kernelSearchAreaConditions.MaxSpacingBetweenBoundaries = 10.0; } private void TransferUpliftVanSearchAreaSettings(SearchAreaConditionsType kernelSearchAreaConditions) { kernelSearchAreaConditions.AutoTangentLines = UpliftVanCalculationGrid.TangentLinesCreationMethod is TangentLinesDefinition.Automatic or TangentLinesDefinition.OnBoundaryLines; kernelSearchAreaConditions.AutoSearchArea = UpliftVanCalculationGrid.IsGridsAutomatic; kernelSearchAreaConditions.OnlyAbovePleistoceen = UpliftVanCalculationGrid.TangentLinesCreationMethod == TangentLinesDefinition.Automatic; - kernelSearchAreaConditions.MaxSpacingBetweenBoundaries = 0.8; kernelSearchAreaConditions.TangentLineNumber = UpliftVanCalculationGrid.TangentLineCount; kernelSearchAreaConditions.TangentLineZTop = UpliftVanCalculationGrid.TangentLineZTop; kernelSearchAreaConditions.TangentLineZBottom = UpliftVanCalculationGrid.TangentLineZBottom; + kernelSearchAreaConditions.MaxSpacingBetweenBoundaries = 0.8; } private BishopCalculationCircle TransferBishopCalculationGrid() @@ -218,11 +229,11 @@ return kernelUpliftVanCalculationGrid; } - private void TransferSurfaceLine(SurfaceLine2 surfaceLineInput, SurfaceLineType surfaceLine) + private void TransferSurfaceLine(SurfaceLine2 damSurfaceLine, SurfaceLineType kernelSurfaceLine) { - surfaceLine.CharacteristicPoints = new SurfaceLineTypeCharacteristicPoint[surfaceLineInput.CharacteristicPoints.Count]; + kernelSurfaceLine.CharacteristicPoints = new SurfaceLineTypeCharacteristicPoint[damSurfaceLine.CharacteristicPoints.Count]; var i = 0; - foreach (CharacteristicPoint damCharPoint in surfaceLineInput.CharacteristicPoints) + foreach (CharacteristicPoint damCharPoint in damSurfaceLine.CharacteristicPoints) { var kernelCharPoint = new SurfaceLineTypeCharacteristicPoint { @@ -233,56 +244,69 @@ Z = damCharPoint.Point.Z } }; - surfaceLine.CharacteristicPoints[i] = kernelCharPoint; + kernelSurfaceLine.CharacteristicPoints[i] = kernelCharPoint; i++; } } - private StabilityInputType TransferStabilityModel(DamKernelInput damKernelInput, MStabParameters mStabParameters, ObjectRegistry objectRegistry) + private StabilityInputType TransferStabilityModel(DamKernelInput damKernelInput, MStabParameters mStabParameters, + Waternet damWaterNet, ObjectRegistry registry) { if (damKernelInput == null || mStabParameters == null) { return null; } - var stabilityInputType = new StabilityInputType + var kernelStabilityInput = new StabilityInputType { ConstructionStages = new ConstructionStageInputType[1], SlipPlaneConstraints = new SlipPlaneConstraintsType() }; switch (mStabParameters.Model) { case StabilityModelType.Bishop: - stabilityInputType.BishopCalculationCircle = TransferBishopCalculationGrid(); + kernelStabilityInput.BishopCalculationCircle = TransferBishopCalculationGrid(); break; case StabilityModelType.UpliftVan: - stabilityInputType.UpliftVanCalculationGrid = TransferUpliftVanCalculationGrid(); + kernelStabilityInput.UpliftVanCalculationGrid = TransferUpliftVanCalculationGrid(); break; default: throw new NotImplementedException(nameof(mStabParameters.Model)); } - TransferSlipPlaneConstraints(damKernelInput.Location, stabilityInputType.SlipPlaneConstraints); - TransferStabilityModelProperties(mStabParameters, stabilityInputType); + TransferSlipPlaneConstraints(damKernelInput.Location, kernelStabilityInput.SlipPlaneConstraints); + TransferStabilityModelProperties(mStabParameters, kernelStabilityInput); - stabilityInputType.ConstructionStages[0] = new ConstructionStageInputType(); - ConstructionStageInputType lastStage = stabilityInputType.ConstructionStages.Last(); + kernelStabilityInput.ConstructionStages[0] = new ConstructionStageInputType(); + ConstructionStageInputType lastStage = kernelStabilityInput.ConstructionStages.Last(); - stabilityInputType.Soils = new SoilType[damKernelInput.Location.SoilList.Soils.Count]; + kernelStabilityInput.Soils = new SoilType[damKernelInput.Location.SoilList.Soils.Count]; lastStage.FixedSoilStresses = new FixedSoilStressType[damKernelInput.Location.SoilList.Soils.Count]; - TransferSoils(damKernelInput.Location.SoilList, stabilityInputType.Soils, lastStage.FixedSoilStresses, objectRegistry); + TransferSoils(damKernelInput.Location.SoilList, kernelStabilityInput.Soils, lastStage.FixedSoilStresses, registry); - lastStage.UniformLoads = new UniformLoadType[1]; - TransferUniformLoads(TrafficLoad, lastStage.UniformLoads, objectRegistry); - TransferTrafficLoadDegreeOfConsolidation(TrafficLoad, damKernelInput.SubSoilScenario.SoilProfile2D, - damKernelInput.Location.TrafficLoadDegreeOfConsolidations, lastStage, objectRegistry); - lastStage.SoilProfile = new SoilProfileType(); lastStage.PreconsolidationStresses = new PreconsolidationStressType[damKernelInput.SubSoilScenario.SoilProfile2D.PreconsolidationStresses.Count]; lastStage.WaterDefinition = WaterDefinitionType.WaterNet; - TransferSoilProfile(damKernelInput.SubSoilScenario.SoilProfile2D, lastStage.SoilProfile, lastStage.PreconsolidationStresses, objectRegistry); + TransferSoilProfile(damKernelInput.SubSoilScenario.SoilProfile2D, lastStage.SoilProfile, lastStage.PreconsolidationStresses, registry); - return stabilityInputType; + 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 VersionInfoType TransferVersionInfo() @@ -301,7 +325,8 @@ 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); + kernelStabilityInput.SearchAlgorithm = mStabParameters.Model == StabilityModelType.Bishop ? + SearchAlgorithmType.Grid : InputConversionHelper.ConvertToMacroStabilitySearchMethod(mStabParameters.SearchMethod); if (kernelStabilityInput.SearchAlgorithm == SearchAlgorithmType.BeeswarmAndLevenbergMarquardt) { CreateDefaultBeeSwarmOptions(kernelStabilityInput); @@ -329,23 +354,23 @@ kernelStabilityInput.NumberOfRefinementsTangentLines = 2; } - private static void TransferSlipPlaneConstraints(Location location, SlipPlaneConstraintsType slipPlaneConstraints) + private static void TransferSlipPlaneConstraints(Location damLocation, SlipPlaneConstraintsType kernelSlipPlaneConstraints) { - if (location.StabilityOptions == null) + if (damLocation.StabilityOptions == null) { return; } - slipPlaneConstraints.SlipPlaneMinDepth = location.StabilityOptions.MinimalCircleDepth ?? 0.0; - if ((location.StabilityOptions.StabilityZoneType == StabilityZoneType.ForbiddenZone) && - location.StabilityOptions.ForbiddenZoneFactor.HasValue) + kernelSlipPlaneConstraints.SlipPlaneMinDepth = damLocation.StabilityOptions.MinimalCircleDepth ?? 0.0; + if ((damLocation.StabilityOptions.StabilityZoneType == StabilityZoneType.ForbiddenZone) && + damLocation.StabilityOptions.ForbiddenZoneFactor.HasValue) { - CharacteristicPointSet characteristicPoints = location.SurfaceLine.CharacteristicPoints; - slipPlaneConstraints.XEntryMin = characteristicPoints.GetPoint2D(CharacteristicPointType.DikeTopAtRiver).X; + 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 = location.StabilityOptions.ForbiddenZoneFactor.Value; - slipPlaneConstraints.XEntryMax = (xDikeToeAtPolder * factor) + ((1 - factor) * xDikeTopAtPolder); + double factor = damLocation.StabilityOptions.ForbiddenZoneFactor.Value; + kernelSlipPlaneConstraints.XEntryMax = (xDikeToeAtPolder * factor) + ((1 - factor) * xDikeTopAtPolder); } } @@ -365,7 +390,8 @@ }; } - private void TransferSoils(SoilList damSoilList, SoilType[] kernelSoils, FixedSoilStressType[] kernelFixedSoilStresses, ObjectRegistry registry) + private void TransferSoils(SoilList damSoilList, SoilType[] kernelSoils, FixedSoilStressType[] kernelFixedSoilStresses, + ObjectRegistry registry) { if (damSoilList != null) { @@ -385,15 +411,15 @@ } } - private static SoilType CreateSoil(Soil soil, ObjectRegistry registry) + private static SoilType CreateSoil(Soil damSoil, ObjectRegistry registry) { - SoilType soilType = InputConversionHelper.ConvertToMacroStabilitySoil(soil); - soilType.Key = registry.GetId(soil); - return soilType; + SoilType kernelSoil = InputConversionHelper.ConvertToMacroStabilitySoil(damSoil); + kernelSoil.Key = registry.GetId(damSoil); + return kernelSoil; } private void TransferSoilProfile(SoilProfile2D damSoilProfile2D, SoilProfileType kernelSoilProfile, - PreconsolidationStressType[] preConsolidationStresses, ObjectRegistry registry) + PreconsolidationStressType[] kernelPreConsolidationStresses, ObjectRegistry registry) { // Add points kernelSoilProfile.Geometry = new GeometryType @@ -415,10 +441,11 @@ TransferSoilProfileSoilLayers2D(damSoilProfile2D, kernelSoilProfile, registry); - TransferSoilProfilePreConsolidationStresses(damSoilProfile2D, preConsolidationStresses); + TransferSoilProfilePreConsolidationStresses(damSoilProfile2D, kernelPreConsolidationStresses); } - private static void TransferSoilProfilePreConsolidationStresses(SoilProfile2D damSoilProfile2D, PreconsolidationStressType[] preConsolidationStresses) + private static void TransferSoilProfilePreConsolidationStresses(SoilProfile2D damSoilProfile2D, + PreconsolidationStressType[] kernelPreConsolidationStresses) { var i = 0; foreach (PreConsolidationStress preConsolidationStress in damSoilProfile2D.PreconsolidationStresses) @@ -432,12 +459,13 @@ }, StressValue = preConsolidationStress.StressValue }; - preConsolidationStresses[i] = kernelPreConsolidationStressType; + kernelPreConsolidationStresses[i] = kernelPreConsolidationStressType; i++; } } - private static void TransferSoilProfileSoilLayers2D(SoilProfile2D damSoilProfile2D, SoilProfileType kernelSoilProfile, ObjectRegistry registry) + private static void TransferSoilProfileSoilLayers2D(SoilProfile2D damSoilProfile2D, SoilProfileType kernelSoilProfile, + ObjectRegistry registry) { var i = 0; foreach (SoilLayer2D damSoilLayer2D in damSoilProfile2D.Surfaces) @@ -450,18 +478,18 @@ GeometrySurface = registry.GetId(damSoilLayer2D.GeometrySurface), Soil = registry.GetId(damSoilLayer2D.Soil), WaterPressureInterpolationModelSpecified = true, - WaterPressureInterpolationModel = InputConversionHelper.ConvertToMacroStabilityWaterPressureInterpolationModel(damSoilLayer2D - .WaterpressureInterpolationModel) + WaterPressureInterpolationModel = InputConversionHelper.ConvertToMacroStabilityWaterPressureInterpolationModel( + damSoilLayer2D.WaterpressureInterpolationModel) }; kernelSoilProfile.SoilSurfaces[i] = kernelSoilLayer2D; i++; } } - private static void TransferSoilProfileGeometrySurfaces(SoilProfile2D damSoilProfile2D, SoilProfileType kernelSoilProfile, ObjectRegistry registry) + private static void TransferSoilProfileGeometrySurfaces(SoilProfile2D damSoilProfile2D, SoilProfileType kernelSoilProfile, + ObjectRegistry registry) { - int i; - i = 0; + int i = 0; foreach (SoilLayer2D damSurface in damSoilProfile2D.Surfaces) { var kernelGeometrySurface = new GeometrySurfaceType @@ -484,7 +512,8 @@ } } - private static void TransferSoilProfileGeometryLoops(SoilProfile2D damSoilProfile2D, SoilProfileType kernelSoilProfile, ObjectRegistry registry) + private static void TransferSoilProfileGeometryLoops(SoilProfile2D damSoilProfile2D, SoilProfileType kernelSoilProfile, + ObjectRegistry registry) { var i = 0; foreach (GeometryLoop damLoop in damSoilProfile2D.Geometry.Loops) @@ -495,11 +524,11 @@ Curves = new LoopTypeCurve[damLoop.CurveList.Count] }; var j = 0; - foreach (GeometryCurve geometryCurve in damLoop.CurveList) + foreach (GeometryCurve damCurve in damLoop.CurveList) { var kernelCurve = new LoopTypeCurve { - Curve = registry.GetId(geometryCurve) + Curve = registry.GetId(damCurve) }; kernelLoop.Curves[j] = kernelCurve; j++; @@ -510,7 +539,8 @@ } } - private static void TransferSoilProfileGeometryCurves(SoilProfile2D damSoilProfile2D, SoilProfileType kernelSoilProfile, ObjectRegistry registry) + private static void TransferSoilProfileGeometryCurves(SoilProfile2D damSoilProfile2D, SoilProfileType kernelSoilProfile, + ObjectRegistry registry) { var i = 0; foreach (GeometryCurve damCurve in damSoilProfile2D.Geometry.Curves) @@ -526,7 +556,8 @@ } } - private static void TransferSoilProfileGeometryPoints(SoilProfile2D damSoilProfile2D, SoilProfileType kernelSoilProfile, ObjectRegistry registry) + private static void TransferSoilProfileGeometryPoints(SoilProfile2D damSoilProfile2D, SoilProfileType kernelSoilProfile, + ObjectRegistry registry) { var i = 0; foreach (Point2D damPoint in damSoilProfile2D.Geometry.Points) @@ -542,36 +573,134 @@ } } - private void TransferUniformLoads(TrafficLoad damTrafficLoad, UniformLoadType[] kernelUniformLoads, ObjectRegistry registry) + private UniformLoadType[] TransferUniformLoads(TrafficLoad damTrafficLoad, ObjectRegistry registry) { if (damTrafficLoad != null) { - kernelUniformLoads[0].XStart = damTrafficLoad.XStart; - kernelUniformLoads[0].XEnd = damTrafficLoad.XEnd; - kernelUniformLoads[0].Pressure = damTrafficLoad.Pressure; - kernelUniformLoads[0].DistributionAngle = 0.0; - kernelUniformLoads[0].Key = registry.GetId(damTrafficLoad); - }; + 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 null; } - private static void TransferTrafficLoadDegreeOfConsolidation(TrafficLoad damTrafficLoad, SoilProfile2D soilProfile, + private static void TransferTrafficLoadDegreeOfConsolidation(TrafficLoad damTrafficLoad, SoilProfile2D damSoilProfile, IList damDegreeOfConsolidations, - ConstructionStageInputType stage, ObjectRegistry registry) + ConstructionStageInputType kernelStage, ObjectRegistry registry) { - if (damDegreeOfConsolidations != null && stage.UniformLoads.Length == 1) + if (damDegreeOfConsolidations != null && kernelStage.UniformLoads.Length == 1) { int i = 0; - stage.ConsolidationValues = new ConsolidationValuesTypeConsolidationValue[damDegreeOfConsolidations.Count]; - foreach (SoilLayer2D surface in soilProfile.Surfaces) + kernelStage.ConsolidationValues = new ConsolidationValuesTypeConsolidationValue[damDegreeOfConsolidations.Count]; + foreach (SoilLayer2D damSurface in damSoilProfile.Surfaces) { - stage.ConsolidationValues[i] = new ConsolidationValuesTypeConsolidationValue + kernelStage.ConsolidationValues[i] = new ConsolidationValuesTypeConsolidationValue { Consolidator = registry.GetId(damTrafficLoad), - Consolidated = registry.GetId(surface), - Value = damDegreeOfConsolidations.Find(t => t.SoilName == surface.Soil.Name).DegreeOfConsolidation + 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; + + // Head Lines + kernelWaternet.HeadLines = new HeadLineType[damWaternet.HeadLineList.Count]; + int i = 0; + foreach (HeadLine damHeadLine in damWaternet.HeadLineList) + { + HeadLineType kernelHeadLine = CreateHeadLine(damHeadLine, registry); + kernelWaternet.HeadLines[i] = kernelHeadLine; + i++; + } + + // Phreatic Line + kernelWaternet.PhreaticLine = CreatePhreaticLine(damWaternet.PhreaticLine, registry); + + // 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; + } + } + + private static HeadLineType CreateHeadLine(HeadLine damHeadLine, ObjectRegistry registry) + { + return new HeadLineType + { + Key = registry.GetId(damHeadLine), + WaternetLine = CreateWaternetLineType(damHeadLine) + }; + } + + private static HeadLineType CreatePhreaticLine(PhreaticLine damPhreaticLine, ObjectRegistry registry) + { + return new HeadLineType + { + Key = registry.GetId(damPhreaticLine), + WaternetLine = CreateWaternetLineType(damPhreaticLine) + }; + } + + 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 (int 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 (int 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 + }; + } } \ No newline at end of file