using System; using System.Collections.Generic; using System.Linq; using Deltares.Geotechnics.Soils; using Deltares.Mathematics; using Deltares.Standard.Language; using Deltares.Standard.Reflection; using Deltares.Standard.Validation; namespace Deltares.Stability { /// /// Validator for .. /// public class PreConsolidationStressListValidator { /// /// for in case /// not enough data is available to perform validation. /// public const string CannotValidateMissingDataId = "NO_VALIDATE_MISSING_DATA"; /// /// for in case /// a data point exists outside of the geometry of the validated soil profile. /// public const string DataOutOfBounds = "PRECONSOLIDATION_DATA_OUT_OF_BOUNDS"; public const string DataOnLayerBoundary = "PRECONSOLIDATION_DATA_ON_LAYER_BOUNDARY"; private readonly StabilityModel model; /// /// Initializes a new instance of the class. /// /// The stability model to be validated. Cannot be null. public PreConsolidationStressListValidator(StabilityModel stabilityModel) { model = stabilityModel; } /// /// Validates the data in . /// /// The collection of validation messages generated by this method. public IValidationResult[] Validate() { var validationMessages = new List(); if (RequiredDataAvailableForValidation(validationMessages) && IsPreconsolidationStressDataRequired()) { ValidateDataInsideProfileBounds(validationMessages); ValidateDataAvailableForSoilProfile(validationMessages); ValidateDataNotOnLayerBoundary(validationMessages); } return validationMessages.ToArray(); } private bool RequiredDataAvailableForValidation(ICollection validationMessages) { var noSoilProfileToValidate = model.SoilProfile == null; if (noSoilProfileToValidate) { return false; } if (model.SoilProfile.Surfaces.Any(s => s.Soil == null) || model.SurfaceLine2 == null) { var translate = this.Translate("Validation::NoValidationDueLackingData_LocationName{0}"); var message = String.Format(translate, model.SoilProfile.Name); var validationResult = new ValidationResult(ValidationResultType.Warning, message, model); validationResult.AddPropertyAndID( model.GetMemberName(m => m.SoilProfile.PreconsolidationStresses), CannotValidateMissingDataId); validationMessages.Add(validationResult); return false; } return true; } private bool IsPreconsolidationStressDataRequired() { return model.SoilProfile.Surfaces.Any(s => s.Soil.ShearStrengthModel == ShearStrengthModel.CuCalculated && !s.Soil.UsePop); } private ValidationResult Create_NoPreconsolidationStress_ValidationResult() { var translate = this.Translate("Validation::NoPreconsolidationStress_LocationName{0}"); string message = String.Format(translate, model.SoilProfile.Name); var validationResult = new ValidationResult(ValidationResultType.Error, message, model); validationResult.Repairer = new MissingPreconsolidationStressRepairer(); validationResult.AddPropertyAndID( model.GetMemberName(m => m.SoilProfile.PreconsolidationStresses), MissingPreconsolidationStressRepairer.NoPreconsolidationStressDataId); return validationResult; } private void ValidateDataInsideProfileBounds(ICollection validationMessages) { if (model.SoilProfile.PreconsolidationStresses.Any(PreConsolidationStressOutsideSoilProfileBounds)) { var translate = this.Translate("Validation::PreconsolidationStressOutOfBounds_LocationName{0}"); string message = String.Format(translate, model.SoilProfile.Name); var validationResult = new ValidationResult(ValidationResultType.Error, message, model); validationResult.AddPropertyAndID( model.GetMemberName(m => m.SoilProfile.PreconsolidationStresses), DataOutOfBounds); validationMessages.Add(validationResult); } } private bool PreConsolidationStressOutsideSoilProfileBounds(PreConsolidationStress preConsolidationStress) { var heightAtXcoordinate = model.SurfaceLine2.Geometry.GetZAtX(preConsolidationStress.X); return heightAtXcoordinate < preConsolidationStress.Z; } private void ValidateDataAvailableForSoilProfile(ICollection validationMessages) { if (!PreConsolidationDataAvailableForSoilProfile()) { validationMessages.Add(Create_NoPreconsolidationStress_ValidationResult()); } } private bool PreConsolidationDataAvailableForSoilProfile() { return model.SoilProfile.PreconsolidationStresses.Any(); } private void ValidateDataNotOnLayerBoundary(ICollection validationMessages) { if (model.SoilProfile.PreconsolidationStresses.Any(PreConsolidationStressOnLayerBoundary)) { var translate = this.Translate("Validation::PreconsolidationStressOnLayerBoundary_LocationName{0}"); string message = String.Format(translate, model.SoilProfile.Name); var validationResult = new ValidationResult(ValidationResultType.Error, message, model); validationResult.AddPropertyAndID( model.GetMemberName(m => m.SoilProfile.PreconsolidationStresses), DataOnLayerBoundary); validationMessages.Add(validationResult); } } private bool PreConsolidationStressOnLayerBoundary(PreConsolidationStress preConsolidationStress) { bool result = false; Point3D point = new Point3D { X = preConsolidationStress.X, Y = preConsolidationStress.Y, Z = preConsolidationStress.Z }; foreach (var curves in model.Geometry.Curves) { if (curves.ContainsPoint(point, Constants.CGeoAccu)) { result = true; } } return result; } } }