// Copyright (C) Stichting Deltares 2017. 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; using Core.Common.Base.Data; using Core.Common.Base.Geometry; using Ringtoets.Common.Data.Probabilistics; using Ringtoets.Common.IO.Exceptions; using Ringtoets.Common.IO.SoilProfile; using Ringtoets.MacroStabilityInwards.Data; using Ringtoets.MacroStabilityInwards.Data.SoilProfile; using Ringtoets.MacroStabilityInwards.IO.Properties; using RingtoetsCommonIOResources = Ringtoets.Common.IO.Properties.Resources; namespace Ringtoets.MacroStabilityInwards.IO.SoilProfiles { /// /// Transforms generic into /// or . /// internal static class MacroStabilityInwardsSoilLayerTransformer { private const double tolerance = 1e-6; /// /// Transforms the generic into a /// . /// /// The soil layer to use in the transformation. /// A based on the given data. /// Thrown when is /// null. /// Thrown when transformation would not result /// in a valid transformed instance. public static MacroStabilityInwardsSoilLayer1D Transform(SoilLayer1D soilLayer) { if (soilLayer == null) { throw new ArgumentNullException(nameof(soilLayer)); } ValidateStochasticParameters(soilLayer); var layer = new MacroStabilityInwardsSoilLayer1D(soilLayer.Top); SetProperties(soilLayer, layer.Data); return layer; } /// /// Transforms the generic into a /// . /// /// The soil layer to use in the transformation. /// A based on the given data. /// Thrown when is /// null. /// Thrown when transformation would not result /// in a valid transformed instance. public static MacroStabilityInwardsSoilLayer2D Transform(SoilLayer2D soilLayer) { if (soilLayer == null) { throw new ArgumentNullException(nameof(soilLayer)); } ValidateStochasticParameters(soilLayer); if (soilLayer.OuterLoop == null) { throw new ImportedDataTransformException(); } Ring outerRing = TransformSegmentToRing(soilLayer.OuterLoop); Ring[] innerRings = soilLayer.InnerLoops.Select(TransformSegmentToRing).ToArray(); var layer = new MacroStabilityInwardsSoilLayer2D(outerRing, innerRings); SetProperties(soilLayer, layer.Data); return layer; } /// /// Sets the properties of the . /// /// The soil layer to get the data from. /// The data to set the data upon. /// Thrown when transformation would not result /// in a valid transformed instance. private static void SetProperties(SoilLayerBase soilLayer, MacroStabilityInwardsSoilLayerData data) { data.ShearStrengthModel = TransformShearStrengthModel(soilLayer.ShearStrengthModel); data.UsePop = TransformUsePop(soilLayer.UsePop); data.MaterialName = soilLayer.MaterialName; data.IsAquifer = TransformIsAquifer(soilLayer.IsAquifer); data.Color = SoilLayerColorConverter.Convert(soilLayer.Color); data.AbovePhreaticLevel = new VariationCoefficientLogNormalDistribution { Mean = (RoundedDouble) soilLayer.AbovePhreaticLevelMean, CoefficientOfVariation = (RoundedDouble) soilLayer.AbovePhreaticLevelCoefficientOfVariation, Shift = (RoundedDouble) soilLayer.AbovePhreaticLevelShift }; data.BelowPhreaticLevel = new VariationCoefficientLogNormalDistribution { Mean = (RoundedDouble) soilLayer.BelowPhreaticLevelMean, CoefficientOfVariation = (RoundedDouble) soilLayer.BelowPhreaticLevelCoefficientOfVariation, Shift = (RoundedDouble) soilLayer.BelowPhreaticLevelShift }; data.Cohesion = new VariationCoefficientLogNormalDistribution { Mean = (RoundedDouble) soilLayer.CohesionMean, CoefficientOfVariation = (RoundedDouble) soilLayer.CohesionCoefficientOfVariation }; data.FrictionAngle = new VariationCoefficientLogNormalDistribution { Mean = (RoundedDouble) soilLayer.FrictionAngleMean, CoefficientOfVariation = (RoundedDouble) soilLayer.FrictionAngleCoefficientOfVariation }; data.ShearStrengthRatio = new VariationCoefficientLogNormalDistribution { Mean = (RoundedDouble) soilLayer.ShearStrengthRatioMean, CoefficientOfVariation = (RoundedDouble) soilLayer.ShearStrengthRatioCoefficientOfVariation }; data.StrengthIncreaseExponent = new VariationCoefficientLogNormalDistribution { Mean = (RoundedDouble) soilLayer.StrengthIncreaseExponentMean, CoefficientOfVariation = (RoundedDouble) soilLayer.StrengthIncreaseExponentCoefficientOfVariation }; data.Pop = new VariationCoefficientLogNormalDistribution { Mean = (RoundedDouble) soilLayer.PopMean, CoefficientOfVariation = (RoundedDouble) soilLayer.PopCoefficientOfVariation }; } /// /// Transforms a to a for the /// is aquifer property of soil layers. /// /// The value to transform. /// A based on . /// Thrown when /// could not be transformed. private static bool TransformIsAquifer(double? isAquifer) { try { return SoilLayerIsAquiferConverter.Convert(isAquifer); } catch (NotSupportedException) { throw new ImportedDataTransformException(string.Format(RingtoetsCommonIOResources.Transform_Invalid_value_ParameterName_0, RingtoetsCommonIOResources.SoilLayerData_IsAquifer_DisplayName)); } } /// /// Transforms a to a for the /// use POP property of soil layers. /// /// The value to transform. /// A based on . /// Thrown when /// could not be transformed. private static bool TransformUsePop(double? usePop) { if (!usePop.HasValue) { return true; } if (Math.Abs(usePop.Value) < tolerance) { return false; } throw new ImportedDataTransformException(string.Format(RingtoetsCommonIOResources.Transform_Invalid_value_ParameterName_0, Resources.SoilLayerData_UsePop_Description)); } /// /// Transforms a to a for the /// shear strength model of soil layers. /// /// The value to transform. /// A based /// on . /// Thrown when /// could not be transformed. private static MacroStabilityInwardsShearStrengthModel TransformShearStrengthModel(double? shearStrengthModel) { if (!shearStrengthModel.HasValue) { return MacroStabilityInwardsShearStrengthModel.CPhi; } if (Math.Abs(shearStrengthModel.Value - 6) < tolerance) { return MacroStabilityInwardsShearStrengthModel.SuCalculated; } if (Math.Abs(shearStrengthModel.Value - 9) < tolerance) { return MacroStabilityInwardsShearStrengthModel.CPhiOrSuCalculated; } if (Math.Abs(shearStrengthModel.Value - 1) < tolerance) { throw new ImportedDataTransformException(Resources.MacroStabilityInwardsSoilLayerTransformer_TransformShearStrengthModel_No_MacroStabilityInwardsShearStrengthModel); } throw new ImportedDataTransformException(string.Format(RingtoetsCommonIOResources.Transform_Invalid_value_ParameterName_0, Resources.SoilLayerData_ShearStrengthModel_Description)); } /// /// Transforms a collection of to . /// /// The segments to transform. /// A based on . /// Thrown when /// could not be transformed to a . private static Ring TransformSegmentToRing(IEnumerable segments) { try { var points = new List(); foreach (Segment2D segment in segments) { points.AddRange(new[] { segment.FirstPoint, segment.SecondPoint }); } return new Ring(points.Distinct()); } catch (ArgumentException e) { throw new ImportedDataTransformException(Resources.MacroStabilityInwardsSoilLayerTransformer_TransformSegmentToRing_Invalid_geometry_for_Ring, e); } } /// /// Validates whether the values of the distribution and shift for the stochastic parameters /// are correct for creating a soil layer. /// /// The soil layer to validate. /// Thrown when any of the distributions of the /// stochastic parameters is not defined as lognormal or is shifted when it should not be. private static void ValidateStochasticParameters(SoilLayerBase soilLayer) { DistributionHelper.ValidateIsLogNormal(soilLayer.AbovePhreaticLevelDistributionType, Resources.SoilLayerData_AbovePhreaticLevelDistribution_Description); DistributionHelper.ValidateIsLogNormal( soilLayer.BelowPhreaticLevelDistributionType, Resources.SoilLayerData_BelowPhreaticLevelDistribution_DisplayName); DistributionHelper.ValidateIsNonShiftedLogNormal( soilLayer.CohesionDistributionType, soilLayer.CohesionShift, Resources.SoilLayerData_CohesionDistribution_DisplayName); DistributionHelper.ValidateIsNonShiftedLogNormal( soilLayer.FrictionAngleDistributionType, soilLayer.FrictionAngleShift, Resources.SoilLayerData_FrictionAngleDistribution_DisplayName); DistributionHelper.ValidateIsNonShiftedLogNormal( soilLayer.ShearStrengthRatioDistributionType, soilLayer.ShearStrengthRatioShift, Resources.SoilLayerData_ShearStrengthRatioDistribution_DisplayName); DistributionHelper.ValidateIsNonShiftedLogNormal( soilLayer.StrengthIncreaseExponentDistributionType, soilLayer.StrengthIncreaseExponentShift, Resources.SoilLayerData_StrengthIncreaseExponentDistribution_DisplayName); DistributionHelper.ValidateIsNonShiftedLogNormal( soilLayer.PopDistributionType, soilLayer.PopShift, Resources.SoilLayerData_PopDistribution_DisplayName); } } }