Index: DamEngine/trunk/src/Deltares.DamEngine.Data/Geotechnics/SoilProfile1D.cs =================================================================== diff -u -r1974 -r3079 --- DamEngine/trunk/src/Deltares.DamEngine.Data/Geotechnics/SoilProfile1D.cs (.../SoilProfile1D.cs) (revision 1974) +++ DamEngine/trunk/src/Deltares.DamEngine.Data/Geotechnics/SoilProfile1D.cs (.../SoilProfile1D.cs) (revision 3079) @@ -48,18 +48,18 @@ /// public class SoilProfile1D : SoilProfile { - private const double defaultBottomLayerHeight = 20.0; + private const double DefaultBottomLayerHeight = 20.0; private readonly DelegatedList layers = new DelegatedList(); private double bottomLevel = double.NaN; - private SoilLayer1D infiltrationLayer = null; + private SoilLayer1D infiltrationLayer; /// /// Default constructor /// public SoilProfile1D() { - Name = LocalizationManager.GetTranslatedText(this, "DefaultNameSoilProfile1D"); + base.Name = LocalizationManager.GetTranslatedText(this, "DefaultNameSoilProfile1D"); layers.AddMethod = AddLayer; } @@ -76,16 +76,33 @@ layers.Add(new SoilLayer1D(soil, topLevel)); } + /// + /// Assigns the specified profile. + /// + /// The profile. public void Assign(SoilProfile1D profile) { - this.Assign((SoilProfile)profile); - this.Layers.Clear(); - foreach (SoilLayer1D layer in (IEnumerable)profile.Layers) - this.Layers.Add((SoilLayer1D)layer.Clone()); - this.BottomLevel = profile.BottomLevel; + Assign((SoilProfile)profile); + Layers.Clear(); + foreach (SoilLayer1D layer in profile.Layers) + Layers.Add((SoilLayer1D)layer.Clone()); + BottomLevel = profile.BottomLevel; } /// + /// Creates a new object that is a copy of the current instance. + /// + /// + /// A new object that is a copy of this instance. + /// + public object Clone() + { + var cloneSoilProfile = new SoilProfile1D(); + cloneSoilProfile.Assign(this); + return cloneSoilProfile; + } + + /// /// Gets the soil layer collection for this profile /// public IList Layers @@ -122,7 +139,7 @@ { if (double.IsNaN(bottomLevel) && layers.Count > 0) { - bottomLevel = Layers.Last().TopLevel - defaultBottomLayerHeight; + bottomLevel = Layers.Last().TopLevel - DefaultBottomLayerHeight; } return bottomLevel; @@ -171,34 +188,15 @@ /// public SoilLayer1D GetLayerWithName(string name) { - return this.layers.FirstOrDefault((Func)(layer => + return layers.FirstOrDefault(layer => { if (layer.Name != null) return layer.Name.Equals(name); return false; - })); + }); } /// - /// This method makes sure all names are unique - /// - public void EnsureUniqueLayerNames() - { - if (AreAllLayerNamesUnique()) - { - return; - } - foreach (var layer in Layers) - { - layer.Name = null; - } - foreach (var layer in Layers) - { - layer.Name = GetNewUniqueLayerName(); - } - } - - /// /// Checks weather all layer names are unique. /// /// @@ -245,31 +243,6 @@ } /// - /// The highest aquifer layer, can be null if not aquifer is present - /// - [Validate] - public SoilLayer1D TopAquiferLayer - { - get - { - IList sortedLayers = Layers.OrderByDescending(l => l.TopLevel).ToList(); - SoilLayer1D aquiferLayer = null; - - // Search the highest aquifer layer - for (int layerIndex = 0; layerIndex < sortedLayers.Count; layerIndex++) - { - var layer = sortedLayers[layerIndex]; - if (IsAquiferLayer(layer)) - { - aquiferLayer = layer; - break; - } - } - return aquiferLayer; - } - } - - /// /// Gets the toppest aquifer layer of the deepest cluster of aquifers /// /// @@ -352,62 +325,6 @@ } /// - /// Gets the lowest layer in the highest cluster of in-between aquifers - /// - /// - /// The lowest layer in the highest cluster of in-between aquifers - /// - public SoilLayer1D BottomLayerOfInBetweenAquiferCluster - { - get - { - IList sortedLayers = Layers.OrderByDescending(l => l.TopLevel).ToList(); - SoilLayer1D highestAquiferLayer = null; - SoilLayer1D aquiferLayer = null; - int indexHighestAquifer = -1; - - // Search the index of the highest aquifer layer - for (int layerIndex = 1; layerIndex < sortedLayers.Count; layerIndex++) - { - var previousLayer = sortedLayers[layerIndex - 1]; - var layer = sortedLayers[layerIndex]; - if (IsAquiferLayer(layer) && !IsAquiferLayer(previousLayer)) - { - highestAquiferLayer = layer; - indexHighestAquifer = layerIndex; - break; - } - } - - // If highest aquifer layer is bottom aquifer layer, there is no in between aquiferlayer - if (highestAquiferLayer == BottomAquiferLayer) - { - return null; - } - - // in-between aquifers cluster may consists of more then 1 connected (aquifer) layers. - // Search all layers below the found highest aquifer to find bottom aquifer layer. - if (indexHighestAquifer >= 0) - { - for (int layerIndex = indexHighestAquifer; layerIndex < sortedLayers.Count; layerIndex++) - { - var layer = sortedLayers[layerIndex]; - - if (IsAquiferLayer(layer)) - { - aquiferLayer = layer; - } - else - { - break; - } - } - } - return aquiferLayer; - } - } - - /// /// Gets (calculates) the height for a given layer in the profile /// /// The layer to process @@ -428,7 +345,7 @@ var bottomLayer = Layers.Last(); if (bottomLayer.Height.IsZero()) { - BottomLevel -= defaultBottomLayerHeight; + BottomLevel -= DefaultBottomLayerHeight; } } @@ -669,6 +586,16 @@ } /// + /// Gets the layer at a given z coordinate. + /// + /// The z. + /// the found layer + public SoilLayer1D GetLayerAt(double z) + { + return Layers.FirstOrDefault(soilLayer => soilLayer.BottomLevel < z && soilLayer.TopLevel >= z); + } + + /// /// Gets the layer below the given layer. /// /// The given layer. @@ -719,78 +646,6 @@ } /// - /// Gets the total soil pressure, including the eventual free water on surface - /// - /// The level for wich the total pressure is calculated - /// The phreatic level - /// Unit weight of the water - /// The soil pressure - public double GetTotalPressure(double z, double phreaticLevel, double unitWeightWater) - { - double pressure = 0; - - // see if free water is at surface - double surfaceLevel = Layers[0].TopLevel; - if (z > surfaceLevel) - { - return Math.Max(0, (phreaticLevel - z)*unitWeightWater); - } - - if (phreaticLevel > surfaceLevel) - { - if (z < phreaticLevel) - { - pressure += (phreaticLevel - Math.Max(Layers[0].TopLevel, z))*unitWeightWater; - } - } - - foreach (var layer in Layers) - { - if (layer.Height > 0 && layer.Soil != null) - { - if (z >= layer.TopLevel) - { - continue; - } - if (z <= layer.BottomLevel) - { - if (phreaticLevel <= layer.BottomLevel) - { - pressure += layer.Height*layer.Soil.AbovePhreaticLevel; - } - else if (phreaticLevel >= layer.TopLevel) - { - pressure += layer.Height*layer.Soil.BelowPhreaticLevel; - } - else - { - pressure += (phreaticLevel - layer.BottomLevel)*layer.Soil.BelowPhreaticLevel; - pressure += (layer.TopLevel - phreaticLevel)*layer.Soil.AbovePhreaticLevel; - } - } - else - { - if (phreaticLevel <= z) - { - pressure += (layer.TopLevel - z)*layer.Soil.AbovePhreaticLevel; - } - else if (phreaticLevel >= layer.TopLevel) - { - pressure += (layer.TopLevel - z)*layer.Soil.BelowPhreaticLevel; - } - else - { - pressure += (layer.TopLevel - phreaticLevel)*layer.Soil.AbovePhreaticLevel; - pressure += (phreaticLevel - z)*layer.Soil.BelowPhreaticLevel; - } - } - } - } - - return pressure; - } - - /// /// Returns a that represents this instance. /// ///