// Copyright (C) Stichting Deltares 2016. All rights reserved. // // This file is part of Ringtoets. // // Ringtoets is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // // All names, logos, and references to "Deltares" are registered trademarks of // Stichting Deltares and remain full property of Stichting Deltares at all times. // All rights reserved. using System; using System.Collections.Generic; using System.Linq; namespace Ringtoets.Common.IO.Structures { /// /// This class contains validations methods for objects. /// public static class StructuresParameterRowsValidator { private static readonly Dictionary>> heightStructuresRules = new Dictionary>> { { "KW_HOOGTE1", OrientationOfTheNormalOfTheStructure }, { "KW_HOOGTE2", LevelOfCrestOfStructure }, { "KW_HOOGTE3", FlowWidthAtBottomProtection }, { "KW_HOOGTE4", CriticalOvertoppingDischarge }, { "KW_HOOGTE5", WidthOfFlowApertures }, { "KW_HOOGTE6", FailureProbabilityOfStructureGivenErosion }, { "KW_HOOGTE7", StorageStructureArea }, { "KW_HOOGTE8", AllowableIncreaseOfLevelForStorage } }; /// /// Validates a collection of . /// /// The objects to validate. /// A object containing the validation result. /// Thrown when is null. public static ValidationResult ValidateHeightStructuresParameters(IList structureParameterRows) { if (structureParameterRows == null) { throw new ArgumentNullException("structureParameterRows"); } List warningMessages = new List(); List errorMessages = new List(); foreach (string name in heightStructuresRules.Keys) { int count = structureParameterRows.Count(row => row.ParameterId.Equals(name)); if (count < 1) { errorMessages.Add(string.Format("Parameter '{0}' ontbreekt.", name)); continue; } if (count > 1) { warningMessages.Add(string.Format("Parameter '{0}' komt meermaals voor. De eerste specificatie wordt gebruikt.", name)); } errorMessages.AddRange(heightStructuresRules[name](structureParameterRows.First(row => row.ParameterId.Equals(name)))); } return new ValidationResult(errorMessages, warningMessages); } #region HeightStructuesRules private static List OrientationOfTheNormalOfTheStructure(StructuresParameterRow row) { List messages = new List(); double orientation = row.NumericalValue; if (!(orientation >= 0 && orientation <= 360)) { messages.Add("De oriëntatie van het kunstwerk valt buiten het bereik [0, 360]."); } return messages; } private static List LevelOfCrestOfStructure(StructuresParameterRow row) { List messages = new List(); double meanCrestLevel = row.NumericalValue; if (double.IsNaN(meanCrestLevel) || double.IsInfinity(meanCrestLevel)) { messages.Add("De kerende hoogte van het kunstwerk heeft een ongeldige waarde."); } double variance = row.VarianceValue; if (double.IsNaN(variance) || double.IsInfinity(variance) || variance < 0.0 || row.VarianceType != VarianceType.StandardDeviation) { messages.Add("De standaard afwijking van de kerende hoogte normaalverdeling heeft een ongeldige waarde."); } return messages; } private static List FlowWidthAtBottomProtection(StructuresParameterRow row) { List messages = new List(); double meanFlowWidth = row.NumericalValue; if (double.IsNaN(meanFlowWidth) || double.IsInfinity(meanFlowWidth)) { messages.Add("De stroomvoerende breedte bij bodembescherming van het kunstwerk heeft een ongeldige waarde."); } double variance = row.VarianceValue; if (double.IsNaN(variance) || double.IsInfinity(variance) || variance < 0.0 || row.VarianceType != VarianceType.CoefficientOfVariation) { messages.Add("De variantie van de stroomvoerende breedte bij bodembescherming lognormaalverdeling heeft een ongeldige waarde."); } return messages; } private static List CriticalOvertoppingDischarge(StructuresParameterRow row) { List messages = new List(); double meanDischange = row.NumericalValue; if (double.IsNaN(meanDischange) || double.IsInfinity(meanDischange)) { messages.Add("Het kritieke overslagdebiet per strekkende meter van het kunstwerk heeft een ongeldige waarde."); } double variance = row.VarianceValue; if (double.IsNaN(variance) || double.IsInfinity(variance) || variance < 0.0 || row.VarianceType != VarianceType.CoefficientOfVariation) { messages.Add("De variantie van de kritieke overslagdebiet per strekkende meter lognormaalverdeling heeft een ongeldige waarde."); } return messages; } private static List WidthOfFlowApertures(StructuresParameterRow row) { List messages = new List(); double meanWidth = row.NumericalValue; if (double.IsNaN(meanWidth) || double.IsInfinity(meanWidth)) { messages.Add("De breedte van de kruin van het kunstwerk heeft een ongeldige waarde."); } double variance = row.VarianceValue; if (double.IsNaN(variance) || double.IsInfinity(variance) || variance < 0.0 || row.VarianceType != VarianceType.StandardDeviation) { messages.Add("De standaard afwijking van de breedte van de kruin normaalverdeling heeft een ongeldige waarde."); } return messages; } private static List FailureProbabilityOfStructureGivenErosion(StructuresParameterRow row) { List messages = new List(); double failureProbability = row.NumericalValue; if (failureProbability < 0.0 || failureProbability > 1.0) { messages.Add("De waarde voor de faalkans van het kunstwerk valt buiten het bereik [0, 1]."); } return messages; } private static List StorageStructureArea(StructuresParameterRow row) { List messages = new List(); double meanArea = row.NumericalValue; if (double.IsNaN(meanArea) || double.IsInfinity(meanArea)) { messages.Add("Het kombergend oppervlak van het kunstwerk heeft een ongeldige waarde."); } double variance = row.VarianceValue; if (double.IsNaN(variance) || double.IsInfinity(variance) || variance < 0.0 || row.VarianceType != VarianceType.CoefficientOfVariation) { messages.Add("De variantie van de kombergend oppervlak lognormaalverdeling heeft een ongeldige waarde."); } return messages; } private static List AllowableIncreaseOfLevelForStorage(StructuresParameterRow row) { List messages = new List(); double meanAllowableIncrease = row.NumericalValue; if (double.IsNaN(meanAllowableIncrease) || double.IsInfinity(meanAllowableIncrease)) { messages.Add("De toegestane peilverhoging op het kombergend oppervlak van het kunstwerk heeft een ongeldige waarde."); } double variance = row.VarianceValue; if (double.IsNaN(variance) || double.IsInfinity(variance) || variance < 0.0 || row.VarianceType != VarianceType.CoefficientOfVariation) { messages.Add("De variantie van de toegestane peilverhoging op het kombergend oppervlak lognormaalverdeling heeft een ongeldige waarde."); } return messages; } #endregion } }