Index: dam engine/trunk/src/Deltares.DamEngine.Calculators.Tests/DamMacroStabilityTests.cs =================================================================== diff -u -r584 -r596 --- dam engine/trunk/src/Deltares.DamEngine.Calculators.Tests/DamMacroStabilityTests.cs (.../DamMacroStabilityTests.cs) (revision 584) +++ dam engine/trunk/src/Deltares.DamEngine.Calculators.Tests/DamMacroStabilityTests.cs (.../DamMacroStabilityTests.cs) (revision 596) @@ -40,7 +40,7 @@ [Test] public void TestFullCalculation() { - const double diff = 0.0001; + const double diff = 0.01; // ToDo zant Fill input var damKernelInput = new DamKernelInput(); @@ -53,19 +53,18 @@ // Validate the input List messages; kernelWrapper.Validate(damStabilityInput, out messages); -// Assert.AreEqual(0, messages.Count); + Assert.AreEqual(0, messages.Count); // Run the dll -// DamMacroStabilityOutput output = (DamMacroStabilityOutput)kernelWrapper.Execute(damStabilityInput, out messages); -// Assert.AreEqual(0, messages.Count); - // ToDo zant specify output - // Assert.AreEqual(0.0, output.xxx, diff); + DamMacroStabilityOutput output = (DamMacroStabilityOutput)kernelWrapper.Execute(damStabilityInput, out messages); + Assert.AreEqual(0, messages.Count); + Assert.AreEqual(1.71, output.Zone1.SafetyFactor, diff); + Assert.IsNull(output.Zone2); // Fill the design results -// DesignResult result; -// kernelWrapper.PostProcess(output, out result); - // ToDo zant specify output -// Assert.AreEqual(0.0, result.StabilityDesignResults.SafetyFactor, diff); + DesignResult result; + kernelWrapper.PostProcess(damKernelInput, output, out result); + Assert.AreEqual(1.71, result.StabilityDesignResults.SafetyFactor, diff); } [Test] @@ -147,7 +146,7 @@ // Validate without setting values. Expected error messages. var damStabilityInput = new DamMacroStabilityInput(); List messages; - //ToDo zant Validate is not implemented yet + // Validate is not implemented (yet), returns always true // kernelWrapper.Validate(damStabilityInput, out messages); // Assert.IsTrue(messages.Count > 0); @@ -167,14 +166,26 @@ var kernelWrapper = new DamMacroStabilityKernelWrapper(); DamMacroStabilityOutput output = new DamMacroStabilityOutput(); - // ToDo zant specify output -// output.xxx = 1.1; -// output.yyy = 2.2; + var zone1 = new DamMacroStabilityOutput.ResultsSingleZone(); + zone1.SafetyFactor = 1.1; + zone1.EntryPointXCoordinate = 1.2; + zone1.ExitPointXCoordinate = 1.3; + output.Zone1 = zone1; + var zone2 = new DamMacroStabilityOutput.ResultsSingleZone(); + zone2.SafetyFactor = 0.9; + zone2.EntryPointXCoordinate = 2.2; + zone2.ExitPointXCoordinate = 2.3; + output.Zone2 = zone2; DesignResult result; kernelWrapper.PostProcess(null, output, out result); - // ToDo zant specify output -// Assert.AreEqual(output.xxx, result.StabilityDesignResults.SafetyFactor); + Assert.AreEqual(0.9, result.StabilityDesignResults.SafetyFactor); + Assert.AreEqual(1.1, result.StabilityDesignResults.Zone1SafetyFactor); + Assert.AreEqual(1.2, result.StabilityDesignResults.LocalZone1EntryPointX); + Assert.AreEqual(1.3, result.StabilityDesignResults.LocalZone1ExitPointX); + Assert.AreEqual(0.9, result.StabilityDesignResults.Zone2SafetyFactor); + Assert.AreEqual(2.2, result.StabilityDesignResults.LocalZone2EntryPointX); + Assert.AreEqual(2.3, result.StabilityDesignResults.LocalZone2ExitPointX); } [Test] @@ -203,7 +214,5 @@ kernelWrapper.PostProcess(null, null, out result); } - - } } Index: dam engine/trunk/src/Deltares.DamEngine.Calculators/KernelWrappers/DamMacroStability/DamMacroStabilityKernelWrapper.cs =================================================================== diff -u -r586 -r596 --- dam engine/trunk/src/Deltares.DamEngine.Calculators/KernelWrappers/DamMacroStability/DamMacroStabilityKernelWrapper.cs (.../DamMacroStabilityKernelWrapper.cs) (revision 586) +++ dam engine/trunk/src/Deltares.DamEngine.Calculators/KernelWrappers/DamMacroStability/DamMacroStabilityKernelWrapper.cs (.../DamMacroStabilityKernelWrapper.cs) (revision 596) @@ -1,8 +1,12 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.Data; +using System.Diagnostics; using System.IO; +using System.Linq; using System.Xml.Linq; using Deltares.DamEngine.Calculators.KernelWrappers.Common; +using Deltares.DamEngine.Calculators.KernelWrappers.DamMacroStability.Assemblers; using Deltares.DamEngine.Calculators.KernelWrappers.Interfaces; using Deltares.DamEngine.Calculators.Properties; using Deltares.DamEngine.Data.Design; @@ -16,7 +20,7 @@ { public class DamMacroStabilityKernelWrapper : IKernelWrapper { - private const string DamMacroStabilityFolder = @".\KernelWrappers\MacroStability"; + private const string DamMacroStabilityFolder = @".\KernelWrappers\DamMacroStability"; private const string DGeoStabilityExe = "DGeoStability.exe"; /// @@ -27,10 +31,14 @@ public IKernelDataInput Prepare(DamKernelInput damKernelInput) { // TODO: this is just fake data + const string testFolder = @"..\..\Deltares.DamEngine.Calculators.Tests\Files\MacroStability"; + // Relative paths in ini file do not work yet in DGeoStability 16.2. This is fixed in 18.1. + var absoluteFolder = Path.GetFullPath(Path.Combine(Directory.GetCurrentDirectory(), testFolder)); + var stiFileName = Path.Combine(absoluteFolder, "test.sti"); return new DamMacroStabilityInput() { DGeoStabilityExePath = Path.Combine(DamMacroStabilityFolder, DGeoStabilityExe), - DGeoStabilityInputFileName = "test.sti" + DGeoStabilityInputFileName = stiFileName }; } @@ -66,16 +74,38 @@ // ToDo zant Question: write sti file in prepare or in execute? -// // Write xml file -// XDocument xmlDocument = CreateMstabDamXmlDocument(); -// -// // Use xml file to create sti file -// CreateStiFile(xmlDocument); -// // start calculation -// var calculator = StabilityCalculator(kernelDataInput); -// calculator.Calculate(); -// // ToDo zant -// // damMacroStabilityOutput.FoSp = calculator.FoSp; + // Write xml file + XDocument xmlDocument = CreateMstabDamXmlDocument(); + + // Use xml file to create sti file + CreateStiFile(xmlDocument); + + // start calculation + var calculator = StabilityCalculator(kernelDataInput); + calculator.Calculate(); + + // get results + var results = calculator.GetResults(); + if (results.Count > 0) + { + var zone1 = new DamMacroStabilityOutput.ResultsSingleZone(); + zone1.SafetyFactor = results[0].Zone1.SafetyFactor; + zone1.CircleSurfacePointLeftXCoordinate = results[0].Zone1.CircleSurfacePointLeftXCoordinate; + zone1.CircleSurfacePointRightXCoordinate = results[0].Zone1.CircleSurfacePointRightXCoordinate; + zone1.EntryPointXCoordinate = results[0].Zone1.EntryPointXCoordinate; + zone1.ExitPointXCoordinate = results[0].Zone1.ExitPointXCoordinate; + damMacroStabilityOutput.Zone1 = zone1; + if (results[0].Zone2 != null) + { + var zone2 = new DamMacroStabilityOutput.ResultsSingleZone(); + zone2.SafetyFactor = results[0].Zone1.SafetyFactor; + zone2.CircleSurfacePointLeftXCoordinate = results[0].Zone1.CircleSurfacePointLeftXCoordinate; + zone2.CircleSurfacePointRightXCoordinate = results[0].Zone1.CircleSurfacePointRightXCoordinate; + zone2.EntryPointXCoordinate = results[0].Zone1.EntryPointXCoordinate; + zone2.ExitPointXCoordinate = results[0].Zone1.ExitPointXCoordinate; + damMacroStabilityOutput.Zone2 = zone2; + } + } return damMacroStabilityOutput; } @@ -93,10 +123,38 @@ var requiredSafetyFactor = 1.2; List errorMessages; - XDocument mstabXML = MStabXmlDoc.CreateMStabXmlDoc(stabilityProjectFilename, scenario, soilProfile, soilGeometry2DName, - riverLevel, mstabDesignEmbankment, surfaceLine, trafficLoad, requiredSafetyFactor, out errorMessages); - mstabXML.Save(stabilityProjectFilename + ".xml"); - return mstabXML; +// XDocument mstabXml = MStabXmlDoc.CreateMStabXmlDoc(stabilityProjectFilename, scenario, soilProfile, soilGeometry2DName, +// riverLevel, mstabDesignEmbankment, surfaceLine, trafficLoad, requiredSafetyFactor, out errorMessages); +// mstabXml.Save(stabilityProjectFilename + ".xml"); + + // ToDo zant tmp use predefined xml doc until CreateMstabDamXmlDocument is fully implemented + const string testFolder = @"..\..\Deltares.DamEngine.Calculators.Tests\Files\MacroStability"; + var xmlFileName = Path.Combine(testFolder, "test.xml"); + var stiFileName = Path.Combine(testFolder, "test.sti"); + var geometryFileName = Path.Combine(testFolder, "DWP_1.sti"); + var soilDbName = Path.Combine(testFolder, "DAM Tutorial Design0.soilmaterials.mdb"); + XDocument mstabXml = XDocument.Load(xmlFileName); + XElement inputElement = (from element in mstabXml.Root.Descendants() + where element.Name.LocalName == DamMStabAssembler.XmlElementNameInput + select element).Single(); + XAttribute mstabFileName = inputElement.Attribute(DamMStabAssembler.XmlAttributeMStabFileName); + Debug.Assert(mstabFileName != null, "mstabFileName != null"); + mstabFileName.Value = stiFileName; + + // modify name of Soil DB Name + XAttribute dbName = inputElement.Attribute(DamMStabAssembler.XmlAttributeSoilDBName); + Debug.Assert(dbName != null, "dbName != null"); + dbName.Value = soilDbName; + + // modify name of geometry input file + XElement geometryOptionsElement = (from element in inputElement.Descendants() + where element.Name.LocalName == DamMStabAssembler.XmlElementGeometryCreationOptions + select element).Single(); + XAttribute geomFileName = geometryOptionsElement.Attribute(DamMStabAssembler.XmlAttributeSoilGeometry2DFilename); + Debug.Assert(geomFileName != null, "geomFileName != null"); + geomFileName.Value = geometryFileName; + + return mstabXml; } internal void CreateStiFile(XDocument xmlDocument) @@ -151,8 +209,18 @@ designResult = new DesignResult(d, s, p, soilProfile2DName, AnalysisType.NoAdaption, 0); var stabilityDesignResults = new StabilityDesignResults(); - // ToDo zant - // stabilityDesignResults.SafetyFactor = damPipingOutput.; + stabilityDesignResults.Zone1SafetyFactor = damPipingOutput.Zone1.SafetyFactor; + stabilityDesignResults.LocalZone1EntryPointX = damPipingOutput.Zone1.EntryPointXCoordinate; + stabilityDesignResults.LocalZone1ExitPointX = damPipingOutput.Zone1.ExitPointXCoordinate; + stabilityDesignResults.SafetyFactor = stabilityDesignResults.Zone1SafetyFactor; + if (damPipingOutput.Zone2 != null) + { + var zone2 = (DamMacroStabilityOutput.ResultsSingleZone) damPipingOutput.Zone2; + stabilityDesignResults.Zone2SafetyFactor = zone2.SafetyFactor; + stabilityDesignResults.LocalZone2EntryPointX = zone2.EntryPointXCoordinate; + stabilityDesignResults.LocalZone2ExitPointX = zone2.ExitPointXCoordinate; + stabilityDesignResults.SafetyFactor = Math.Min(damPipingOutput.Zone1.SafetyFactor, zone2.SafetyFactor); + } designResult.StabilityDesignResults = stabilityDesignResults; } } Index: dam engine/trunk/src/Deltares.DamEngine.Calculators/KernelWrappers/DamMacroStability/DamMacroStabilityOutput.cs =================================================================== diff -u -r543 -r596 --- dam engine/trunk/src/Deltares.DamEngine.Calculators/KernelWrappers/DamMacroStability/DamMacroStabilityOutput.cs (.../DamMacroStabilityOutput.cs) (revision 543) +++ dam engine/trunk/src/Deltares.DamEngine.Calculators/KernelWrappers/DamMacroStability/DamMacroStabilityOutput.cs (.../DamMacroStabilityOutput.cs) (revision 596) @@ -4,5 +4,23 @@ { public class DamMacroStabilityOutput : IKernelDataOutput { + public struct ResultsSingleZone + { + public double SafetyFactor; + public double CircleSurfacePointLeftXCoordinate; + public double CircleSurfacePointRightXCoordinate; + public double EntryPointXCoordinate; + public double ExitPointXCoordinate; + public void Init() + { + SafetyFactor = 0.0; + EntryPointXCoordinate = 0.0; + ExitPointXCoordinate = 0.0; + } + } + + public ResultsSingleZone Zone1 { get; set; } + public ResultsSingleZone? Zone2 { get; set; } + } }