Index: DamEngine/trunk/src/Deltares.DamEngine.Calculators.Tests/KernelWrappers/WbiPipingSellmeijerRevised/WbiPipingSellmeijerRevisedKernelWrapperTests.cs =================================================================== diff -u -r1692 -r1897 --- DamEngine/trunk/src/Deltares.DamEngine.Calculators.Tests/KernelWrappers/WbiPipingSellmeijerRevised/WbiPipingSellmeijerRevisedKernelWrapperTests.cs (.../WbiPipingSellmeijerRevisedKernelWrapperTests.cs) (revision 1692) +++ DamEngine/trunk/src/Deltares.DamEngine.Calculators.Tests/KernelWrappers/WbiPipingSellmeijerRevised/WbiPipingSellmeijerRevisedKernelWrapperTests.cs (.../WbiPipingSellmeijerRevisedKernelWrapperTests.cs) (revision 1897) @@ -136,6 +136,11 @@ ModelFactors = { UpliftCriterionPiping = 1.0 + }, + ModelParametersForPlLines = + { + DampingFactorPl3 = 0.25, + DampingFactorPl4 = 0.10 } }; @@ -149,6 +154,7 @@ FailureMechanismSystemType = FailureMechanismSystemType.Piping, PipingModelType = PipingModelType.Wti2017 }; + var damKernelInput = new DamKernelInput { Location = location, @@ -161,6 +167,7 @@ IKernelDataOutput kernelDataOutput; kernelWrapper.Prepare(damKernelInput, 0, out kernelDataInput, out kernelDataOutput); var damPipingInput = (WbiPipingSellmeijerRevisedInput)kernelDataInput; + var damPipingOutput = (WbiPipingSellmeijerRevisedOutput)kernelDataOutput; Assert.AreEqual(1.0, damPipingInput.HRiver, diff); Assert.AreEqual(0.0, damPipingInput.HExit, diff); Assert.AreEqual(0.3, damPipingInput.Rc, diff); @@ -172,6 +179,16 @@ Assert.AreEqual(37.0, damPipingInput.BeddingAngle, diff); Assert.AreEqual(1.33E-06, damPipingInput.KinematicViscosityWater, diff); Assert.AreEqual(0.0001, damPipingInput.DarcyPermeability, diff); + Assert.AreEqual(1.000, damPipingInput.ModelFactorUplift, diff); + Assert.AreEqual(-17.62, damPipingInput.EffectiveStress, diff); + Assert.AreEqual(0.75, damPipingInput.PhiExit, diff); + Assert.AreEqual(0.75, damPipingInput.RExit, diff); + Assert.AreEqual(0.00, damPipingInput.PhiPolder, diff); + + Assert.AreEqual(-17.62, damPipingOutput.EffectiveStress, diff); + Assert.AreEqual(50.50, damPipingOutput.ExitPointX, diff); + Assert.AreEqual(0.0741358539523677, damPipingOutput.UpliftFactor, diff); + Assert.AreEqual(true, damPipingOutput.UpliftSituation.IsUplift); } [Test] Index: DamEngine/trunk/src/Deltares.DamEngine.Calculators/KernelWrappers/WbiPipingSellmeijerRevised/WbiPipingSellmeijerRevisedOutput.cs =================================================================== diff -u -r1618 -r1897 --- DamEngine/trunk/src/Deltares.DamEngine.Calculators/KernelWrappers/WbiPipingSellmeijerRevised/WbiPipingSellmeijerRevisedOutput.cs (.../WbiPipingSellmeijerRevisedOutput.cs) (revision 1618) +++ DamEngine/trunk/src/Deltares.DamEngine.Calculators/KernelWrappers/WbiPipingSellmeijerRevised/WbiPipingSellmeijerRevisedOutput.cs (.../WbiPipingSellmeijerRevisedOutput.cs) (revision 1897) @@ -32,14 +32,22 @@ public class WbiPipingSellmeijerRevisedOutput: IKernelDataOutput { /// - /// Gets or sets the safetyfactor. + /// Gets or sets the piping safetyfactor. /// /// /// The fo sp. /// public double FoSp { get; set; } /// + /// Gets or sets the uplift safetyfactor. + /// + /// + /// The fo sp. + /// + public double FoSu { get; set; } + + /// /// Gets or sets the H-critical (critical head difference for piping). /// /// @@ -48,6 +56,14 @@ public double Hc { get; set; } /// + /// Gets or sets the H-critical (critical head difference for uplift). + /// + /// + /// The hc. + /// + public double Hcu { get; set; } + + /// /// Gets or sets the calculation result. /// /// @@ -78,5 +94,13 @@ /// The uplift situation. /// public UpliftSituation UpliftSituation { get; set; } + + /// + /// Gets or sets the effective stress. + /// + /// + /// The effective stress. + /// + public double EffectiveStress { get; set; } } } Index: DamEngine/trunk/src/Deltares.DamEngine.Calculators/KernelWrappers/WbiPipingSellmeijerRevised/WbiPipingSellmeijerRevisedKernelWrapper.cs =================================================================== diff -u -r1692 -r1897 --- DamEngine/trunk/src/Deltares.DamEngine.Calculators/KernelWrappers/WbiPipingSellmeijerRevised/WbiPipingSellmeijerRevisedKernelWrapper.cs (.../WbiPipingSellmeijerRevisedKernelWrapper.cs) (revision 1692) +++ DamEngine/trunk/src/Deltares.DamEngine.Calculators/KernelWrappers/WbiPipingSellmeijerRevised/WbiPipingSellmeijerRevisedKernelWrapper.cs (.../WbiPipingSellmeijerRevisedKernelWrapper.cs) (revision 1897) @@ -263,6 +263,14 @@ return DesignStrategy.ShoulderPerPoint; } + /// + /// Evaluates the uplift situation and prepares the input for the wbi-piping and the qbi-uplift calculation. + /// + /// The dam kernel input. + /// The kernel data input. + /// The pl lines. + /// The water level. + /// The dam piping output. private static void EvaluateUpliftSituation(DamKernelInput damKernelInput, out IKernelDataInput kernelDataInput, PlLines plLines, double waterLevel, WbiPipingSellmeijerRevisedOutput damPipingOutput) @@ -321,6 +329,19 @@ inBetweenAquiferlayerSoil = soilProfile1D.InBetweenAquiferLayer.Soil; } + // Additional parameters for Uplift + var phiPolder = referenceLevel; + var rExit = 1 - location.ModelParametersForPlLines.DampingFactorPl3; + if (soilProfile1D.InBetweenAquiferLayer != null) + { + rExit = 1 - location.ModelParametersForPlLines.DampingFactorPl4; + } + var effectiveThicknessCalculator = CreateEffectiveThicknessCalculator(soilProfile1D, surfaceLine, location.PolderLevel, + Physics.UnitWeightOfwater, xExit); + effectiveThicknessCalculator.Calculate(); + var effectiveStress = effectiveThicknessCalculator.EffectiveStress; + + // Fill the input for the wbi-uplift calculation as well as the wbi-piping SellmeijerRevised calculation. kernelDataInput = new WbiPipingSellmeijerRevisedInput() { HRiver = waterLevel, @@ -330,17 +351,29 @@ SeepageLength = seepageLength, // specific Sellmeijer 4 Forces KinematicViscosityWater = Physics.WaterViscosity, + VolumetricWeightOfWater = Physics.UnitWeightOfwater, WhitesDragCoefficient = inBetweenAquiferlayerSoil.WhitesConstant, BeddingAngle = inBetweenAquiferlayerSoil.BeddingAngle, D70 = d70, DAquifer = aquiferHeight, DarcyPermeability = permeabilityKx, + ModelFactorUplift = 1.0, + EffectiveStress = effectiveStress, + PhiExit = phiPolder + rExit * (waterLevel - phiPolder), + RExit = rExit, + PhiPolder = phiPolder }; + damPipingOutput.EffectiveStress = effectiveStress; damPipingOutput.ExitPointX = xExit; damPipingOutput.UpliftFactor = upliftFactor; damPipingOutput.UpliftSituation = upliftSituation; } + /// + /// Creates the piping calculator wbi sellmeijer revised. + /// + /// The kernel data input. + /// the Sellmeijer2011Calculator private static Sellmeijer2011Calculator CreatePipingCalculatorWbiSellmeijerRevised(IKernelDataInput kernelDataInput) { var wbiPipingSellmeijerRevisedInput = kernelDataInput as WbiPipingSellmeijerRevisedInput; @@ -368,6 +401,104 @@ return calculator; } + /// + /// Converts the CharacteristicPointType to PipingCharacteristicPointType. + /// + /// Type of the characteristic point. + /// the PipingCharacteristicPointType + private static PipingCharacteristicPointType ConvertToPipingPointType(CharacteristicPointType characteristicPointType) + { + switch (characteristicPointType) + { + case CharacteristicPointType.BottomDitchDikeSide: return PipingCharacteristicPointType.BottomDitchDikeSide; + case CharacteristicPointType.BottomDitchPolderSide: return PipingCharacteristicPointType.BottomDitchPolderSide; + case CharacteristicPointType.DikeToeAtPolder: return PipingCharacteristicPointType.DikeToeAtPolder; + case CharacteristicPointType.DitchDikeSide: return PipingCharacteristicPointType.DitchDikeSide; + case CharacteristicPointType.DitchPolderSide: return PipingCharacteristicPointType.DitchPolderSide; + case CharacteristicPointType.ShoulderBaseInside: return PipingCharacteristicPointType.ShoulderBaseInside; + default: return PipingCharacteristicPointType.None; + } + } + + /// + /// Converts a SurfaceLine2 to piping surface line. + /// + /// The surface line. + /// the PipingSurfaceLine + private static PipingSurfaceLine ConvertToPipingSurfaceLine(SurfaceLine2 surfaceLine) + { + var pipingSurfaceLine = new PipingSurfaceLine(); + foreach (var surfaceLineCharacteristicPoint in surfaceLine.CharacteristicPoints) + { + var pipingPoint = new PipingPoint + { + X = surfaceLineCharacteristicPoint.X, + Y = surfaceLineCharacteristicPoint.Y, + Z = surfaceLineCharacteristicPoint.Z, + Type = ConvertToPipingPointType(surfaceLineCharacteristicPoint.CharacteristicPointType) + }; + pipingSurfaceLine.Points.Add(pipingPoint); + } + return pipingSurfaceLine; + } + + /// + /// Converts a SoilProfile1D to piping profile. + /// + /// The soil profile1 d. + /// the PipingProfile + private static PipingProfile ConvertToPipingProfile(SoilProfile1D soilProfile1D) + { + var pipingProfile = new PipingProfile(); + foreach (var soilLayer1D in soilProfile1D.Layers) + { + var pipingLayer = new PipingLayer + { + AbovePhreaticLevel = soilLayer1D.Soil.AbovePhreaticLevel, + BelowPhreaticLevel = soilLayer1D.Soil.BelowPhreaticLevel, + DryUnitWeight = soilLayer1D.Soil.DryUnitWeight, + IsAquifer = soilLayer1D.IsAquifer, + TopLevel = soilLayer1D.TopLevel, + Name = soilLayer1D.Name + }; + pipingProfile.Layers.Add(pipingLayer); + } + if (pipingProfile.Layers.Count > 0) + { + pipingProfile.BottomLevel = pipingProfile.Layers[pipingProfile.Layers.Count - 1].TopLevel - 10; + } + return pipingProfile; + } + + /// + /// Creates the effective thickness calculator. + /// + /// The soil profile. + /// The surface line. + /// The phreatic level. + /// The volumetric weight of water. + /// The x exit. + /// the EffectiveThicknessCalculator + private static EffectiveThicknessCalculator CreateEffectiveThicknessCalculator(SoilProfile1D soilProfile, SurfaceLine2 surfaceLine, + double phreaticLevel, double volumicWeightOfWater, double xExit) + { + var calculator = new EffectiveThicknessCalculator + { + SurfaceLine = ConvertToPipingSurfaceLine(surfaceLine), + SoilProfile = ConvertToPipingProfile(soilProfile), + PhreaticLevel = phreaticLevel, + VolumicWeightOfWater = volumicWeightOfWater, + ExitPointXCoordinate = xExit + }; + return calculator; + } + + /// + /// Performs the single calculation wbi sellmeijer revised. + /// + /// The messages. + /// The wbi piping output. + /// The wbi piping input. private static void PerformSingleCalculationWbiSellmeijerRevised(out List messages, WbiPipingSellmeijerRevisedOutput wbiPipingOutput, WbiPipingSellmeijerRevisedInput wbiPipingInput) { Index: DamEngine/trunk/src/Deltares.DamEngine.Calculators/KernelWrappers/WbiPipingSellmeijerRevised/WbiPipingSellmeijerRevisedInput.cs =================================================================== diff -u -r1586 -r1897 --- DamEngine/trunk/src/Deltares.DamEngine.Calculators/KernelWrappers/WbiPipingSellmeijerRevised/WbiPipingSellmeijerRevisedInput.cs (.../WbiPipingSellmeijerRevisedInput.cs) (revision 1586) +++ DamEngine/trunk/src/Deltares.DamEngine.Calculators/KernelWrappers/WbiPipingSellmeijerRevised/WbiPipingSellmeijerRevisedInput.cs (.../WbiPipingSellmeijerRevisedInput.cs) (revision 1897) @@ -165,5 +165,44 @@ /// public double DAquifer { get; set; } + /// + /// Gets or sets the model factor uplift. + /// + /// + /// The model factor uplift. + /// + public double ModelFactorUplift { get; set; } + + /// + /// Gets or sets the effective stress. + /// + /// + /// The effective stress. + /// + public double EffectiveStress { get; set; } + + /// + /// Gets or sets the phi exit. + /// + /// + /// The phi exit. + /// + public double PhiExit { get; set; } + + /// + /// Gets or sets the r exit. + /// + /// + /// The r exit. + /// + public double RExit { get; set; } + + /// + /// Gets or sets the phi polder. + /// + /// + /// The phi polder. + /// + public double PhiPolder { get; set; } } }