// Copyright (C) Stichting Deltares 2019. 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 Deltares.DamEngine.Data.General;
using Deltares.DamEngine.Data.Geometry;
using Deltares.DamEngine.Data.Geotechnics;
using Deltares.MacroStability.Data;
using Deltares.MacroStability.Kernel;
using Deltares.MacroStability.Preprocessing;
using Deltares.SoilStress.Data;
using Soil = Deltares.MacroStability.Geometry.Soil;
using CharacteristicPoint = Deltares.DamEngine.Data.Geotechnics.CharacteristicPoint;
using GeometryCurve = Deltares.MacroStability.Geometry.GeometryCurve;
using GeometryLoop = Deltares.MacroStability.Geometry.GeometryLoop;
using GeometryPointString = Deltares.MacroStability.Geometry.GeometryPointString;
using GeometrySurface = Deltares.MacroStability.Geometry.GeometrySurface;
using Point2D = Deltares.MacroStability.Geometry.Point2D;
using SurfaceLine2 = Deltares.DamEngine.Data.Geotechnics.SurfaceLine2;
using Waternet = Deltares.MacroStability.Geometry.Waternet;
namespace Deltares.DamEngine.Calculators.KernelWrappers.MacroStabilityCommon.MacroStabilityIo
{
/// Fill DamEngine data objects from the kernel data model
public class FillDamEngineFromWti
{
/// Gets or sets the SoilList DamEngine object
/// The soil list.
public SoilList SoilList { get; set; }
/// Gets or sets the location DamEngine object.
/// The location.
public Location Location { get; set; }
/// Gets or sets the SoilProfile2D DamEngine object.
/// The soil profile2 d.
public SoilProfile2D SoilProfile2D { get; set; }
/// Gets or sets the SurfaceLine2 DamEngine object.
/// The surface line2.
public SurfaceLine2 SurfaceLine2 { get; set; }
/// Gets or sets the waternet.
/// The waternet.
public Data.Geometry.Waternet Waternet { get; set; }
/// Gets or sets the UpliftVan calculation grid.
/// The uplift van calculation grid.
public UpliftVanCalculationGrid UpliftVanCalculationGrid { get; set; }
/// Gets or sets the traffic load.
/// The traffic load.
public TrafficLoad TrafficLoad { get; set; }
/// Gets or sets the failure mechanism parameters m stab.
/// The failure mechanism parameters for macrostability DamEngine object.
public FailureMechanismParametersMStab FailureMechanismParametersMStab { get; set; }
private Dictionary dictSoils = new Dictionary();
private Dictionary dictHeadLines = new Dictionary();
/// Creates the dam project data from the kernel model.
/// The kernel model.
/// The DamProjectData object filled with Wti data
public void FillDamProjectDataFromKernelModel(KernelModel kernelModel)
{
Location = null;
TransferWtiStabilityModel(kernelModel.StabilityModel);
TransferSoils(kernelModel.StabilityModel.Soils);
TransferSoilProfile2D(kernelModel.StabilityModel.SoilProfile);
TransferSurfaceLine(kernelModel.PreprocessingModel.LastStage.SurfaceLine);
TransferWaternet(kernelModel.StabilityModel.LastStage.GeotechnicsData.CurrentWaternet);
TransferUpliftVanCalculationGrid(kernelModel.StabilityModel.SlipPlaneUpliftVan, kernelModel.PreprocessingModel.SearchAreaConditions);
TransferTrafficLoad(kernelModel.StabilityModel.LastStage.UniformLoads);
}
private void TransferTrafficLoad(List kernelUniformLoads)
{
TrafficLoad = null;
if ((kernelUniformLoads != null) && (kernelUniformLoads.Count > 0))
{
if (kernelUniformLoads.Count > 1)
{
throw new ArgumentException(string.Format(
"Trafficload cannot be constructed because there are too many uniform loads defined ({0}",
kernelUniformLoads.Count));
}
var kernelUniformLoad = kernelUniformLoads[0];
TrafficLoad = new TrafficLoad()
{
XStart = kernelUniformLoad.XStart,
XEnd = kernelUniformLoad.XEnd,
Pressure = kernelUniformLoad.Pressure
};
}
}
private void TransferUpliftVanCalculationGrid(SlipPlaneUpliftVan kernelSlipPlaneUpliftVan,
SearchAreaConditions kernelSearchAreaConditions)
{
UpliftVanCalculationGrid = new UpliftVanCalculationGrid();
UpliftVanCalculationGrid.IsAuto = kernelSearchAreaConditions.AutoSearchArea;
UpliftVanCalculationGrid.LeftGridXCount = kernelSlipPlaneUpliftVan.SlipPlaneLeftGrid.GridXNumber;
UpliftVanCalculationGrid.LeftGridXLeft = kernelSlipPlaneUpliftVan.SlipPlaneLeftGrid.GridXLeft;
UpliftVanCalculationGrid.LeftGridXRight = kernelSlipPlaneUpliftVan.SlipPlaneLeftGrid.GridXRight;
UpliftVanCalculationGrid.LeftGridZCount = kernelSlipPlaneUpliftVan.SlipPlaneLeftGrid.GridZNumber;
UpliftVanCalculationGrid.LeftGridZTop = kernelSlipPlaneUpliftVan.SlipPlaneLeftGrid.GridZTop;
UpliftVanCalculationGrid.LeftGridZBottom = kernelSlipPlaneUpliftVan.SlipPlaneLeftGrid.GridZBottom;
UpliftVanCalculationGrid.RightGridXCount = kernelSlipPlaneUpliftVan.SlipPlaneRightGrid.GridXNumber;
UpliftVanCalculationGrid.RightGridXLeft = kernelSlipPlaneUpliftVan.SlipPlaneRightGrid.GridXLeft;
UpliftVanCalculationGrid.RightGridXRight = kernelSlipPlaneUpliftVan.SlipPlaneRightGrid.GridXRight;
UpliftVanCalculationGrid.RightGridZCount = kernelSlipPlaneUpliftVan.SlipPlaneRightGrid.GridZNumber;
UpliftVanCalculationGrid.RightGridZTop = kernelSlipPlaneUpliftVan.SlipPlaneRightGrid.GridZTop;
UpliftVanCalculationGrid.RightGridZBottom = kernelSlipPlaneUpliftVan.SlipPlaneRightGrid.GridZBottom;
UpliftVanCalculationGrid.TangentLineAutomaticAtBoundaries = kernelSearchAreaConditions.AutoTangentLines;
UpliftVanCalculationGrid.TangentLineCount = kernelSlipPlaneUpliftVan.SlipPlaneTangentLine.TangentLineNumber;
UpliftVanCalculationGrid.TangentLineZTop = kernelSlipPlaneUpliftVan.SlipPlaneTangentLine.TangentLineZTop;
UpliftVanCalculationGrid.TangentLineZBottom = kernelSlipPlaneUpliftVan.SlipPlaneTangentLine.TangentLineZBottom;
}
private void TransferWaternet(Waternet kernelWaternet)
{
Waternet = new Data.Geometry.Waternet();
// Properties
Waternet.IsGenerated = kernelWaternet.IsGenerated;
Waternet.UnitWeight = kernelWaternet.UnitWeight;
// Phreatic Line
var damPhreaticLine = new PhreaticLine()
{
Name = kernelWaternet.PhreaticLine.Name
};
foreach (var kernelPoint in kernelWaternet.PhreaticLine.CalcPoints)
{
damPhreaticLine.CalcPoints.Add(new Data.Geometry.Point2D(kernelPoint.X, kernelPoint.Z));
}
dictHeadLines.Add(kernelWaternet.PhreaticLine, damPhreaticLine);
Waternet.PhreaticLine = damPhreaticLine;
// Head Lines
foreach (var kernelHeadLine in kernelWaternet.HeadLineList)
{
var damHeadLine = new HeadLine()
{
Name = kernelHeadLine.Name
};
foreach (var kernelPoint in kernelHeadLine.CalcPoints)
{
damHeadLine.CalcPoints.Add(new Data.Geometry.Point2D(kernelPoint.X, kernelPoint.Z));
}
Waternet.HeadLineList.Add(damHeadLine);
dictHeadLines.Add(kernelHeadLine, damHeadLine);
}
// Waternet Lines
foreach (var kernelWaternetLine in kernelWaternet.WaternetLineList)
{
var damWaternetLine = new WaternetLine()
{
Name = kernelWaternetLine.Name
};
foreach (var kernelPoint in kernelWaternetLine.CalcPoints)
{
damWaternetLine.CalcPoints.Add(new Data.Geometry.Point2D(kernelPoint.X, kernelPoint.Z));
}
damWaternetLine.HeadLine = dictHeadLines[kernelWaternetLine.HeadLine];
Waternet.WaternetLineList.Add(damWaternetLine);
}
}
private void TransferSurfaceLine(MacroStability.Geometry.SurfaceLine2 kernelSurfaceLine2)
{
SurfaceLine2 = new SurfaceLine2();
foreach (var kernelCharPoint in kernelSurfaceLine2.CharacteristicPoints)
{
CharacteristicPoint damCharPoint;
damCharPoint = new CharacteristicPoint()
{
CharacteristicPointType = ConversionHelper.ConvertToDamCharacteristicPointType(kernelCharPoint.CharacteristicPointType),
GeometryPoint = new GeometryPoint()
{
X = kernelCharPoint.X,
Z = kernelCharPoint.Z
}
};
SurfaceLine2.CharacteristicPoints.Add(damCharPoint);
}
}
private void TransferSoils(IList stabilityModelSoils)
{
SoilList = new SoilList();
foreach (Soil kernelSoil in stabilityModelSoils)
{
var damSoil = ConversionHelper.ConvertToDamSoil(kernelSoil);
dictSoils.Add(kernelSoil.Name, damSoil);
SoilList.Add(damSoil);
}
}
private void TransferWtiStabilityModel(StabilityModel kernelModelStabilityModel)
{
FailureMechanismParametersMStab = new FailureMechanismParametersMStab();
// kernelModelStabilityModel.MoveGrid is not in DamEngine datamodel
// kernelModelStabilityModel.MaximumSliceWidth is not in DamEngine datamodel
FailureMechanismParametersMStab.MStabParameters.SearchMethod =
ConversionHelper.ConvertToDamSearchMethod(kernelModelStabilityModel.SearchAlgorithm);
FailureMechanismParametersMStab.MStabParameters.Model =
ConversionHelper.ConvertToMStabModelType(kernelModelStabilityModel.ModelOption);
FailureMechanismParametersMStab.MStabParameters.GridPosition =
ConversionHelper.ConvertToMStabGridPosition(kernelModelStabilityModel.GridOrientation);
}
private void TransferSoilProfile2D(MacroStability.Geometry.SoilProfile2D kernelsoilProfile2D)
{
SoilProfile2D = new SoilProfile2D();
Dictionary dictPoints = new Dictionary();
Dictionary dictCurves = new Dictionary();
Dictionary dictLoops = new Dictionary();
Dictionary dictSurfaces = new Dictionary();
// Add points
foreach (var kernelPoint in kernelsoilProfile2D.Geometry.Points)
{
Data.Geometry.Point2D damPoint;
if (dictPoints.ContainsKey(kernelPoint))
{
damPoint = dictPoints[kernelPoint];
}
else
{
damPoint = new Data.Geometry.Point2D() { X = kernelPoint.X, Z = kernelPoint.Z };
dictPoints.Add(kernelPoint, damPoint);
}
SoilProfile2D.Geometry.Points.Add(damPoint);
}
// Add curves
foreach (var kernelCurve in kernelsoilProfile2D.Geometry.Curves)
{
Data.Geometry.GeometryCurve damCurve;
if (dictCurves.ContainsKey(kernelCurve))
{
damCurve = dictCurves[kernelCurve];
}
else
{
var kernelHeadPoint = kernelCurve.HeadPoint;
var kernelEndPoint = kernelCurve.EndPoint;
var damHeadPoint = dictPoints[kernelHeadPoint];
var damEndPoint = dictPoints[kernelEndPoint];
damCurve = new Data.Geometry.GeometryCurve() { HeadPoint = damHeadPoint, EndPoint = damEndPoint };
dictCurves.Add(kernelCurve, damCurve);
}
SoilProfile2D.Geometry.Curves.Add(damCurve);
}
// Add loops
foreach (var kernelLoop in kernelsoilProfile2D.Geometry.Loops)
{
Data.Geometry.GeometryLoop damLoop;
if (dictLoops.ContainsKey(kernelLoop))
{
damLoop = dictLoops[kernelLoop];
}
else
{
damLoop = new Data.Geometry.GeometryLoop() { Name = kernelLoop.Name };
foreach (var damCurve in kernelLoop.CurveList)
{
damLoop.CurveList.Add(dictCurves[damCurve]);
}
dictLoops.Add(kernelLoop, damLoop);
}
SoilProfile2D.Geometry.Loops.Add(damLoop);
}
// Add surfaces
foreach (var kernelSurface in kernelsoilProfile2D.Geometry.Surfaces)
{
Data.Geometry.GeometrySurface damSurface;
if (dictSurfaces.ContainsKey(kernelSurface))
{
damSurface = dictSurfaces[kernelSurface];
}
else
{
damSurface = new Data.Geometry.GeometrySurface() { Name = kernelSurface.Name };
damSurface.OuterLoop = dictLoops[kernelSurface.OuterLoop];
foreach (var damInnerLoop in kernelSurface.InnerLoops)
{
damSurface.InnerLoops.Add(dictLoops[damInnerLoop]);
}
dictSurfaces.Add(kernelSurface, damSurface);
}
SoilProfile2D.Geometry.Surfaces.Add(damSurface);
}
// Add soil surfaces
foreach (var kernelSoilLayer2D in kernelsoilProfile2D.Surfaces)
{
SoilLayer2D damSoilLayer2D = new SoilLayer2D();
damSoilLayer2D.GeometrySurface = dictSurfaces[kernelSoilLayer2D.GeometrySurface];
damSoilLayer2D.Soil = dictSoils[kernelSoilLayer2D.Soil.Name];
damSoilLayer2D.IsAquifer = kernelSoilLayer2D.IsAquifer;
damSoilLayer2D.WaterpressureInterpolationModel = ConversionHelper.ConvertToDamWaterpressureInterpolationModel(kernelSoilLayer2D.WaterpressureInterpolationModel);
SoilProfile2D.Surfaces.Add(damSoilLayer2D);
}
}
}
}