Index: Ringtoets/GrassCoverErosionInwards/src/Ringtoets.GrassCoverErosionInwards.Plugin/GrassCoverErosionInwardsGuiPlugin.cs =================================================================== diff -u -r55e027f1f3573d97603297411504f2714e9819b1 -rb0341753cd4f8a71d8254bdd00e0555e957879c7 --- Ringtoets/GrassCoverErosionInwards/src/Ringtoets.GrassCoverErosionInwards.Plugin/GrassCoverErosionInwardsGuiPlugin.cs (.../GrassCoverErosionInwardsGuiPlugin.cs) (revision 55e027f1f3573d97603297411504f2714e9819b1) +++ Ringtoets/GrassCoverErosionInwards/src/Ringtoets.GrassCoverErosionInwards.Plugin/GrassCoverErosionInwardsGuiPlugin.cs (.../GrassCoverErosionInwardsGuiPlugin.cs) (revision b0341753cd4f8a71d8254bdd00e0555e957879c7) @@ -151,7 +151,7 @@ private static ExceedanceProbabilityCalculationActivity CreateHydraRingTargetProbabilityCalculationActivity(FailureMechanismSection failureMechanismSection, string hlcdDirectory, GrassCoverErosionInwardsCalculation calculation, - double norm) + double norm, double contribution) { var hydraulicBoundaryLocationId = (int) calculation.InputParameters.HydraulicBoundaryLocation.Id; var sectionLength = failureMechanismSection.GetSectionLength(); @@ -178,7 +178,7 @@ ParseBreakWater(inwardsInput) ), calculation.ClearOutput, - output => { ParseHydraRingOutput(calculation, norm, output); }); + output => { ParseHydraRingOutput(calculation, norm, contribution, output); }); } private static HydraRingBreakWater ParseBreakWater(GrassCoverErosionInwardsInput input) @@ -219,11 +219,11 @@ } } - private static void ParseHydraRingOutput(GrassCoverErosionInwardsCalculation calculation, double norm, ExceedanceProbabilityCalculationOutput output) + private static void ParseHydraRingOutput(GrassCoverErosionInwardsCalculation calculation, double norm, double contribution, ExceedanceProbabilityCalculationOutput output) { if (output != null) { - GrassCoverErosionInwardsOutputCalculationService.Calculate(calculation, norm, output.Beta); + GrassCoverErosionInwardsOutputCalculationService.Calculate(calculation, norm, contribution, output.Beta); calculation.NotifyObservers(); } else @@ -240,7 +240,9 @@ failureMechanism.Sections.First(), // TODO: Pass dike section based on cross section of calculation with reference line Path.GetDirectoryName(assessmentSection.HydraulicBoundaryDatabase.FilePath), calc, - assessmentSection.FailureMechanismContribution.Norm)).ToList()); + assessmentSection.FailureMechanismContribution.Norm, + failureMechanism.Contribution + )).ToList()); } private static string AllDataAvailable(IAssessmentSection assessmentSection, GrassCoverErosionInwardsFailureMechanism failureMechanism) @@ -284,7 +286,7 @@ { failureMechanism = failureMechanismContext.WrappedData; } - return failureMechanism != null && ReferenceEquals(view.Data, ((GrassCoverErosionInwardsFailureMechanism)failureMechanism).SectionResults); + return failureMechanism != null && ReferenceEquals(view.Data, ((GrassCoverErosionInwardsFailureMechanism) failureMechanism).SectionResults); } #endregion @@ -537,7 +539,8 @@ context.FailureMechanism.Sections.First(), // TODO: Pass dike section based on cross section of calculation with reference line Path.GetDirectoryName(context.AssessmentSection.HydraulicBoundaryDatabase.FilePath), calculation, - context.AssessmentSection.FailureMechanismContribution.Norm); + context.AssessmentSection.FailureMechanismContribution.Norm, + context.FailureMechanism.Contribution); ActivityProgressDialogRunner.Run(Gui.MainWindow, activity); } Index: Ringtoets/GrassCoverErosionInwards/src/Ringtoets.GrassCoverErosionInwards.Service/GrassCoverErosionInwardsOutputCalculationService.cs =================================================================== diff -u -r1f2fbaa211ff678a1171a5c0a67e9a94c350eab5 -rb0341753cd4f8a71d8254bdd00e0555e957879c7 --- Ringtoets/GrassCoverErosionInwards/src/Ringtoets.GrassCoverErosionInwards.Service/GrassCoverErosionInwardsOutputCalculationService.cs (.../GrassCoverErosionInwardsOutputCalculationService.cs) (revision 1f2fbaa211ff678a1171a5c0a67e9a94c350eab5) +++ Ringtoets/GrassCoverErosionInwards/src/Ringtoets.GrassCoverErosionInwards.Service/GrassCoverErosionInwardsOutputCalculationService.cs (.../GrassCoverErosionInwardsOutputCalculationService.cs) (revision b0341753cd4f8a71d8254bdd00e0555e957879c7) @@ -21,7 +21,9 @@ using System; using MathNet.Numerics.Distributions; +using Ringtoets.Common.Data.FailureMechanism; using Ringtoets.GrassCoverErosionInwards.Data; +using Ringtoets.Integration.Data; namespace Ringtoets.GrassCoverErosionInwards.Service { @@ -32,20 +34,22 @@ { // Inputs private readonly double norm; + private readonly double contribution; private readonly int lengthEffectN; private readonly double probability; // Results private double requiredProbability; - private double pTCrossAllowed; - private double pTCrossGrassCoverErosionInwards; + private double allowedCrossSectionProbability; + private double grassCoverErosionInwardsCrossSectionProbability; private double requiredReliability; private double reliability; private double factorOfSafety; - private GrassCoverErosionInwardsOutputCalculationService(double norm, int lengthEffectN, double probability) + private GrassCoverErosionInwardsOutputCalculationService(double norm, double contribution, int lengthEffectN, double probability) { this.norm = norm; + this.contribution = contribution/100; this.lengthEffectN = lengthEffectN; this.probability = probability; } @@ -54,16 +58,17 @@ /// Calculates the given the , , and . /// /// The calculation which is used. - /// The norm which has been defined on the assessment section. + /// The amount of contribution as a percentage [0-100] for the as part of the overall verdict. + /// The norm which has been defined on the . /// The probability result. /// Thrown when is null. - public static void Calculate(GrassCoverErosionInwardsCalculation calculation, double norm, double probability) + public static void Calculate(GrassCoverErosionInwardsCalculation calculation, double norm, double contribution, double probability) { if (calculation == null) { throw new ArgumentNullException("calculation"); } - var calculator = new GrassCoverErosionInwardsOutputCalculationService(norm, calculation.NormProbabilityInput.N, probability); + var calculator = new GrassCoverErosionInwardsOutputCalculationService(norm, contribution, calculation.NormProbabilityInput.N, probability); calculator.Calculate(); @@ -86,48 +91,38 @@ private void CalculateReliability() { requiredProbability = RequiredProbability(norm); - pTCrossAllowed = PtCrossAllowed(probability, norm, lengthEffectN); - pTCrossGrassCoverErosionInwards = PtCrossGrassCoverErosionInwards(); + allowedCrossSectionProbability = AllowedCrossSectionProbability(contribution, norm, lengthEffectN); + grassCoverErosionInwardsCrossSectionProbability = probability; } private void CalculateRequiredReliability() { - requiredReliability = RequiredReliability(pTCrossAllowed); - reliability = Reliability(pTCrossGrassCoverErosionInwards); + requiredReliability = RequiredReliability(allowedCrossSectionProbability); + reliability = grassCoverErosionInwardsCrossSectionProbability; } #region Sub calculations - private static double RequiredProbability(double contribution) + private static double RequiredProbability(double norm) { - return new Normal().InverseCumulativeDistribution(1 - 1.0/contribution); + return new Normal().InverseCumulativeDistribution(1 - 1.0/norm); } - private static double PtCrossAllowed(double probability, double contribution, double n) + private static double AllowedCrossSectionProbability(double probability, double contribution, double factorN) { - return probability*(1.0/contribution)/n; + return probability*(1.0/contribution)/factorN; } - private static double PtCrossGrassCoverErosionInwards() + private static double RequiredReliability(double allowedCrossSectionProbability) { - return 1.0/50000; + return new Normal().InverseCumulativeDistribution(1 - allowedCrossSectionProbability); } - private static double RequiredReliability(double pTCrossAllowed) + private static double FactorOfSafety(double reliability, double requiredReliability) { - return new Normal().InverseCumulativeDistribution(1 - pTCrossAllowed); + return reliability/requiredReliability; } - private static double Reliability(double pTCross) - { - return new Normal().InverseCumulativeDistribution(1 - pTCross); - } - - private static double FactorOfSafety(double betaCrossGekb, double betaCrossAllowed) - { - return betaCrossGekb/betaCrossAllowed; - } - #endregion } } \ No newline at end of file Index: Ringtoets/GrassCoverErosionInwards/src/Ringtoets.GrassCoverErosionInwards.Service/Ringtoets.GrassCoverErosionInwards.Service.csproj =================================================================== diff -u -ra053684de9667dfb70aa8cf669e22843c2bd39ed -rb0341753cd4f8a71d8254bdd00e0555e957879c7 --- Ringtoets/GrassCoverErosionInwards/src/Ringtoets.GrassCoverErosionInwards.Service/Ringtoets.GrassCoverErosionInwards.Service.csproj (.../Ringtoets.GrassCoverErosionInwards.Service.csproj) (revision a053684de9667dfb70aa8cf669e22843c2bd39ed) +++ Ringtoets/GrassCoverErosionInwards/src/Ringtoets.GrassCoverErosionInwards.Service/Ringtoets.GrassCoverErosionInwards.Service.csproj (.../Ringtoets.GrassCoverErosionInwards.Service.csproj) (revision b0341753cd4f8a71d8254bdd00e0555e957879c7) @@ -73,6 +73,11 @@ Ringtoets.Common.Data False + + {11F1F874-45AF-43E4-8AE5-15A5C9593E28} + Ringtoets.Integration.Data + False + {90DE728E-48EF-4665-AB38-3D88E41D9F4D} Ringtoets.GrassCoverErosionInwards.Data Index: Ringtoets/GrassCoverErosionInwards/test/Ringtoets.GrassCoverErosionInwards.Service.Test/GrassCoverErosionInwardsOutputCalculationServiceTest.cs =================================================================== diff -u -r1f2fbaa211ff678a1171a5c0a67e9a94c350eab5 -rb0341753cd4f8a71d8254bdd00e0555e957879c7 --- Ringtoets/GrassCoverErosionInwards/test/Ringtoets.GrassCoverErosionInwards.Service.Test/GrassCoverErosionInwardsOutputCalculationServiceTest.cs (.../GrassCoverErosionInwardsOutputCalculationServiceTest.cs) (revision 1f2fbaa211ff678a1171a5c0a67e9a94c350eab5) +++ Ringtoets/GrassCoverErosionInwards/test/Ringtoets.GrassCoverErosionInwards.Service.Test/GrassCoverErosionInwardsOutputCalculationServiceTest.cs (.../GrassCoverErosionInwardsOutputCalculationServiceTest.cs) (revision b0341753cd4f8a71d8254bdd00e0555e957879c7) @@ -35,7 +35,7 @@ public void Calculate_NullCalculation_ThrowsArgumentNullException() { // Setup & Call - TestDelegate test = () => GrassCoverErosionInwardsOutputCalculationService.Calculate(null, 0, 1); + TestDelegate test = () => GrassCoverErosionInwardsOutputCalculationService.Calculate(null, double.NaN, double.NaN, double.NaN); // Assert var exception = Assert.Throws(test); @@ -52,62 +52,85 @@ new GeneralNormProbabilityInput()); // Call - GrassCoverErosionInwardsOutputCalculationService.Calculate(calculation, norm, double.NaN); + GrassCoverErosionInwardsOutputCalculationService.Calculate(calculation, norm, double.NaN, double.NaN); // Assert RoundedDouble output = calculation.Output.RequiredProbability; Assert.AreEqual(expectedResult, output, output.GetAccuracy()); } [Test] - [TestCase(30000, 1, 4.149409984)] - [TestCase(30000, 0.24, 4.465183916)] - [TestCase(20000, 1, 4.055626981)] - [TestCase(20000, 0.24, 4.377587847)] - public void RequiredReliability_DifferentInputs_ReturnsExpectedValue(int norm, double probability, double expectedResult) + [TestCase(30000, 100, 4.149409984)] + [TestCase(30000, 24, 4.465183916)] + [TestCase(20000, 100, 4.055626981)] + [TestCase(20000, 24, 4.377587847)] + public void RequiredReliability_DifferentInputs_ReturnsExpectedValue(int norm, double contribution, double expectedResult) { // Setup var calculation = new GrassCoverErosionInwardsCalculation(new GeneralGrassCoverErosionInwardsInput(), new GeneralNormProbabilityInput()); // Call - GrassCoverErosionInwardsOutputCalculationService.Calculate(calculation, norm, probability); + GrassCoverErosionInwardsOutputCalculationService.Calculate(calculation, norm, contribution, double.NaN); // Assert RoundedDouble output = calculation.Output.RequiredReliability; Assert.AreEqual(expectedResult, output, output.GetAccuracy()); } [Test] - public void Reliability_DifferentInputs_ReturnsExpectedValue() + [TestCase(1.23456, 1.23456)] + [TestCase(789.123, 789.123)] + public void Reliability_DifferentInputs_ReturnsExpectedValue(double probability, double expectedResult) { // Setup var calculation = new GrassCoverErosionInwardsCalculation(new GeneralGrassCoverErosionInwardsInput(), new GeneralNormProbabilityInput()); // Call - GrassCoverErosionInwardsOutputCalculationService.Calculate(calculation, double.NaN, double.NaN); + GrassCoverErosionInwardsOutputCalculationService.Calculate(calculation, double.NaN, double.NaN, probability); // Assert RoundedDouble output = calculation.Output.Reliability; - Assert.AreEqual(4.107479655, output, output.GetAccuracy()); + Assert.AreEqual(expectedResult, output, output.GetAccuracy()); } [Test] - [TestCase(30000, 1, 0.989894869)] - [TestCase(30000, 0.24, 0.919890363)] - [TestCase(20000, 1, 1.012785366)] - [TestCase(20000, 0.24, 0.938297482)] - public void FactorOfSafety_DifferentInputs_ReturnsExpectedValue(int norm, double probability, double expectedResult) + [TestCase(1, 1)] + [TestCase(60000, 60000)] + public void Probability_Always_ReturnsExpectedValue(double probability, double expectedResult) { // Setup var calculation = new GrassCoverErosionInwardsCalculation(new GeneralGrassCoverErosionInwardsInput(), new GeneralNormProbabilityInput()); // Call - GrassCoverErosionInwardsOutputCalculationService.Calculate(calculation, norm, probability); + GrassCoverErosionInwardsOutputCalculationService.Calculate(calculation, double.NaN, double.NaN, probability); // Assert + RoundedDouble output = calculation.Output.Probability; + Assert.AreEqual(expectedResult, output, output.GetAccuracy()); + } + + [Test] + [TestCase(30000, 100, 4.107479655, 0.989894869)] + [TestCase(30000, 100, 4.149409984, 1)] + [TestCase(30000, 24, 4.107479655, 0.919890363)] + [TestCase(30000, 24, 4.149409984, 0.929280868)] + [TestCase(20000, 100, 4.107479655, 1.012785366)] + [TestCase(20000, 100, 4.149409984, 1.023124169)] + [TestCase(20000, 24, 4.107479655, 0.938297482)] + [TestCase(20000, 24, 4.149409984, 0.947875892)] + public void FactorOfSafety_DifferentInputs_ReturnsExpectedValue(int norm, double contribution, double probability, double expectedResult) + { + // Setup + var calculation = new GrassCoverErosionInwardsCalculation(new GeneralGrassCoverErosionInwardsInput(), + new GeneralNormProbabilityInput()); + + // Call + GrassCoverErosionInwardsOutputCalculationService.Calculate(calculation, norm, contribution, probability); + + // Assert RoundedDouble output = calculation.Output.FactorOfSafety; Assert.AreEqual(expectedResult, output, output.GetAccuracy()); }