Index: Ringtoets/Piping/src/Ringtoets.Piping.Service/PipingCalculationService.cs =================================================================== diff -u -r0dfaf04c32ddd8f2ccfe1e244bdc6efcbb3b6857 -r7751f40a2df9299c4510003b45dac7d574cd97c2 --- Ringtoets/Piping/src/Ringtoets.Piping.Service/PipingCalculationService.cs (.../PipingCalculationService.cs) (revision 0dfaf04c32ddd8f2ccfe1e244bdc6efcbb3b6857) +++ Ringtoets/Piping/src/Ringtoets.Piping.Service/PipingCalculationService.cs (.../PipingCalculationService.cs) (revision 7751f40a2df9299c4510003b45dac7d574cd97c2) @@ -21,6 +21,7 @@ using System.Collections.Generic; using System.Linq; +using Core.Common.Base.Data; using Ringtoets.Common.Service; using Ringtoets.Piping.Data; using Ringtoets.Piping.KernelWrapper; @@ -200,6 +201,16 @@ { validationResult.Add(Resources.PipingCalculationService_ValidateInput_Cannot_derive_SaturatedVolumicWeight); } + else + { + var saturatedVolumicWeightOfCoverageLayer = + PipingSemiProbabilisticDesignValueFactory.GetSaturatedVolumicWeightOfCoverageLayer(inputParameters).GetDesignValue(); + + if (saturatedVolumicWeightOfCoverageLayer < inputParameters.WaterVolumetricWeight) + { + validationResult.Add(Resources.PipingCalculationService_ValidateInput_SaturatedVolumicWeightCoverageLayer_must_be_larger_than_WaterVolumetricWeight); + } + } } } } Index: Ringtoets/Piping/src/Ringtoets.Piping.Service/Properties/Resources.Designer.cs =================================================================== diff -u -r7ee19b11cabfc6cb2ba1ab895462b024a621294b -r7751f40a2df9299c4510003b45dac7d574cd97c2 --- Ringtoets/Piping/src/Ringtoets.Piping.Service/Properties/Resources.Designer.cs (.../Resources.Designer.cs) (revision 7ee19b11cabfc6cb2ba1ab895462b024a621294b) +++ Ringtoets/Piping/src/Ringtoets.Piping.Service/Properties/Resources.Designer.cs (.../Resources.Designer.cs) (revision 7751f40a2df9299c4510003b45dac7d574cd97c2) @@ -249,6 +249,16 @@ } /// + /// Looks up a localized string similar to Het verzadigd volumetrisch gewicht van de deklaag moet groter zijn dan het volumetrisch gewicht van water.. + /// + internal static string PipingCalculationService_ValidateInput_SaturatedVolumicWeightCoverageLayer_must_be_larger_than_WaterVolumetricWeight { + get { + return ResourceManager.GetString("PipingCalculationService_ValidateInput_SaturatedVolumicWeightCoverageLayer_must_b" + + "e_larger_than_WaterVolumetricWeight", resourceCulture); + } + } + + /// /// Looks up a localized string similar to Veiligheidsfactor voor piping kan niet worden berekend.. /// internal static string PipingSemiProbabilisticCalculationService_ValidateOutputOnCalculation_Factor_of_safety_cannot_be_calculated { Index: Ringtoets/Piping/src/Ringtoets.Piping.Service/Properties/Resources.resx =================================================================== diff -u -r7ee19b11cabfc6cb2ba1ab895462b024a621294b -r7751f40a2df9299c4510003b45dac7d574cd97c2 --- Ringtoets/Piping/src/Ringtoets.Piping.Service/Properties/Resources.resx (.../Resources.resx) (revision 7ee19b11cabfc6cb2ba1ab895462b024a621294b) +++ Ringtoets/Piping/src/Ringtoets.Piping.Service/Properties/Resources.resx (.../Resources.resx) (revision 7751f40a2df9299c4510003b45dac7d574cd97c2) @@ -174,4 +174,7 @@ Gespecificeerde waarde voor d70 ({0} m) ligt buiten het geldigheidsbereik van dit model. Geldige waarden liggen tussen 0.000063 m en 0.0005 m. + + Het verzadigd volumetrisch gewicht van de deklaag moet groter zijn dan het volumetrisch gewicht van water. + \ No newline at end of file Index: Ringtoets/Piping/test/Ringtoets.Piping.Service.Test/PipingCalculationServiceTest.cs =================================================================== diff -u -r7ee19b11cabfc6cb2ba1ab895462b024a621294b -r7751f40a2df9299c4510003b45dac7d574cd97c2 --- Ringtoets/Piping/test/Ringtoets.Piping.Service.Test/PipingCalculationServiceTest.cs (.../PipingCalculationServiceTest.cs) (revision 7ee19b11cabfc6cb2ba1ab895462b024a621294b) +++ Ringtoets/Piping/test/Ringtoets.Piping.Service.Test/PipingCalculationServiceTest.cs (.../PipingCalculationServiceTest.cs) (revision 7751f40a2df9299c4510003b45dac7d574cd97c2) @@ -426,8 +426,8 @@ new PipingSoilLayer(10.5) { IsAquifer = false, - BelowPhreaticLevelDeviation = random.GetFromRange(1e-6, 999.999), - BelowPhreaticLevelMean = random.GetFromRange(10.0, 999.999), + BelowPhreaticLevelDeviation = random.GetFromRange(1e-6, 5.0), + BelowPhreaticLevelMean = random.GetFromRange(15.0, 999.999), BelowPhreaticLevelShift = random.GetFromRange(1e-6, 10.0) }, incompletePipingSoilLayer @@ -588,6 +588,7 @@ var random = new Random(21); var belowPhreaticLevelDeviation = random.NextDouble(); var belowPhreaticLevelShift = random.NextDouble(); + var belowPhreaticLevelMeanBase = 15.0; var profile = new PipingSoilProfile(string.Empty, 0.0, new[] { @@ -596,14 +597,14 @@ IsAquifer = false, BelowPhreaticLevelDeviation = belowPhreaticLevelDeviation, BelowPhreaticLevelShift = belowPhreaticLevelShift, - BelowPhreaticLevelMean = 0.1 + belowPhreaticLevelShift + random.NextDouble() + BelowPhreaticLevelMean = belowPhreaticLevelMeanBase + belowPhreaticLevelShift + random.NextDouble() }, new PipingSoilLayer(8.5) { IsAquifer = false, BelowPhreaticLevelDeviation = belowPhreaticLevelDeviation, BelowPhreaticLevelShift = belowPhreaticLevelShift, - BelowPhreaticLevelMean = 0.1 + belowPhreaticLevelShift + random.NextDouble() + BelowPhreaticLevelMean = belowPhreaticLevelMeanBase + belowPhreaticLevelShift + random.NextDouble() }, new PipingSoilLayer(5.0) { @@ -661,8 +662,8 @@ new PipingSoilLayer(10.5) { IsAquifer = false, - BelowPhreaticLevelDeviation = random.GetFromRange(1e-6, 999.999), - BelowPhreaticLevelMean = random.GetFromRange(10.0, 999.999), + BelowPhreaticLevelDeviation = random.GetFromRange(1e-6, 5.0), + BelowPhreaticLevelMean = random.GetFromRange(15.0, 999.999), BelowPhreaticLevelShift = random.GetFromRange(1e-6, 10.0) }, soilLayer @@ -689,6 +690,132 @@ } [Test] + public void Validate_CalculationWithSaturatedCoverageLayerVolumicWeightLessThanWaterVolumicWeight_LogsErrorAndReturnsFalse() + { + // Setup + const string name = ""; + + var random = new Random(21); + + var profile = new PipingSoilProfile(string.Empty, 0.0, + new[] + { + new PipingSoilLayer(10.5) + { + IsAquifer = false, + BelowPhreaticLevelMean = 9.81, + BelowPhreaticLevelDeviation = 2, + BelowPhreaticLevelShift = 0 + }, + new PipingSoilLayer(5.0) + { + IsAquifer = true, + PermeabilityDeviation = random.NextDouble(), + PermeabilityMean = 0.1 + random.NextDouble(), + DiameterD70Mean = 0.0002, + DiameterD70Deviation = 0 + } + }, + SoilProfileType.SoilProfile1D, -1); + + PipingCalculation pipingCalculation = PipingCalculationScenarioFactory.CreatePipingCalculationScenarioWithValidInput(); + pipingCalculation.Name = name; + pipingCalculation.InputParameters.StochasticSoilProfile.SoilProfile = profile; + + bool isValid = false; + + // Call + Action call = () => isValid = PipingCalculationService.Validate(pipingCalculation); + + // Assert + TestHelper.AssertLogMessages(call, messages => + { + var msgs = messages.ToArray(); + Assert.AreEqual(3, msgs.Length); + StringAssert.StartsWith(string.Format("Validatie van '{0}' gestart om: ", name), msgs.First()); + Assert.AreEqual( + "Validatie mislukt: Het verzadigd volumetrisch gewicht van de deklaag moet groter zijn dan het volumetrisch gewicht van water.", + msgs[1]); + StringAssert.StartsWith(string.Format("Validatie van '{0}' beƫindigd om: ", name), msgs.Last()); + }); + + Assert.IsFalse(isValid); + } + + [Test] + public void Validate_CalculationSaturatedCoverageLayerHeavierThanWaterLayerMissingSaturatedParameter_LogsNoErrorForSaturatedValue() + { + // Setup + const string name = ""; + + var random = new Random(21); + + var profile = new PipingSoilProfile(string.Empty, 0.0, + new[] + { + new PipingSoilLayer(10.5) + { + IsAquifer = false, + BelowPhreaticLevelMean = 5, + BelowPhreaticLevelDeviation = 2, + BelowPhreaticLevelShift = 0 + }, + new PipingSoilLayer(8.5) + { + IsAquifer = false, + BelowPhreaticLevelMean = 5, + BelowPhreaticLevelDeviation = 2, + BelowPhreaticLevelShift = double.NaN + }, + new PipingSoilLayer(5.0) + { + IsAquifer = true, + PermeabilityDeviation = random.NextDouble(), + PermeabilityMean = 0.1 + random.NextDouble(), + DiameterD70Mean = 0.0002, + DiameterD70Deviation = 0 + } + }, + SoilProfileType.SoilProfile1D, -1); + + PipingCalculation pipingCalculation = PipingCalculationScenarioFactory.CreatePipingCalculationScenarioWithValidInput(); + pipingCalculation.Name = name; + pipingCalculation.InputParameters.StochasticSoilProfile.SoilProfile = profile; + + // Call + Action call = () => PipingCalculationService.Validate(pipingCalculation); + + // Assert + TestHelper.AssertLogMessages(call, messages => + { + var msgs = messages.ToArray(); + Assert.AreEqual(4, msgs.Length); + StringAssert.StartsWith(string.Format("Validatie van '{0}' gestart om: ", name), msgs.First()); + Assert.AreEqual( + "Validatie mislukt: Kan de definitie voor het verzadigd gewicht van de deklaag niet (volledig) afleiden.", + msgs[2]); + StringAssert.StartsWith(string.Format("Validatie van '{0}' beƫindigd om: ", name), msgs.Last()); + }); + } + + [Test] + public void Validate_CompleteInput_InputSetOnSubCalculators() + { + // Setup + PipingCalculation validPipingCalculation = PipingCalculationScenarioFactory.CreatePipingCalculationScenarioWithValidInput(); + PipingInput input = validPipingCalculation.InputParameters; + + using (new PipingSubCalculatorFactoryConfig()) + { + // Call + PipingCalculationService.Validate(validPipingCalculation); + + // Assert + AssertSubCalculatorInputs(input); + } + } + + [Test] public void Calculate_ValidPipingCalculation_LogStartAndEndOfValidatingInputsAndCalculation() { // Setup @@ -755,23 +882,6 @@ } [Test] - public void Validate_CompleteInput_InputSetOnSubCalculators() - { - // Setup - PipingCalculation validPipingCalculation = PipingCalculationScenarioFactory.CreatePipingCalculationScenarioWithValidInput(); - PipingInput input = validPipingCalculation.InputParameters; - - using (new PipingSubCalculatorFactoryConfig()) - { - // Call - PipingCalculationService.Validate(validPipingCalculation); - - // Assert - AssertSubCalculatorInputs(input); - } - } - - [Test] public void Calculate_CompleteInput_InputSetOnSubCalculators() { // Setup