Index: DamEngine/trunk/src/Deltares.DamEngine.Data/Geotechnics/SoilProfile1D.cs =================================================================== diff -u -r3893 -r4000 --- DamEngine/trunk/src/Deltares.DamEngine.Data/Geotechnics/SoilProfile1D.cs (.../SoilProfile1D.cs) (revision 3893) +++ DamEngine/trunk/src/Deltares.DamEngine.Data/Geotechnics/SoilProfile1D.cs (.../SoilProfile1D.cs) (revision 4000) @@ -52,7 +52,6 @@ private readonly DelegatedList layers = new DelegatedList(); private double bottomLevel = double.NaN; - private SoilLayer1D infiltrationLayer; /// /// Default constructor @@ -77,32 +76,6 @@ } /// - /// Assigns the specified profile. - /// - /// The profile. - public void Assign(SoilProfile1D profile) - { - 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 @@ -148,7 +121,7 @@ { if (double.IsNaN(bottomLevel) || (Math.Abs(value - bottomLevel) > GeometryConstants.Accuracy)) { - bottomLevel = value; + bottomLevel = value; } } } @@ -164,7 +137,7 @@ get { return layers.Any() ? layers.First().TopLevel : BottomLevel; - } + } } /// @@ -173,76 +146,9 @@ /// /// The infiltration layer. /// - public SoilLayer1D InfiltrationLayer - { - get - { - return infiltrationLayer; - } - } + public SoilLayer1D InfiltrationLayer { get; private set; } /// - /// Gets layer with the specified name. - /// - /// The name. - /// - public SoilLayer1D GetLayerWithName(string name) - { - return layers.FirstOrDefault(layer => - { - if (layer.Name != null) - return layer.Name.Equals(name); - return false; - }); - } - - /// - /// Checks weather all layer names are unique. - /// - /// - /// true if all layer names are unique; otherwise, false. - /// - public bool AreAllLayerNamesUnique() - { - var layersSize = Layers.Count; - for (int i = 0; i < layersSize; ++i) - { - var id1 = layers[i].Name; - if (id1 == null) - { - return false; - } - - for (int j = i + 1; j < layersSize; ++j) - { - if (id1.Equals(Layers[j].Name)) - { - return false; - } - } - } - - return true; - } - - /// - /// Gets the first unused unique layer name. - /// - /// new unique layer name - public string GetNewUniqueLayerName() - { - string newName; - int i = 0; - SoilLayer1D soilLayer; - do - { - newName = "L" + i++; - soilLayer = GetLayerWithName(newName); - } while (soilLayer != null); - return newName; - } - - /// /// Gets the toppest aquifer layer of the deepest cluster of aquifers /// /// @@ -257,7 +163,7 @@ int aquiferIndex = -1; // Search deepest aquifer layer - for (int layerIndex = 0; layerIndex < sortedLayers.Count; layerIndex++) + for (var layerIndex = 0; layerIndex < sortedLayers.Count; layerIndex++) { SoilLayer1D layer = sortedLayers[layerIndex]; if (IsAquiferLayer(layer)) @@ -274,7 +180,7 @@ { for (int layerIndex = aquiferIndex + 1; layerIndex < sortedLayers.Count; layerIndex++) { - var layer = sortedLayers[layerIndex]; + SoilLayer1D layer = sortedLayers[layerIndex]; if (IsAquiferLayer(layer)) { aquiferLayer = layer; @@ -285,6 +191,7 @@ } } } + return aquiferLayer; } } @@ -302,12 +209,12 @@ { IList sortedLayers = Layers.OrderByDescending(l => l.TopLevel).ToList(); SoilLayer1D aquiferLayer = null; - + // Search the highest aquifer layer with an aquitard above - for (int layerIndex = 1; layerIndex < sortedLayers.Count; layerIndex++) + for (var layerIndex = 1; layerIndex < sortedLayers.Count; layerIndex++) { - var previousLayer = sortedLayers[layerIndex - 1]; - var layer = sortedLayers[layerIndex]; + SoilLayer1D previousLayer = sortedLayers[layerIndex - 1]; + SoilLayer1D layer = sortedLayers[layerIndex]; if (IsAquiferLayer(layer) && !IsAquiferLayer(previousLayer)) { aquiferLayer = layer; @@ -320,20 +227,115 @@ { aquiferLayer = null; } + return aquiferLayer; } } /// + /// Assigns the specified profile. + /// + /// The profile. + public void Assign(SoilProfile1D profile) + { + 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 layer with the specified name. + /// + /// The name. + /// + public SoilLayer1D GetLayerWithName(string name) + { + return layers.FirstOrDefault(layer => + { + if (layer.Name != null) + { + return layer.Name.Equals(name); + } + + return false; + }); + } + + /// + /// Checks weather all layer names are unique. + /// + /// + /// true if all layer names are unique; otherwise, false. + /// + public bool AreAllLayerNamesUnique() + { + int layersSize = Layers.Count; + for (var i = 0; i < layersSize; ++i) + { + string id1 = layers[i].Name; + if (id1 == null) + { + return false; + } + + for (int j = i + 1; j < layersSize; ++j) + { + if (id1.Equals(Layers[j].Name)) + { + return false; + } + } + } + + return true; + } + + /// + /// Gets the first unused unique layer name. + /// + /// new unique layer name + public string GetNewUniqueLayerName() + { + string newName; + var i = 0; + SoilLayer1D soilLayer; + do + { + newName = "L" + i++; + soilLayer = GetLayerWithName(newName); + } while (soilLayer != null); + + return newName; + } + + /// /// Gets (calculates) the height for a given layer in the profile /// /// The layer to process /// The height public double GetLayerHeight(SoilLayer1D soilLayer) { - var layerIndex = layers.IndexOf(soilLayer); - var soilLayerBelow = (layerIndex < layers.Count - 1) ? layers[layerIndex + 1] : null; - var levelBelow = (soilLayerBelow != null) ? soilLayerBelow.TopLevel : BottomLevel; + int layerIndex = layers.IndexOf(soilLayer); + SoilLayer1D soilLayerBelow = (layerIndex < layers.Count - 1) ? layers[layerIndex + 1] : null; + double levelBelow = (soilLayerBelow != null) ? soilLayerBelow.TopLevel : BottomLevel; return soilLayer.TopLevel - levelBelow; } @@ -342,7 +344,7 @@ /// public void EnsureLastLayerHasHeight() { - var bottomLayer = Layers.Last(); + SoilLayer1D bottomLayer = Layers.Last(); if (bottomLayer.Height.IsZero()) { BottomLevel -= DefaultBottomLayerHeight; @@ -355,16 +357,15 @@ /// Length of the penetration. public void DetermineInfiltrationLayer(double penetrationLength) { - infiltrationLayer = null; + InfiltrationLayer = null; SoilLayer1D bottomAquiferLayer = BottomAquiferLayer; if (penetrationLength > 0 && bottomAquiferLayer != null) { SoilLayer1D inBetweenAquiferLayer = InBetweenAquiferLayer; - double aquiferBottom = inBetweenAquiferLayer == null ? - Double.PositiveInfinity : inBetweenAquiferLayer.BottomLevel; + double aquiferBottom = inBetweenAquiferLayer == null ? Double.PositiveInfinity : inBetweenAquiferLayer.BottomLevel; IList infiltrationLayers = layers.Where(l => l.TopLevel <= aquiferBottom && l.TopLevel > bottomAquiferLayer.TopLevel) @@ -376,12 +377,12 @@ if (separationLevel <= infiltrationLayers.First().TopLevel) { - infiltrationLayer = layers.Last(l => l.TopLevel >= separationLevel); + InfiltrationLayer = layers.Last(l => l.TopLevel >= separationLevel); } } } } - + /// /// Validates this instance (using validator mechanism). /// @@ -393,46 +394,47 @@ if (LayerCount == 0) { - var error = String.Format(LocalizationManager.GetTranslatedText(this, "SoilProfileWithoutLayers"), Name); + string error = String.Format(LocalizationManager.GetTranslatedText(this, "SoilProfileWithoutLayers"), Name); return new[] - { - new ValidationResult(ValidationResultType.Error, - error, "", this) - }; + { + new ValidationResult(ValidationResultType.Error, + error, "", this) + }; } if (!IsStrictlyDescending(out erroneousLayer)) { - var error = String.Format(LocalizationManager.GetTranslatedText(this, "SoilProfileLayersNotDescending"), - Name, erroneousLayer.Name); + string error = String.Format(LocalizationManager.GetTranslatedText(this, "SoilProfileLayersNotDescending"), + Name, erroneousLayer.Name); return new[] - { - new ValidationResult(ValidationResultType.Error, - error, "", this) - }; + { + new ValidationResult(ValidationResultType.Error, + error, "", this) + }; } if (HasInvalidThicknessLayers(out erroneousLayer)) { - var error = String.Format(LocalizationManager.GetTranslatedText(this, "SoilProfileInvalidLayerThickness"), - Name, erroneousLayer.Name); + string error = String.Format(LocalizationManager.GetTranslatedText(this, "SoilProfileInvalidLayerThickness"), + Name, erroneousLayer.Name); return new[] - { - new ValidationResult(ValidationResultType.Error, - error, "", this) - }; + { + new ValidationResult(ValidationResultType.Error, + error, "", this) + }; } if (HasLayersWithoutSoil(out erroneousLayer)) { - var error = String.Format(LocalizationManager.GetTranslatedText(this, "SoilProfileLayerWithoutSoil"), - Name, erroneousLayer.Name); + string error = String.Format(LocalizationManager.GetTranslatedText(this, "SoilProfileLayerWithoutSoil"), + Name, erroneousLayer.Name); return new[] - { - new ValidationResult(ValidationResultType.Error, - error, "", this) - }; + { + new ValidationResult(ValidationResultType.Error, + error, "", this) + }; } + return new ValidationResult[0]; } @@ -452,12 +454,85 @@ /// Bottom level public double GetBottomLevel(SoilLayer1D soilLayer) { - var layerBelow = GetLayerBelow(soilLayer); + SoilLayer1D layerBelow = GetLayerBelow(soilLayer); return layerBelow != null ? layerBelow.TopLevel : BottomLevel; } /// + /// 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. + /// The found layer + public SoilLayer1D GetLayerBelow(SoilLayer1D layer) + { + return GetLayerByInsetOffset(layer, 1); + } + + /// + /// Gets the layer index of the given layer. + /// + /// The layer. + /// The index, -1 if not found + public int GetLayerIndexAt(SoilLayer1D layer) + { + if (layer == null) + { + return -1; + } + + for (var i = 0; i < layers.Count; ++i) + { + if (layers[i] == layer) + { + return i; + } + } + + return -1; + } + + /// + /// Gets the top level of highest aquifer. + /// + /// + public double GetTopLevelOfHighestAquifer() + { + double topLevel; + if (InBetweenAquiferLayer != null) + { + topLevel = InBetweenAquiferLayer.TopLevel; + } + else + { + topLevel = BottomAquiferLayer.TopLevel; + } + + return topLevel; + } + + /// + /// Returns a that represents this instance. + /// + /// + /// A that represents this instance. + /// + public override string ToString() + { + return Name; + } + + /// /// Ares the layers ordered descending. /// /// @@ -471,10 +546,10 @@ return true; } - var current = Layers[0]; - for (int i = 1; i < Layers.Count; ++i) + SoilLayer1D current = Layers[0]; + for (var i = 1; i < Layers.Count; ++i) { - var previous = current; + SoilLayer1D previous = current; current = Layers[i]; if (current.TopLevel > previous.TopLevel) @@ -495,7 +570,7 @@ /// true if the layers are strictly ordered in descending order; otherwise, false. private bool IsStrictlyDescending(out SoilLayer1D erroneousLayer) { - for (int i = 1; i < layers.Count; i++) + for (var i = 1; i < layers.Count; i++) { if (layers[i].TopLevel > layers[i - 1].TopLevel) { @@ -515,20 +590,22 @@ /// True when a layer with invalid thickness exists private bool HasInvalidThicknessLayers(out SoilLayer1D erroneousLayer) { - for (int i = 1; i < layers.Count; i++) + for (var i = 1; i < layers.Count; i++) { if (layers[i].TopLevel >= layers[i - 1].TopLevel) { erroneousLayer = layers[i]; return true; } } + // check bottom layer using bottom of profile if (layers.Count > 0 && layers[layers.Count - 1].TopLevel <= BottomLevel) { erroneousLayer = layers[layers.Count - 1]; return true; } + erroneousLayer = null; return false; } @@ -540,14 +617,15 @@ /// true when a layer without soil is found private bool HasLayersWithoutSoil(out SoilLayer1D erroneousLayer) { - for (int i = 0; i < layers.Count; i++) + for (var i = 0; i < layers.Count; i++) { if (layers[i].Soil == null) { erroneousLayer = layers[i]; return true; } } + erroneousLayer = null; return false; } @@ -585,77 +663,6 @@ return layers[requestedIndex]; } - /// - /// 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. - /// The found layer - public SoilLayer1D GetLayerBelow(SoilLayer1D layer) - { - return GetLayerByInsetOffset(layer, 1); - } - - /// - /// Gets the layer index of the given layer. - /// - /// The layer. - /// The index, -1 if not found - public int GetLayerIndexAt(SoilLayer1D layer) - { - if (layer == null) - { - return -1; - } - - for (int i = 0; i < layers.Count; ++i) - { - if (layers[i] == layer) - { - return i; - } - } - return -1; - } - - /// - /// Gets the top level of highest aquifer. - /// - /// - public double GetTopLevelOfHighestAquifer() - { - double topLevel; - if (InBetweenAquiferLayer != null) - { - topLevel = InBetweenAquiferLayer.TopLevel; - } - else - { - topLevel = BottomAquiferLayer.TopLevel; - } - return topLevel; - } - - /// - /// Returns a that represents this instance. - /// - /// - /// A that represents this instance. - /// - public override string ToString() - { - return Name; - } - private void AddLayer(SoilLayer1D layer) { layer.SoilProfile = this;