Index: dam engine/trunk/src/Deltares.DamEngine.Calculators.Tests/KernelWrappers/DamMacroStability/DamMacroStabilityKernelWrapperTests.cs =================================================================== diff -u -r815 -r819 --- dam engine/trunk/src/Deltares.DamEngine.Calculators.Tests/KernelWrappers/DamMacroStability/DamMacroStabilityKernelWrapperTests.cs (.../DamMacroStabilityKernelWrapperTests.cs) (revision 815) +++ dam engine/trunk/src/Deltares.DamEngine.Calculators.Tests/KernelWrappers/DamMacroStability/DamMacroStabilityKernelWrapperTests.cs (.../DamMacroStabilityKernelWrapperTests.cs) (revision 819) @@ -174,18 +174,21 @@ { var kernelWrapper = new DamMacroStabilityKernelWrapper(); - DamMacroStabilityOutput output = new DamMacroStabilityOutput(); - var zone1 = new DamMacroStabilityOutput.ResultsSingleZone(); + DamMacroStabilityOutputItem outputItem = new DamMacroStabilityOutputItem(); + + var zone1 = new DamMacroStabilityOutputItem.ResultsSingleZone(); zone1.SafetyFactor = 1.1; zone1.EntryPointXCoordinate = 1.2; zone1.ExitPointXCoordinate = 1.3; - output.Zone1Results = zone1; - var zone2 = new DamMacroStabilityOutput.ResultsSingleZone(); + outputItem.Zone1Results = zone1; + var zone2 = new DamMacroStabilityOutputItem.ResultsSingleZone(); zone2.SafetyFactor = 0.9; zone2.EntryPointXCoordinate = 2.2; zone2.ExitPointXCoordinate = 2.3; - output.Zone2Results = zone2; - + outputItem.Zone2Results = zone2; + DamMacroStabilityOutput output = new DamMacroStabilityOutput(); + output.StabilityOutputItems = new List(); + output.StabilityOutputItems.Add(outputItem); List results; kernelWrapper.PostProcess(null, output, "", out results); Assert.AreEqual(0.9, results[0].StabilityDesignResults.SafetyFactor); Index: dam engine/trunk/src/Deltares.DamEngine.Calculators/Deltares.DamEngine.Calculators.csproj =================================================================== diff -u -r781 -r819 --- dam engine/trunk/src/Deltares.DamEngine.Calculators/Deltares.DamEngine.Calculators.csproj (.../Deltares.DamEngine.Calculators.csproj) (revision 781) +++ dam engine/trunk/src/Deltares.DamEngine.Calculators/Deltares.DamEngine.Calculators.csproj (.../Deltares.DamEngine.Calculators.csproj) (revision 819) @@ -118,6 +118,7 @@ + @@ -182,11 +183,11 @@ - + KernelWrappers\DamPipingSellmeijerVnk\CalcDlls\MPipingCalc2.dll PreserveNewest CalcDlls\MPipingCalc2.dll - + PreserveNewest Index: dam engine/trunk/src/Deltares.DamEngine.Calculators/KernelWrappers/DamMacroStability/DamMacroStabilityOutputItem.cs =================================================================== diff -u --- dam engine/trunk/src/Deltares.DamEngine.Calculators/KernelWrappers/DamMacroStability/DamMacroStabilityOutputItem.cs (revision 0) +++ dam engine/trunk/src/Deltares.DamEngine.Calculators/KernelWrappers/DamMacroStability/DamMacroStabilityOutputItem.cs (revision 819) @@ -0,0 +1,82 @@ +// 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 Deltares.DamEngine.Data.General; +using Deltares.DamEngine.Data.Standard.Calculation; + +namespace Deltares.DamEngine.Calculators.KernelWrappers.DamMacroStability +{ + /// + /// Class for a single set of DamMacroStabilityOutput parameters + /// + public class DamMacroStabilityOutputItem + { + /// + /// Gets or sets the calculation result. + /// + /// + /// The calculation result. + /// + public CalculationResult CalculationResult { get; set; } + + /// + /// Gets or sets the uplift situation. + /// + /// + /// The uplift situation. + /// + public UpliftSituation UpliftSituation { get; set; } + + /// + /// Structure holding the resuls per zone + /// + 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; + } + } + + /// + /// Gets or sets the zone1 results. + /// + /// + /// The zone1. + /// + public ResultsSingleZone Zone1Results { get; set; } + + /// + /// Gets or sets the zone2 results. + /// + /// + /// The zone2. + /// + public ResultsSingleZone? Zone2Results { get; set; } + } +} Index: dam engine/trunk/src/Deltares.DamEngine.Calculators/KernelWrappers/DamMacroStability/DamMacroStabilityOutput.cs =================================================================== diff -u -r781 -r819 --- dam engine/trunk/src/Deltares.DamEngine.Calculators/KernelWrappers/DamMacroStability/DamMacroStabilityOutput.cs (.../DamMacroStabilityOutput.cs) (revision 781) +++ dam engine/trunk/src/Deltares.DamEngine.Calculators/KernelWrappers/DamMacroStability/DamMacroStabilityOutput.cs (.../DamMacroStabilityOutput.cs) (revision 819) @@ -19,15 +19,19 @@ // Stichting Deltares and remain full property of Stichting Deltares at all times. // All rights reserved. +using System.Collections.Generic; using Deltares.DamEngine.Calculators.KernelWrappers.Interfaces; using Deltares.DamEngine.Data.General; using Deltares.DamEngine.Data.Standard.Calculation; namespace Deltares.DamEngine.Calculators.KernelWrappers.DamMacroStability { + /// + /// Class holding all DamMacroStabilityOutput. + /// + /// public class DamMacroStabilityOutput : IKernelDataOutput { - /// /// Gets or sets the calculation result. /// @@ -37,46 +41,12 @@ public CalculationResult CalculationResult { get; set; } /// - /// Gets or sets the uplift situation. + /// Gets or sets the stability output items. /// /// - /// The uplift situation. + /// The stability output items. /// - public UpliftSituation UpliftSituation { get; set; } + public List StabilityOutputItems { get; set; } - /// - /// Structure holding the resuls per zone - /// - 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; - } - } - - /// - /// Gets or sets the zone1 results. - /// - /// - /// The zone1. - /// - public ResultsSingleZone Zone1Results { get; set; } - - /// - /// Gets or sets the zone2 results. - /// - /// - /// The zone2. - /// - public ResultsSingleZone? Zone2Results { get; set; } - } } Index: dam engine/trunk/src/Deltares.DamEngine.Calculators/KernelWrappers/DamMacroStabilityOutwards/DamMacroStabilityOutwardsKernelWrapper.cs =================================================================== diff -u -r816 -r819 --- dam engine/trunk/src/Deltares.DamEngine.Calculators/KernelWrappers/DamMacroStabilityOutwards/DamMacroStabilityOutwardsKernelWrapper.cs (.../DamMacroStabilityOutwardsKernelWrapper.cs) (revision 816) +++ dam engine/trunk/src/Deltares.DamEngine.Calculators/KernelWrappers/DamMacroStabilityOutwards/DamMacroStabilityOutwardsKernelWrapper.cs (.../DamMacroStabilityOutwardsKernelWrapper.cs) (revision 819) @@ -78,6 +78,7 @@ { var damMacroStabilityOutput = new DamMacroStabilityOutput() { + StabilityOutputItems = new List(), CalculationResult = CalculationResult.NoRun }; kernelDataOutput = damMacroStabilityOutput; @@ -147,27 +148,29 @@ var results = calculator.GetResults(); if (results.Count > 0) { - var zone1 = new DamMacroStabilityOutput.ResultsSingleZone + var damMacroStabilityOutputItem = new DamMacroStabilityOutputItem(); + var zone1 = new DamMacroStabilityOutputItem.ResultsSingleZone { SafetyFactor = results[0].Zone1.SafetyFactor, CircleSurfacePointLeftXCoordinate = results[0].Zone1.CircleSurfacePointLeftXCoordinate, CircleSurfacePointRightXCoordinate = results[0].Zone1.CircleSurfacePointRightXCoordinate, EntryPointXCoordinate = results[0].Zone1.EntryPointXCoordinate, ExitPointXCoordinate = results[0].Zone1.ExitPointXCoordinate }; - damMacroStabilityOutput.Zone1Results = zone1; + damMacroStabilityOutputItem.Zone1Results = zone1; if (results[0].Zone2 != null) { - var zone2 = new DamMacroStabilityOutput.ResultsSingleZone + var zone2 = new DamMacroStabilityOutputItem.ResultsSingleZone { SafetyFactor = results[0].Zone1.SafetyFactor, CircleSurfacePointLeftXCoordinate = results[0].Zone1.CircleSurfacePointLeftXCoordinate, CircleSurfacePointRightXCoordinate = results[0].Zone1.CircleSurfacePointRightXCoordinate, EntryPointXCoordinate = results[0].Zone1.EntryPointXCoordinate, ExitPointXCoordinate = results[0].Zone1.ExitPointXCoordinate }; - damMacroStabilityOutput.Zone2Results = zone2; + damMacroStabilityOutputItem.Zone2Results = zone2; } + damMacroStabilityOutput.StabilityOutputItems.Add(damMacroStabilityOutputItem); } } @@ -258,22 +261,27 @@ { CalculationResult = damMacroStabilityOutput.CalculationResult }; - var stabilityDesignResults = new StabilityDesignResults + if (damMacroStabilityOutput.StabilityOutputItems.Count > 0) { - Zone1SafetyFactor = damMacroStabilityOutput.Zone1Results.SafetyFactor, - LocalZone1EntryPointX = damMacroStabilityOutput.Zone1Results.EntryPointXCoordinate, - LocalZone1ExitPointX = damMacroStabilityOutput.Zone1Results.ExitPointXCoordinate - }; - stabilityDesignResults.SafetyFactor = stabilityDesignResults.Zone1SafetyFactor; - if (damMacroStabilityOutput.Zone2Results != null) - { - var zone2 = (DamMacroStabilityOutput.ResultsSingleZone) damMacroStabilityOutput.Zone2Results; - stabilityDesignResults.Zone2SafetyFactor = zone2.SafetyFactor; - stabilityDesignResults.LocalZone2EntryPointX = zone2.EntryPointXCoordinate; - stabilityDesignResults.LocalZone2ExitPointX = zone2.ExitPointXCoordinate; - stabilityDesignResults.SafetyFactor = Math.Min(damMacroStabilityOutput.Zone1Results.SafetyFactor, zone2.SafetyFactor); + var damMacroStabilityOutputItem = damMacroStabilityOutput.StabilityOutputItems[0]; + var stabilityDesignResults = new StabilityDesignResults + { + Zone1SafetyFactor = damMacroStabilityOutputItem.Zone1Results.SafetyFactor, + LocalZone1EntryPointX = damMacroStabilityOutputItem.Zone1Results.EntryPointXCoordinate, + LocalZone1ExitPointX = damMacroStabilityOutputItem.Zone1Results.ExitPointXCoordinate + }; + + stabilityDesignResults.SafetyFactor = stabilityDesignResults.Zone1SafetyFactor; + if (damMacroStabilityOutputItem.Zone2Results != null) + { + var zone2 = (DamMacroStabilityOutputItem.ResultsSingleZone)damMacroStabilityOutputItem.Zone2Results; + stabilityDesignResults.Zone2SafetyFactor = zone2.SafetyFactor; + stabilityDesignResults.LocalZone2EntryPointX = zone2.EntryPointXCoordinate; + stabilityDesignResults.LocalZone2ExitPointX = zone2.ExitPointXCoordinate; + stabilityDesignResults.SafetyFactor = Math.Min(damMacroStabilityOutputItem.Zone1Results.SafetyFactor, zone2.SafetyFactor); + } + designResult.StabilityDesignResults = stabilityDesignResults; } - designResult.StabilityDesignResults = stabilityDesignResults; designResults.Add(designResult); } Index: dam engine/trunk/src/Deltares.DamEngine.Calculators/KernelWrappers/DamMacroStability/DamMacroStabilityKernelWrapper.cs =================================================================== diff -u -r816 -r819 --- dam engine/trunk/src/Deltares.DamEngine.Calculators/KernelWrappers/DamMacroStability/DamMacroStabilityKernelWrapper.cs (.../DamMacroStabilityKernelWrapper.cs) (revision 816) +++ dam engine/trunk/src/Deltares.DamEngine.Calculators/KernelWrappers/DamMacroStability/DamMacroStabilityKernelWrapper.cs (.../DamMacroStabilityKernelWrapper.cs) (revision 819) @@ -65,6 +65,7 @@ { var damMacroStabilityOutput = new DamMacroStabilityOutput() { + StabilityOutputItems = new List(), CalculationResult = CalculationResult.NoRun }; kernelDataOutput = damMacroStabilityOutput; @@ -80,18 +81,42 @@ // 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"); - - - var damPipingInput = new DamMacroStabilityInput() + var damMacroStabilityInput = new DamMacroStabilityInput() { DGeoStabilityExePath = Path.Combine(DamMacroStabilityFolder, DGeoStabilityExe), DGeoStabilityInputFileName = stiFileName, FailureMechanismeParamatersMStab = FailureMechanismeParamatersMStab }; - kernelDataInput = damPipingInput; + + // Check the model to see what is to be calculted and how many calculations are required + switch (FailureMechanismeParamatersMStab.MStabParameters.Model) + { + case MStabModelType.Bishop: + case MStabModelType.UpliftVan: + { + // prepare the requested calc + break; + } + case MStabModelType.BishopUpliftVan: + { + // see if uplift is required + // if so, both upliftvan and bishop are to be prepared, calculated and worst case is to be determined + var stiFileName2 = Path.Combine(absoluteFolder, "test.sti"); + damMacroStabilityInput.DGeoStabilityInputFileNameSecondModel = stiFileName2; + // if not, only Bishop calculation + break; + } + default: + { + //model not implemented error + break; + } + } + kernelDataInput = damMacroStabilityInput; + // Write xml file - XDocument xmlDocument = CreateMstabDamXmlDocument(damKernelInput, damPipingInput); + XDocument xmlDocument = CreateMstabDamXmlDocument(damKernelInput, damMacroStabilityInput); // Use xml file to create sti file CreateStiFile(xmlDocument); @@ -135,36 +160,67 @@ DamMacroStabilityOutput damMacroStabilityOutput = (DamMacroStabilityOutput) kernelDataOutput; messages = new List(); - // start calculation + // start (first) calculation + var stabilityOutputItem = ExcecuteCalculation(kernelDataInput); + if (stabilityOutputItem != null) + { + damMacroStabilityOutput.StabilityOutputItems.Add(stabilityOutputItem); + } + // now check if second calculation is needed, if so perform it. + var input = (DamMacroStabilityInput) kernelDataInput; + if (!string.IsNullOrEmpty(input.DGeoStabilityInputFileNameSecondModel)) + { + var inputFileName = input.DGeoStabilityInputFileName; + input.DGeoStabilityInputFileName = input.DGeoStabilityInputFileNameSecondModel; + try + { + var stabilityOutputItemSecondModel = ExcecuteCalculation(kernelDataInput); + if (stabilityOutputItemSecondModel != null) + { + damMacroStabilityOutput.StabilityOutputItems.Add(stabilityOutputItemSecondModel); + } + } + finally + { + input.DGeoStabilityInputFileName = inputFileName; + } + } + } + + private static DamMacroStabilityOutputItem ExcecuteCalculation(IKernelDataInput kernelDataInput) + { var calculator = StabilityCalculator(kernelDataInput); calculator.Calculate(); - // get results + // get (first) results var results = calculator.GetResults(); if (results.Count > 0) { - var zone1 = new DamMacroStabilityOutput.ResultsSingleZone + var stabilityOutputItem = new DamMacroStabilityOutputItem(); + var zone1 = new DamMacroStabilityOutputItem.ResultsSingleZone { SafetyFactor = results[0].Zone1.SafetyFactor, CircleSurfacePointLeftXCoordinate = results[0].Zone1.CircleSurfacePointLeftXCoordinate, CircleSurfacePointRightXCoordinate = results[0].Zone1.CircleSurfacePointRightXCoordinate, EntryPointXCoordinate = results[0].Zone1.EntryPointXCoordinate, ExitPointXCoordinate = results[0].Zone1.ExitPointXCoordinate }; - damMacroStabilityOutput.Zone1Results = zone1; + stabilityOutputItem.Zone1Results = zone1; if (results[0].Zone2 != null) { - var zone2 = new DamMacroStabilityOutput.ResultsSingleZone + var zone2 = new DamMacroStabilityOutputItem.ResultsSingleZone { SafetyFactor = results[0].Zone1.SafetyFactor, CircleSurfacePointLeftXCoordinate = results[0].Zone1.CircleSurfacePointLeftXCoordinate, CircleSurfacePointRightXCoordinate = results[0].Zone1.CircleSurfacePointRightXCoordinate, EntryPointXCoordinate = results[0].Zone1.EntryPointXCoordinate, ExitPointXCoordinate = results[0].Zone1.ExitPointXCoordinate }; - damMacroStabilityOutput.Zone2Results = zone2; + stabilityOutputItem.Zone2Results = zone2; } + return stabilityOutputItem; } + return null; } internal XDocument CreateMstabDamXmlDocument(DamKernelInput damKernelInput, DamMacroStabilityInput kernelDataInput) @@ -235,8 +291,8 @@ /// public void PostProcess(DamKernelInput damKernelInput, IKernelDataOutput kernelDataOutput, string resultMessage, out List designResults) { - DamMacroStabilityOutput damPipingOutput = kernelDataOutput as DamMacroStabilityOutput; - if (damPipingOutput == null) + DamMacroStabilityOutput damMacroStabilityOutput = kernelDataOutput as DamMacroStabilityOutput; + if (damMacroStabilityOutput == null) { throw new NoNullAllowedException(Resources.DamMacroStabilityKernelWrapper_PostProcess_NoOutputObjectDefinedForSellmeijer4Forces); } @@ -251,24 +307,46 @@ var p = new SoilProfile1D(); designResults = new List(); var designResult = new DesignResult(d, s, p, soilProfile2DName, AnalysisType.NoAdaption); + if (damMacroStabilityOutput.StabilityOutputItems.Count > 0) + { + var damMacroStabilityOutputItem = damMacroStabilityOutput.StabilityOutputItems[0]; + if (damMacroStabilityOutputItem != null) + { + FillDesignResult(damMacroStabilityOutputItem, designResult); + designResults.Add(designResult); + } + } + if (damMacroStabilityOutput.StabilityOutputItems.Count > 1) + { + // Todo this next line is still fake! + designResult = new DesignResult(d, s, p, soilProfile2DName, AnalysisType.NoAdaption); + var damMacroStabilityOutputItem = damMacroStabilityOutput.StabilityOutputItems[1]; + if (damMacroStabilityOutputItem != null) + { + FillDesignResult(damMacroStabilityOutputItem, designResult); + } + designResults.Add(designResult); + } + } + private static void FillDesignResult(DamMacroStabilityOutputItem damMacroStabilityOutputItem, DesignResult designResult) + { var stabilityDesignResults = new StabilityDesignResults { - Zone1SafetyFactor = damPipingOutput.Zone1Results.SafetyFactor, - LocalZone1EntryPointX = damPipingOutput.Zone1Results.EntryPointXCoordinate, - LocalZone1ExitPointX = damPipingOutput.Zone1Results.ExitPointXCoordinate + Zone1SafetyFactor = damMacroStabilityOutputItem.Zone1Results.SafetyFactor, + LocalZone1EntryPointX = damMacroStabilityOutputItem.Zone1Results.EntryPointXCoordinate, + LocalZone1ExitPointX = damMacroStabilityOutputItem.Zone1Results.ExitPointXCoordinate }; stabilityDesignResults.SafetyFactor = stabilityDesignResults.Zone1SafetyFactor; - if (damPipingOutput.Zone2Results != null) + if (damMacroStabilityOutputItem.Zone2Results != null) { - var zone2 = (DamMacroStabilityOutput.ResultsSingleZone) damPipingOutput.Zone2Results; + var zone2 = (DamMacroStabilityOutputItem.ResultsSingleZone) damMacroStabilityOutputItem.Zone2Results; stabilityDesignResults.Zone2SafetyFactor = zone2.SafetyFactor; stabilityDesignResults.LocalZone2EntryPointX = zone2.EntryPointXCoordinate; stabilityDesignResults.LocalZone2ExitPointX = zone2.ExitPointXCoordinate; - stabilityDesignResults.SafetyFactor = Math.Min(damPipingOutput.Zone1Results.SafetyFactor, zone2.SafetyFactor); + stabilityDesignResults.SafetyFactor = Math.Min(damMacroStabilityOutputItem.Zone1Results.SafetyFactor, zone2.SafetyFactor); } designResult.StabilityDesignResults = stabilityDesignResults; - designResults.Add(designResult); } } }