Index: DamEngine/trunk/src/Deltares.DamEngine.IntegrationTests/IntegrationTests/MacroStabilityInwardsTests.cs =================================================================== diff -u -r4498 -r4513 --- DamEngine/trunk/src/Deltares.DamEngine.IntegrationTests/IntegrationTests/MacroStabilityInwardsTests.cs (.../MacroStabilityInwardsTests.cs) (revision 4498) +++ DamEngine/trunk/src/Deltares.DamEngine.IntegrationTests/IntegrationTests/MacroStabilityInwardsTests.cs (.../MacroStabilityInwardsTests.cs) (revision 4513) @@ -567,7 +567,7 @@ } Output output = GeneralHelper.RunAfterInputValidation(engineInterface, true, "Results_Single_Core" + ".xml"); - + Assert.AreEqual(18, output.Results.CalculationResults.Length); Assert.AreEqual(3020, output.Results.CalculationMessages.Length); int resultsFound = CheckLargeResultsSets.CheckResultsDesignBishopAdaptionWithScenariosForHeadPl3CalculatesCorrect( @@ -689,10 +689,11 @@ // Note Bka: it already failed, with message "The preparation for this calculation failed". // Now for a different reason. Probably because DTH is not yet taken into account with testing/adjusting the data. + const string message = "The error calculation message is not has expected."; Assert.IsTrue(output.Results.CalculationMessages[0].Message1.Contains("Location 'DWP_1', subsoil scenario 'DWP_1.sti', design scenario '1': " + - "The calculation failed with error message 'Value cannot be null.")); + "The calculation failed with error message 'Value cannot be null."), message); Assert.IsTrue(output.Results.CalculationMessages[0].Message1.Contains("Location 'DWP_1', subsoil scenario 'DWP_1.sti', design scenario '1': " + - "The preparation for this calculation failed.")); + "The preparation for this calculation failed."), message); } [Test] Index: DamEngine/trunk/src/Deltares.DamEngine.TestHelpers/GeneralHelper.cs =================================================================== diff -u -r4479 -r4513 --- DamEngine/trunk/src/Deltares.DamEngine.TestHelpers/GeneralHelper.cs (.../GeneralHelper.cs) (revision 4479) +++ DamEngine/trunk/src/Deltares.DamEngine.TestHelpers/GeneralHelper.cs (.../GeneralHelper.cs) (revision 4513) @@ -22,7 +22,9 @@ using System; using System.Collections.Generic; using System.IO; +using System.Linq; using System.Text; +using Deltares.DamEngine.Data.Design; using Deltares.DamEngine.Data.General; using Deltares.DamEngine.Data.Standard.Logging; using Deltares.DamEngine.Interface; @@ -54,7 +56,7 @@ var engineInterface = new EngineInterface(inputString); return RunAfterInputValidation(engineInterface, areResultsExpected, outputXml); } - + public static Output RunAfterInputValidation(EngineInterface engineInterface, bool areResultsExpected = true, string outputXml = "") { // Validate input @@ -65,8 +67,9 @@ { extraValidationMessage = ", see output xml in debugger"; } + Assert.IsNull(validationMessages, "Validation should succeed but does not" + extraValidationMessage); - + // Run calculation string outputString = engineInterface.Run(); Assert.IsNotNull(outputString); @@ -75,15 +78,16 @@ { File.WriteAllText("Output.xml", outputString, Encoding.Unicode); } - + CheckDependencyOnStiFiles(output); - + // Evaluate results if (!areResultsExpected) { Assert.IsNull(output.Results.CalculationResults, "No results are expected"); return output; } + bool isNoResultAvailable; switch (engineInterface.DamProjectData.DamProjectType) { @@ -94,15 +98,19 @@ isNoResultAvailable = output.Results.OperationalOutputTimeSeries.IsNullOrEmpty(); break; } + if (!isNoResultAvailable) { + CheckConsistencyOfAdaptGeometryResults(engineInterface, output.Results); return output; } + string assertMessage = "No results available."; foreach (var calcMessage in output.Results.CalculationMessages) { assertMessage = assertMessage + Environment.NewLine + calcMessage.Message1; } + Assert.IsNotNull(output.Results.CalculationResults, assertMessage); return output; } @@ -111,11 +119,107 @@ { foreach (var calcMessage in output.Results.CalculationMessages) { - if ((calcMessage.MessageType == MessageMessageType.Error) & calcMessage.Message1.Contains("The preparation for this calculation failed")) + if ((calcMessage.MessageType == MessageMessageType.Error) & calcMessage.Message1.Contains("The preparation for this " + + "calculation failed")) { - var assertMessage = "No results available due to dependency on 2D geometries (sti files) and the old MacroStability kernel wrapper implementation"; + var assertMessage = "No results available due to dependency on 2D geometries (sti files) and the old " + + "MacroStability kernel wrapper implementation"; Assert.IsNotNull(output.Results.CalculationResults, assertMessage); } } } + + private static void CheckConsistencyOfAdaptGeometryResults(EngineInterface engineInterface, OutputResults outputResults) + { + if (engineInterface.DamProjectData.DamProjectCalculationSpecification.AnalysisTypeForSerializationPurposeOnly == AnalysisType.AdaptGeometry) + { + bool isGeometryAdapted = false; + foreach (DesignResult calculationResult in outputResults.CalculationResults) + { + bool isDesignSuccessful = IsAdaptGeometrySuccessful(outputResults.CalculationMessages, calculationResult); + double fosRequired = FetchRequiredFactor(engineInterface, calculationResult.ScenarioName, calculationResult.LocationName); + double fosCalculated = FetchCalculatedFactor(engineInterface, calculationResult); + + string fileName = calculationResult.BaseFileName; + bool isGeometryAdaptedInThisLocation = fileName.Contains("Ite(") && !fileName.Contains("Ite(1)"); + isGeometryAdapted = isGeometryAdapted || isGeometryAdaptedInThisLocation; + + if (isGeometryAdaptedInThisLocation) + { + if (isDesignSuccessful) + { + const string message = "After adapting the geometry, the calculated safety factor is less than the" + + " required safety factor; this is unexpected."; + Assert.IsTrue(fosCalculated >= fosRequired, message); + } + else + { + const string message = "As the design was not successful and had to stop, the calculated safety " + + "factor should be less than the required safety factor but this is not the case."; + Assert.IsTrue(fosRequired >= fosCalculated, message); + } + } + } + Assert.IsTrue(isGeometryAdapted, "The AnalyseType is set to AdaptGeometry in the input, however the geometry was " + + "not adapted in any location. Either set the AnalysisType to NoAdaptation or " + + "increase the required safety factor."); + } + } + + private static bool IsAdaptGeometrySuccessful(Message[] messages, DesignResult results) + { + foreach (var message in messages) + { + string location = "Location '" + results.LocationName + "'"; + string profile = "subsoil scenario '" + results.ProfileName + "'"; + string scenario = "design scenario '" + results.ScenarioName + "'"; + if (message.Message1.Contains("The design was not successful.") && message.Message1.Contains(location) && + message.Message1.Contains(profile) && message.Message1.Contains(scenario)) + { + return false; + } + } + return true; + } + + private static double FetchRequiredFactor(EngineInterface engineInterface, string scenarioName, string locationName) + { + foreach (Location location in engineInterface.DamProjectData.Dike.Locations) + { + foreach (DesignScenario scenario in location.Scenarios) + { + if (location.Name == locationName && scenario.LocationScenarioID == scenarioName) + { + switch (engineInterface.DamProjectData.DamProjectCalculationSpecification.CurrentSpecification.FailureMechanismSystemType) + { + case FailureMechanismSystemType.StabilityInside: + return scenario.RequiredSafetyFactorStabilityInnerSlope; + + case FailureMechanismSystemType.StabilityOutside: + return scenario.RequiredSafetyFactorStabilityOuterSlope; + + case FailureMechanismSystemType.Piping: + return scenario.RequiredSafetyFactorPiping; + default: + throw new ArgumentOutOfRangeException(); + } + } + } + } + return 999; + } + + private static double FetchCalculatedFactor(EngineInterface engineInterface, DesignResult results) + { + switch (engineInterface.DamProjectData.DamProjectCalculationSpecification.CurrentSpecification.FailureMechanismSystemType) + { + case FailureMechanismSystemType.StabilityInside: + case FailureMechanismSystemType.StabilityOutside: + return results.StabilityDesignResults.SafetyFactor; + case FailureMechanismSystemType.Piping: + return results.PipingDesignResults.Wti2017BackwardErosionFactor; + default: + throw new ArgumentOutOfRangeException(); + } + } } \ No newline at end of file Index: DamEngine/trunk/src/Deltares.DamEngine.Calculators/KernelWrappers/WtiPipingSellmeijerRevised/WtiPipingSellmeijerRevisedKernelWrapper.cs =================================================================== diff -u -r4412 -r4513 --- DamEngine/trunk/src/Deltares.DamEngine.Calculators/KernelWrappers/WtiPipingSellmeijerRevised/WtiPipingSellmeijerRevisedKernelWrapper.cs (.../WtiPipingSellmeijerRevisedKernelWrapper.cs) (revision 4412) +++ DamEngine/trunk/src/Deltares.DamEngine.Calculators/KernelWrappers/WtiPipingSellmeijerRevised/WtiPipingSellmeijerRevisedKernelWrapper.cs (.../WtiPipingSellmeijerRevisedKernelWrapper.cs) (revision 4513) @@ -377,11 +377,11 @@ ThrowWhenKernelInputNull(damPipingInput); ThrowWhenDamKernelInputNull(damKernelInput); ThrowWhenKernelOutputNull(damPipingOutput); - double fosRequiered = damKernelInput.Location.ModelFactors.RequiredSafetyFactorPiping; + double fosRequired = damKernelInput.Location.ModelFactors.RequiredSafetyFactorPiping; double fosAchieved = damPipingOutput.FoSbe; - evaluationMessage = String.Format(Resources.FactorAchievedVsFactorRequired, fosAchieved, fosRequiered); + evaluationMessage = String.Format(Resources.FactorAchievedVsFactorRequired, fosAchieved, fosRequired); designAdvise = DesignAdvise.None; - return (fosAchieved >= fosRequiered); + return (fosAchieved >= fosRequired); } ///