// Copyright (C) Stichting Deltares 2017. 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 Deltares.DamEngine.Data.General;
using Deltares.DamEngine.Io.XmlInput;
using Input = Deltares.DamEngine.Io.XmlInput.Input;
namespace Deltares.DamEngine.Interface
{
public class FillXmlInputFromDam
{
///
/// Creates the input from Dam data.
///
/// The dam project data.
///
public static Input CreateInput(DamProjectData damProjectData)
{
Input input = new Input();
input.DamProjectType = ConversionHelper.ConvertToInputDamProjectType(damProjectData.DamProjectType);
Dike dike = damProjectData.Dike;
TransferLocations(dike, input);
TransferSurfaceLines(dike, input);
TransferSoils(dike, input);
return input;
}
private static void TransferSoils(Dike dike, Input input)
{
var soils = dike.SoilList.Soils;
input.Soils = new Soil[soils.Count];
for (int i = 0; i < soils.Count; i++)
{
var soil = dike.SoilList.Soils[i];
var inputSoil = new Soil();
inputSoil.Name = soil.Name;
inputSoil.BeddingAngleSpecified = !Double.IsNaN(soil.BeddingAngle);
inputSoil.BeddingAngle = soil.BeddingAngle;
inputSoil.DiameterD70Specified = !Double.IsNaN(soil.DiameterD70);
inputSoil.DiameterD70 = soil.DiameterD70;
inputSoil.DiameterD90Specified = !Double.IsNaN(soil.DiameterD70);
inputSoil.DiameterD90 = soil.DiameterD90;
inputSoil.PermeabKxSpecified = !Double.IsNaN(soil.DiameterD90);
inputSoil.PermeabKx = soil.PermeabKx;
inputSoil.WhitesConstantSpecified = !Double.IsNaN(soil.WhitesConstant);
inputSoil.WhitesConstant = soil.WhitesConstant;
input.Soils[i] = inputSoil;
}
}
private static void TransferSurfaceLines(Dike dike, Input input)
{
input.SurfaceLines = new SurfaceLine[dike.SurfaceLines2.Count];
for (int i = 0; i < dike.SurfaceLines2.Count; i++)
{
var surfaceLine = dike.SurfaceLines2[i];
var inputSurfaceLine = new SurfaceLine();
inputSurfaceLine.Name = surfaceLine.Name;
inputSurfaceLine.Points = new SurfaceLinePoint[surfaceLine.CharacteristicPoints.Count];
for (int j = 0; j < surfaceLine.CharacteristicPoints.Count; j++)
{
var characteristicPoint = surfaceLine.CharacteristicPoints[j];
var inputPoint = new SurfaceLinePoint()
{
PointType = ConversionHelper.ConvertToInputPointType(characteristicPoint.CharacteristicPointType),
X = characteristicPoint.X,
Z = characteristicPoint.Z
};
inputSurfaceLine.Points[j] = inputPoint;
}
input.SurfaceLines[i] = inputSurfaceLine;
}
}
private static void TransferLocations(Dike dike, Input input)
{
int locationCount = dike.Locations.Count;
input.Locations = new Io.XmlInput.Location[locationCount];
for (int i = 0; i < locationCount; i++)
{
var location = dike.Locations[i];
var inputLocation = new Io.XmlInput.Location();
var waternetOptions = new LocationWaternetOptions();
inputLocation.SurfaceLineName = location.SurfaceLine2.Name;
waternetOptions.PhreaticLineCreationMethod = ConversionHelper.ConvertToInputPhreaticLineCreationMethod(location.ModelParametersForPLLines.PLLineCreationMethod);
waternetOptions.IntrusionVerticalWaterPressure = ConversionHelper.ConvertToInputIntrusionVerticalWaterPressure(location.IntrusionVerticalWaterPressure ?? IntrusionVerticalWaterPressureType.Standard);
waternetOptions.PolderLevel = location.PolderLevel;
waternetOptions.DampingFactorPL3 = location.ModelParametersForPLLines.DampingFactorPL4;
waternetOptions.DampingFactorPL4 = location.ModelParametersForPLLines.DampingFactorPL3;
waternetOptions.PenetrationLength = location.ModelParametersForPLLines.PenetrationLength;
waternetOptions.Pl1BelowCrestMiddleSpecified = location.PlLineOffsetBelowDikeCrestMiddle.HasValue;
waternetOptions.Pl1BelowCrestMiddle = location.PlLineOffsetBelowDikeCrestMiddle ?? 0.0;
waternetOptions.Pl1FactorBelowShoulderCrestSpecified = location.UsePlLineOffsetFactorBelowShoulderCrest ?? false;
waternetOptions.Pl1FactorBelowShoulderCrest = location.PlLineOffsetFactorBelowShoulderCrest ?? 0.0;
waternetOptions.DryPl1BelowCrestMiddleSpecified = location.PlLineOffsetDryBelowDikeCrestMiddle.HasValue;
waternetOptions.DryPl1BelowCrestMiddle = location.PlLineOffsetDryBelowDikeCrestMiddle ?? 0.0;
waternetOptions.DryPl1FactorBelowShoulderCrestSpecified = location.UsePlLineOffsetDryFactorBelowShoulderCrest ?? false;
waternetOptions.DryPl1FactorBelowShoulderCrest = location.PlLineOffsetDryFactorBelowShoulderCrest ?? 0.0;
waternetOptions.HeadPl2Specified = location.HeadPl2.HasValue;
waternetOptions.HeadPl2 = location.HeadPl2 ?? 0.0;
waternetOptions.HeadPl3Specified = location.HeadPl3.HasValue;
waternetOptions.HeadPl3 = location.HeadPl3 ?? 0.0;
waternetOptions.HeadPl4Specified = location.HeadPl4.HasValue;
waternetOptions.HeadPl4 = location.HeadPl4 ?? 0.0;
waternetOptions.SlopeDampingFactor = location.SlopeDampingPiezometricHeightPolderSide;
waternetOptions.Pl1BelowCrestRiverside = location.PlLineOffsetBelowDikeTopAtRiver;
waternetOptions.Pl1BelowCrestPolderside = location.PlLineOffsetBelowDikeTopAtPolder;
waternetOptions.Pl1BelowShoulderCrestPolderside = location.PlLineOffsetBelowShoulderBaseInside;
waternetOptions.Pl1BelowToeDikePolderside = location.PlLineOffsetBelowDikeToeAtPolder;
inputLocation.WaternetOptions = waternetOptions;
input.Locations[i] = inputLocation;
}
}
}
}