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.