// 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.Linq; using Core.Common.Base; using Core.Common.Base.Data; using Core.Common.Base.Geometry; using Ringtoets.Common.Data.Calculation; using Ringtoets.Common.Data.DikeProfiles; using Ringtoets.Common.Data.Probabilistics; using Ringtoets.HydraRing.Data; using RingtoetsCommonDataResources = Ringtoets.Common.Data.Properties.Resources; namespace Ringtoets.ClosingStructures.Data { /// /// Class that holds all closing structures calculation specific input parameters. /// public class ClosingStructuresInput : Observable, ICalculationInput { private readonly NormalDistribution modelFactorSuperCriticalFlow; private readonly NormalDistribution thresholdHeightOpenWeir; private readonly NormalDistribution drainCoefficient; private readonly LogNormalDistribution areaFlowApertures; private readonly NormalDistribution levelCrestStructureNotClosing; private readonly NormalDistribution insideWaterLevel; private readonly LogNormalDistribution storageStructureArea; private readonly LogNormalDistribution allowedLevelIncreaseStorage; private readonly LogNormalDistribution flowWidthAtBottomProtection; private readonly NormalDistribution widthFlowApertures; private readonly LogNormalDistribution stormDuration; private readonly LogNormalDistribution criticalOverToppingDischarge; private RoundedDouble structureNormalOrientation; private RoundedDouble factorStormDurationOpenStructure; private double failureProbablityOpenStructure; private double failureProbabilityReparation; private double failureProbabilityStructureWithErosion; private double probabilityOpenStructureBeforeFlooding; private RoundedDouble deviationWaveDirection; private ForeshoreProfile foreshoreProfile; /// /// Creates a new instance of the class. /// public ClosingStructuresInput() { structureNormalOrientation = new RoundedDouble(2); factorStormDurationOpenStructure = new RoundedDouble(2, double.NaN); deviationWaveDirection = new RoundedDouble(2, double.NaN); failureProbablityOpenStructure = double.NaN; failureProbabilityReparation = double.NaN; failureProbabilityStructureWithErosion = double.NaN; probabilityOpenStructureBeforeFlooding = 1.0; modelFactorSuperCriticalFlow = new NormalDistribution(2) { Mean = (RoundedDouble) 1.1, StandardDeviation = (RoundedDouble) 0.03 }; thresholdHeightOpenWeir = new NormalDistribution(2) { Mean = (RoundedDouble) double.NaN, StandardDeviation = (RoundedDouble) 0.1 }; drainCoefficient = new NormalDistribution(2) { Mean = (RoundedDouble) 1, StandardDeviation = (RoundedDouble) 0.2 }; areaFlowApertures = new LogNormalDistribution(2) { Mean = (RoundedDouble) double.NaN, StandardDeviation = (RoundedDouble) 0.01 }; levelCrestStructureNotClosing = new NormalDistribution(2) { Mean = (RoundedDouble) double.NaN, StandardDeviation = (RoundedDouble) 0.05 }; insideWaterLevel = new NormalDistribution(2) { Mean = (RoundedDouble) double.NaN, StandardDeviation = (RoundedDouble) 0.1 }; allowedLevelIncreaseStorage = new LogNormalDistribution(2) { Mean = (RoundedDouble) double.NaN, StandardDeviation = (RoundedDouble) 0.1 }; storageStructureArea = new LogNormalDistribution(2) { Mean = (RoundedDouble) double.NaN }; storageStructureArea.SetStandardDeviationFromVariationCoefficient(0.1); flowWidthAtBottomProtection = new LogNormalDistribution(2) { Mean = (RoundedDouble) double.NaN, StandardDeviation = (RoundedDouble) 0.05 }; criticalOverToppingDischarge = new LogNormalDistribution(2) { Mean = (RoundedDouble) double.NaN }; criticalOverToppingDischarge.SetStandardDeviationFromVariationCoefficient(0.15); widthFlowApertures = new NormalDistribution(2) { Mean = (RoundedDouble) double.NaN, }; widthFlowApertures.SetStandardDeviationFromVariationCoefficient(0.05); stormDuration = new LogNormalDistribution(2) { Mean = (RoundedDouble) 6.0 }; stormDuration.SetStandardDeviationFromVariationCoefficient(0.25); UpdateForeshoreProperties(); } private bool ValidProbabilityValue(double probability) { return !double.IsNaN(probability) && probability <= 1 && probability >= 0; } #region Structure properties /// /// Gets or sets the closing structure. /// public ClosingStructure ClosingStructure { get; set; } /// /// Gets or sets the type of closing structure. /// public ClosingStructureType ClosingStructureType { get; set; } #endregion #region Model Factors /// /// Gets or sets the model factor for the super critical flow. /// /// Only sets the mean. public NormalDistribution ModelFactorSuperCriticalFlow { get { return modelFactorSuperCriticalFlow; } set { modelFactorSuperCriticalFlow.Mean = value.Mean; } } /// /// Gets or sets the drain coefficient. /// /// Only sets the mean. public NormalDistribution DrainCoefficient { get { return drainCoefficient; } set { drainCoefficient.Mean = value.Mean; } } /// /// Gets or sets the storm duration for an open structure. /// public RoundedDouble FactorStormDurationOpenStructure { get { return factorStormDurationOpenStructure; } set { factorStormDurationOpenStructure = value.ToPrecision(factorStormDurationOpenStructure.NumberOfDecimalPlaces); } } #endregion #region Hydraulic load and data properties public HydraulicBoundaryLocation HydraulicBoundaryLocation { get; set; } #region Foreshore Profile /// /// Gets or sets the foreshore profile. /// public ForeshoreProfile ForeshoreProfile { get { return foreshoreProfile; } set { foreshoreProfile = value; UpdateForeshoreProperties(); } } /// /// Gets or sets whether the needs to be taken into account. /// public bool UseBreakWater { get; set; } /// /// Gets or sets whether the needs to be taken into account. /// public bool UseForeshore { get; set; } /// /// Gets the geometry of the foreshore. /// public RoundedPoint2DCollection ForeshoreGeometry { get { return foreshoreProfile != null ? foreshoreProfile.Geometry : new RoundedPoint2DCollection(2, Enumerable.Empty()); } } /// /// Gets the . /// public BreakWater BreakWater { get; private set; } private void UpdateForeshoreProperties() { if (foreshoreProfile == null) { UseForeshore = false; UseBreakWater = false; BreakWater = GetDefaultBreakWaterProperties(); } else { UseForeshore = foreshoreProfile.Geometry.Count() > 1; UseBreakWater = foreshoreProfile.HasBreakWater; BreakWater = foreshoreProfile.HasBreakWater ? new BreakWater(foreshoreProfile.BreakWater.Type, foreshoreProfile.BreakWater.Height) : GetDefaultBreakWaterProperties(); } } private BreakWater GetDefaultBreakWaterProperties() { return new BreakWater(BreakWaterType.Dam, 0.0); } #endregion /// /// Gets or sets the inside water level. /// [m+NAP] /// public NormalDistribution InsideWaterLevel { get { return insideWaterLevel; } set { insideWaterLevel.Mean = value.Mean; insideWaterLevel.StandardDeviation = value.StandardDeviation; } } /// /// Gets or sets the deviation of the wave direction. /// [degrees] /// public RoundedDouble DeviationWaveDirection { get { return deviationWaveDirection; } set { deviationWaveDirection = value.ToPrecision(deviationWaveDirection.NumberOfDecimalPlaces); } } /// /// Gets or sets the storm duration. /// [hrs] /// /// Only sets the mean. public LogNormalDistribution StormDuration { get { return stormDuration; } set { stormDuration.Mean = value.Mean; } } #endregion #region Schematization #region Structure Normal orientation /// /// Gets or sets the orientation of the normal of the structure. /// [degrees] /// ///Thown when the value for the orientation is not between [0,360] degrees. public RoundedDouble StructureNormalOrientation { get { return structureNormalOrientation; } set { RoundedDouble newOrientationValue = value.ToPrecision(structureNormalOrientation.NumberOfDecimalPlaces); if (newOrientationValue < 0 || newOrientationValue > 360) { throw new ArgumentOutOfRangeException(null, RingtoetsCommonDataResources.Orientation_Value_needs_to_be_between_0_and_360); } structureNormalOrientation = newOrientationValue; } } #endregion /// /// Gets or sets the threshold height of the open weir. /// [m+NAP] /// public NormalDistribution ThresholdHeightOpenWeir { get { return thresholdHeightOpenWeir; } set { thresholdHeightOpenWeir.Mean = value.Mean; thresholdHeightOpenWeir.StandardDeviation = value.StandardDeviation; } } /// /// Gets or sets the area flow apertures. /// [m^2] /// public LogNormalDistribution AreaFlowApertures { get { return areaFlowApertures; } set { areaFlowApertures.Mean = value.Mean; areaFlowApertures.StandardDeviation = value.StandardDeviation; } } /// /// Gets or sets the failure probability of an open structure. /// [1/year] /// /// Thrown when the value of the probability /// is not between [0, 1]. public double FailureProbabilityOpenStructure { get { return failureProbablityOpenStructure; } set { if (!ValidProbabilityValue(value)) { throw new ArgumentOutOfRangeException(null, RingtoetsCommonDataResources.FailureProbability_Value_needs_to_be_between_0_and_1); } failureProbablityOpenStructure = value; } } /// /// Gets or sets the reparation failure probability. /// [1/year] /// /// Thrown when the value of the probability /// is not between [0, 1]. public double FailureProbablityReparation { get { return failureProbabilityReparation; } set { if (!ValidProbabilityValue(value)) { throw new ArgumentOutOfRangeException(null, RingtoetsCommonDataResources.FailureProbability_Value_needs_to_be_between_0_and_1); } failureProbabilityReparation = value; } } /// /// Gets or sets the amount of identical apertures to use during the calculation. /// public int IdenticalApertures { get; set; } /// /// Gets or sets the level of crest of the structures that are not closed. /// [m+NAP] /// public NormalDistribution LevelCrestStructureNotClosing { get { return levelCrestStructureNotClosing; } set { levelCrestStructureNotClosing.Mean = value.Mean; levelCrestStructureNotClosing.StandardDeviation = value.StandardDeviation; } } /// /// Gets or sets the allowable increase of level for storage. /// [m] /// public LogNormalDistribution AllowedLevelIncreaseStorage { get { return allowedLevelIncreaseStorage; } set { allowedLevelIncreaseStorage.Mean = value.Mean; allowedLevelIncreaseStorage.StandardDeviation = value.StandardDeviation; } } /// /// Gets or sets the storage structure area. /// [m^2] /// public LogNormalDistribution StorageStructureArea { get { return storageStructureArea; } set { storageStructureArea.Mean = value.Mean; storageStructureArea.StandardDeviation = value.StandardDeviation; } } /// /// Gets or sets the flow width at the bottom protection. /// [m] /// public LogNormalDistribution FlowWidthAtBottomProtection { get { return flowWidthAtBottomProtection; } set { flowWidthAtBottomProtection.Mean = value.Mean; flowWidthAtBottomProtection.StandardDeviation = value.StandardDeviation; } } /// /// Gets or sets the critical overtopping discharge. /// [m^3/s/m] /// public LogNormalDistribution CriticalOverToppingDischarge { get { return criticalOverToppingDischarge; } set { criticalOverToppingDischarge.Mean = value.Mean; criticalOverToppingDischarge.StandardDeviation = value.StandardDeviation; } } /// /// Gets or sets the failure probability of structure given erosion. /// [1/year] /// /// Thrown when the value of the probability /// is not between [0, 1]. public double FailureProbabilityStructureWithErosion { get { return failureProbabilityStructureWithErosion; } set { if (!ValidProbabilityValue(value)) { throw new ArgumentOutOfRangeException(null, RingtoetsCommonDataResources.FailureProbability_Value_needs_to_be_between_0_and_1); } failureProbabilityStructureWithErosion = value; } } /// /// Gets or sets the width of flow apertures. /// [m] /// public NormalDistribution WidthFlowApertures { get { return widthFlowApertures; } set { widthFlowApertures.Mean = value.Mean; widthFlowApertures.StandardDeviation = value.StandardDeviation; } } /// /// Gets or sets the failure probability of an open structure before flooding. /// /// Thrown when the value of the probability /// is not between [0, 1]. public double ProbabilityOpenStructureBeforeFlooding { get { return probabilityOpenStructureBeforeFlooding; } set { if (!ValidProbabilityValue(value)) { throw new ArgumentOutOfRangeException(null, RingtoetsCommonDataResources.FailureProbability_Value_needs_to_be_between_0_and_1); } probabilityOpenStructureBeforeFlooding = value; } } #endregion } }