Index: Ringtoets/DuneErosion/src/Ringtoets.DuneErosion.Service/DuneErosionBoundaryCalculationService.cs =================================================================== diff -u -r52b71daa08d9133ecbb4b516cc585118e7ba505b -rfb58ab4a91a86c0b07665d31beb2334bdbd18413 --- Ringtoets/DuneErosion/src/Ringtoets.DuneErosion.Service/DuneErosionBoundaryCalculationService.cs (.../DuneErosionBoundaryCalculationService.cs) (revision 52b71daa08d9133ecbb4b516cc585118e7ba505b) +++ Ringtoets/DuneErosion/src/Ringtoets.DuneErosion.Service/DuneErosionBoundaryCalculationService.cs (.../DuneErosionBoundaryCalculationService.cs) (revision fb58ab4a91a86c0b07665d31beb2334bdbd18413) @@ -21,8 +21,10 @@ using System; using System.IO; +using Core.Common.Utils; using log4net; using Ringtoets.Common.Data.AssessmentSection; +using Ringtoets.Common.Data.Hydraulics; using Ringtoets.Common.Service; using Ringtoets.DuneErosion.Data; using Ringtoets.DuneErosion.Service.Properties; @@ -68,17 +70,25 @@ CalculationServiceHelper.LogCalculationBeginTime(calculationName); var exceptionThrown = false; - var inputValid = false; + var inputValid = true; try { - DunesBoundaryConditionsCalculationInput calculationInput = CreateInput(duneLocation, failureMechanism, assessmentSection, hydraulicBoundaryDatabaseFilePath); - inputValid = true; + double mechanismSpecificNorm = failureMechanism.GetMechanismSpecificNorm(assessmentSection); + DunesBoundaryConditionsCalculationInput calculationInput = CreateInput(duneLocation, mechanismSpecificNorm, hydraulicBoundaryDatabaseFilePath); calculator.Calculate(calculationInput); if (string.IsNullOrEmpty(calculator.LastErrorFileContent)) { + duneLocation.Output = CreateDuneLocationOutput(duneLocation.Name, calculationInput.Beta, mechanismSpecificNorm); } } + catch (ArgumentException e) + { + log.Error(e.Message); + exceptionThrown = true; + inputValid = false; + throw; + } catch (HydraRingFileParserException) { if (!canceled) @@ -120,7 +130,6 @@ { throw new HydraRingCalculationException(lastErrorFileContent); } - } } @@ -137,24 +146,30 @@ canceled = true; } - private static DunesBoundaryConditionsCalculationInput CreateInput(DuneLocation duneLocation, - DuneErosionFailureMechanism failureMechanism, - IAssessmentSection assessmentSection, - string hydraulicBoundaryDatabaseFilePath) + private DuneLocationOutput CreateDuneLocationOutput(string duneLocationName, double targetReliability, double targetProbability) { - double mechanismSpecificNorm; + var reliability = calculator.ReliabilityIndex; + var probability = StatisticsConverter.ReliabilityToProbability(reliability); - try + CalculationConvergence converged = RingtoetsCommonDataCalculationService.CalculationConverged( + calculator.ReliabilityIndex, targetProbability); + + if (converged != CalculationConvergence.CalculatedConverged) { - mechanismSpecificNorm = failureMechanism.GetMechanismSpecificNorm(assessmentSection); + log.WarnFormat(Resources.DuneErosionBoundaryCalculationService_CreateDuneLocationOutput_Calculation_for_location_0_not_converged, duneLocationName); } - catch (ArgumentException e) - { - log.Error(e.Message); - throw; - } - var dunesBoundaryConditionsCalculationInput = new DunesBoundaryConditionsCalculationInput(1, duneLocation.Id, mechanismSpecificNorm, duneLocation.Orientation); + return new DuneLocationOutput(calculator.WaterLevel, calculator.WaveHeight, + calculator.WavePeriod, targetProbability, + targetReliability, probability, + reliability, converged); + } + + private static DunesBoundaryConditionsCalculationInput CreateInput(DuneLocation duneLocation, + double norm, + string hydraulicBoundaryDatabaseFilePath) + { + var dunesBoundaryConditionsCalculationInput = new DunesBoundaryConditionsCalculationInput(1, duneLocation.Id, norm, duneLocation.Orientation); HydraRingSettingsDatabaseHelper.AssignSettingsFromDatabase(dunesBoundaryConditionsCalculationInput, hydraulicBoundaryDatabaseFilePath); return dunesBoundaryConditionsCalculationInput; } Index: Ringtoets/DuneErosion/src/Ringtoets.DuneErosion.Service/Properties/Resources.Designer.cs =================================================================== diff -u -rc3cdf6d9fadf4ad1c50d1175979c94e3e9733ed6 -rfb58ab4a91a86c0b07665d31beb2334bdbd18413 --- Ringtoets/DuneErosion/src/Ringtoets.DuneErosion.Service/Properties/Resources.Designer.cs (.../Resources.Designer.cs) (revision c3cdf6d9fadf4ad1c50d1175979c94e3e9733ed6) +++ Ringtoets/DuneErosion/src/Ringtoets.DuneErosion.Service/Properties/Resources.Designer.cs (.../Resources.Designer.cs) (revision fb58ab4a91a86c0b07665d31beb2334bdbd18413) @@ -111,5 +111,15 @@ "on_no_error_report", resourceCulture); } } + + /// + /// Looks up a localized string similar to Duinafslag berekening voor locatie '{0}' is niet geconvergeerd.. + /// + internal static string DuneErosionBoundaryCalculationService_CreateDuneLocationOutput_Calculation_for_location_0_not_converged { + get { + return ResourceManager.GetString("DuneErosionBoundaryCalculationService_CreateDuneLocationOutput_Calculation_for_lo" + + "cation_0_not_converged", resourceCulture); + } + } } } Index: Ringtoets/DuneErosion/src/Ringtoets.DuneErosion.Service/Properties/Resources.resx =================================================================== diff -u -rc3cdf6d9fadf4ad1c50d1175979c94e3e9733ed6 -rfb58ab4a91a86c0b07665d31beb2334bdbd18413 --- Ringtoets/DuneErosion/src/Ringtoets.DuneErosion.Service/Properties/Resources.resx (.../Resources.resx) (revision c3cdf6d9fadf4ad1c50d1175979c94e3e9733ed6) +++ Ringtoets/DuneErosion/src/Ringtoets.DuneErosion.Service/Properties/Resources.resx (.../Resources.resx) (revision fb58ab4a91a86c0b07665d31beb2334bdbd18413) @@ -127,4 +127,7 @@ De berekening voor duinafslag '{0}' is niet gelukt. Er is geen foutrapport beschikbaar. + + Duinafslag berekening voor locatie '{0}' is niet geconvergeerd. + \ No newline at end of file Index: Ringtoets/DuneErosion/src/Ringtoets.DuneErosion.Service/Ringtoets.DuneErosion.Service.csproj =================================================================== diff -u -rc3cdf6d9fadf4ad1c50d1175979c94e3e9733ed6 -rfb58ab4a91a86c0b07665d31beb2334bdbd18413 --- Ringtoets/DuneErosion/src/Ringtoets.DuneErosion.Service/Ringtoets.DuneErosion.Service.csproj (.../Ringtoets.DuneErosion.Service.csproj) (revision c3cdf6d9fadf4ad1c50d1175979c94e3e9733ed6) +++ Ringtoets/DuneErosion/src/Ringtoets.DuneErosion.Service/Ringtoets.DuneErosion.Service.csproj (.../Ringtoets.DuneErosion.Service.csproj) (revision fb58ab4a91a86c0b07665d31beb2334bdbd18413) @@ -64,6 +64,11 @@ Core.Common.Base False + + {F49BD8B2-332A-4C91-A196-8CCE0A2C7D98} + Core.Common.Utils + False + {D4200F43-3F72-4F42-AF0A-8CED416A38EC} Ringtoets.Common.Data Index: Ringtoets/DuneErosion/test/Ringtoets.DuneErosion.Service.Test/DuneErosionBoundaryCalculationServiceTest.cs =================================================================== diff -u -rc3cdf6d9fadf4ad1c50d1175979c94e3e9733ed6 -rfb58ab4a91a86c0b07665d31beb2334bdbd18413 --- Ringtoets/DuneErosion/test/Ringtoets.DuneErosion.Service.Test/DuneErosionBoundaryCalculationServiceTest.cs (.../DuneErosionBoundaryCalculationServiceTest.cs) (revision c3cdf6d9fadf4ad1c50d1175979c94e3e9733ed6) +++ Ringtoets/DuneErosion/test/Ringtoets.DuneErosion.Service.Test/DuneErosionBoundaryCalculationServiceTest.cs (.../DuneErosionBoundaryCalculationServiceTest.cs) (revision fb58ab4a91a86c0b07665d31beb2334bdbd18413) @@ -24,6 +24,7 @@ using System.Linq; using Core.Common.Base.Geometry; using Core.Common.TestUtil; +using Core.Common.Utils; using NUnit.Framework; using Rhino.Mocks; using Ringtoets.Common.Data.AssessmentSection; @@ -34,6 +35,7 @@ using Ringtoets.HydraRing.Calculation.Data.Input.Hydraulics; using Ringtoets.HydraRing.Calculation.Exceptions; using Ringtoets.HydraRing.Calculation.TestUtil.Calculator; +using Ringtoets.Common.Data.TestUtil; namespace Ringtoets.DuneErosion.Service.Test { @@ -142,6 +144,119 @@ } [Test] + public void Calculate_CalculationRan_SetOutput() + { + // Setup + const double norm = 1.0/200; + const double contribution = 10; + const string ringId = "1"; + var failureMechanism = new DuneErosionFailureMechanism + { + Contribution = contribution + }; + + var mocks = new MockRepository(); + var assessmentSection = mocks.Stub(); + assessmentSection.Stub(a => a.Id).Return(ringId); + assessmentSection.Stub(a => a.GetFailureMechanisms()).Return(new[] + { + failureMechanism + }); + assessmentSection.Stub(a => a.FailureMechanismContribution).Return(new FailureMechanismContribution(new[] + { + failureMechanism + }, 1, norm)); + mocks.ReplayAll(); + + var duneLocation = new DuneLocation(1300001, "test", new Point2D(0, 0), 3, 0, 0, 0.000007); + + // Precondition + Assert.IsNull(duneLocation.Output); + + using (new HydraRingCalculatorFactoryConfig()) + { + var testCalculator = ((TestHydraRingCalculatorFactory) HydraRingCalculatorFactory.Instance).DunesBoundaryConditionsCalculator; + testCalculator.ReliabilityIndex = 3.27052; + testCalculator.WaterLevel = 4.82912; + testCalculator.WaveHeight = 2.88936; + testCalculator.WavePeriod = 10.65437; + + // Call + Action test = () => new DuneErosionBoundaryCalculationService().Calculate(duneLocation, failureMechanism, assessmentSection, validFilePath); + + // Assert + TestHelper.AssertLogMessages(test, messages => + { + var msgs = messages.ToArray(); + Assert.AreEqual(3, msgs.Length); + StringAssert.StartsWith(string.Format("Berekening van '{0}' gestart om: ", duneLocation.Name), msgs[0]); + StringAssert.StartsWith("Duinafslag berekening is uitgevoerd op de tijdelijke locatie", msgs[1]); + StringAssert.StartsWith(string.Format("Berekening van '{0}' beƫindigd om: ", duneLocation.Name), msgs[2]); + }); + double mechanismSpecificNorm = failureMechanism.GetMechanismSpecificNorm(assessmentSection); + double targetReliability = StatisticsConverter.ProbabilityToReliability(mechanismSpecificNorm); + double calculatedProbability = StatisticsConverter.ReliabilityToProbability(testCalculator.ReliabilityIndex); + + Assert.IsNotNull(duneLocation.Output); + Assert.AreEqual(testCalculator.ReliabilityIndex, duneLocation.Output.CalculatedReliability.Value); + Assert.AreEqual(calculatedProbability, duneLocation.Output.CalculatedProbability); + Assert.AreEqual(mechanismSpecificNorm, duneLocation.Output.TargetProbability); + Assert.AreEqual(targetReliability, duneLocation.Output.TargetReliability, duneLocation.Output.TargetReliability.GetAccuracy()); + Assert.AreEqual(testCalculator.WaterLevel, duneLocation.Output.WaterLevel, duneLocation.Output.WaterLevel.GetAccuracy()); + Assert.AreEqual(testCalculator.WaveHeight, duneLocation.Output.WaveHeight, duneLocation.Output.WaveHeight.GetAccuracy()); + Assert.AreEqual(testCalculator.WavePeriod, duneLocation.Output.WavePeriod, duneLocation.Output.WavePeriod.GetAccuracy()); + } + } + + [Test] + public void Calculate_CalculationRanNotConverged_LogMessage() + { + // Setup + const double norm = 1.0/200; + const double contribution = 10; + const string ringId = "1"; + var failureMechanism = new DuneErosionFailureMechanism + { + Contribution = contribution + }; + + var mocks = new MockRepository(); + var assessmentSection = mocks.Stub(); + assessmentSection.Stub(a => a.Id).Return(ringId); + assessmentSection.Stub(a => a.GetFailureMechanisms()).Return(new[] + { + failureMechanism + }); + assessmentSection.Stub(a => a.FailureMechanismContribution).Return(new FailureMechanismContribution(new[] + { + failureMechanism + }, 1, norm)); + mocks.ReplayAll(); + + var duneLocation = new DuneLocation(1300001, "test", new Point2D(0, 0), 3, 0, 0, 0.000007); + + using (new HydraRingCalculatorFactoryConfig()) + { + var testCalculator = ((TestHydraRingCalculatorFactory) HydraRingCalculatorFactory.Instance).DunesBoundaryConditionsCalculator; + testCalculator.ReliabilityIndex = 0.01; + + // Call + Action test = () => new DuneErosionBoundaryCalculationService().Calculate(duneLocation, failureMechanism, assessmentSection, validFilePath); + + // Assert + TestHelper.AssertLogMessages(test, messages => + { + var msgs = messages.ToArray(); + Assert.AreEqual(4, msgs.Length); + StringAssert.StartsWith(string.Format("Berekening van '{0}' gestart om: ", duneLocation.Name), msgs[0]); + StringAssert.StartsWith(string.Format("Duinafslag berekening voor locatie '{0}' is niet geconvergeerd.", duneLocation.Name), msgs[1]); + StringAssert.StartsWith("Duinafslag berekening is uitgevoerd op de tijdelijke locatie", msgs[2]); + StringAssert.StartsWith(string.Format("Berekening van '{0}' beƫindigd om: ", duneLocation.Name), msgs[3]); + }); + } + } + + [Test] public void Calculate_CancelCalculationWithValidInput_CancelsCalculator() { // Setup Index: Ringtoets/DuneErosion/test/Ringtoets.DuneErosion.Service.Test/Ringtoets.DuneErosion.Service.Test.csproj =================================================================== diff -u -rb002ca3566c04bde5fe85396b6e972c41ba3b9f1 -rfb58ab4a91a86c0b07665d31beb2334bdbd18413 --- Ringtoets/DuneErosion/test/Ringtoets.DuneErosion.Service.Test/Ringtoets.DuneErosion.Service.Test.csproj (.../Ringtoets.DuneErosion.Service.Test.csproj) (revision b002ca3566c04bde5fe85396b6e972c41ba3b9f1) +++ Ringtoets/DuneErosion/test/Ringtoets.DuneErosion.Service.Test/Ringtoets.DuneErosion.Service.Test.csproj (.../Ringtoets.DuneErosion.Service.Test.csproj) (revision fb58ab4a91a86c0b07665d31beb2334bdbd18413) @@ -72,6 +72,10 @@ {3bbfd65b-b277-4e50-ae6d-bd24c3434609} Core.Common.Base + + {F49BD8B2-332A-4C91-A196-8CCE0A2C7D98} + Core.Common.Utils + {D749EE4C-CE50-4C17-BF01-9A953028C126} Core.Common.TestUtil @@ -80,6 +84,10 @@ {D4200F43-3F72-4F42-AF0A-8CED416A38EC} Ringtoets.Common.Data + + {4843D6E5-066F-4795-94F5-1D53932DD03C} + Ringtoets.Common.Data.TestUtil + {888d4097-8bc2-4703-9fb1-8744c94d525e} Ringtoets.HydraRing.Calculation