// 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 System.Globalization;
using System.IO;
using System.Reflection;
using System.Xml;
using System.Xml.Schema;
using Deltares.MacroStability.Data;
using Deltares.MacroStability.Geometry;
using Deltares.MacroStability.Kernel;
using Deltares.MacroStability.Preprocessing;
using Deltares.MacroStability.Standard;
using Deltares.MacroStability.WaternetCreator;
using Deltares.SearchAlgorithms;
using Deltares.SoilStress.Data;
using Deltares.WTIStability.Data;
namespace Deltares.DamEngine.Calculators.KernelWrappers.MacroStabilityCommon.MacroStabilityIo
{
///
/// WTI xml format deserializer class
///
public class WtiDeserializer
{
///
/// Deserializes the specified XML.
///
/// The XML.
/// The stability model.
public static KernelModel Deserialize(string xml)
{
XmlDocument document = new XmlDocument();
document.LoadXml(xml);
document.Schemas.Add(GetSchema("Deltares.DamEngine.Calculators.KernelWrappers.MacroStabilityCommon.MacroStabilityIo.WtiVersionInfo.xsd", false));
document.Schemas.Add(GetSchema("Deltares.DamEngine.Calculators.KernelWrappers.MacroStabilityCommon.MacroStabilityIo.WTIGeometry.xsd", false));
document.Schemas.Add(GetSchema("Deltares.DamEngine.Calculators.KernelWrappers.MacroStabilityCommon.MacroStabilityIo.WTIWaternetDefinition.xsd", false));
document.Schemas.Add(GetSchema("Deltares.DamEngine.Calculators.KernelWrappers.MacroStabilityCommon.MacroStabilityIo.WTIWaternet.xsd", false));
document.Schemas.Add(GetSchema("Deltares.DamEngine.Calculators.KernelWrappers.MacroStabilityCommon.MacroStabilityIo.WTISoilModel.xsd", false));
document.Schemas.Add(GetSchema("Deltares.DamEngine.Calculators.KernelWrappers.MacroStabilityCommon.MacroStabilityIo.WTIStabilityModel.xsd", true));
// the following call to Validate succeeds.
document.Validate(ValidationEventHandler);
// if survived here, the xml is all right
string name = "WTIStabilityModel";
KernelModel kernelModel = new KernelModel();
ReadStabilityModel(GetElement(document, name), kernelModel, new Dictionary());
return kernelModel;
}
///
/// Deserializes the result.
///
/// The XML.
/// The deserialized calculation results.
public static StabilityAssessmentCalculationResult DeserializeResult(string xml)
{
XmlDocument document = new XmlDocument();
document.LoadXml(xml);
document.Schemas.Add(GetSchema("Deltares.WTIStability.IO.WTIWaternetDefinition.xsd", false));
document.Schemas.Add(GetSchema("Deltares.WTIStability.IO.WTIWaternet.xsd", false));
document.Schemas.Add(GetSchema("Deltares.WTIStability.IO.WTIStabilityModelResult.xsd", true));
// the following call to Validate succeeds.
document.Validate(ValidationEventHandler);
// if survived here, the xml is all right
string name = "WTIStabilityModelResult";
StabilityAssessmentCalculationResult result = new StabilityAssessmentCalculationResult();
ReadStabilityModelResult(GetElement(document, name), result);
return result;
}
///
/// Deserializes the results of a calculation from the xml string.
///
/// The XML.
/// The results of the calculation
public static ValidationResult[] DeserializeValidation(string xml)
{
XmlDocument document = new XmlDocument();
document.LoadXml(xml);
document.Schemas.Add(GetSchema("Deltares.DamEngine.Calculators.KernelWrappers.MacroStabilityCommon.MacroStabilityIo.WTIStabilityModelValidation.xsd", false));
// xsd validation
document.Validate(ValidationEventHandler);
string name = "WTIStabilityModelValidation";
var result = new List();
ReadValidationResult(GetElement(document, name), result);
return result.ToArray();
}
///
/// Deserializes a waternet.
///
/// The waternet in XML format.
/// if set to true [get waternet daily].
///
/// The waternet.
///
public static Waternet DeserializeWaternetUsedDuringCalculation(string xml, bool getDaily)
{
var document = new XmlDocument();
document.LoadXml(xml);
document.Schemas.Add(GetSchema("Deltares.WTIStability.IO.WTIWaternet.xsd", false));
document.Schemas.Add(GetSchema("Deltares.WTIStability.IO.WTIWaternetUsedDuringCalculation.xsd", false));
// the following call to Validate succeeds.
document.Validate(ValidationEventHandler);
// if survived here, the xml is all right
const string name = "WTIWaternetUsedDuringCalculation";
var waternet = new Waternet();
var location = new Location();
if (getDaily)
{
waternet.Name = "WaternetDaily";
}
ReadWaternets(GetElement(GetElement(document, name), "Waternets"), ref waternet, location, getDaily,
new Dictionary());
return waternet;
}
///
/// Deserializes the validation messages displayed during the creation of the waternet.
///
/// The waternet with validation messages in XML format.
/// The validation messages.
public static List DeserializeValidationMessagesForWaternet(string xml)
{
XmlDocument document = new XmlDocument();
document.LoadXml(xml);
document.Schemas.Add(GetSchema("Deltares.WTIStability.IO.WTIWaternet.xsd", false));
document.Schemas.Add(GetSchema("Deltares.WTIStability.IO.WTIWaternetUsedDuringCalculation.xsd", false));
// the following call to Validate succeeds.
document.Validate(ValidationEventHandler);
// if survived here, the xml is all right
string name = "WTIWaternetUsedDuringCalculation";
var validationMessages = new List();
ReadValidationResult(GetElement(document, name), validationMessages);
return validationMessages;
}
private static XmlSchema GetSchema(string path, bool validate)
{
Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(path);
if (stream != null)
{
if (validate)
{
return XmlSchema.Read(stream, ValidationEventHandler);
}
else
{
return XmlSchema.Read(stream, null);
}
}
return null;
}
private static void ValidationEventHandler(object sender, ValidationEventArgs e)
{
throw new XmlSchemaValidationException(e.Message);
}
private static XmlElement GetElement(XmlNode parent, string name)
{
foreach (var xmlNode in parent.ChildNodes)
{
XmlElement element = xmlNode as XmlElement;
if (element != null)
{
if (element.Name == name)
{
return element;
}
}
}
return null;
}
private static IEnumerable GetElements(XmlElement parent, string name)
{
List elements = new List();
foreach (XmlElement element in parent.ChildNodes)
{
if (element.Name == name)
{
elements.Add(element);
}
}
return elements;
}
private static void ReadStabilityModel(XmlElement element, KernelModel kernelModel, Dictionary keys)
{
StabilityModel model = kernelModel.StabilityModel;
PreprocessingModel automationModel = kernelModel.PreprocessingModel;
if (element.GetAttribute("SearchAlgorithm") == "GeneticAndLevenbergMarquardt")
{
model.SearchAlgorithm = SearchAlgorithm.Genetic;
model.FinalizeWithLevenbergMarquardt = true;
}
else
{
model.SearchAlgorithm = (SearchAlgorithm)Enum.Parse(typeof(SearchAlgorithm), element.GetAttribute("SearchAlgorithm"));
model.FinalizeWithLevenbergMarquardt = false;
}
model.ModelOption = (ModelOptions)Enum.Parse(typeof(ModelOptions), element.GetAttribute("ModelOption"));
if (model.SearchAlgorithm == SearchAlgorithm.Grid && model.ModelOption == ModelOptions.Spencer)
{
model.SearchAlgorithm = SearchAlgorithm.Genetic;
}
model.GridOrientation = (GridOrientation)Enum.Parse(typeof(GridOrientation), element.GetAttribute("Orientation"));
model.FileVersionAsRead = ReadVersionInfo(GetElement(element, "VersionInfo"));
List soilStresses = model.LastStage.SoilStresses;
ReadSoilModel(GetElement(element, "SoilModel"), model.SoilModel, soilStresses, keys);
ReadSoilProfile(GetElement(element, "SoilProfile"), model.SoilProfile, keys);
ReadSurfaceLine(GetElement(element, "SurfaceLine"), automationModel.LastStage.SurfaceLine, keys);
Location loc = new Location();
ReadLocation(GetElement(element, "Location"), ref loc);
automationModel.LastStage.Locations.Add(loc);
if (GetElement(element, "LocationDaily") != null)
{
PreprocessingConstructionStage preDailyStage = new PreprocessingConstructionStage();
automationModel.ConstructionStages.Insert(0, preDailyStage);
ConstructionStage dailyStage = new ConstructionStage();
model.ConstructionStages.Insert(0, dailyStage);
Location locDaily = new Location();
ReadLocation(GetElement(element, "LocationDaily"), ref locDaily);
preDailyStage.Locations.Add(locDaily);
}
var currentWaternet = model.GeotechnicsData.CurrentWaternet;
ReadWaternets(GetElement(element, "Waternets"), ref currentWaternet, automationModel.LastStage.Locations[0], false, keys);
model.GeotechnicsData.CurrentWaternet = currentWaternet;
loc.Waternet = currentWaternet;
loc.Surfaceline = automationModel.LastStage.SurfaceLine;
if (automationModel.ConstructionStages.Count == 2) // daily waternet available
{
ConstructionStage dailyStage = model.ConstructionStages[0];
var currentWaternetDaily = dailyStage.GeotechnicsData.CurrentWaternet;
ReadWaternets(GetElement(element, "Waternets"), ref currentWaternetDaily, automationModel.ConstructionStages[0].Locations[0], true, keys);
currentWaternetDaily.Name = "WaternetDaily";
model.ConstructionStages[0].GeotechnicsData.CurrentWaternet = currentWaternetDaily;
automationModel.ConstructionStages[0].Locations[0].Waternet = currentWaternetDaily;
automationModel.ConstructionStages[0].SurfaceLine = automationModel.LastStage.SurfaceLine; // copy ref surface line
automationModel.ConstructionStages[0].Locations[0].Surfaceline = automationModel.LastStage.SurfaceLine;
}
Dictionary isTemporary = new Dictionary();
ReadUniformLoads(GetElement(element, "UniformLoads"), model.LastStage.UniformLoads, model.LastStage.InvalidUniformLoads, keys, isTemporary);
ReadPreconsolidationStresses(GetElement(element, "PreconsolidationStresses"), model, keys);
ReadConsolidationValues(GetElement(element, "ConsolidationValues"), model, keys, isTemporary);
ReadMultiplicationFactorsCPhiForUplift(GetElement(element, "MultiplicationFactorsCPhiForUplift"), model.LastStage.MultiplicationFactorsCPhiForUpliftList);
ReadSpencerSlipPlanes(GetElement(element, "SpencerSlipPlanes"), model, automationModel, keys);
ReadUpliftVanCalculationGrid(GetElement(element, "UpliftVanCalculationGrid"), model, kernelModel.PreprocessingModel);
ReadSlipPlaneConstraints(GetElement(element, "SlipPlaneConstraints"), model, kernelModel.PreprocessingModel);
ReadGeneticAlgorithmOptions(GetElement(element, "GeneticAlgorithmOptions"), model.GeneticAlgorithmOptions);
ReadLevenbergMarquardtOptions(GetElement(element, "LevenbergMarquardtOptions"), model.LevenbergMarquardtOptions);
model.MoveGrid = Boolean.Parse(element.GetAttribute("MoveGrid"));
model.SlipCircle.SlipCircleTangentLine.MoveTangentLines = model.MoveGrid;
model.MaximumSliceWidth = Double.Parse(element.GetAttribute("MaximumSliceWidth"), CultureInfo.InvariantCulture);
// Clone data if daily stage is added
if (model.ConstructionStages.Count > 1)
{
ConstructionStage dailyStage = model.ConstructionStages[0];
dailyStage.SoilProfile = kernelModel.StabilityModel.LastStage.SoilProfile;
// only use preconsolidation stresses in the daily stage
dailyStage.PreconsolidationStresses.AddRange(kernelModel.StabilityModel.LastStage.PreconsolidationStresses);
kernelModel.StabilityModel.LastStage.PreconsolidationStresses.Clear(); // stress points only applicable to daily stage
dailyStage.SoilStresses.AddRange(soilStresses);
kernelModel.StabilityModel.LastStage.SoilStresses.Clear();
dailyStage.UniformLoads.AddRange(kernelModel.StabilityModel.LastStage.UniformLoads);
dailyStage.ConsolidationMatrix = kernelModel.StabilityModel.LastStage.ConsolidationMatrix;
PreprocessingConstructionStage preDailyStage = automationModel.ConstructionStages[0];
preDailyStage.SurfaceLine = automationModel.LastStage.SurfaceLine;
}
}
private static int ReadVersionInfo(XmlElement element)
{
var fileVersion = 0;
if (element != null)
{
fileVersion = int.Parse(element.GetAttribute("FileVersion"), CultureInfo.InvariantCulture);
}
return fileVersion;
}
private static void ReadLevenbergMarquardtOptions(XmlElement element, LevenbergMarquardtOptions options)
{
options.IterationCount = Int32.Parse(element.GetAttribute("IterationCount"), CultureInfo.InvariantCulture);
options.Shift = Double.Parse(element.GetAttribute("Shift"), CultureInfo.InvariantCulture);
options.DriftGrant = Double.Parse(element.GetAttribute("DriftGrant"), CultureInfo.InvariantCulture);
options.ParameterCount = Int32.Parse(element.GetAttribute("ParameterCount"), CultureInfo.InvariantCulture);
options.VariableCount = Int32.Parse(element.GetAttribute("VariableCount"), CultureInfo.InvariantCulture);
}
private static void ReadGeneticAlgorithmOptions(XmlElement element, GeneticAlgorithmOptions options)
{
options.EliteCount = Int32.Parse(element.GetAttribute("EliteCount"), CultureInfo.InvariantCulture);
options.PopulationCount = Int32.Parse(element.GetAttribute("PopulationCount"), CultureInfo.InvariantCulture);
options.GenerationCount = Int32.Parse(element.GetAttribute("GenerationCount"), CultureInfo.InvariantCulture);
options.MutationRate = Double.Parse(element.GetAttribute("MutationRate"), CultureInfo.InvariantCulture);
options.CrossOverScatterFraction = Double.Parse(element.GetAttribute("CrossOverScatterFraction"), CultureInfo.InvariantCulture);
options.CrossOverSinglePointFraction = Double.Parse(element.GetAttribute("CrossOverSinglePointFraction"), CultureInfo.InvariantCulture);
options.CrossOverDoublePointFraction = Double.Parse(element.GetAttribute("CrossOverDoublePointFraction"), CultureInfo.InvariantCulture);
options.MutationJumpFraction = Double.Parse(element.GetAttribute("MutationJumpFraction"), CultureInfo.InvariantCulture);
options.MutationCreepFraction = Double.Parse(element.GetAttribute("MutationCreepFraction"), CultureInfo.InvariantCulture);
options.MutationInverseFraction = Double.Parse(element.GetAttribute("MutationInverseFraction"), CultureInfo.InvariantCulture);
options.MutationCreepReduction = Double.Parse(element.GetAttribute("MutationCreepReduction"), CultureInfo.InvariantCulture);
options.Seed = Int32.Parse(element.GetAttribute("Seed"), CultureInfo.InvariantCulture);
}
private static void ReadSlipPlaneConstraints(XmlElement element, StabilityModel model, PreprocessingModel preprocessing)
{
SlipPlaneConstraints constraints = model.SlipPlaneConstraints;
constraints.SlipPlaneMinDepth = Double.Parse(element.GetAttribute("SlipPlaneMinDepth"), CultureInfo.InvariantCulture);
constraints.SlipPlaneMinLength = Double.Parse(element.GetAttribute("SlipPlaneMinLength"), CultureInfo.InvariantCulture);
preprocessing.SearchAreaConditions.AutomaticForbiddenZones = Boolean.Parse(element.GetAttribute("AutomaticForbiddenZones")) && Boolean.Parse(element.GetAttribute("CreateZones"));
constraints.XLeftMin = Double.Parse(element.GetAttribute("XEntryMin"), CultureInfo.InvariantCulture);
constraints.XLeftMax = Double.Parse(element.GetAttribute("XEntryMax"), CultureInfo.InvariantCulture);
model.MaxAllowedAngleBetweenSlices = Double.Parse(element.GetAttribute("MaxAllowedAngleBetweenSlices"), CultureInfo.InvariantCulture);
model.RequiredForcePointsInSlices = Double.Parse(element.GetAttribute("RequiredForcePointsInSlices"), CultureInfo.InvariantCulture);
}
private static void ReadForbiddenZones(XmlElement element, StabilityAssessmentCalculationResult result)
{
result.AreForbiddenZonesAuto = Boolean.Parse(element.GetAttribute("AutomaticallyCalculated"));
result.XMinEntry = Double.Parse(element.GetAttribute("XEntryMin"), CultureInfo.InvariantCulture);
result.XMaxEntry = Double.Parse(element.GetAttribute("XEntryMax"), CultureInfo.InvariantCulture);
}
private static void ReadUpliftVanCalculationGrid(XmlElement element, StabilityModel model, PreprocessingModel preprocessing)
{
SlipPlaneUpliftVan slipPlane = model.SlipPlaneUpliftVan;
ReadCalculationGrid(GetElement(element, "LeftGrid"), slipPlane.SlipPlaneLeftGrid);
ReadCalculationGrid(GetElement(element, "RightGrid"), slipPlane.SlipPlaneRightGrid);
XmlElement tangentElement = GetElement(element, "TangentLines");
slipPlane.SlipCircleTangentLine.TangentLineZTop = Double.Parse(tangentElement.GetAttribute("TangentLineZTop"), CultureInfo.InvariantCulture);
slipPlane.SlipCircleTangentLine.TangentLineZBottom = Double.Parse(tangentElement.GetAttribute("TangentLineZBottom"), CultureInfo.InvariantCulture);
slipPlane.SlipCircleTangentLine.TangentLineNumber = Int32.Parse(tangentElement.GetAttribute("TangentLineNumber"), CultureInfo.InvariantCulture);
slipPlane.SlipCircleTangentLine.SearchValuesType = Boolean.Parse(tangentElement.GetAttribute("AutomaticAtBoundaries")) ? SearchValuesType.Enumerated : SearchValuesType.Interval;
if (model.ModelOption == ModelOptions.Bishop)
{
preprocessing.SearchAreaConditions.AutoSearchArea = Boolean.Parse(element.GetAttribute("Auto"));
preprocessing.SearchAreaConditions.AutoTangentLines = Boolean.Parse(tangentElement.GetAttribute("AutomaticAtBoundaries"));
}
else if (model.ModelOption == ModelOptions.UpliftVan)
{
preprocessing.SearchAreaConditions.AutoSearchArea = Boolean.Parse(element.GetAttribute("Auto"));
preprocessing.SearchAreaConditions.AutoTangentLines = preprocessing.SearchAreaConditions.AutoSearchArea || Boolean.Parse(tangentElement.GetAttribute("AutomaticAtBoundaries"));
}
}
private static void ReadUsedUpliftVanCalculationGrid(XmlElement element, StabilityAssessmentCalculationResult result)
{
result.IsGridAuto = Boolean.Parse(element.GetAttribute("AutomaticallyCalculated"));
ReadCalculationGrid(GetElement(element, "LeftGrid"), result.SlipPlaneUpliftVan.SlipPlaneLeftGrid);
ReadCalculationGrid(GetElement(element, "RightGrid"), result.SlipPlaneUpliftVan.SlipPlaneRightGrid);
XmlElement tangentElement = GetElement(element, "TangentLines");
foreach (XmlElement tangentLineElement in GetElements(tangentElement, "TangentLine"))
{
TangentLine tangentLine = new TangentLine
{
Height = Double.Parse(tangentLineElement.GetAttribute("Level"), CultureInfo.InvariantCulture)
};
result.SlipPlaneUpliftVan.SlipPlaneTangentLine.BoundaryHeights.Add(tangentLine);
}
}
private static void ReadCalculationGrid(XmlElement element, SlipCircleGrid grid)
{
grid.GridXLeft = Double.Parse(element.GetAttribute("GridXLeft"), CultureInfo.InvariantCulture);
grid.GridXRight = Double.Parse(element.GetAttribute("GridXRight"), CultureInfo.InvariantCulture);
grid.GridZTop = Double.Parse(element.GetAttribute("GridZTop"), CultureInfo.InvariantCulture);
grid.GridZBottom = Double.Parse(element.GetAttribute("GridZBottom"), CultureInfo.InvariantCulture);
grid.GridXNumber = Int32.Parse(element.GetAttribute("GridXNumber"), CultureInfo.InvariantCulture);
grid.GridZNumber = Int32.Parse(element.GetAttribute("GridZNumber"), CultureInfo.InvariantCulture);
}
private static void ReadSpencerSlipPlanes(XmlElement element, StabilityModel model, PreprocessingModel preprocessing, Dictionary keys)
{
model.SlipPlanes.Clear();
XmlElement upperElement = GetElement(element, "UpperSlipPlane");
foreach (XmlElement pointElement in GetElements(upperElement, "Point"))
{
if (model.SlipPlanes.Count < 1)
{
model.SlipPlanes.Add(new SlipPlane());
}
model.SlipPlanes[0].Points.Add(ReadPoint(pointElement, keys, model.SlipPlanes[0]));
model.SlipPlanes[0].SyncCalcPoints();
}
XmlElement lowerElement = GetElement(element, "LowerSlipPlane");
foreach (XmlElement pointElement in GetElements(lowerElement, "Point"))
{
if (model.SlipPlanes.Count < 2)
{
model.SlipPlanes.Add(new SlipPlane());
}
model.SlipPlanes[1].Points.Add(ReadPoint(pointElement, keys, model.SlipPlanes[1]));
model.SlipPlanes[1].SyncCalcPoints();
}
if (model.ModelOption == ModelOptions.Spencer)
{
preprocessing.SearchAreaConditions.AutoSearchArea = Boolean.Parse(element.GetAttribute("Auto"));
}
preprocessing.SearchAreaConditions.SlipPlanePosition = (SlipPlanePosition)Enum.Parse(typeof(SlipPlanePosition), element.GetAttribute("SlipPlanePosition"));
}
private static void ReadWaternets(XmlElement element, ref Waternet currentWaternet, Location location, bool getDaily, Dictionary keys)
{
foreach (XmlElement waternet in GetElements(element, "Waternet"))
{
var isDaily = Boolean.Parse(waternet.GetAttribute("IsDaily"));
if (isDaily == getDaily)
{
ReadWaternet(waternet, ref currentWaternet, location, keys);
}
}
}
private static void ReadWaternet(XmlElement element, ref Waternet waternet, Location location, Dictionary keys)
{
// if the location is null (daily can be), do NOT read the waternet (Daily)
if (element != null && location != null)
{
// if the waternet (daily) is not yet there, create it here.
if (waternet == null)
{
waternet = new Waternet
{
Name = "WaternetDaily"
};
}
if (waternet.PhreaticLine == null)
{
waternet.PhreaticLine = new PhreaticLine();
}
ReadWaternetLine(GetElement(element, "PhreaticLine"), waternet.PhreaticLine, keys);
foreach (XmlElement headLineElement in GetElements(GetElement(element, "HeadLines"), "HeadLine"))
{
HeadLine headLine = new HeadLine();
ReadWaternetLine(headLineElement, headLine, keys);
waternet.HeadLineList.Add(headLine);
}
foreach (
XmlElement waternetLineElement in GetElements(GetElement(element, "WaternetLines"), "WaternetLine"))
{
WaternetLine waternetLine = new WaternetLine();
ReadWaternetLine(GetElement(waternetLineElement, "WaternetLine"), waternetLine, keys);
waternetLine.HeadLine =
(GeometryPointString)
keys[
Convert.ToInt32(waternetLineElement.GetAttribute("AssociatedHeadLine"),
CultureInfo.InvariantCulture)];
waternet.WaternetLineList.Add(waternetLine);
}
waternet.UnitWeight = Double.Parse(element.GetAttribute("UnitWeightWater"), CultureInfo.InvariantCulture);
waternet.IsGenerated = Boolean.Parse(element.GetAttribute("IsGenerated"));
location.WaternetCreationMode = waternet.IsGenerated
? WaternetCreationMode.CreateWaternet
: WaternetCreationMode.FillInWaternetValues;
}
}
private static void ReadWaternetLine(XmlElement element, GeometryPointString waternetLine, Dictionary keys)
{
keys[Int32.Parse(element.GetAttribute("Key"), CultureInfo.InvariantCulture)] = waternetLine;
waternetLine.Name = element.GetAttribute("Name");
foreach (XmlElement pointElement in GetElements(GetElement(element, "Points"), "Point"))
{
waternetLine.Points.Add(ReadPoint(pointElement, keys, waternetLine));
}
waternetLine.SyncCalcPoints();
}
private static void ReadMultiplicationFactorsCPhiForUplift(XmlElement element, List list)
{
list.Clear();
foreach (XmlElement factorElement in GetElements(element, "MultiplicationFactorsCPhiForUplift"))
{
MultiplicationFactorOnCPhiForUplift factor = new MultiplicationFactorOnCPhiForUplift
{
UpliftFactor = Double.Parse(factorElement.GetAttribute("UpliftFactor"), CultureInfo.InvariantCulture),
MultiplicationFactor = Double.Parse(factorElement.GetAttribute("MultiplicationFactor"), CultureInfo.InvariantCulture)
};
list.Add(factor);
}
}
private static void ReadConsolidationValues(XmlElement element, StabilityModel model, Dictionary keys, Dictionary isTemporary)
{
UniformLoad consolidationLoad = new UniformLoad();
XmlElement loadElement = GetElement(element, "ConsolidationLoad");
keys[Int32.Parse(loadElement.GetAttribute("Key"), CultureInfo.InvariantCulture)] = consolidationLoad;
foreach (XmlElement consElement in GetElements(element, "ConsolidationValue"))
{
object consolidator = keys[Int32.Parse(consElement.GetAttribute("Consolidator"), CultureInfo.InvariantCulture)];
object consolidated = keys[Int32.Parse(consElement.GetAttribute("Consolidated"), CultureInfo.InvariantCulture)];
if (consolidator == consolidationLoad)
{
foreach (UniformLoad load in model.LastStage.UniformLoads)
{
if (isTemporary[load])
{
ConsolidationValue consolidation = new ConsolidationValue
{
Consolidator = load,
Consolidated = consolidated,
Value = Double.Parse(consElement.GetAttribute("Value"), CultureInfo.InvariantCulture)
};
model.LastStage.XmlConsolidationValues.Add(consolidation);
}
}
}
else
{
ConsolidationValue consolidation = new ConsolidationValue
{
Consolidator = consolidator,
Consolidated = consolidated,
Value = Double.Parse(consElement.GetAttribute("Value"), CultureInfo.InvariantCulture)
};
model.LastStage.XmlConsolidationValues.Add(consolidation);
}
}
}
private static void ReadTrafficLoadConsolidationValues(XmlElement element, DegreeofConsolidationMatrix matrix, Dictionary keys)
{
if (element != null)
{
XmlElement loadElemet = GetElement(element, "ConsolidationLoad");
keys[Int32.Parse(loadElemet.GetAttribute("Key"), CultureInfo.InvariantCulture)] = matrix.Consolidators;
foreach (XmlElement consElement in GetElements(element, "ConsolidationValue"))
{
ConsolidationValue consolidation = new ConsolidationValue
{
Consolidator = keys[Int32.Parse(consElement.GetAttribute("Consolidator"), CultureInfo.InvariantCulture)],
Consolidated = keys[Int32.Parse(consElement.GetAttribute("Consolidated"), CultureInfo.InvariantCulture)],
Value = Double.Parse(consElement.GetAttribute("Value"), CultureInfo.InvariantCulture)
};
matrix.ConsolidationValues.Add(consolidation);
}
}
}
private static void ReadPreconsolidationStresses(XmlElement element, StabilityModel stabilityModel, Dictionary keys)
{
stabilityModel.LastStage.PreconsolidationStresses.Clear();
foreach (XmlElement stressElement in GetElements(element, "PreconsolidationStress"))
{
PreConsolidationStress stress = new PreConsolidationStress();
GeometryPoint point = ReadPoint(GetElement(stressElement, "Point"), keys, stress);
stress.X = point.X;
stress.Z = point.Z;
stress.StressValue = Double.Parse(stressElement.GetAttribute("StressValue"), CultureInfo.InvariantCulture);
stabilityModel.LastStage.PreconsolidationStresses.Add(stress);
}
}
private static void ReadUniformLoads(XmlElement element, List list, List invalidList, Dictionary keys, Dictionary isTemporary)
{
list.Clear();
invalidList.Clear();
foreach (XmlElement uniformLoadElement in GetElements(element, "UniformLoad"))
{
UniformLoad uniformLoad = new UniformLoad
{
Pressure = Double.Parse(uniformLoadElement.GetAttribute("Magnitude"), CultureInfo.InvariantCulture),
DistributionAngle = Double.Parse(uniformLoadElement.GetAttribute("DistributionAngle"), CultureInfo.InvariantCulture),
XEnd = Double.Parse(uniformLoadElement.GetAttribute("XEnd"), CultureInfo.InvariantCulture),
XStart = Double.Parse(uniformLoadElement.GetAttribute("XStart"), CultureInfo.InvariantCulture)
};
if (!uniformLoad.Pressure.AlmostEquals(0) && !(uniformLoad.XEnd - uniformLoad.XStart).AlmostEquals(0))
{
if (isTemporary != null)
{
string loadType = uniformLoadElement.GetAttribute("LoadType");
isTemporary[uniformLoad] = loadType.ToLower().Equals("temporary");
}
int key = Int32.Parse(uniformLoadElement.GetAttribute("Key"), CultureInfo.InvariantCulture);
keys[key] = uniformLoad;
list.Add(uniformLoad);
}
else
{
int key = Int32.Parse(uniformLoadElement.GetAttribute("Key"), CultureInfo.InvariantCulture);
keys[key] = uniformLoad;
invalidList.Add(uniformLoad);
}
}
}
private static void ReadLocation(XmlElement element, ref Location location)
{
// locationdaily is only to be created when the data is part of the file. If it is not, it must remain null in order
// to prevent bogus data.
if (element != null)
{
if (location == null)
{
location = new Location();
}
location.DikeSoilScenario = (DikeSoilScenario)Enum.Parse(typeof(DikeSoilScenario), element.GetAttribute("DikeSoilScenario"));
location.WaterLevelRiver = Double.Parse(element.GetAttribute("WaterLevelRiver"), CultureInfo.InvariantCulture);
location.WaterLevelRiverAverage = Double.Parse(element.GetAttribute("WaterLevelRiverAverage"), CultureInfo.InvariantCulture);
location.WaterLevelRiverLow = Double.Parse(element.GetAttribute("WaterLevelRiverLow"), CultureInfo.InvariantCulture);
location.WaterLevelPolder = Double.Parse(element.GetAttribute("WaterLevelPolder"), CultureInfo.InvariantCulture);
location.DrainageConstructionPresent = Boolean.Parse(element.GetAttribute("DrainageConstructionPresent"));
location.XCoordMiddleDrainageConstruction = Double.Parse(element.GetAttribute("XCoordMiddleDrainageConstruction"), CultureInfo.InvariantCulture);
location.ZCoordMiddleDrainageConstruction = Double.Parse(element.GetAttribute("ZCoordMiddleDrainageConstruction"), CultureInfo.InvariantCulture);
location.MinimumLevelPhreaticLineAtDikeTopRiver = Double.Parse(element.GetAttribute("MinimumLevelPhreaticLineAtDikeTopRiver"), CultureInfo.InvariantCulture);
location.MinimumLevelPhreaticLineAtDikeTopPolder = Double.Parse(element.GetAttribute("MinimumLevelPhreaticLineAtDikeTopPolder"), CultureInfo.InvariantCulture);
location.UseDefaultOffsets = Boolean.Parse(element.GetAttribute("UseDefaultOffsets"));
location.PlLineOffsetBelowPointBRingtoetsWti2017 = Double.Parse(element.GetAttribute("PlLineOffsetBelowPointBRingtoetsWti2017"), CultureInfo.InvariantCulture);
location.PlLineOffsetBelowDikeTopAtPolder = Double.Parse(element.GetAttribute("PlLineOffsetBelowDikeTopAtPolder"), CultureInfo.InvariantCulture);
location.PlLineOffsetBelowShoulderBaseInside = Double.Parse(element.GetAttribute("PlLineOffsetBelowShoulderBaseInside"), CultureInfo.InvariantCulture);
location.PlLineOffsetBelowDikeToeAtPolder = Double.Parse(element.GetAttribute("PlLineOffsetBelowDikeToeAtPolder"), CultureInfo.InvariantCulture);
location.HeadInPlLine2Outwards = Double.Parse(element.GetAttribute("HeadInPLLine2Outwards"), CultureInfo.InvariantCulture);
location.HeadInPlLine2Inwards = Double.Parse(element.GetAttribute("HeadInPLLine2Inwards"), CultureInfo.InvariantCulture);
location.HeadInPlLine3 = Double.Parse(element.GetAttribute("HeadInPLLine3"), CultureInfo.InvariantCulture);
location.HeadInPlLine4 = Double.Parse(element.GetAttribute("HeadInPLLine4"), CultureInfo.InvariantCulture);
location.AdjustPl3And4ForUplift = Boolean.Parse(element.GetAttribute("AdjustPl3And4ForUplift"));
location.PenetrationLength = Double.Parse(element.GetAttribute("PenetrationLength"), CultureInfo.InvariantCulture);
location.LeakageLengthOutwardsPl3 = Double.Parse(element.GetAttribute("LeakageLengthOutwardsPl3"), CultureInfo.InvariantCulture);
location.LeakageLengthInwardsPl3 = Double.Parse(element.GetAttribute("LeakageLengthInwardsPl3"), CultureInfo.InvariantCulture);
location.LeakageLengthOutwardsPl4 = Double.Parse(element.GetAttribute("LeakageLengthOutwardsPl4"), CultureInfo.InvariantCulture);
location.LeakageLengthInwardsPl4 = Double.Parse(element.GetAttribute("LeakageLengthInwardsPl4"), CultureInfo.InvariantCulture);
}
else
{
location = null;
}
}
private static void ReadSurfaceLine(XmlElement element, SurfaceLine2 surfaceLine, Dictionary keys)
{
surfaceLine.CharacteristicPoints.Clear();
foreach (XmlElement charNode in GetElements(GetElement(element, "CharacteristicPoints"), "CharacteristicPoint"))
{
CharacteristicPoint charPoint = new CharacteristicPoint
{
GeometryPoint = ReadPoint(GetElement(charNode, "GeometryPoint"), keys, surfaceLine),
CharacteristicPointType = (CharacteristicPointType)Enum.Parse(typeof(CharacteristicPointType), charNode.GetAttribute("CharacteristicPointType"))
};
surfaceLine.CharacteristicPoints.Add(charPoint);
}
surfaceLine.Geometry.SyncPoints();
}
private static void ReadSoilModel(XmlElement element, SoilModel soilModel, List soilStresses, Dictionary keys)
{
soilModel.Soils.Clear();
foreach (XmlElement soilNode in GetElements(GetElement(element, "Soils"), "Soil"))
{
Soil soil = new Soil();
FixedSoilStress fixedSoilStress = null;
ReadSoil(soilNode, soil, ref fixedSoilStress, keys);
if (fixedSoilStress != null)
{
soilStresses.Add(fixedSoilStress);
}
soilModel.Soils.Add(soil);
}
}
private static void ReadSoil(XmlElement element, Soil soil, ref FixedSoilStress fixedSoilStress, Dictionary keys)
{
keys[Int32.Parse(element.GetAttribute("Key"), CultureInfo.InvariantCulture)] = soil;
soil.Name = element.GetAttribute("Name");
soil.AbovePhreaticLevel = Double.Parse(element.GetAttribute("AbovePhreaticLevel"), CultureInfo.InvariantCulture);
soil.BelowPhreaticLevel = Double.Parse(element.GetAttribute("BelowPhreaticLevel"), CultureInfo.InvariantCulture);
soil.Cohesion = Double.Parse(element.GetAttribute("Cohesion"), CultureInfo.InvariantCulture);
soil.FrictionAngle = Double.Parse(element.GetAttribute("FrictionAngle"), CultureInfo.InvariantCulture);
string dilatancyType = element.GetAttribute("DilatancyType");
switch (dilatancyType)
{
case "Phi": soil.Dilatancy = soil.FrictionAngle; break;
case "MinusPhi": soil.Dilatancy = -soil.FrictionAngle; break;
case "Zero": soil.Dilatancy = 0; break;
}
soil.RatioCuPc = Double.Parse(element.GetAttribute("RatioCuPc"), CultureInfo.InvariantCulture);
soil.StrengthIncreaseExponent = Double.Parse(element.GetAttribute("StrengthIncreaseExponent"), CultureInfo.InvariantCulture);
soil.ShearStrengthModel = (ShearStrengthModel)Enum.Parse(typeof(ShearStrengthModel), element.GetAttribute("ShearStrengthModel"));
if (Boolean.Parse(element.GetAttribute("UsePop")))
{
fixedSoilStress = new FixedSoilStress();
fixedSoilStress.Soil = soil;
fixedSoilStress.CenterStressValue.POP = Double.Parse(element.GetAttribute("POP"), CultureInfo.InvariantCulture);
//fixedSoilStress.OCR = Double.Parse(element.GetAttribute("OCR"), CultureInfo.InvariantCulture);
}
}
private static void ReadSoilProfile(XmlElement element, SoilProfile2D soilProfile, Dictionary keys)
{
ReadGeometry(GetElement(element, "Geometry"), soilProfile.Geometry, keys);
foreach (XmlElement layerElement in GetElements(GetElement(element, "Surfaces"), "Surface"))
{
SoilLayer2D surface = new SoilLayer2D();
ReadSoilLayer(layerElement, surface, keys);
soilProfile.Surfaces.Add(surface);
}
}
private static void ReadSoilLayer(XmlElement element, SoilLayer2D surface, Dictionary keys)
{
keys[Int32.Parse(element.GetAttribute("Key"), CultureInfo.InvariantCulture)] = surface;
surface.Soil = (Soil)keys[Int32.Parse(element.GetAttribute("Soil"), CultureInfo.InvariantCulture)];
surface.GeometrySurface = (GeometrySurface)keys[Int32.Parse(element.GetAttribute("Surface"), CultureInfo.InvariantCulture)];
surface.IsAquifer = Boolean.Parse(element.GetAttribute("IsAquifer"));
if (element.HasAttribute("WaterpressureInterpolationModel"))
{
surface.WaterpressureInterpolationModel = (WaterpressureInterpolationModel)Enum.Parse(typeof(WaterpressureInterpolationModel), element.GetAttribute("WaterpressureInterpolationModel"));
}
else
{
surface.WaterpressureInterpolationModel = WaterpressureInterpolationModel.Automatic; //default value
}
}
private static void ReadGeometry(XmlElement element, GeometryData geometry, Dictionary keys)
{
geometry.Points.Clear();
geometry.Curves.Clear();
geometry.Loops.Clear();
geometry.Surfaces.Clear();
geometry.Left = Double.Parse(element.GetAttribute("Left"), CultureInfo.InvariantCulture);
geometry.Right = Double.Parse(element.GetAttribute("Right"), CultureInfo.InvariantCulture);
geometry.Bottom = Double.Parse(element.GetAttribute("Bottom"), CultureInfo.InvariantCulture);
foreach (XmlElement pointElement in GetElements(GetElement(element, "Points"), "Point"))
{
geometry.Points.Add(ReadPoint(pointElement, keys));
}
foreach (XmlElement curveElement in GetElements(GetElement(element, "Curves"), "Curve"))
{
geometry.Curves.Add(ReadCurve(curveElement, keys));
}
foreach (XmlElement loopElement in GetElements(GetElement(element, "Loops"), "Loop"))
{
geometry.Loops.Add(ReadLoop(loopElement, keys));
}
foreach (XmlElement surfaceElement in GetElements(GetElement(element, "Surfaces"), "Surface"))
{
geometry.Surfaces.Add(ReadSurface(surfaceElement, keys));
}
}
private static GeometrySurface ReadSurface(XmlElement element, Dictionary keys)
{
int key = Int32.Parse(element.GetAttribute("Key"), CultureInfo.InvariantCulture);
if (keys.ContainsKey(key))
{
return (GeometrySurface)keys[key];
}
else
{
GeometrySurface surface = new GeometrySurface();
keys[key] = surface;
surface.OuterLoop = (GeometryLoop)keys[Int32.Parse(element.GetAttribute("OuterLoop"), CultureInfo.InvariantCulture)];
surface.InnerLoops.Clear();
foreach (XmlElement loopElement in GetElements(GetElement(element, "InnerLoops"), "InnerLoop"))
{
GeometryLoop loop = (GeometryLoop)keys[Int32.Parse(loopElement.GetAttribute("Loop"), CultureInfo.InvariantCulture)];
surface.InnerLoops.Add(loop);
}
return surface;
}
}
private static GeometryLoop ReadLoop(XmlElement element, Dictionary keys)
{
int key = Int32.Parse(element.GetAttribute("Key"), CultureInfo.InvariantCulture);
if (keys.ContainsKey(key))
{
return (GeometryLoop)keys[key];
}
else
{
GeometryLoop loop = new GeometryLoop();
keys[key] = loop;
loop.CurveList.Clear();
foreach (XmlElement curveElement in GetElements(GetElement(element, "Curves"), "Curve"))
{
GeometryCurve curve = (GeometryCurve)keys[Int32.Parse(curveElement.GetAttribute("Curve"), CultureInfo.InvariantCulture)];
loop.CurveList.Add(curve);
}
return loop;
}
}
private static GeometryCurve ReadCurve(XmlElement element, Dictionary keys)
{
int key = Int32.Parse(element.GetAttribute("Key"), CultureInfo.InvariantCulture);
if (keys.ContainsKey(key))
{
return (GeometryCurve)keys[key];
}
else
{
GeometryCurve curve = new GeometryCurve();
keys[key] = curve;
curve.HeadPoint = (Point2D)keys[Int32.Parse(element.GetAttribute("HeadPoint"), CultureInfo.InvariantCulture)];
curve.EndPoint = (Point2D)keys[Int32.Parse(element.GetAttribute("EndPoint"), CultureInfo.InvariantCulture)];
return curve;
}
}
private static GeometryPoint ReadPoint(XmlElement element, Dictionary keys, object owner)
{
int key = Int32.Parse(element.GetAttribute("Key"), CultureInfo.InvariantCulture);
if (keys.ContainsKey(key))
{
if (keys[key] is Point2D)
{
var point = (Point2D)keys[key];
var geomPoint = new GeometryPoint(point.X, point.Z)
{
Owner = owner
};
return geomPoint;
}
return (GeometryPoint)keys[key];
}
else
{
GeometryPoint point = new GeometryPoint();
keys[key] = point;
point.X = Double.Parse(element.GetAttribute("X"), CultureInfo.InvariantCulture);
point.Z = Double.Parse(element.GetAttribute("Z"), CultureInfo.InvariantCulture);
point.Owner = owner;
return point;
}
}
private static Point2D ReadPoint(XmlElement element, Dictionary keys)
{
int key = Int32.Parse(element.GetAttribute("Key"), CultureInfo.InvariantCulture);
if (keys.ContainsKey(key))
{
return (Point2D)keys[key];
}
else
{
Point2D point = new Point2D();
keys[key] = point;
point.X = Double.Parse(element.GetAttribute("X"), CultureInfo.InvariantCulture);
point.Z = Double.Parse(element.GetAttribute("Z"), CultureInfo.InvariantCulture);
return point;
}
}
private static GeometryPoint ReadPoint2D(XmlElement element)
{
GeometryPoint point = new GeometryPoint()
{
X = Double.Parse(element.GetAttribute("X"), CultureInfo.InvariantCulture),
Z = Double.Parse(element.GetAttribute("Z"), CultureInfo.InvariantCulture)
};
return point;
}
private static void ReadValidationResult(XmlElement element, List result)
{
foreach (XmlElement validationElement in GetElements(GetElement(element, "Validations"), "Validation"))
{
result.Add(new ValidationResult
{
MessageType = (ValidationResultType)Enum.Parse(typeof(ValidationResultType), validationElement.GetAttribute("Severity")),
Text = validationElement.GetAttribute("Message")
});
}
}
private static void ReadStabilityModelResult(XmlElement element, StabilityAssessmentCalculationResult result)
{
result.ModelOption = (ModelOptions)Enum.Parse(typeof(ModelOptions), element.GetAttribute("ModelOption"));
result.Calculated = Boolean.Parse(element.GetAttribute("Succeeded"));
result.FactorOfSafety = Double.Parse(element.GetAttribute("SafetyFactor"), CultureInfo.InvariantCulture);
result.ZValue = Double.Parse(element.GetAttribute("ZValue"), CultureInfo.InvariantCulture);
result.Curve = ReadSlidingCurve(result.Calculated, GetElement(element, "MinimumSafetyCurve"));
result.Location = new Location();
result.LocationDaily = new Location();
result.Waternet = new Waternet();
result.WaternetDaily = new Waternet();
result.SlipPlaneUpliftVan = new SlipPlaneUpliftVan();
result.TrafficLoad = new List();
result.DegreeOfConsolidationMatrix = new DegreeofConsolidationMatrix();
result.XMinEntry = new double();
result.XMaxEntry = new double();
var location = (Location)result.Location;
ReadLocation(GetElement(element, "Location"), ref location);
result.Location = location;
var locationDaily = (Location)result.LocationDaily;
ReadLocation(GetElement(element, "LocationDaily"), ref locationDaily);
result.LocationDaily = locationDaily;
var waternet = result.Waternet;
ReadWaternets(GetElement(element, "Waternets"), ref waternet, result.Location, false, new Dictionary());
result.Waternet = waternet;
var waternetDaily = result.WaternetDaily;
ReadWaternets(GetElement(element, "Waternets"), ref waternetDaily, result.LocationDaily, true, new Dictionary());
result.WaternetDaily = waternetDaily;
ReadUsedUpliftVanCalculationGrid(GetElement(element, "UpliftVanCalculationGrid"), result);
ReadUniformLoads(GetElement(element, "TrafficLoad"), result.TrafficLoad,new List(), new Dictionary(), new Dictionary());
ReadTrafficLoadConsolidationValues(GetElement(element, "ConsolidationValues"), result.DegreeOfConsolidationMatrix, new Dictionary());
ReadForbiddenZones(GetElement(element, "ForbiddenZones"), result);
ReadMessages(GetElement(element, "Messages"), result.Messages);
}
private static SlidingCurve ReadSlidingCurve(bool calculationSucceded, XmlElement element)
{
SlidingCurve slidingCurve = new SlidingCurve();
string curveType = element.GetAttribute("CurveType");
switch (curveType)
{
case "Circle": slidingCurve = new SlidingCircle(); break;
case "DualCircle": slidingCurve = new SlidingDualCircle(); break;
case "Plane": slidingCurve = new SlidingPlane(); break;
}
if (slidingCurve is SlidingDualCircle && calculationSucceded)
{
SlidingDualCircle slidingDualCircle = (SlidingDualCircle)slidingCurve;
slidingDualCircle.ActiveCircle.X = Double.Parse(element.GetAttribute("ActiveCircleCenterX"), CultureInfo.InvariantCulture);
slidingDualCircle.ActiveCircle.Z = Double.Parse(element.GetAttribute("ActiveCircleCenterZ"), CultureInfo.InvariantCulture);
slidingDualCircle.ActiveRadius = Double.Parse(element.GetAttribute("ActiveCircleRadius"), CultureInfo.InvariantCulture);
slidingDualCircle.PassiveCircle.X = Double.Parse(element.GetAttribute("PassiveCircleCenterX"), CultureInfo.InvariantCulture);
slidingDualCircle.PassiveCircle.Z = Double.Parse(element.GetAttribute("PassiveCircleCenterZ"), CultureInfo.InvariantCulture);
slidingDualCircle.PassiveRadius = Double.Parse(element.GetAttribute("PassiveCircleRadius"), CultureInfo.InvariantCulture);
slidingDualCircle.HorizontalForce0 = Double.Parse(element.GetAttribute("NonIteratedHorizontaleForce"), CultureInfo.InvariantCulture);
slidingDualCircle.ActiveForce0 = Double.Parse(element.GetAttribute("NonIteratedActiveForce"), CultureInfo.InvariantCulture);
slidingDualCircle.PassiveForce0 = Double.Parse(element.GetAttribute("NonIteratedPassiveForce"), CultureInfo.InvariantCulture);
slidingDualCircle.HorizontalForce = Double.Parse(element.GetAttribute("IteratedHorizontaleForce"), CultureInfo.InvariantCulture);
slidingDualCircle.ActiveForce = Double.Parse(element.GetAttribute("IteratedActiveForce"), CultureInfo.InvariantCulture);
slidingDualCircle.PassiveForce = Double.Parse(element.GetAttribute("IteratedPassiveForce"), CultureInfo.InvariantCulture);
slidingDualCircle.DrivingMomentActive = Double.Parse(element.GetAttribute("DrivingMomentActive"), CultureInfo.InvariantCulture);
slidingDualCircle.DrivingMomentPassive = Double.Parse(element.GetAttribute("DrivingMomentPassive"), CultureInfo.InvariantCulture);
slidingDualCircle.ResistingMomentActive = Double.Parse(element.GetAttribute("ResistingMomentActive"), CultureInfo.InvariantCulture);
slidingDualCircle.ResistingMomentPassive = Double.Parse(element.GetAttribute("ResistingMomentPassive"), CultureInfo.InvariantCulture);
}
foreach (XmlElement sliceElement in GetElements(GetElement(element, "Slices"), "Slice"))
{
var topLeft = ReadPoint2D(GetElement(sliceElement, "TopLeftPoint"));
var topRight = ReadPoint2D(GetElement(sliceElement, "TopRightPoint"));
var bottomLeft = ReadPoint2D(GetElement(sliceElement, "BottomLeftPoint"));
var bottomRight = ReadPoint2D(GetElement(sliceElement, "BottomRightPoint"));
Slice slice = new Slice
{
TopLeftX = topLeft.X,
TopLeftZ = topLeft.Z,
TopRightX = topRight.X,
TopRightZ = topRight.Z,
BottomLeftX = bottomLeft.X,
BottomLeftZ = bottomLeft.Z,
BottomRightX = bottomRight.X,
BottomRightZ = bottomRight.Z,
CohesionOutput = Double.Parse(sliceElement.GetAttribute("Cohesion"), CultureInfo.InvariantCulture),
PhiOutput = Double.Parse(sliceElement.GetAttribute("FrictionAngle"), CultureInfo.InvariantCulture),
PGrens = Double.Parse(sliceElement.GetAttribute("CriticalPressure"), CultureInfo.InvariantCulture),
OCR = Double.Parse(sliceElement.GetAttribute("OCR"), CultureInfo.InvariantCulture),
POP = Double.Parse(sliceElement.GetAttribute("POP"), CultureInfo.InvariantCulture),
DegreeofConsolidationPorePressure = Double.Parse(sliceElement.GetAttribute("DegreeofConsolidationPorePressure"), CultureInfo.InvariantCulture),
PorePressureDueToDegreeOfConsolidationLoad = Double.Parse(sliceElement.GetAttribute("PorePressureDueToDegreeOfConsolidationLoad"), CultureInfo.InvariantCulture),
Dilatancy = Double.Parse(sliceElement.GetAttribute("Dilatancy"), CultureInfo.InvariantCulture),
ExternalLoad = Double.Parse(sliceElement.GetAttribute("ExternalLoad"), CultureInfo.InvariantCulture),
HydrostaticPorePressure = Double.Parse(sliceElement.GetAttribute("HydrostaticPorePressure"), CultureInfo.InvariantCulture),
LeftForce = Double.Parse(sliceElement.GetAttribute("LeftForce"), CultureInfo.InvariantCulture),
LeftForceAngle = Double.Parse(sliceElement.GetAttribute("LeftForceAngle"), CultureInfo.InvariantCulture),
LeftForceY = Double.Parse(sliceElement.GetAttribute("LeftForceY"), CultureInfo.InvariantCulture),
RightForce = Double.Parse(sliceElement.GetAttribute("RightForce"), CultureInfo.InvariantCulture),
RightForceAngle = Double.Parse(sliceElement.GetAttribute("RightForceAngle"), CultureInfo.InvariantCulture),
RightForceY = Double.Parse(sliceElement.GetAttribute("RightForceY"), CultureInfo.InvariantCulture),
LoadStress = Double.Parse(sliceElement.GetAttribute("LoadStress"), CultureInfo.InvariantCulture),
NormalStress = Double.Parse(sliceElement.GetAttribute("NormalStress"), CultureInfo.InvariantCulture),
PoreOnSurface = Double.Parse(sliceElement.GetAttribute("PorePressure"), CultureInfo.InvariantCulture),
HPoreOnSurface = Double.Parse(sliceElement.GetAttribute("HorizontalPorePressure"), CultureInfo.InvariantCulture),
VPoreOnSurface = Double.Parse(sliceElement.GetAttribute("VerticalPorePressure"), CultureInfo.InvariantCulture),
PiezometricPorePressure = Double.Parse(sliceElement.GetAttribute("PiezometricPorePressure"), CultureInfo.InvariantCulture),
EffectiveStress = Double.Parse(sliceElement.GetAttribute("EffectiveStress"), CultureInfo.InvariantCulture),
EffectiveStressDaily = Double.Parse(sliceElement.GetAttribute("EffectiveStressDaily"), CultureInfo.InvariantCulture),
ExcessPorePressure = Double.Parse(sliceElement.GetAttribute("ExcessPorePressure"), CultureInfo.InvariantCulture),
ShearStress = Double.Parse(sliceElement.GetAttribute("ShearStress"), CultureInfo.InvariantCulture),
SoilStress = Double.Parse(sliceElement.GetAttribute("SoilStress"), CultureInfo.InvariantCulture),
TotalPorePressure = Double.Parse(sliceElement.GetAttribute("TotalPorePressure"), CultureInfo.InvariantCulture),
TotalStress = Double.Parse(sliceElement.GetAttribute("TotalStress"), CultureInfo.InvariantCulture),
Weight = Double.Parse(sliceElement.GetAttribute("Weight"), CultureInfo.InvariantCulture),
SuOutput = Double.Parse(sliceElement.GetAttribute("Su"), CultureInfo.InvariantCulture)
};
var ssm = sliceElement.GetAttribute("ShearStrengthModel");
if (!string.IsNullOrEmpty(ssm))
{
slice.ShearStrengthModel = (ShearStrengthModel)Enum.Parse(typeof(ShearStrengthModel), ssm);
}
slidingCurve.Slices.Add(slice);
}
return slidingCurve;
}
private static void ReadMessages(XmlElement element, List messages)
{
messages.Clear();
foreach (XmlElement pointElement in GetElements(element, "Message"))
{
LogMessage message = new LogMessage
{
Message = pointElement.GetAttribute("Message"),
MessageType = (LogMessageType)Enum.Parse(typeof(LogMessageType), pointElement.GetAttribute("MessageType"))
};
messages.Add(message);
}
}
}
}