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