Index: Ringtoets/Piping/src/Ringtoets.Piping.Data/PipingSoilProfile.cs =================================================================== diff -u -r935ddb05bb15494732dea93d6c67a40bb318fb85 -r96a31b6c1e568fbbe87fb72f13f0a76b065bdf77 --- Ringtoets/Piping/src/Ringtoets.Piping.Data/PipingSoilProfile.cs (.../PipingSoilProfile.cs) (revision 935ddb05bb15494732dea93d6c67a40bb318fb85) +++ Ringtoets/Piping/src/Ringtoets.Piping.Data/PipingSoilProfile.cs (.../PipingSoilProfile.cs) (revision 96a31b6c1e568fbbe87fb72f13f0a76b065bdf77) @@ -115,9 +115,9 @@ /// does not contain . public double GetLayerThickness(PipingSoilLayer layer) { - var orderedLayers = layers.OrderBy(l => l.Top); + var layersOrderedByTopAscending = layers.Reverse(); var previousLevel = Bottom; - foreach (var oLayer in orderedLayers) + foreach (var oLayer in layersOrderedByTopAscending) { if (ReferenceEquals(layer, oLayer)) { @@ -132,5 +132,56 @@ { return Name; } + + /// + /// Retrieves the thickness of the topmost aquifer layer under a certain . + /// Only the thickness of the part of the aquifer layer under the level is determined. + /// Aquifer layers above are not considered. + /// + /// The level under which the aquifer layer is sought. + /// The thickness of the part of the topmost aquifer layer under the . + /// is less than . + public double GetTopAquiferLayerThicknessBelowLevel(double level) + { + ValidateLevelToBottom(level); + + PipingSoilLayer currentTopAquiferLayer = null; + foreach (var pipingSoilLayer in Layers) + { + if (pipingSoilLayer.Top > level) + { + currentTopAquiferLayer = null; + } + if (currentTopAquiferLayer != null && pipingSoilLayer.Top <= level) + { + break; + } + if (pipingSoilLayer.IsAquifer) + { + currentTopAquiferLayer = pipingSoilLayer; + } + } + return GetLayerThicknessBelowLevel(currentTopAquiferLayer, level); + } + + private void ValidateLevelToBottom(double level) + { + if (level < Bottom) + { + var message = string.Format(Resources.PipingSoilProfile_GetTopAquiferLayerThicknessBelowLevel_Level_0_below_Bottom_1_, level, Bottom); + throw new ArgumentException(message); + } + } + + private double GetLayerThicknessBelowLevel(PipingSoilLayer layer, double level) + { + var thickness = double.NaN; + if (layer != null) + { + double thicknessAboveLevel = Math.Max(0, layer.Top - level); + thickness = GetLayerThickness(layer) - thicknessAboveLevel; + } + return thickness; + } } } \ No newline at end of file