Index: DamEngine/trunk/src/Deltares.DamEngine.Data/Geotechnics/SoilProfile1D.cs =================================================================== diff -u -r4540 -r4906 --- DamEngine/trunk/src/Deltares.DamEngine.Data/Geotechnics/SoilProfile1D.cs (.../SoilProfile1D.cs) (revision 4540) +++ DamEngine/trunk/src/Deltares.DamEngine.Data/Geotechnics/SoilProfile1D.cs (.../SoilProfile1D.cs) (revision 4906) @@ -149,10 +149,10 @@ public SoilLayer1D InfiltrationLayer { get; private set; } /// - /// Gets the toppest aquifer layer of the deepest cluster of aquifers + /// Gets the highest aquifer layer of the deepest cluster of aquifers /// /// - /// The toppest aquifer layer in the deepest cluster of aquifers + /// The highest aquifer layer in the deepest cluster of aquifers /// public SoilLayer1D BottomAquiferLayer { @@ -174,7 +174,7 @@ } } - // aquifer may consists of more then 1 connected (aquifer) layers + // aquifer may consist of more than 1 connected (aquifer) layers // Search all layers above the first found aquifer to find top aquifer layer if (aquiferIndex >= 0) { @@ -197,40 +197,84 @@ } /// - /// Gets the highest aquifer in the highest cluster of in-between aquifers. + /// Gets the list of all clusters of in-between aquifers: + /// Item1 is the top aquifer and Item2 the bottom aquifer of the cluster. + /// For a cluster of 1 layer, Item1 and Item2 are equal. /// The top layer of a cluster of in-between aquifer can't be the highest layer of the soil profile. /// /// - /// The highest aquifer in the highest in-between cluster of aquifers + /// The list of all clusters of in-between aquifers. /// - public SoilLayer1D InBetweenAquiferLayer + public IList<(SoilLayer1D, SoilLayer1D)> InBetweenAquiferClusters { get { + // At least 4 layers are needed (aquitard, aquifer, aquitard, aquifer) to get one in-between aquifer + if (LayerCount <= 3) + { + return null; + } + IList sortedLayers = Layers.OrderByDescending(l => l.TopLevel).ToList(); - SoilLayer1D aquiferLayer = null; + IList<(SoilLayer1D, SoilLayer1D)> aquiferLayers = new List<(SoilLayer1D, SoilLayer1D)>(); - // Search the highest aquifer layer with an aquitard above - for (var layerIndex = 1; layerIndex < sortedLayers.Count; layerIndex++) + SoilLayer1D highestAquiferSoFar = null; + // Search the aquifer layers with an aquitard above + for (var layerIndex = 1; layerIndex < sortedLayers.Count - 1; layerIndex++) { SoilLayer1D previousLayer = sortedLayers[layerIndex - 1]; SoilLayer1D layer = sortedLayers[layerIndex]; - if (IsAquiferLayer(layer) && !IsAquiferLayer(previousLayer)) + SoilLayer1D nextLayer = sortedLayers[layerIndex + 1]; + + if (IsAquiferLayer(layer)) { - aquiferLayer = layer; + if (!IsAquiferLayer(previousLayer)) + { + + if (!IsAquiferLayer(nextLayer)) + { + aquiferLayers.Add(new ValueTuple(layer, layer)); + } + else + { + highestAquiferSoFar = layer; + } + } + else + { + if (!IsAquiferLayer(nextLayer) && highestAquiferSoFar != null) + { + aquiferLayers.Add(new ValueTuple(highestAquiferSoFar, layer)); + highestAquiferSoFar = null; + } + } + } + + if (layerIndex >= sortedLayers.IndexOf(BottomAquiferLayer)) + { break; } } - // If highest aquifer layer is bottom aquifer layer, there is no in between aquiferlayer - if (aquiferLayer == BottomAquiferLayer) - { - aquiferLayer = null; - } + return aquiferLayers.Count == 0 ? null : aquiferLayers; - return aquiferLayer; } } + + /// + /// Gets the highest aquifer in the highest cluster of in-between aquifers. + /// The top layer of a cluster of in-between aquifer can't be the highest layer of the soil profile. + /// + /// + /// The highest aquifer in the highest in-between cluster of aquifers + /// + public SoilLayer1D InBetweenAquiferLayer + { + get + { + return InBetweenAquiferClusters?.First().Item1; + } + } /// /// Assigns the specified profile.