Index: DamEngine/trunk/src/Deltares.DamEngine.Calculators/KernelWrappers/WtiPipingSellmeijerRevised/WtiPipingSellmeijerRevisedKernelWrapper.cs =================================================================== diff -u -r2646 -r2695 --- DamEngine/trunk/src/Deltares.DamEngine.Calculators/KernelWrappers/WtiPipingSellmeijerRevised/WtiPipingSellmeijerRevisedKernelWrapper.cs (.../WtiPipingSellmeijerRevisedKernelWrapper.cs) (revision 2646) +++ DamEngine/trunk/src/Deltares.DamEngine.Calculators/KernelWrappers/WtiPipingSellmeijerRevised/WtiPipingSellmeijerRevisedKernelWrapper.cs (.../WtiPipingSellmeijerRevisedKernelWrapper.cs) (revision 2695) @@ -69,15 +69,20 @@ FoSh = defaultMaxReturnValue }; kernelDataOutput = damPipingOutput; - if (damKernelInput.SubSoilScenario.SegmentFailureMechanismType.Value.In(SegmentFailureMechanismType.Piping, SegmentFailureMechanismType.All)) + if (damKernelInput.SubSoilScenario != null) { - var soilProfile1D = damKernelInput.SubSoilScenario.SoilProfile1D; - var location = damKernelInput.Location; - double waterLevel = damKernelInput.RiverLevelHigh; - UpliftSituation upliftSituation; - var plLines = PlLinesHelper.CreatePlLinesForPiping(location, soilProfile1D, waterLevel, out upliftSituation); - EvaluateUpliftSituation(damKernelInput, out kernelDataInput, plLines, waterLevel, damPipingOutput); - return PrepareResult.Successful; + if (damKernelInput.SubSoilScenario.SegmentFailureMechanismType.Value.In( + SegmentFailureMechanismType.Piping, SegmentFailureMechanismType.All)) + { + var soilProfile1D = damKernelInput.SubSoilScenario.SoilProfile1D; + var location = damKernelInput.Location; + double waterLevel = damKernelInput.RiverLevelHigh; + UpliftSituation upliftSituation; + var plLines = + PlLinesHelper.CreatePlLinesForPiping(location, soilProfile1D, waterLevel, out upliftSituation); + EvaluateUpliftSituation(damKernelInput, out kernelDataInput, plLines, waterLevel, damPipingOutput); + return PrepareResult.Successful; + } } kernelDataInput = null; return PrepareResult.NotRelevant; Index: DamEngine/trunk/src/Deltares.DamEngine.IntegrationTests/IntegrationTests/OperationalGrebbedijkTests.cs =================================================================== diff -u -r2518 -r2695 --- DamEngine/trunk/src/Deltares.DamEngine.IntegrationTests/IntegrationTests/OperationalGrebbedijkTests.cs (.../OperationalGrebbedijkTests.cs) (revision 2518) +++ DamEngine/trunk/src/Deltares.DamEngine.IntegrationTests/IntegrationTests/OperationalGrebbedijkTests.cs (.../OperationalGrebbedijkTests.cs) (revision 2695) @@ -19,10 +19,13 @@ // Stichting Deltares and remain full property of Stichting Deltares at all times. // All rights reserved. +using System; using System.IO; using System.Text; +using Deltares.DamEngine.Data.General; using Deltares.DamEngine.Interface; using Deltares.DamEngine.Io; +using Deltares.DamEngine.Io.XmlOutput; using Deltares.DamEngine.TestHelpers; using NUnit.Framework; @@ -74,6 +77,69 @@ } + [TestCase(PipingModelType.Bligh)] + [TestCase(PipingModelType.SellmeijerVnk)] + [TestCase(PipingModelType.Sellmeijer4Forces)] + [ExpectedException(typeof(NotImplementedException))] + public void Run_UsingTestFiles_ButWithUnsupportedPipingModelFails(PipingModelType pipingModel) + { + const string calcDir = "TestOperationalGrebbedijk"; + const string workingDir = @"TestFiles\"; + const string baseTestDirectory = @".\"; + if (Directory.Exists(calcDir)) + { + Directory.Delete(calcDir, true); // delete previous results + } + Directory.CreateDirectory(calcDir); + // Switch to TestFiles directory to check if DamLive can also run from another directory + Directory.SetCurrentDirectory(workingDir); + // Based on "DamLive\trunk\src\Deltares.DamLive.Tests\TestData\DamLive\Set2\\output.damx" + const string inputFileName = baseTestDirectory + @"GrebbedijkStability.xml"; + string inputString = File.ReadAllText(inputFileName); + inputString = XmlAdapter.ChangeValueInXml(inputString, "ProjectPath", ""); // Current directory will be used + inputString = XmlAdapter.ChangeValueInXml(inputString, "CalculationMap", calcDir); // Current directory will be used + inputString = XmlAdapter.ChangeValueInXml(inputString, "MapForSoilgeometries2D", baseTestDirectory + @"Operational\Grebbedijk\input.Geometries\"); + inputString = XmlAdapter.ChangeValueInXml(inputString, "SoilDatabaseName", baseTestDirectory + @"Operational\Grebbedijk\input0.soilmaterials.mdb"); + EngineInterface engineInterface = new EngineInterface(inputString); + Assert.IsNotNull(engineInterface.DamProjectData); + engineInterface.DamProjectData.DamProjectCalculationSpecification.CurrentSpecification.FailureMechanismSystemType = FailureMechanismSystemType.Piping; + engineInterface.DamProjectData.DamProjectCalculationSpecification.CurrentSpecification.PipingModelType = pipingModel; + string outputString = engineInterface.Run(); + } + + [TestCase(PipingModelType.Wti2017)] + public void Run_UsingTestFiles_ButWithSupportedPipingModelFailsBecauseNoRelevantSegments(PipingModelType pipingModel) + { + const string calcDir = "TestOperationalGrebbedijk"; + const string workingDir = @"TestFiles\"; + const string baseTestDirectory = @".\"; + if (Directory.Exists(calcDir)) + { + Directory.Delete(calcDir, true); // delete previous results + } + + Directory.CreateDirectory(calcDir); + // Switch to TestFiles directory to check if DamLive can also run from another directory + Directory.SetCurrentDirectory(workingDir); + // Based on "DamLive\trunk\src\Deltares.DamLive.Tests\TestData\DamLive\Set2\\output.damx" + const string inputFileName = baseTestDirectory + @"GrebbedijkStability.xml"; + string inputString = File.ReadAllText(inputFileName); + inputString = XmlAdapter.ChangeValueInXml(inputString, "ProjectPath", ""); // Current directory will be used + inputString = XmlAdapter.ChangeValueInXml(inputString, "CalculationMap", calcDir); // Current directory will be used + inputString = XmlAdapter.ChangeValueInXml(inputString, "MapForSoilgeometries2D", baseTestDirectory + @"Operational\Grebbedijk\input.Geometries\"); + inputString = XmlAdapter.ChangeValueInXml(inputString, "SoilDatabaseName", baseTestDirectory + @"Operational\Grebbedijk\input0.soilmaterials.mdb"); + EngineInterface engineInterface = new EngineInterface(inputString); + Assert.IsNotNull(engineInterface.DamProjectData); + engineInterface.DamProjectData.DamProjectCalculationSpecification.CurrentSpecification.FailureMechanismSystemType = FailureMechanismSystemType.Piping; + engineInterface.DamProjectData.DamProjectCalculationSpecification.CurrentSpecification.PipingModelType = pipingModel; + string outputString = engineInterface.Run(); + Assert.IsNotNull(outputString); + var output = DamXmlSerialization.LoadOutputFromXmlString(outputString); + Assert.AreEqual(2,output.Results.CalculationMessages.Length); + Assert.AreEqual(MessageMessageType.Info, output.Results.CalculationMessages[0].MessageType); + Assert.AreEqual(MessageMessageType.Error, output.Results.CalculationMessages[1].MessageType); + Assert.IsTrue(output.Results.CalculationMessages[1].Message1.Contains("Piping")); + } } } Index: DamEngine/trunk/src/Deltares.DamEngine.Calculators/DikesOperational/OperationalCalculator.cs =================================================================== diff -u -r2656 -r2695 --- DamEngine/trunk/src/Deltares.DamEngine.Calculators/DikesOperational/OperationalCalculator.cs (.../OperationalCalculator.cs) (revision 2656) +++ DamEngine/trunk/src/Deltares.DamEngine.Calculators/DikesOperational/OperationalCalculator.cs (.../OperationalCalculator.cs) (revision 2695) @@ -130,19 +130,25 @@ FailureMechanismSystemType soilProbabilityFailureMechanismSystemType = damProjectData.DamProjectCalculationSpecification.CurrentSpecification.FailureMechanismSystemType; var soiProfileProbability = location.Segment.GetMostProbableSoilGeometryProbability( ConversionHelper.ConvertToSegmentFailureMechanismType(soilProbabilityFailureMechanismSystemType)); - var projectPath = damProjectData.ProjectPath != "" ? damProjectData.ProjectPath : Directory.GetCurrentDirectory(); - var calculationMessages = new List(); - operationalCalculatorTasks.Add(new OperationalCalculatorTask() + if (soiProfileProbability != null) { - Location = location, - SoiProfileProbability = soiProfileProbability, - ProjectPath = projectPath, - CalculationMap = damProjectData.CalculationMap, - FailureMechanismeCalculationSpecification = damProjectData.DamProjectCalculationSpecification.CurrentSpecification, - TimeSerieEntry = entry, - TimeStepIndex = entryIndex, - CalculationMessages = calculationMessages - }); + var projectPath = damProjectData.ProjectPath != "" + ? damProjectData.ProjectPath + : Directory.GetCurrentDirectory(); + var calculationMessages = new List(); + operationalCalculatorTasks.Add(new OperationalCalculatorTask() + { + Location = location, + SoiProfileProbability = soiProfileProbability, + ProjectPath = projectPath, + CalculationMap = damProjectData.CalculationMap, + FailureMechanismeCalculationSpecification = damProjectData + .DamProjectCalculationSpecification.CurrentSpecification, + TimeSerieEntry = entry, + TimeStepIndex = entryIndex, + CalculationMessages = calculationMessages + }); + } } else { @@ -153,13 +159,29 @@ } } - // Perform the calculation - Parallel.Run(operationalCalculatorTasks, RunOperationalCalculatorTask, null, damProjectData.MaxCalculationCores); - foreach (var operationalCalculatorTask in operationalCalculatorTasks) + if (operationalCalculatorTasks.Count > 0) { - damProjectData.CalculationMessages.AddRange(operationalCalculatorTask.CalculationMessages); + // Perform the calculation + Parallel.Run(operationalCalculatorTasks, RunOperationalCalculatorTask, null, + damProjectData.MaxCalculationCores); + foreach (var operationalCalculatorTask in operationalCalculatorTasks) + { + damProjectData.CalculationMessages.AddRange(operationalCalculatorTask.CalculationMessages); + } + + damProjectData.OutputTimeSerieCollection = outputTimeSerieCollection; } - damProjectData.OutputTimeSerieCollection = outputTimeSerieCollection; + else + { + var logMessage = new LogMessage + { + MessageType = LogMessageType.Error, + Subject = null, + Message = string.Format(Resources.DesignCalculatorNoSegmentsWithFailureMechanismTypePresent, + damProjectData.DamProjectCalculationSpecification.CurrentSpecification.FailureMechanismSystemType.ToString()) + }; + damProjectData.CalculationMessages.Add(logMessage); + } } private void RunOperationalCalculatorTask(object operationalCalculatorTask) @@ -341,7 +363,20 @@ } break; case FailureMechanismSystemType.Piping: - throw new NotImplementedException(); + switch (currentSpecification.PipingModelType) + { + case PipingModelType.Bligh: + throw new NotImplementedException(); + case PipingModelType.SellmeijerVnk: + throw new NotImplementedException(); + case PipingModelType.Sellmeijer4Forces: + throw new NotImplementedException(); + case PipingModelType.Wti2017: + parameter = TimeSerieParameters.StabilityInsideFactor.ToString(); + break; + } + break; + } return parameter; }