// 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.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 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 GeometrySurface = Deltares.MacroStability.Geometry.GeometrySurface;
using Point2D = Deltares.MacroStability.Geometry.Point2D;
using SurfaceLine2 = Deltares.DamEngine.Data.Geotechnics.SurfaceLine2;
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 Data.Geotechnics.SoilProfile2D SoilProfile2D { get; set; }
/// Gets or sets the SurfaceLine2 DamEngine object.
/// The surface line2.
public Data.Geotechnics.SurfaceLine2 SurfaceLine2 { 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();
/// Creates the dam project data from the kernel model.
/// The kernel model.
/// The DamProjectData object filled with Wti data
public void FillDamProjectDataFromKernelModel(KernelModel kernelModel)
{
SoilList = new SoilList();
Location = new Location();
SoilProfile2D = new Data.Geotechnics.SoilProfile2D();
SurfaceLine2 = new Data.Geotechnics.SurfaceLine2();
FailureMechanismParametersMStab = new FailureMechanismParametersMStab();
TransferWtiStabilityModel(kernelModel.StabilityModel, FailureMechanismParametersMStab);
TransferSoils(kernelModel.StabilityModel.Soils);
TransferSoilProfile2D(kernelModel.StabilityModel.SoilProfile);
TransferSurfaceLine(kernelModel.PreprocessingModel.LastStage.SurfaceLine, SurfaceLine2);
// TransferLocation(kernelModel, Location);
// TransferSurfaceLine2(kernelModel, SurfaceLine2);
// TransferParametersMStab(kernelModel, FailureMechanismParametersMStab);
}
private void TransferSurfaceLine(MacroStability.Geometry.SurfaceLine2 kernelSurfaceLine2, SurfaceLine2 damSurfaceLine)
{
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
}
};
damSurfaceLine.CharacteristicPoints.Add(damCharPoint);
}
}
private void TransferSoils(IList stabilityModelSoils)
{
foreach (Soil kernelSoil in stabilityModelSoils)
{
var damSoil = ConversionHelper.ConvertToDamSoil(kernelSoil);
dictSoils.Add(kernelSoil.Name, damSoil);
SoilList.Add(damSoil);
}
}
private void TransferWtiStabilityModel(StabilityModel kernelModelStabilityModel, FailureMechanismParametersMStab 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 TransferParametersMStab(KernelModel kernelModel, FailureMechanismParametersMStab failureMechanismParametersMStab)
{
throw new System.NotImplementedException();
}
private void TransferSurfaceLine2()
{
throw new System.NotImplementedException();
}
private void TransferSoilProfile2D(MacroStability.Geometry.SoilProfile2D kernelsoilProfile2D)
{
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);
}
}
private void TransferLocation(KernelModel kernelModel, Location location)
{
throw new System.NotImplementedException();
}
}
}