From 56aed8acee9899af6cc985f63a55ac97eeff5e43 Mon Sep 17 00:00:00 2001 From: kpne Date: Mon, 2 Dec 2024 18:10:17 +0100 Subject: [PATCH 1/5] update en steel with specification class --- .../En/EnSteelCorrosionResistance.cs | 9 ++ .../En/EnSteelDeliveryCondition.cs | 16 ++ .../En/EnSteelFormingTemperature.cs | 8 + .../StandardMaterials/En/EnSteelGrade.cs | 24 +-- .../En/EnSteelImpactTemperatureProperty.cs | 9 ++ .../StandardMaterials/En/EnSteelQuality.cs | 11 ++ .../StandardMaterials/En/IEnSteelMaterial.cs | 4 +- .../En/IEnSteelSpecification.cs | 16 ++ .../ENMaterialFactory/ENSteelFactoryTests.cs | 149 ++++++++++-------- .../EN/EnSteelMaterialTests.cs | 10 +- .../LinearElasticMaterialFactory.cs | 2 +- .../EnMaterialFactory/EnSteelFactory.cs | 143 +++++++++++------ .../StandardMaterials/En/EnSteelMaterial.cs | 80 +++++++++- .../En/EnSteelSpecification.cs | 16 ++ 14 files changed, 358 insertions(+), 139 deletions(-) create mode 100644 Materials/IMaterials/StandardMaterials/En/EnSteelCorrosionResistance.cs create mode 100644 Materials/IMaterials/StandardMaterials/En/EnSteelDeliveryCondition.cs create mode 100644 Materials/IMaterials/StandardMaterials/En/EnSteelFormingTemperature.cs create mode 100644 Materials/IMaterials/StandardMaterials/En/EnSteelImpactTemperatureProperty.cs create mode 100644 Materials/IMaterials/StandardMaterials/En/EnSteelQuality.cs create mode 100644 Materials/IMaterials/StandardMaterials/En/IEnSteelSpecification.cs create mode 100644 Materials/Materials/StandardMaterials/En/EnSteelSpecification.cs diff --git a/Materials/IMaterials/StandardMaterials/En/EnSteelCorrosionResistance.cs b/Materials/IMaterials/StandardMaterials/En/EnSteelCorrosionResistance.cs new file mode 100644 index 0000000..bc40a4d --- /dev/null +++ b/Materials/IMaterials/StandardMaterials/En/EnSteelCorrosionResistance.cs @@ -0,0 +1,9 @@ +namespace MagmaWorks.Taxonomy.Materials.StandardMaterials.En +{ + public enum EnSteelCorrosionResistance + { + None, + W, + WP + } +} diff --git a/Materials/IMaterials/StandardMaterials/En/EnSteelDeliveryCondition.cs b/Materials/IMaterials/StandardMaterials/En/EnSteelDeliveryCondition.cs new file mode 100644 index 0000000..928365e --- /dev/null +++ b/Materials/IMaterials/StandardMaterials/En/EnSteelDeliveryCondition.cs @@ -0,0 +1,16 @@ +using System.ComponentModel; + +namespace MagmaWorks.Taxonomy.Materials.StandardMaterials.En +{ + public enum EnSteelDeliveryCondition + { + [Description("As-rolled")] + AR, + [Description("Normalised rolled in accordance with EN 10025-3")] + N, + [Description("Thermomechanical rolling in accordance with EN 10025-4")] + M, + [Description("Quenched and tempered in accordance with EN 10025-6")] + Q + } +} diff --git a/Materials/IMaterials/StandardMaterials/En/EnSteelFormingTemperature.cs b/Materials/IMaterials/StandardMaterials/En/EnSteelFormingTemperature.cs new file mode 100644 index 0000000..26d4c57 --- /dev/null +++ b/Materials/IMaterials/StandardMaterials/En/EnSteelFormingTemperature.cs @@ -0,0 +1,8 @@ +namespace MagmaWorks.Taxonomy.Materials.StandardMaterials.En +{ + public enum EnSteelFormingTemperature + { + HotRolled, + ColdFormed + } +} diff --git a/Materials/IMaterials/StandardMaterials/En/EnSteelGrade.cs b/Materials/IMaterials/StandardMaterials/En/EnSteelGrade.cs index f64e8a1..39ea9da 100644 --- a/Materials/IMaterials/StandardMaterials/En/EnSteelGrade.cs +++ b/Materials/IMaterials/StandardMaterials/En/EnSteelGrade.cs @@ -5,28 +5,8 @@ public enum EnSteelGrade S235, S275, S355, + S420, S450, - S275N, - S355N, - S420N, - S460N, - S275M, - S355M, - S420M, - S460M, - S235W, - S355W, - S460Q, - S235H, - S275H, - S355H, - S275NH, - S355NH, - S420NH, - S460NH, - S275MH, - S355MH, - S420MH, - S460MH, + S460, } } diff --git a/Materials/IMaterials/StandardMaterials/En/EnSteelImpactTemperatureProperty.cs b/Materials/IMaterials/StandardMaterials/En/EnSteelImpactTemperatureProperty.cs new file mode 100644 index 0000000..ec68894 --- /dev/null +++ b/Materials/IMaterials/StandardMaterials/En/EnSteelImpactTemperatureProperty.cs @@ -0,0 +1,9 @@ +namespace MagmaWorks.Taxonomy.Materials.StandardMaterials.En +{ + public enum EnSteelImpactTemperatureProperty + { + None, + L, + L1 + } +} diff --git a/Materials/IMaterials/StandardMaterials/En/EnSteelQuality.cs b/Materials/IMaterials/StandardMaterials/En/EnSteelQuality.cs new file mode 100644 index 0000000..237abff --- /dev/null +++ b/Materials/IMaterials/StandardMaterials/En/EnSteelQuality.cs @@ -0,0 +1,11 @@ +namespace MagmaWorks.Taxonomy.Materials.StandardMaterials.En +{ + public enum EnSteelQuality + { + None, + JR, + J0, + J2, + K2 + } +} diff --git a/Materials/IMaterials/StandardMaterials/En/IEnSteelMaterial.cs b/Materials/IMaterials/StandardMaterials/En/IEnSteelMaterial.cs index a85d056..1b11b2f 100644 --- a/Materials/IMaterials/StandardMaterials/En/IEnSteelMaterial.cs +++ b/Materials/IMaterials/StandardMaterials/En/IEnSteelMaterial.cs @@ -5,9 +5,9 @@ namespace MagmaWorks.Taxonomy.Materials.StandardMaterials.En { public interface IEnSteelMaterial : IEnMaterial { + IEnSteelSpecification Specification { get; } EnSteelGrade Grade { get; } - EnExecutionClass ExecutionClassforStaticOrLowSeismicLoading { get; } - EnExecutionClass ExecutionClassforFatigueOrHighSeismicLoading { get; } + /// /// γM0 partial factor for resistance of cross-sections whatever the class is /// diff --git a/Materials/IMaterials/StandardMaterials/En/IEnSteelSpecification.cs b/Materials/IMaterials/StandardMaterials/En/IEnSteelSpecification.cs new file mode 100644 index 0000000..73e4da6 --- /dev/null +++ b/Materials/IMaterials/StandardMaterials/En/IEnSteelSpecification.cs @@ -0,0 +1,16 @@ +using MagmaWorks.Taxonomy.Serialization; + +namespace MagmaWorks.Taxonomy.Materials.StandardMaterials.En +{ + public interface IEnSteelSpecification : ITaxonomySerializable + { + EnExecutionClass ExecutionClassforStaticOrLowSeismicLoading { get; set; } + EnExecutionClass ExecutionClassforFatigueOrHighSeismicLoading { get; set; } + EnSteelCorrosionResistance CorrosionResistance { get; set; } + EnSteelDeliveryCondition DeliveryCondition { get; set; } + EnSteelFormingTemperature FormingTemperature { get; set; } + EnSteelImpactTemperatureProperty ImpactTemperatureProperty { get; set; } + EnSteelQuality Quality { get; set; } + bool HollowSection { get; set; } + } +} diff --git a/Materials/MaterialTests/ENMaterialFactory/ENSteelFactoryTests.cs b/Materials/MaterialTests/ENMaterialFactory/ENSteelFactoryTests.cs index 19d250b..c2ebf79 100644 --- a/Materials/MaterialTests/ENMaterialFactory/ENSteelFactoryTests.cs +++ b/Materials/MaterialTests/ENMaterialFactory/ENSteelFactoryTests.cs @@ -34,17 +34,20 @@ public void CreateStandardS355ConcreteMaterialTests() public void CreateLinearElasticTests(EnSteelGrade grade) { // Assemble + var material = new EnSteelMaterial(grade, NationalAnnex.RecommendedValues); + string materialGrade = GetGradeName(material); + // Act - ILinearElasticMaterial material = EnSteelFactory.CreateLinearElastic(grade); + ILinearElasticMaterial analysisMaterial = EnSteelFactory.CreateLinearElastic(material); // Assert - double expectedStrength = Table3_1[grade].fy40; - Assert.Equal(expectedStrength, material.Strength.Megapascals, 12); + double expectedStrength = Table3_1[materialGrade].fy40; + Assert.Equal(expectedStrength, analysisMaterial.Strength.Megapascals, 12); double expectedElasticModulus = 210; - Assert.Equal(expectedElasticModulus, material.ElasticModulus.Gigapascals, 12); + Assert.Equal(expectedElasticModulus, analysisMaterial.ElasticModulus.Gigapascals, 12); - Assert.Equal(MaterialType.Steel, material.Type); + Assert.Equal(MaterialType.Steel, analysisMaterial.Type); } [Theory] @@ -52,19 +55,21 @@ public void CreateLinearElasticTests(EnSteelGrade grade) public void CreateLinearElasticThickPlatedTests(EnSteelGrade grade) { // Assemble + var material = new EnSteelMaterial(grade, NationalAnnex.RecommendedValues); + string materialGrade = GetGradeName(material); Length thickness = new Length(60, LengthUnit.Millimeter); // Act - ILinearElasticMaterial material = EnSteelFactory.CreateLinearElastic(grade, thickness); + ILinearElasticMaterial analysisMaterial = EnSteelFactory.CreateLinearElastic(material, thickness); // Assert - double expectedStrength = Table3_1[grade].fy80; - Assert.Equal(expectedStrength, material.Strength.Megapascals, 12); + double expectedStrength = Table3_1[materialGrade].fy80; + Assert.Equal(expectedStrength, analysisMaterial.Strength.Megapascals, 12); double expectedElasticModulus = 210; - Assert.Equal(expectedElasticModulus, material.ElasticModulus.Gigapascals, 12); + Assert.Equal(expectedElasticModulus, analysisMaterial.ElasticModulus.Gigapascals, 12); - Assert.Equal(MaterialType.Steel, material.Type); + Assert.Equal(MaterialType.Steel, analysisMaterial.Type); } [Theory] @@ -72,20 +77,23 @@ public void CreateLinearElasticThickPlatedTests(EnSteelGrade grade) public void CreateBiLinearTests(EnSteelGrade grade) { // Assemble + var material = new EnSteelMaterial(grade, NationalAnnex.RecommendedValues); + string materialGrade = GetGradeName(material); + // Act - IBiLinearMaterial material = EnSteelFactory.CreateBiLinear(grade); + IBiLinearMaterial analysisMaterial = EnSteelFactory.CreateBiLinear(material); // Assert - double expectedYieldStrength = Table3_1[grade].fy40; - Assert.Equal(expectedYieldStrength, material.YieldStrength.Megapascals, 12); + double expectedYieldStrength = Table3_1[materialGrade].fy40; + Assert.Equal(expectedYieldStrength, analysisMaterial.YieldStrength.Megapascals, 12); - double expectedUltimateStrength = Table3_1[grade].fu40; - Assert.Equal(expectedUltimateStrength, material.UltimateStrength.Megapascals, 12); + double expectedUltimateStrength = Table3_1[materialGrade].fu40; + Assert.Equal(expectedUltimateStrength, analysisMaterial.UltimateStrength.Megapascals, 12); double expectedElasticModulus = 210; - Assert.Equal(expectedElasticModulus, material.ElasticModulus.Gigapascals, 12); + Assert.Equal(expectedElasticModulus, analysisMaterial.ElasticModulus.Gigapascals, 12); - Assert.Equal(MaterialType.Steel, material.Type); + Assert.Equal(MaterialType.Steel, analysisMaterial.Type); } [Theory] @@ -99,49 +107,54 @@ public void CreateBiLinearThickPlatedTests(EnSteelGrade grade) } // Assemble + var material = new EnSteelMaterial(grade, NationalAnnex.RecommendedValues); + string materialGrade = GetGradeName(material); Length thickness = new Length(60, LengthUnit.Millimeter); // Act - IBiLinearMaterial material = EnSteelFactory.CreateBiLinear(grade, thickness); + IBiLinearMaterial analysisMaterial = EnSteelFactory.CreateBiLinear(material, thickness); // Assert - double expectedYieldStrength = Table3_1[grade].fy80; - Assert.Equal(expectedYieldStrength, material.YieldStrength.Megapascals, 12); + double expectedYieldStrength = Table3_1[materialGrade].fy80; + Assert.Equal(expectedYieldStrength, analysisMaterial.YieldStrength.Megapascals, 12); - double expectedUltimateStrength = Table3_1[grade].fu80; - Assert.Equal(expectedUltimateStrength, material.UltimateStrength.Megapascals, 12); + double expectedUltimateStrength = Table3_1[materialGrade].fu80; + Assert.Equal(expectedUltimateStrength, analysisMaterial.UltimateStrength.Megapascals, 12); double expectedElasticModulus = 210; - Assert.Equal(expectedElasticModulus, material.ElasticModulus.Gigapascals, 12); + Assert.Equal(expectedElasticModulus, analysisMaterial.ElasticModulus.Gigapascals, 12); - Assert.Equal(MaterialType.Steel, material.Type); + Assert.Equal(MaterialType.Steel, analysisMaterial.Type); } [Fact] public void CreateLinearElasticThrowsExpectionForTooThickPlateTests() { // Assemble + var material = new EnSteelMaterial(EnSteelGrade.S235, NationalAnnex.RecommendedValues); Length thickness = new Length(81, LengthUnit.Millimeter); - EnSteelGrade grade = EnSteelGrade.S235; // Act // Assert - Assert.Throws(() => EnSteelFactory.CreateLinearElastic(grade, thickness)); + Assert.Throws(() => EnSteelFactory.CreateLinearElastic(material, thickness)); } [Theory] - [InlineData(EnSteelGrade.S275MH)] - [InlineData(EnSteelGrade.S355MH)] - [InlineData(EnSteelGrade.S420MH)] - [InlineData(EnSteelGrade.S460MH)] + [InlineData(EnSteelGrade.S275)] + [InlineData(EnSteelGrade.S355)] + [InlineData(EnSteelGrade.S420)] + [InlineData(EnSteelGrade.S460)] public void CreateBiLinearThrowsExpectionForSomeGradesTests(EnSteelGrade grade) { // Assemble + var material = new EnSteelMaterial(grade, NationalAnnex.RecommendedValues); + material.Specification.DeliveryCondition = EnSteelDeliveryCondition.M; + material.Specification.HollowSection = true; Length thickness = new Length(60, LengthUnit.Millimeter); // Act // Assert - Assert.Throws(() => EnSteelFactory.CreateBiLinear(grade, thickness)); + Assert.Throws(() => EnSteelFactory.CreateBiLinear(material, thickness)); } public static IEnumerable EnumValues() @@ -152,41 +165,47 @@ public static IEnumerable EnumValues() } } - private static readonly Dictionary Table3_1 = new() + private static string GetGradeName(IEnSteelMaterial material) + { + string materialGrade = $"{material.Grade}{material.Specification.DeliveryCondition}"; + return materialGrade.Replace("AR", string.Empty) + (material.Specification.HollowSection ? "H" : string.Empty); + } + + private static readonly Dictionary Table3_1 = new() { - { EnSteelGrade.S235, (235, 360, 215, 360) }, - { EnSteelGrade.S275, (275, 430, 255, 410) }, - { EnSteelGrade.S355, (355, 490, 335, 470) }, - { EnSteelGrade.S450, (440, 550, 410, 550) }, - - { EnSteelGrade.S275N, (275, 390, 255, 370) }, - { EnSteelGrade.S355N, (355, 490, 335, 470) }, - { EnSteelGrade.S420N, (420, 520, 390, 520) }, - { EnSteelGrade.S460N, (460, 540, 430, 540) }, - - { EnSteelGrade.S275M, (275, 370, 255, 360) }, - { EnSteelGrade.S355M, (355, 470, 335, 450) }, - { EnSteelGrade.S420M, (420, 520, 390, 500) }, - { EnSteelGrade.S460M, (460, 540, 430, 530) }, - - { EnSteelGrade.S235W, (235, 360, 215, 340) }, - { EnSteelGrade.S355W, (355, 490, 335, 490) }, - - { EnSteelGrade.S460Q, (460, 570, 440, 550) }, - - { EnSteelGrade.S235H, (235, 360, 215, 340) }, - { EnSteelGrade.S275H, (275, 430, 255, 410) }, - { EnSteelGrade.S355H, (355, 510, 335, 490) }, - - { EnSteelGrade.S275NH, (275, 390, 255, 370) }, - { EnSteelGrade.S355NH, (355, 490, 335, 470) }, - { EnSteelGrade.S420NH, (420, 540, 390, 520) }, - { EnSteelGrade.S460NH, (460, 560, 430, 550) }, - - { EnSteelGrade.S275MH, (275, 360, 0, 0) }, - { EnSteelGrade.S355MH, (355, 470, 0, 0) }, - { EnSteelGrade.S420MH, (420, 500, 0, 0) }, - { EnSteelGrade.S460MH, (460, 530, 0, 0) }, + { "S235", (235, 360, 215, 360) }, + { "S275", (275, 430, 255, 410) }, + { "S355", (355, 490, 335, 470) }, + { "S450", (440, 550, 410, 550) }, + + { "S275N", (275, 390, 255, 370) }, + { "S355N", (355, 490, 335, 470) }, + { "S420N", (420, 520, 390, 520) }, + { "S460N", (460, 540, 430, 540) }, + + { "S275M", (275, 370, 255, 360) }, + { "S355M", (355, 470, 335, 450) }, + { "S420M", (420, 520, 390, 500) }, + { "S460M", (460, 540, 430, 530) }, + + { "S235W", (235, 360, 215, 340) }, + { "S355W", (355, 490, 335, 490) }, + + { "S460Q", (460, 570, 440, 550) }, + + { "S235H", (235, 360, 215, 340) }, + { "S275H", (275, 430, 255, 410) }, + { "S355H", (355, 510, 335, 490) }, + + { "S275NH", (275, 390, 255, 370) }, + { "S355NH", (355, 490, 335, 470) }, + { "S420NH", (420, 540, 390, 520) }, + { "S460NH", (460, 560, 430, 550) }, + + { "S275MH", (275, 360, 0, 0) }, + { "S355MH", (355, 470, 0, 0) }, + { "S420MH", (420, 500, 0, 0) }, + { "S460MH", (460, 530, 0, 0) }, }; } } diff --git a/Materials/MaterialTests/StandardMaterials/EN/EnSteelMaterialTests.cs b/Materials/MaterialTests/StandardMaterials/EN/EnSteelMaterialTests.cs index 5385570..ce11c52 100644 --- a/Materials/MaterialTests/StandardMaterials/EN/EnSteelMaterialTests.cs +++ b/Materials/MaterialTests/StandardMaterials/EN/EnSteelMaterialTests.cs @@ -26,8 +26,14 @@ public void CreateStandardEnS235UKSteelMaterialTests() "BS EN 1993-1-1: Eurocode 3: Design of Steel Structures - Part 1-1: General rules and rules for buildings", material.Standard.Title); Assert.Equal(MaterialType.Steel, material.Type); - Assert.Equal(EnExecutionClass.EXC3, material.ExecutionClassforStaticOrLowSeismicLoading); - Assert.Equal(EnExecutionClass.EXC3, material.ExecutionClassforFatigueOrHighSeismicLoading); + Assert.Equal(EnExecutionClass.EXC3, material.Specification.ExecutionClassforStaticOrLowSeismicLoading); + Assert.Equal(EnExecutionClass.EXC3, material.Specification.ExecutionClassforFatigueOrHighSeismicLoading); + Assert.Equal(EnSteelDeliveryCondition.AR, material.Specification.DeliveryCondition); + Assert.False(material.Specification.HollowSection); + Assert.Equal(EnSteelFormingTemperature.HotRolled, material.Specification.FormingTemperature); + Assert.Equal(EnSteelImpactTemperatureProperty.None, material.Specification.ImpactTemperatureProperty); + Assert.Equal(EnSteelCorrosionResistance.None, material.Specification.CorrosionResistance); + Assert.Equal(EnSteelQuality.None, material.Specification.Quality); } [Theory] diff --git a/Materials/Materials/AnalysisMaterials/AnalysisMaterialFactory/LinearElasticMaterialFactory.cs b/Materials/Materials/AnalysisMaterials/AnalysisMaterialFactory/LinearElasticMaterialFactory.cs index cec17d6..4572f68 100644 --- a/Materials/Materials/AnalysisMaterials/AnalysisMaterialFactory/LinearElasticMaterialFactory.cs +++ b/Materials/Materials/AnalysisMaterials/AnalysisMaterialFactory/LinearElasticMaterialFactory.cs @@ -23,7 +23,7 @@ public static ILinearElasticMaterial CreateLinearElastic(IStandardMaterial< return EnRebarFactory.CreateLinearElastic(enRebar.Grade); case IEnSteelMaterial enSteel: - return EnSteelFactory.CreateLinearElastic(enSteel.Grade); + return EnSteelFactory.CreateLinearElastic(enSteel); default: throw new ArgumentException($"{material.Type} material type not implemented for Eurocode"); diff --git a/Materials/Materials/EnMaterialFactory/EnSteelFactory.cs b/Materials/Materials/EnMaterialFactory/EnSteelFactory.cs index 46b8f39..d1e13de 100644 --- a/Materials/Materials/EnMaterialFactory/EnSteelFactory.cs +++ b/Materials/Materials/EnMaterialFactory/EnSteelFactory.cs @@ -7,107 +7,162 @@ namespace MagmaWorks.Taxonomy.Materials.StandardMaterials.En { public static class EnSteelFactory { - public static ILinearElasticMaterial CreateLinearElastic(T grade) where T : Enum + public static ILinearElasticMaterial CreateLinearElastic(IEnSteelMaterial material) { - MaterialType type = MaterialType.Steel; - Pressure elasticModulus = new Pressure(210, PressureUnit.Gigapascal); - Pressure yieldStrength = EN1993_1_1_Table3_1[grade].F_y_40mmOrLess; - return new LinearElasticMaterial(type, elasticModulus, yieldStrength); + return CreateLinearElastic(material, new Length(40, LengthUnit.Millimeter)); } - public static ILinearElasticMaterial CreateLinearElastic(EnSteelGrade grade, Length elementThickness) + public static ILinearElasticMaterial CreateLinearElastic(IEnSteelMaterial material, Length elementThickness) { MaterialType type = MaterialType.Steel; Pressure elasticModulus = new Pressure(210, PressureUnit.Gigapascal); Pressure yieldStrength; + Dictionary EN1993_1_1_Table3_1 = GetTable3_1Properties(material.Specification); if (elementThickness.Millimeters > 80) { throw new ArgumentException($"Nominal thickness of the element ({elementThickness}) must be less or equal to 80mm"); } else if (elementThickness.Millimeters <= 40) { - yieldStrength = EN1993_1_1_Table3_1[grade].F_y_40mmOrLess; + yieldStrength = EN1993_1_1_Table3_1[material.Grade].F_y_40mmOrLess; if (yieldStrength.Value == 0) { - throw new ArgumentException($"Nominal thickness of the element ({elementThickness}) must be less or equal to 40mm for Grade {grade}"); + throw new ArgumentException($"Nominal thickness of the element ({elementThickness}) must be less or equal to 40mm for Grade {material.Grade}"); } } else { - yieldStrength = EN1993_1_1_Table3_1[grade].F_y_40To80mm; + yieldStrength = EN1993_1_1_Table3_1[material.Grade].F_y_40To80mm; } return new LinearElasticMaterial(type, elasticModulus, yieldStrength); } - public static IBiLinearMaterial CreateBiLinear(EnSteelGrade grade) + public static IBiLinearMaterial CreateBiLinear(IEnSteelMaterial material) { - ILinearElasticMaterial material = CreateLinearElastic(grade); - Pressure ultimateStrength = EN1993_1_1_Table3_1[grade].F_u_40mmOrLess; - Strain failureStrain = new Strain(15 * material.Strength / material.ElasticModulus, StrainUnit.Ratio); - return new BiLinearMaterial(material, ultimateStrength, failureStrain); + ILinearElasticMaterial analysisMaterial = CreateLinearElastic(material, new Length(40, LengthUnit.Millimeter)); + Dictionary EN1993_1_1_Table3_1 = GetTable3_1Properties(material.Specification); + Pressure ultimateStrength = EN1993_1_1_Table3_1[material.Grade].F_u_40mmOrLess; + Strain failureStrain = new Strain(15 * analysisMaterial.Strength / analysisMaterial.ElasticModulus, StrainUnit.Ratio); + return new BiLinearMaterial(analysisMaterial, ultimateStrength, failureStrain); } - public static IBiLinearMaterial CreateBiLinear(EnSteelGrade grade, Length elementThickness) + public static IBiLinearMaterial CreateBiLinear(IEnSteelMaterial material, Length elementThickness) { - ILinearElasticMaterial material = CreateLinearElastic(grade, elementThickness); + ILinearElasticMaterial analysisMaterial = CreateLinearElastic(material, elementThickness); Pressure ultimateStrength; + Dictionary EN1993_1_1_Table3_1 = GetTable3_1Properties(material.Specification); if (elementThickness.Millimeters > 80) { throw new ArgumentException($"Nominal thickness of the element ({elementThickness}) must be less or equal to 80mm"); } else if (elementThickness.Millimeters <= 40) { - ultimateStrength = EN1993_1_1_Table3_1[grade].F_u_40mmOrLess; + ultimateStrength = EN1993_1_1_Table3_1[material.Grade].F_u_40mmOrLess; } else { - ultimateStrength = EN1993_1_1_Table3_1[grade].F_u_40To80mm; + ultimateStrength = EN1993_1_1_Table3_1[material.Grade].F_u_40To80mm; if (ultimateStrength.Value == 0) { - throw new ArgumentException($"Nominal thickness of the element ({elementThickness}) must be less or equal to 40mm for grade {grade}"); + throw new ArgumentException($"Nominal thickness of the element ({elementThickness}) must be less or equal to 40mm for grade {material.Grade}"); } } - Strain failureStrain = new Strain(15 * material.Strength / material.ElasticModulus, StrainUnit.Ratio); - return new BiLinearMaterial(material, ultimateStrength, failureStrain); + Strain failureStrain = new Strain(15 * analysisMaterial.Strength / analysisMaterial.ElasticModulus, StrainUnit.Ratio); + return new BiLinearMaterial(analysisMaterial, ultimateStrength, failureStrain); } - private static readonly Dictionary EN1993_1_1_Table3_1 = new() + private static Dictionary GetTable3_1Properties(IEnSteelSpecification specification) + { + if (specification.FormingTemperature == EnSteelFormingTemperature.ColdFormed) + { + throw new ArgumentException("Unable to get EN1993-1-1, Table 3.1 values for Cold Formed steel. "); + } + + switch (specification.DeliveryCondition) + { + case EnSteelDeliveryCondition.AR: + return specification.HollowSection ? EN1993_1_1_Table3_1_ARH : EN1993_1_1_Table3_1_AR; + + case EnSteelDeliveryCondition.N: + return specification.HollowSection ? EN1993_1_1_Table3_1_NH : EN1993_1_1_Table3_1_N; + + case EnSteelDeliveryCondition.M: + return specification.HollowSection ? EN1993_1_1_Table3_1_MH : EN1993_1_1_Table3_1_M; + + case EnSteelDeliveryCondition.Q: + if (specification.HollowSection) + { + throw new ArgumentException("Unable to get EN1993-1-1, Table 3.1 values for Hollow Sections" + + "using quenched and tempered delivery condition steel. "); + } + + return EN1993_1_1_Table3_1_Q; + + default: + throw new ArgumentException("Unable to get EN1993-1-1, Table 3.1 values for unknown" + + $" Delivery Condition: {specification.DeliveryCondition}"); + } + } + + private static readonly Dictionary EN1993_1_1_Table3_1_AR = new() { { EnSteelGrade.S235, new Table3_1Properties(235, 360, 215, 360) }, { EnSteelGrade.S275, new Table3_1Properties(275, 430, 255, 410) }, { EnSteelGrade.S355, new Table3_1Properties(355, 490, 335, 470) }, { EnSteelGrade.S450, new Table3_1Properties(440, 550, 410, 550) }, + }; - { EnSteelGrade.S275N, new Table3_1Properties(275, 390, 255, 370) }, - { EnSteelGrade.S355N, new Table3_1Properties(355, 490, 335, 470) }, - { EnSteelGrade.S420N, new Table3_1Properties(420, 520, 390, 520) }, - { EnSteelGrade.S460N, new Table3_1Properties(460, 540, 430, 540) }, + private static readonly Dictionary EN1993_1_1_Table3_1_N = new() + { + { EnSteelGrade.S275, new Table3_1Properties(275, 390, 255, 370) }, + { EnSteelGrade.S355, new Table3_1Properties(355, 490, 335, 470) }, + { EnSteelGrade.S420, new Table3_1Properties(420, 520, 390, 520) }, + { EnSteelGrade.S460, new Table3_1Properties(460, 540, 430, 540) }, + }; - { EnSteelGrade.S275M, new Table3_1Properties(275, 370, 255, 360) }, - { EnSteelGrade.S355M, new Table3_1Properties(355, 470, 335, 450) }, - { EnSteelGrade.S420M, new Table3_1Properties(420, 520, 390, 500) }, - { EnSteelGrade.S460M, new Table3_1Properties(460, 540, 430, 530) }, + private static readonly Dictionary EN1993_1_1_Table3_1_M = new() + { + { EnSteelGrade.S275, new Table3_1Properties(275, 370, 255, 360) }, + { EnSteelGrade.S355, new Table3_1Properties(355, 470, 335, 450) }, + { EnSteelGrade.S420, new Table3_1Properties(420, 520, 390, 500) }, + { EnSteelGrade.S460, new Table3_1Properties(460, 540, 430, 530) }, + }; - { EnSteelGrade.S235W, new Table3_1Properties(235, 360, 215, 340) }, - { EnSteelGrade.S355W, new Table3_1Properties(355, 490, 335, 490) }, + private static readonly Dictionary EN1993_1_1_Table3_1_W = new() + { + { EnSteelGrade.S235, new Table3_1Properties(235, 360, 215, 340) }, + { EnSteelGrade.S355, new Table3_1Properties(355, 490, 335, 490) }, + }; - { EnSteelGrade.S460Q, new Table3_1Properties(460, 570, 440, 550) }, + private static readonly Dictionary EN1993_1_1_Table3_1_Q = new() + { + { EnSteelGrade.S460, new Table3_1Properties(460, 570, 440, 550) }, + }; - { EnSteelGrade.S235H, new Table3_1Properties(235, 360, 215, 340) }, - { EnSteelGrade.S275H, new Table3_1Properties(275, 430, 255, 410) }, - { EnSteelGrade.S355H, new Table3_1Properties(355, 510, 335, 490) }, + private static readonly Dictionary EN1993_1_1_Table3_1_ARH = new() + { + + { EnSteelGrade.S235, new Table3_1Properties(235, 360, 215, 340) }, + { EnSteelGrade.S275, new Table3_1Properties(275, 430, 255, 410) }, + { EnSteelGrade.S355, new Table3_1Properties(355, 510, 335, 490) }, + }; - { EnSteelGrade.S275NH, new Table3_1Properties(275, 390, 255, 370) }, - { EnSteelGrade.S355NH, new Table3_1Properties(355, 490, 335, 470) }, - { EnSteelGrade.S420NH, new Table3_1Properties(420, 540, 390, 520) }, - { EnSteelGrade.S460NH, new Table3_1Properties(460, 560, 430, 550) }, + private static readonly Dictionary EN1993_1_1_Table3_1_NH = new() + { + { EnSteelGrade.S275, new Table3_1Properties(275, 390, 255, 370) }, + { EnSteelGrade.S355, new Table3_1Properties(355, 490, 335, 470) }, + { EnSteelGrade.S420, new Table3_1Properties(420, 540, 390, 520) }, + { EnSteelGrade.S460, new Table3_1Properties(460, 560, 430, 550) }, + }; - { EnSteelGrade.S275MH, new Table3_1Properties(275, 360, 0, 0) }, - { EnSteelGrade.S355MH, new Table3_1Properties(355, 470, 0, 0) }, - { EnSteelGrade.S420MH, new Table3_1Properties(420, 500, 0, 0) }, - { EnSteelGrade.S460MH, new Table3_1Properties(460, 530, 0, 0) }, + private static readonly Dictionary EN1993_1_1_Table3_1_MH = new() + { + { EnSteelGrade.S275, new Table3_1Properties(275, 360, 0, 0) }, + { EnSteelGrade.S355, new Table3_1Properties(355, 470, 0, 0) }, + { EnSteelGrade.S420, new Table3_1Properties(420, 500, 0, 0) }, + { EnSteelGrade.S460, new Table3_1Properties(460, 530, 0, 0) }, }; private struct Table3_1Properties diff --git a/Materials/Materials/StandardMaterials/En/EnSteelMaterial.cs b/Materials/Materials/StandardMaterials/En/EnSteelMaterial.cs index 4b5f499..04bfef6 100644 --- a/Materials/Materials/StandardMaterials/En/EnSteelMaterial.cs +++ b/Materials/Materials/StandardMaterials/En/EnSteelMaterial.cs @@ -1,4 +1,6 @@ -using MagmaWorks.Taxonomy.Standards.Eurocode; +using System; +using System.Diagnostics; +using MagmaWorks.Taxonomy.Standards.Eurocode; using OasysUnits; using OasysUnits.Units; @@ -7,10 +9,9 @@ namespace MagmaWorks.Taxonomy.Materials.StandardMaterials.En public class EnSteelMaterial : IEnSteelMaterial { public EnSteelGrade Grade { get; set; } = EnSteelGrade.S355; + public IEnSteelSpecification Specification { get; set; } = new EnSteelSpecification(); public IEurocode Standard { get; set; } = new En1993(En1993Part.Part1_1, NationalAnnex.RecommendedValues); public MaterialType Type => MaterialType.Steel; - public EnExecutionClass ExecutionClassforStaticOrLowSeismicLoading { get; set; } = EnExecutionClass.EXC3; - public EnExecutionClass ExecutionClassforFatigueOrHighSeismicLoading { get; set; } = EnExecutionClass.EXC3; public Ratio PartialFactor { get; set; } = new Ratio(1.0, RatioUnit.DecimalFraction); public Ratio MemberInstabilityPartialFactor { get; set; } = new Ratio(1.0, RatioUnit.DecimalFraction); public Ratio TensionFracturePartialFactor { get; set; } = new Ratio(1.25, RatioUnit.DecimalFraction); @@ -22,6 +23,79 @@ public EnSteelMaterial(EnSteelGrade grade, NationalAnnex nationalAnnex) SetPartialFactors(nationalAnnex); } + public static bool TryCastFromString(string steel, NationalAnnex nationalAnnex, out EnSteelMaterial material) + { + material = null; + string s = steel.Trim().ToLower(); + if (Enum.TryParse(s.Substring(0, 4), true, out EnSteelGrade grade)) + { + return false; + } + + material = new EnSteelMaterial(grade, nationalAnnex); + if (steel.Contains("n")) + { + material.Specification.DeliveryCondition = EnSteelDeliveryCondition.N; + } + + if (steel.Contains("m")) + { + material.Specification.DeliveryCondition = EnSteelDeliveryCondition.M; + } + + if (steel.Contains("q")) + { + material.Specification.DeliveryCondition = EnSteelDeliveryCondition.Q; + } + + if (steel.Contains("h")) + { + material.Specification.HollowSection = true; + } + + if (steel.Contains("w")) + { + material.Specification.CorrosionResistance = EnSteelCorrosionResistance.W; + } + + if (steel.Contains("wp")) + { + material.Specification.CorrosionResistance = EnSteelCorrosionResistance.WP; + } + + if (steel.Contains("l")) + { + material.Specification.ImpactTemperatureProperty = EnSteelImpactTemperatureProperty.L; + } + + if (steel.Contains("l1")) + { + material.Specification.ImpactTemperatureProperty = EnSteelImpactTemperatureProperty.L1; + } + + if (steel.Contains("jr")) + { + material.Specification.Quality = EnSteelQuality.JR; + } + + if (steel.Contains("j0")) + { + material.Specification.Quality = EnSteelQuality.J0; + } + + if (steel.Contains("j2")) + { + material.Specification.Quality = EnSteelQuality.J2; + } + + if (steel.Contains("k2")) + { + material.Specification.Quality = EnSteelQuality.K2; + } + + return true; + } + private void SetPartialFactors(NationalAnnex nationalAnnex) { switch (nationalAnnex) diff --git a/Materials/Materials/StandardMaterials/En/EnSteelSpecification.cs b/Materials/Materials/StandardMaterials/En/EnSteelSpecification.cs new file mode 100644 index 0000000..3571109 --- /dev/null +++ b/Materials/Materials/StandardMaterials/En/EnSteelSpecification.cs @@ -0,0 +1,16 @@ +namespace MagmaWorks.Taxonomy.Materials.StandardMaterials.En +{ + public class EnSteelSpecification : IEnSteelSpecification + { + public EnExecutionClass ExecutionClassforStaticOrLowSeismicLoading { get; set; } = EnExecutionClass.EXC3; + public EnExecutionClass ExecutionClassforFatigueOrHighSeismicLoading { get; set; } = EnExecutionClass.EXC3; + public EnSteelCorrosionResistance CorrosionResistance { get; set; } = EnSteelCorrosionResistance.None; + public EnSteelDeliveryCondition DeliveryCondition { get; set; } = EnSteelDeliveryCondition.AR; + public EnSteelFormingTemperature FormingTemperature { get; set; } = EnSteelFormingTemperature.HotRolled; + public EnSteelImpactTemperatureProperty ImpactTemperatureProperty { get; set; } = EnSteelImpactTemperatureProperty.None; + public EnSteelQuality Quality { get; set; } = EnSteelQuality.None; + public bool HollowSection { get; set; } = false; + + public EnSteelSpecification() { } + } +} From 5927266f80e10d385cc13bf49d73d20cdbc5d585 Mon Sep 17 00:00:00 2001 From: kpne Date: Mon, 2 Dec 2024 18:13:05 +0100 Subject: [PATCH 2/5] test --- .../En/EnSteelSpecificationTests.cs | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 Materials/MaterialTests/StandardMaterials/En/EnSteelSpecificationTests.cs diff --git a/Materials/MaterialTests/StandardMaterials/En/EnSteelSpecificationTests.cs b/Materials/MaterialTests/StandardMaterials/En/EnSteelSpecificationTests.cs new file mode 100644 index 0000000..05416c0 --- /dev/null +++ b/Materials/MaterialTests/StandardMaterials/En/EnSteelSpecificationTests.cs @@ -0,0 +1,43 @@ +using MagmaWorks.Taxonomy.Materials; +using MagmaWorks.Taxonomy.Materials.StandardMaterials.En; +using MagmaWorks.Taxonomy.Serialization; +using MagmaWorks.Taxonomy.Standards; +using MagmaWorks.Taxonomy.Standards.Eurocode; + +namespace MaterialTests.StandardMaterials.En +{ + public class EnSteelSpecificationTests + { + [Fact] + public void CreateSpcificationTests() + { + // Assemble + // Act + IEnSteelSpecification spec = new EnSteelSpecification(); + + // Assert + Assert.Equal(EnExecutionClass.EXC3, spec.ExecutionClassforStaticOrLowSeismicLoading); + Assert.Equal(EnExecutionClass.EXC3, spec.ExecutionClassforFatigueOrHighSeismicLoading); + Assert.Equal(EnSteelDeliveryCondition.AR, spec.DeliveryCondition); + Assert.False(spec.HollowSection); + Assert.Equal(EnSteelFormingTemperature.HotRolled, spec.FormingTemperature); + Assert.Equal(EnSteelImpactTemperatureProperty.None, spec.ImpactTemperatureProperty); + Assert.Equal(EnSteelCorrosionResistance.None, spec.CorrosionResistance); + Assert.Equal(EnSteelQuality.None, spec.Quality); + } + + [Fact] + public void InterfaceSurvivesRoundtripDeserializationTest() + { + // Assemble + IEnSteelSpecification spec = new EnSteelSpecification(); + + // Act + string json = spec.ToJson(); + IEnSteelSpecification matDeserialized = json.FromJson(); + + // Assert + Assert.Equivalent(spec, matDeserialized); + } + } +} From 469fed97ae696ac333d6dc123355bad67572d154 Mon Sep 17 00:00:00 2001 From: kpne Date: Tue, 3 Dec 2024 19:53:05 +0100 Subject: [PATCH 3/5] En Steel Material specification --- .../En/EnSteelDeliveryCondition.cs | 2 +- .../StandardMaterials/En/IEnSteelMaterial.cs | 5 +- .../En/IEnSteelSpecification.cs | 2 + .../En/InvalidSteelSpecificationException.cs | 9 + .../ENMaterialFactory/ENSteelFactoryTests.cs | 70 +++++-- .../EN/EnSteelMaterialTests.cs | 8 - .../En/EnSteelSpecificationTests.cs | 198 +++++++++++++++++- .../EnMaterialFactory/EnSteelFactory.cs | 7 +- .../StandardMaterials/En/EnSteelMaterial.cs | 48 +++-- .../En/EnSteelSpecification.cs | 170 ++++++++++++++- .../ConcreteSectionRebarLayerTests.cs | 3 +- Sections/SectionTests/ConcreteSectionTests.cs | 3 +- Sections/SectionTests/RebarTests.cs | 3 +- 13 files changed, 461 insertions(+), 67 deletions(-) create mode 100644 Materials/IMaterials/StandardMaterials/En/InvalidSteelSpecificationException.cs diff --git a/Materials/IMaterials/StandardMaterials/En/EnSteelDeliveryCondition.cs b/Materials/IMaterials/StandardMaterials/En/EnSteelDeliveryCondition.cs index 928365e..981a0bc 100644 --- a/Materials/IMaterials/StandardMaterials/En/EnSteelDeliveryCondition.cs +++ b/Materials/IMaterials/StandardMaterials/En/EnSteelDeliveryCondition.cs @@ -4,7 +4,7 @@ namespace MagmaWorks.Taxonomy.Materials.StandardMaterials.En { public enum EnSteelDeliveryCondition { - [Description("As-rolled")] + [Description("As-rolled - EN10025-2")] AR, [Description("Normalised rolled in accordance with EN 10025-3")] N, diff --git a/Materials/IMaterials/StandardMaterials/En/IEnSteelMaterial.cs b/Materials/IMaterials/StandardMaterials/En/IEnSteelMaterial.cs index 1b11b2f..6ebbaa1 100644 --- a/Materials/IMaterials/StandardMaterials/En/IEnSteelMaterial.cs +++ b/Materials/IMaterials/StandardMaterials/En/IEnSteelMaterial.cs @@ -1,5 +1,4 @@ -using MagmaWorks.Taxonomy.Materials.StandardMaterials.En; -using OasysUnits; +using OasysUnits; namespace MagmaWorks.Taxonomy.Materials.StandardMaterials.En { @@ -22,5 +21,7 @@ public interface IEnSteelMaterial : IEnMaterial /// γM2 partial factor for resistance of cross-sections in tension to fracture /// Ratio TensionFracturePartialFactor { get; } + + string GetDesignation(); } } diff --git a/Materials/IMaterials/StandardMaterials/En/IEnSteelSpecification.cs b/Materials/IMaterials/StandardMaterials/En/IEnSteelSpecification.cs index 73e4da6..c101bc5 100644 --- a/Materials/IMaterials/StandardMaterials/En/IEnSteelSpecification.cs +++ b/Materials/IMaterials/StandardMaterials/En/IEnSteelSpecification.cs @@ -12,5 +12,7 @@ public interface IEnSteelSpecification : ITaxonomySerializable EnSteelImpactTemperatureProperty ImpactTemperatureProperty { get; set; } EnSteelQuality Quality { get; set; } bool HollowSection { get; set; } + + string GetDesignation(EnSteelGrade grade); } } diff --git a/Materials/IMaterials/StandardMaterials/En/InvalidSteelSpecificationException.cs b/Materials/IMaterials/StandardMaterials/En/InvalidSteelSpecificationException.cs new file mode 100644 index 0000000..9b9a05c --- /dev/null +++ b/Materials/IMaterials/StandardMaterials/En/InvalidSteelSpecificationException.cs @@ -0,0 +1,9 @@ +using System; + +namespace MagmaWorks.Taxonomy.Materials.StandardMaterials.En +{ + public class InvalidSteelSpecificationException : Exception + { + public InvalidSteelSpecificationException(string t) : base(t) { } + } +} diff --git a/Materials/MaterialTests/ENMaterialFactory/ENSteelFactoryTests.cs b/Materials/MaterialTests/ENMaterialFactory/ENSteelFactoryTests.cs index c2ebf79..b0026bf 100644 --- a/Materials/MaterialTests/ENMaterialFactory/ENSteelFactoryTests.cs +++ b/Materials/MaterialTests/ENMaterialFactory/ENSteelFactoryTests.cs @@ -30,11 +30,10 @@ public void CreateStandardS355ConcreteMaterialTests() } [Theory] - [MemberData(nameof(EnumValues))] - public void CreateLinearElasticTests(EnSteelGrade grade) + [MemberData(nameof(AllEnTable3_1SteelMaterials))] + public void CreateLinearElasticTests(EnSteelMaterial material) { // Assemble - var material = new EnSteelMaterial(grade, NationalAnnex.RecommendedValues); string materialGrade = GetGradeName(material); // Act @@ -51,11 +50,10 @@ public void CreateLinearElasticTests(EnSteelGrade grade) } [Theory] - [MemberData(nameof(EnumValues))] - public void CreateLinearElasticThickPlatedTests(EnSteelGrade grade) + [MemberData(nameof(AllEnTable3_1SteelMaterials))] + public void CreateLinearElasticThickPlatedTests(EnSteelMaterial material) { // Assemble - var material = new EnSteelMaterial(grade, NationalAnnex.RecommendedValues); string materialGrade = GetGradeName(material); Length thickness = new Length(60, LengthUnit.Millimeter); @@ -73,11 +71,10 @@ public void CreateLinearElasticThickPlatedTests(EnSteelGrade grade) } [Theory] - [MemberData(nameof(EnumValues))] - public void CreateBiLinearTests(EnSteelGrade grade) + [MemberData(nameof(AllEnTable3_1SteelMaterials))] + public void CreateBiLinearTests(EnSteelMaterial material) { // Assemble - var material = new EnSteelMaterial(grade, NationalAnnex.RecommendedValues); string materialGrade = GetGradeName(material); // Act @@ -97,21 +94,20 @@ public void CreateBiLinearTests(EnSteelGrade grade) } [Theory] - [MemberData(nameof(EnumValues))] - public void CreateBiLinearThickPlatedTests(EnSteelGrade grade) + [MemberData(nameof(AllEnTable3_1SteelMaterials))] + public void CreateBiLinearThickPlatedTests(EnSteelMaterial material) { - if ((int)grade > 21) - { - CreateBiLinearThrowsExpectionForSomeGradesTests(grade); - return; - } - // Assemble - var material = new EnSteelMaterial(grade, NationalAnnex.RecommendedValues); string materialGrade = GetGradeName(material); Length thickness = new Length(60, LengthUnit.Millimeter); // Act + if (material.Specification.HollowSection && material.Specification.DeliveryCondition == EnSteelDeliveryCondition.M) + { + Assert.Throws(() => EnSteelFactory.CreateBiLinear(material, thickness)); + return; + } + IBiLinearMaterial analysisMaterial = EnSteelFactory.CreateBiLinear(material, thickness); // Assert @@ -157,12 +153,34 @@ public void CreateBiLinearThrowsExpectionForSomeGradesTests(EnSteelGrade grade) Assert.Throws(() => EnSteelFactory.CreateBiLinear(material, thickness)); } - public static IEnumerable EnumValues() + public static IEnumerable AllEnTable3_1SteelMaterials() { - foreach (var enumValue in Enum.GetValues(typeof(EnSteelGrade))) - { - yield return new object[] { enumValue }; - } + yield return new object[] { CreateMaterial("S235") }; + yield return new object[] { CreateMaterial("S275") }; + yield return new object[] { CreateMaterial("S355") }; + yield return new object[] { CreateMaterial("S450") }; + yield return new object[] { CreateMaterial("S275N") }; + yield return new object[] { CreateMaterial("S355 NL") }; + yield return new object[] { CreateMaterial("S420 N") }; + yield return new object[] { CreateMaterial("S460 NL") }; + yield return new object[] { CreateMaterial("S275 M") }; + yield return new object[] { CreateMaterial("S355 ML") }; + yield return new object[] { CreateMaterial("S420 M") }; + yield return new object[] { CreateMaterial("S460 ML") }; + yield return new object[] { CreateMaterial("S235 W") }; + yield return new object[] { CreateMaterial("S355 W") }; + yield return new object[] { CreateMaterial("S460 Q") }; + yield return new object[] { CreateMaterial("S235H") }; + yield return new object[] { CreateMaterial("S275H") }; + yield return new object[] { CreateMaterial("S355H") }; + yield return new object[] { CreateMaterial("S275NH") }; + yield return new object[] { CreateMaterial("S355NHL") }; + yield return new object[] { CreateMaterial("S420NH") }; + yield return new object[] { CreateMaterial("S460NHL") }; + yield return new object[] { CreateMaterial("S275MH") }; + yield return new object[] { CreateMaterial("S355MHL") }; + yield return new object[] { CreateMaterial("S420MH") }; + yield return new object[] { CreateMaterial("S460MHL") }; } private static string GetGradeName(IEnSteelMaterial material) @@ -207,5 +225,11 @@ private static string GetGradeName(IEnSteelMaterial material) { "S420MH", (420, 500, 0, 0) }, { "S460MH", (460, 530, 0, 0) }, }; + + private static EnSteelMaterial CreateMaterial(string s) + { + EnSteelMaterial.TryCreateFromDesignition(s, NationalAnnex.RecommendedValues, out EnSteelMaterial material); + return material; + } } } diff --git a/Materials/MaterialTests/StandardMaterials/EN/EnSteelMaterialTests.cs b/Materials/MaterialTests/StandardMaterials/EN/EnSteelMaterialTests.cs index ce11c52..63e2617 100644 --- a/Materials/MaterialTests/StandardMaterials/EN/EnSteelMaterialTests.cs +++ b/Materials/MaterialTests/StandardMaterials/EN/EnSteelMaterialTests.cs @@ -26,14 +26,6 @@ public void CreateStandardEnS235UKSteelMaterialTests() "BS EN 1993-1-1: Eurocode 3: Design of Steel Structures - Part 1-1: General rules and rules for buildings", material.Standard.Title); Assert.Equal(MaterialType.Steel, material.Type); - Assert.Equal(EnExecutionClass.EXC3, material.Specification.ExecutionClassforStaticOrLowSeismicLoading); - Assert.Equal(EnExecutionClass.EXC3, material.Specification.ExecutionClassforFatigueOrHighSeismicLoading); - Assert.Equal(EnSteelDeliveryCondition.AR, material.Specification.DeliveryCondition); - Assert.False(material.Specification.HollowSection); - Assert.Equal(EnSteelFormingTemperature.HotRolled, material.Specification.FormingTemperature); - Assert.Equal(EnSteelImpactTemperatureProperty.None, material.Specification.ImpactTemperatureProperty); - Assert.Equal(EnSteelCorrosionResistance.None, material.Specification.CorrosionResistance); - Assert.Equal(EnSteelQuality.None, material.Specification.Quality); } [Theory] diff --git a/Materials/MaterialTests/StandardMaterials/En/EnSteelSpecificationTests.cs b/Materials/MaterialTests/StandardMaterials/En/EnSteelSpecificationTests.cs index 05416c0..a42c0cb 100644 --- a/Materials/MaterialTests/StandardMaterials/En/EnSteelSpecificationTests.cs +++ b/Materials/MaterialTests/StandardMaterials/En/EnSteelSpecificationTests.cs @@ -1,7 +1,5 @@ -using MagmaWorks.Taxonomy.Materials; -using MagmaWorks.Taxonomy.Materials.StandardMaterials.En; +using MagmaWorks.Taxonomy.Materials.StandardMaterials.En; using MagmaWorks.Taxonomy.Serialization; -using MagmaWorks.Taxonomy.Standards; using MagmaWorks.Taxonomy.Standards.Eurocode; namespace MaterialTests.StandardMaterials.En @@ -9,11 +7,15 @@ namespace MaterialTests.StandardMaterials.En public class EnSteelSpecificationTests { [Fact] - public void CreateSpcificationTests() + public void CreateSpecificationTests() { // Assemble + EnSteelGrade grade = EnSteelGrade.S235; + NationalAnnex nationalAnnex = NationalAnnex.UnitedKingdom; + IEnSteelMaterial material = new EnSteelMaterial(grade, nationalAnnex); + // Act - IEnSteelSpecification spec = new EnSteelSpecification(); + IEnSteelSpecification spec = material.Specification; // Assert Assert.Equal(EnExecutionClass.EXC3, spec.ExecutionClassforStaticOrLowSeismicLoading); @@ -26,11 +28,195 @@ public void CreateSpcificationTests() Assert.Equal(EnSteelQuality.None, spec.Quality); } + [Fact] + public void EditSpecificationTests() + { + // Assemble + EnSteelGrade grade = EnSteelGrade.S235; + NationalAnnex nationalAnnex = NationalAnnex.UnitedKingdom; + IEnSteelMaterial material = new EnSteelMaterial(grade, nationalAnnex); + IEnSteelSpecification spec = material.Specification; + + // Act + spec.ExecutionClassforStaticOrLowSeismicLoading = EnExecutionClass.EXC1; + spec.ExecutionClassforFatigueOrHighSeismicLoading = EnExecutionClass.EXC4; + spec.DeliveryCondition = EnSteelDeliveryCondition.N; + spec.HollowSection = true; + spec.FormingTemperature = EnSteelFormingTemperature.ColdFormed; + spec.ImpactTemperatureProperty = EnSteelImpactTemperatureProperty.L; + spec.CorrosionResistance = EnSteelCorrosionResistance.W; + spec.Quality = EnSteelQuality.JR; + + // Assert + Assert.Equal(EnExecutionClass.EXC1, spec.ExecutionClassforStaticOrLowSeismicLoading); + Assert.Equal(EnExecutionClass.EXC4, spec.ExecutionClassforFatigueOrHighSeismicLoading); + Assert.Equal(EnSteelDeliveryCondition.N, spec.DeliveryCondition); + Assert.True(spec.HollowSection); + Assert.Equal(EnSteelFormingTemperature.ColdFormed, spec.FormingTemperature); + Assert.Equal(EnSteelImpactTemperatureProperty.L, spec.ImpactTemperatureProperty); + Assert.Equal(EnSteelCorrosionResistance.W, spec.CorrosionResistance); + Assert.Equal(EnSteelQuality.JR, spec.Quality); + } + + + [Theory] + [InlineData("S235", EnSteelGrade.S235, + EnSteelDeliveryCondition.AR, false, EnSteelImpactTemperatureProperty.None, EnSteelCorrosionResistance.None, EnSteelQuality.None)] + [InlineData("S275J0", EnSteelGrade.S275, + EnSteelDeliveryCondition.AR, false, EnSteelImpactTemperatureProperty.None, EnSteelCorrosionResistance.None, EnSteelQuality.J0)] + [InlineData("S355JR", EnSteelGrade.S355, + EnSteelDeliveryCondition.AR, false, EnSteelImpactTemperatureProperty.None, EnSteelCorrosionResistance.None, EnSteelQuality.JR)] + [InlineData("S450J2", EnSteelGrade.S450, + EnSteelDeliveryCondition.AR, false, EnSteelImpactTemperatureProperty.None, EnSteelCorrosionResistance.None, EnSteelQuality.J2)] + [InlineData("S275K2 N", EnSteelGrade.S275, + EnSteelDeliveryCondition.N, false, EnSteelImpactTemperatureProperty.None, EnSteelCorrosionResistance.None, EnSteelQuality.K2)] + [InlineData("S275 NL", EnSteelGrade.S275, + EnSteelDeliveryCondition.N, false, EnSteelImpactTemperatureProperty.L, EnSteelCorrosionResistance.None, EnSteelQuality.None)] + [InlineData("S355 N", EnSteelGrade.S355, + EnSteelDeliveryCondition.N, false, EnSteelImpactTemperatureProperty.None, EnSteelCorrosionResistance.None, EnSteelQuality.None)] + [InlineData("S355 NL", EnSteelGrade.S355, + EnSteelDeliveryCondition.N, false, EnSteelImpactTemperatureProperty.L, EnSteelCorrosionResistance.None, EnSteelQuality.None)] + [InlineData("S420 N", EnSteelGrade.S420, + EnSteelDeliveryCondition.N, false, EnSteelImpactTemperatureProperty.None, EnSteelCorrosionResistance.None, EnSteelQuality.None)] + [InlineData("S420 NL", EnSteelGrade.S420, + EnSteelDeliveryCondition.N, false, EnSteelImpactTemperatureProperty.L, EnSteelCorrosionResistance.None, EnSteelQuality.None)] + [InlineData("S460 N", EnSteelGrade.S460, + EnSteelDeliveryCondition.N, false, EnSteelImpactTemperatureProperty.None, EnSteelCorrosionResistance.None, EnSteelQuality.None)] + [InlineData("S460 NL", EnSteelGrade.S460, + EnSteelDeliveryCondition.N, false, EnSteelImpactTemperatureProperty.L, EnSteelCorrosionResistance.None, EnSteelQuality.None)] + [InlineData("S275 M", EnSteelGrade.S275, + EnSteelDeliveryCondition.M, false, EnSteelImpactTemperatureProperty.None, EnSteelCorrosionResistance.None, EnSteelQuality.None)] + [InlineData("S275 ML", EnSteelGrade.S275, + EnSteelDeliveryCondition.M, false, EnSteelImpactTemperatureProperty.L, EnSteelCorrosionResistance.None, EnSteelQuality.None)] + [InlineData("S355 M", EnSteelGrade.S355, + EnSteelDeliveryCondition.M, false, EnSteelImpactTemperatureProperty.None, EnSteelCorrosionResistance.None, EnSteelQuality.None)] + [InlineData("S355 ML", EnSteelGrade.S355, + EnSteelDeliveryCondition.M, false, EnSteelImpactTemperatureProperty.L, EnSteelCorrosionResistance.None, EnSteelQuality.None)] + [InlineData("S420 M", EnSteelGrade.S420, + EnSteelDeliveryCondition.M, false, EnSteelImpactTemperatureProperty.None, EnSteelCorrosionResistance.None, EnSteelQuality.None)] + [InlineData("S420 ML", EnSteelGrade.S420, + EnSteelDeliveryCondition.M, false, EnSteelImpactTemperatureProperty.L, EnSteelCorrosionResistance.None, EnSteelQuality.None)] + [InlineData("S460 M", EnSteelGrade.S460, + EnSteelDeliveryCondition.M, false, EnSteelImpactTemperatureProperty.None, EnSteelCorrosionResistance.None, EnSteelQuality.None)] + [InlineData("S460 ML", EnSteelGrade.S460, + EnSteelDeliveryCondition.M, false, EnSteelImpactTemperatureProperty.L, EnSteelCorrosionResistance.None, EnSteelQuality.None)] + [InlineData("S235 W", EnSteelGrade.S235, + EnSteelDeliveryCondition.AR, false, EnSteelImpactTemperatureProperty.None, EnSteelCorrosionResistance.W, EnSteelQuality.None)] + [InlineData("S355 W", EnSteelGrade.S355, + EnSteelDeliveryCondition.AR, false, EnSteelImpactTemperatureProperty.None, EnSteelCorrosionResistance.W, EnSteelQuality.None)] + [InlineData("S355 WP", EnSteelGrade.S355, + EnSteelDeliveryCondition.AR, false, EnSteelImpactTemperatureProperty.None, EnSteelCorrosionResistance.WP, EnSteelQuality.None)] + [InlineData("S460 Q", EnSteelGrade.S460, + EnSteelDeliveryCondition.Q, false, EnSteelImpactTemperatureProperty.None, EnSteelCorrosionResistance.None, EnSteelQuality.None)] + [InlineData("S460 QL", EnSteelGrade.S460, + EnSteelDeliveryCondition.Q, false, EnSteelImpactTemperatureProperty.L, EnSteelCorrosionResistance.None, EnSteelQuality.None)] + [InlineData("S460 QL1", EnSteelGrade.S460, + EnSteelDeliveryCondition.Q, false, EnSteelImpactTemperatureProperty.L1, EnSteelCorrosionResistance.None, EnSteelQuality.None)] + [InlineData("S235H", EnSteelGrade.S235, + EnSteelDeliveryCondition.AR, true, EnSteelImpactTemperatureProperty.None, EnSteelCorrosionResistance.None, EnSteelQuality.None)] + [InlineData("S275H", EnSteelGrade.S275, + EnSteelDeliveryCondition.AR, true, EnSteelImpactTemperatureProperty.None, EnSteelCorrosionResistance.None, EnSteelQuality.None)] + [InlineData("S355H", EnSteelGrade.S355, + EnSteelDeliveryCondition.AR, true, EnSteelImpactTemperatureProperty.None, EnSteelCorrosionResistance.None, EnSteelQuality.None)] + [InlineData("S275NH", EnSteelGrade.S275, + EnSteelDeliveryCondition.N, true, EnSteelImpactTemperatureProperty.None, EnSteelCorrosionResistance.None, EnSteelQuality.None)] + [InlineData("S275NHL", EnSteelGrade.S275, + EnSteelDeliveryCondition.N, true, EnSteelImpactTemperatureProperty.L, EnSteelCorrosionResistance.None, EnSteelQuality.None)] + [InlineData("S355NH", EnSteelGrade.S355, + EnSteelDeliveryCondition.N, true, EnSteelImpactTemperatureProperty.None, EnSteelCorrosionResistance.None, EnSteelQuality.None)] + [InlineData("S355NHL", EnSteelGrade.S355, + EnSteelDeliveryCondition.N, true, EnSteelImpactTemperatureProperty.L, EnSteelCorrosionResistance.None, EnSteelQuality.None)] + [InlineData("S420NH", EnSteelGrade.S420, + EnSteelDeliveryCondition.N, true, EnSteelImpactTemperatureProperty.None, EnSteelCorrosionResistance.None, EnSteelQuality.None)] + [InlineData("S420NHL", EnSteelGrade.S420, + EnSteelDeliveryCondition.N, true, EnSteelImpactTemperatureProperty.L, EnSteelCorrosionResistance.None, EnSteelQuality.None)] + [InlineData("S460NH", EnSteelGrade.S460, + EnSteelDeliveryCondition.N, true, EnSteelImpactTemperatureProperty.None, EnSteelCorrosionResistance.None, EnSteelQuality.None)] + [InlineData("S460NHL", EnSteelGrade.S460, + EnSteelDeliveryCondition.N, true, EnSteelImpactTemperatureProperty.L, EnSteelCorrosionResistance.None, EnSteelQuality.None)] + [InlineData("S275MH", EnSteelGrade.S275, + EnSteelDeliveryCondition.M, true, EnSteelImpactTemperatureProperty.None, EnSteelCorrosionResistance.None, EnSteelQuality.None)] + [InlineData("S275MHL", EnSteelGrade.S275, + EnSteelDeliveryCondition.M, true, EnSteelImpactTemperatureProperty.L, EnSteelCorrosionResistance.None, EnSteelQuality.None)] + [InlineData("S355MH", EnSteelGrade.S355, + EnSteelDeliveryCondition.M, true, EnSteelImpactTemperatureProperty.None, EnSteelCorrosionResistance.None, EnSteelQuality.None)] + [InlineData("S355MHL", EnSteelGrade.S355, + EnSteelDeliveryCondition.M, true, EnSteelImpactTemperatureProperty.L, EnSteelCorrosionResistance.None, EnSteelQuality.None)] + [InlineData("S420MH", EnSteelGrade.S420, + EnSteelDeliveryCondition.M, true, EnSteelImpactTemperatureProperty.None, EnSteelCorrosionResistance.None, EnSteelQuality.None)] + [InlineData("S420MHL", EnSteelGrade.S420, + EnSteelDeliveryCondition.M, true, EnSteelImpactTemperatureProperty.L, EnSteelCorrosionResistance.None, EnSteelQuality.None)] + [InlineData("S460MH", EnSteelGrade.S460, + EnSteelDeliveryCondition.M, true, EnSteelImpactTemperatureProperty.None, EnSteelCorrosionResistance.None, EnSteelQuality.None)] + [InlineData("S460MHL", EnSteelGrade.S460, + EnSteelDeliveryCondition.M, true, EnSteelImpactTemperatureProperty.L, EnSteelCorrosionResistance.None, EnSteelQuality.None)] + public void SpecificationFromDesignationTests(string steelDesignation, EnSteelGrade expGrade, + EnSteelDeliveryCondition expDeliveryCondition, bool expHollow, EnSteelImpactTemperatureProperty expTemp, + EnSteelCorrosionResistance expCorr, EnSteelQuality expQuality) + { + // Assemble + NationalAnnex nationalAnnex = NationalAnnex.UnitedKingdom; + + // Act + Assert.True(EnSteelMaterial.TryCreateFromDesignition(steelDesignation, nationalAnnex, out EnSteelMaterial material)); + IEnSteelSpecification spec = material.Specification; + + // Assert + Assert.Equal(expGrade, material.Grade); + Assert.Equal(expDeliveryCondition, spec.DeliveryCondition); + Assert.Equal(expHollow, spec.HollowSection); + Assert.Equal(expTemp, spec.ImpactTemperatureProperty); + Assert.Equal(expCorr, spec.CorrosionResistance); + Assert.Equal(expQuality, spec.Quality); + } + + [Theory] + [InlineData("S235 WL")] + [InlineData("S235 WP")] + [InlineData("S275 W")] + [InlineData("S355 MW")] + [InlineData("S450 H")] + [InlineData("S460")] + [InlineData("S450 N")] + [InlineData("S450 M")] + [InlineData("S235 Q")] + [InlineData("S460 QH")] + public void SpecificationFromInvalidDesignationTests(string steelDesignation) + { + // Assemble + NationalAnnex nationalAnnex = NationalAnnex.UnitedKingdom; + + // Act + // Assert + Assert.False(EnSteelMaterial.TryCreateFromDesignition(steelDesignation, nationalAnnex, out EnSteelMaterial material)); + } + + [Theory] + [InlineData("S 275 J2 AR", "Steel EN 10025-2 - S275J2+AR")] + [InlineData("S 355 NL", "Steel EN 10025-3 - S355NL")] + [InlineData("S 355 ML", "Steel EN 10025-4 - S355ML")] + [InlineData("S355J0WN", "Steel EN 10025-5 - S355J0W+N")] + [InlineData("S460QL", "Steel EN 10025-6 - S460QL")] + public void GetSpecificationDesignationTests(string steelDesignation, string expected) + { + // Assemble + NationalAnnex nationalAnnex = NationalAnnex.UnitedKingdom; + + // Act + Assert.True(EnSteelMaterial.TryCreateFromDesignition(steelDesignation, nationalAnnex, out EnSteelMaterial material)); + + // Assert + Assert.Equal(expected, material.GetDesignation()); + } + [Fact] public void InterfaceSurvivesRoundtripDeserializationTest() { // Assemble - IEnSteelSpecification spec = new EnSteelSpecification(); + EnSteelGrade grade = EnSteelGrade.S235; + NationalAnnex nationalAnnex = NationalAnnex.UnitedKingdom; + IEnSteelMaterial material = new EnSteelMaterial(grade, nationalAnnex); + IEnSteelSpecification spec = material.Specification; // Act string json = spec.ToJson(); diff --git a/Materials/Materials/EnMaterialFactory/EnSteelFactory.cs b/Materials/Materials/EnMaterialFactory/EnSteelFactory.cs index d1e13de..9085031 100644 --- a/Materials/Materials/EnMaterialFactory/EnSteelFactory.cs +++ b/Materials/Materials/EnMaterialFactory/EnSteelFactory.cs @@ -24,8 +24,11 @@ public static ILinearElasticMaterial CreateLinearElastic(IEnSteelMaterial materi } else if (elementThickness.Millimeters <= 40) { - yieldStrength = EN1993_1_1_Table3_1[material.Grade].F_y_40mmOrLess; - if (yieldStrength.Value == 0) + if (EN1993_1_1_Table3_1.ContainsKey(material.Grade)) + { + yieldStrength = EN1993_1_1_Table3_1[material.Grade].F_y_40mmOrLess; + } + else { throw new ArgumentException($"Nominal thickness of the element ({elementThickness}) must be less or equal to 40mm for Grade {material.Grade}"); } diff --git a/Materials/Materials/StandardMaterials/En/EnSteelMaterial.cs b/Materials/Materials/StandardMaterials/En/EnSteelMaterial.cs index 04bfef6..b02514d 100644 --- a/Materials/Materials/StandardMaterials/En/EnSteelMaterial.cs +++ b/Materials/Materials/StandardMaterials/En/EnSteelMaterial.cs @@ -1,5 +1,4 @@ using System; -using System.Diagnostics; using MagmaWorks.Taxonomy.Standards.Eurocode; using OasysUnits; using OasysUnits.Units; @@ -9,7 +8,7 @@ namespace MagmaWorks.Taxonomy.Materials.StandardMaterials.En public class EnSteelMaterial : IEnSteelMaterial { public EnSteelGrade Grade { get; set; } = EnSteelGrade.S355; - public IEnSteelSpecification Specification { get; set; } = new EnSteelSpecification(); + public IEnSteelSpecification Specification { get; } = new EnSteelSpecification(); public IEurocode Standard { get; set; } = new En1993(En1993Part.Part1_1, NationalAnnex.RecommendedValues); public MaterialType Type => MaterialType.Steel; public Ratio PartialFactor { get; set; } = new Ratio(1.0, RatioUnit.DecimalFraction); @@ -23,77 +22,90 @@ public EnSteelMaterial(EnSteelGrade grade, NationalAnnex nationalAnnex) SetPartialFactors(nationalAnnex); } - public static bool TryCastFromString(string steel, NationalAnnex nationalAnnex, out EnSteelMaterial material) + public static bool TryCreateFromDesignition(string designition, NationalAnnex nationalAnnex, out EnSteelMaterial material) { material = null; - string s = steel.Trim().ToLower(); - if (Enum.TryParse(s.Substring(0, 4), true, out EnSteelGrade grade)) + string s = designition.Replace(" ", string.Empty).ToLower(); + if (!Enum.TryParse(s.Substring(0, 4), true, out EnSteelGrade grade)) { return false; } material = new EnSteelMaterial(grade, nationalAnnex); - if (steel.Contains("n")) + if (s.Contains("n")) { material.Specification.DeliveryCondition = EnSteelDeliveryCondition.N; } - if (steel.Contains("m")) + if (s.Contains("m")) { material.Specification.DeliveryCondition = EnSteelDeliveryCondition.M; } - if (steel.Contains("q")) + if (s.Contains("q")) { material.Specification.DeliveryCondition = EnSteelDeliveryCondition.Q; } - if (steel.Contains("h")) + if (s.Contains("h")) { material.Specification.HollowSection = true; } - if (steel.Contains("w")) + if (s.Contains("w")) { material.Specification.CorrosionResistance = EnSteelCorrosionResistance.W; } - if (steel.Contains("wp")) + if (s.Contains("wp")) { material.Specification.CorrosionResistance = EnSteelCorrosionResistance.WP; } - if (steel.Contains("l")) + if (s.Contains("l")) { material.Specification.ImpactTemperatureProperty = EnSteelImpactTemperatureProperty.L; } - if (steel.Contains("l1")) + if (s.Contains("l1")) { material.Specification.ImpactTemperatureProperty = EnSteelImpactTemperatureProperty.L1; } - if (steel.Contains("jr")) + if (s.Contains("jr")) { material.Specification.Quality = EnSteelQuality.JR; } - if (steel.Contains("j0")) + if (s.Contains("j0")) { material.Specification.Quality = EnSteelQuality.J0; } - if (steel.Contains("j2")) + if (s.Contains("j2")) { material.Specification.Quality = EnSteelQuality.J2; } - if (steel.Contains("k2")) + if (s.Contains("k2")) { material.Specification.Quality = EnSteelQuality.K2; } - return true; + try + { + ((EnSteelSpecification)material.Specification).Validate(grade); + return true; + } + catch (InvalidSteelSpecificationException e) + { + return false; + } + } + + public string GetDesignation() + { + return Specification.GetDesignation(Grade); } private void SetPartialFactors(NationalAnnex nationalAnnex) diff --git a/Materials/Materials/StandardMaterials/En/EnSteelSpecification.cs b/Materials/Materials/StandardMaterials/En/EnSteelSpecification.cs index 3571109..2e09773 100644 --- a/Materials/Materials/StandardMaterials/En/EnSteelSpecification.cs +++ b/Materials/Materials/StandardMaterials/En/EnSteelSpecification.cs @@ -11,6 +11,174 @@ public class EnSteelSpecification : IEnSteelSpecification public EnSteelQuality Quality { get; set; } = EnSteelQuality.None; public bool HollowSection { get; set; } = false; - public EnSteelSpecification() { } + internal EnSteelSpecification() { } + + public void Validate(EnSteelGrade grade) + { + if (CorrosionResistance != EnSteelCorrosionResistance.None) + { + switch (DeliveryCondition) + { + case EnSteelDeliveryCondition.AR: + case EnSteelDeliveryCondition.N: + if (ImpactTemperatureProperty != EnSteelImpactTemperatureProperty.None) + { + throw new InvalidSteelSpecificationException( + $"Low impact temperature property (L) may not be used in accordance with EN 10025-5, " + + $"structural steels with improved atmospheric corrosion resistance."); + } + + switch (grade) + { + case EnSteelGrade.S235: + if (CorrosionResistance == EnSteelCorrosionResistance.WP) + { + throw new InvalidSteelSpecificationException( + $"Improved atmospheric corrosion resistance class WP may only be used for steel grade " + + $"S355 in accordance with EN 10025-5"); + } + break; + + case EnSteelGrade.S355: + break; + + default: + throw new InvalidSteelSpecificationException( + $"Only steel grades S235 and S355 may be used in accordance with EN 10025-5, " + + $"for Improved atmospheric corrosion resistance."); + } + break; + + default: + throw new InvalidSteelSpecificationException( + $"In accordance with EN 10025-5, structural steels with improved " + + $"atmospheric corrosion resistance class {CorrosionResistance} may only be delivered " + + $"with normalized rolling (+N) or as-rolled (+AR)."); + } + } + + switch (DeliveryCondition) + { + case EnSteelDeliveryCondition.AR: + switch (grade) + { + case EnSteelGrade.S235: + case EnSteelGrade.S275: + case EnSteelGrade.S355: + break; + + case EnSteelGrade.S450: + if (HollowSection) + { + throw new InvalidSteelSpecificationException( + $"Steel grade {grade} is not covered by EN 10210-1 " + + $"and EN 1993-1-1, Table 3.1 for hollow sections"); + } + break; + + default: + throw new InvalidSteelSpecificationException( + $"Steel grade {grade} is not covered by EN 10025-2 " + + $"for as-rolled (+AR) delivery condition"); + } + break; + + case EnSteelDeliveryCondition.N: + switch (grade) + { + case EnSteelGrade.S275: + case EnSteelGrade.S355: + case EnSteelGrade.S420: + case EnSteelGrade.S460: + break; + + default: + throw new InvalidSteelSpecificationException( + $"Steel grade {grade} is not covered byEN 10025-3 " + + $"for Normalized/normalized rolled (N) delivery condition"); + } + break; + + case EnSteelDeliveryCondition.M: + switch (grade) + { + case EnSteelGrade.S275: + case EnSteelGrade.S355: + case EnSteelGrade.S420: + case EnSteelGrade.S460: + break; + + default: + throw new InvalidSteelSpecificationException( + $"Steel grade {grade} is not covered byEN 10025-3 " + + $"for thermomechanical rolled (M) delivery condition"); + } + break; + + case EnSteelDeliveryCondition.Q: + if (grade != EnSteelGrade.S460) + { + throw new InvalidSteelSpecificationException( + $"Only steel grade S460 is covered by EN 10025-6 and EN1993-1-1, Table 3.1."); + } + + if (HollowSection) + { + throw new InvalidSteelSpecificationException( + $"Quenched and tempered delivery condition (Q) according to EN 10025-6 " + + $"is not covered by EN 1993-1-1, Table 3.1 for hollow sections"); + } + break; + + default: + throw new InvalidSteelSpecificationException( + $"Unable to validate steel specification for delivery " + + $"condition {DeliveryCondition}."); + } + } + + public string GetDesignation(EnSteelGrade grade) + { + Validate(grade); + string j0 = Quality.ToString(); + string w = CorrosionResistance.ToString(); + string n = DeliveryCondition.ToString(); + if (DeliveryCondition == EnSteelDeliveryCondition.AR) + { + n = "+" + n; + } + + string l = ImpactTemperatureProperty.ToString(); + string h = HollowSection ? "H" : string.Empty; + string description = (j0 + w + n + l + h).Replace("None", string.Empty); + if (CorrosionResistance != EnSteelCorrosionResistance.None) + { + if (DeliveryCondition == EnSteelDeliveryCondition.N) + { + n = "+" + n; + description = (j0 + w + n + l + h).Replace("None", string.Empty); + } + + return $"Steel EN 10025-5 - {grade}{description}"; + } + + switch (DeliveryCondition) + { + case EnSteelDeliveryCondition.AR: + return $"Steel EN 10025-2 - {grade}{description}"; + + case EnSteelDeliveryCondition.N: + return $"Steel EN 10025-3 - {grade}{description}"; + + case EnSteelDeliveryCondition.M: + return $"Steel EN 10025-4 - {grade}{description}"; + + case EnSteelDeliveryCondition.Q: + return $"Steel EN 10025-6 - {grade}{description}"; + + default: + return $"Steel EN 10025 - {grade}{description}"; + } + } } } diff --git a/Sections/SectionTests/ConcreteSectionRebarLayerTests.cs b/Sections/SectionTests/ConcreteSectionRebarLayerTests.cs index e3e8f7d..dbb1482 100644 --- a/Sections/SectionTests/ConcreteSectionRebarLayerTests.cs +++ b/Sections/SectionTests/ConcreteSectionRebarLayerTests.cs @@ -1,5 +1,4 @@ -using MagmaWorks.Taxonomy.Materials; -using MagmaWorks.Taxonomy.Materials.StandardMaterials.En; +using MagmaWorks.Taxonomy.Materials.StandardMaterials.En; using MagmaWorks.Taxonomy.Profiles; using MagmaWorks.Taxonomy.Sections; using MagmaWorks.Taxonomy.Sections.Reinforcement; diff --git a/Sections/SectionTests/ConcreteSectionTests.cs b/Sections/SectionTests/ConcreteSectionTests.cs index 0bd9ce4..6a29897 100644 --- a/Sections/SectionTests/ConcreteSectionTests.cs +++ b/Sections/SectionTests/ConcreteSectionTests.cs @@ -1,5 +1,4 @@ -using MagmaWorks.Taxonomy.Materials; -using MagmaWorks.Taxonomy.Materials.StandardMaterials.En; +using MagmaWorks.Taxonomy.Materials.StandardMaterials.En; using MagmaWorks.Taxonomy.Profiles; using MagmaWorks.Taxonomy.Sections; using MagmaWorks.Taxonomy.Sections.Exceptions; diff --git a/Sections/SectionTests/RebarTests.cs b/Sections/SectionTests/RebarTests.cs index da68813..bf23cfe 100644 --- a/Sections/SectionTests/RebarTests.cs +++ b/Sections/SectionTests/RebarTests.cs @@ -1,5 +1,4 @@ -using MagmaWorks.Taxonomy.Materials; -using MagmaWorks.Taxonomy.Materials.StandardMaterials.En; +using MagmaWorks.Taxonomy.Materials.StandardMaterials.En; using MagmaWorks.Taxonomy.Sections; using MagmaWorks.Taxonomy.Sections.Exceptions; using MagmaWorks.Taxonomy.Standards.Eurocode; From 4fe3252bd538d524ca5f3a0a5f957304964625b8 Mon Sep 17 00:00:00 2001 From: kpne Date: Tue, 3 Dec 2024 20:18:46 +0100 Subject: [PATCH 4/5] L1 specification validaton --- .../StandardMaterials/En/EnSteelSpecificationTests.cs | 1 + .../StandardMaterials/En/EnSteelSpecification.cs | 10 ++++++++++ 2 files changed, 11 insertions(+) diff --git a/Materials/MaterialTests/StandardMaterials/En/EnSteelSpecificationTests.cs b/Materials/MaterialTests/StandardMaterials/En/EnSteelSpecificationTests.cs index a42c0cb..ad3f838 100644 --- a/Materials/MaterialTests/StandardMaterials/En/EnSteelSpecificationTests.cs +++ b/Materials/MaterialTests/StandardMaterials/En/EnSteelSpecificationTests.cs @@ -181,6 +181,7 @@ public void SpecificationFromDesignationTests(string steelDesignation, EnSteelGr [InlineData("S450 M")] [InlineData("S235 Q")] [InlineData("S460 QH")] + [InlineData("S235 L1")] public void SpecificationFromInvalidDesignationTests(string steelDesignation) { // Assemble diff --git a/Materials/Materials/StandardMaterials/En/EnSteelSpecification.cs b/Materials/Materials/StandardMaterials/En/EnSteelSpecification.cs index 2e09773..de1b26a 100644 --- a/Materials/Materials/StandardMaterials/En/EnSteelSpecification.cs +++ b/Materials/Materials/StandardMaterials/En/EnSteelSpecification.cs @@ -57,6 +57,16 @@ public void Validate(EnSteelGrade grade) } } + if (ImpactTemperatureProperty == EnSteelImpactTemperatureProperty.L1) + { + if (!(grade == EnSteelGrade.S460 && DeliveryCondition == EnSteelDeliveryCondition.Q)) + { + throw new InvalidSteelSpecificationException( + $"Only steel grades S460 in quenched and tempered delivery condition according to EN 10025-5, " + + $"may use L1 designition for minimum values of impact energy at low temperatures"); + } + } + switch (DeliveryCondition) { case EnSteelDeliveryCondition.AR: From 4f8c0b97ed65c14a03ba5c781669d65438979c01 Mon Sep 17 00:00:00 2001 From: kpne Date: Wed, 4 Dec 2024 10:32:33 +0100 Subject: [PATCH 5/5] short and code designation methods, clean interfaces --- .../StandardMaterials/En/IEnSteelMaterial.cs | 2 -- .../En/IEnSteelSpecification.cs | 2 -- .../En/EnSteelSpecificationTests.cs | 2 +- .../StandardMaterials/En/EnSteelMaterial.cs | 9 +++++-- .../En/EnSteelSpecification.cs | 26 +++++++++++++------ 5 files changed, 26 insertions(+), 15 deletions(-) diff --git a/Materials/IMaterials/StandardMaterials/En/IEnSteelMaterial.cs b/Materials/IMaterials/StandardMaterials/En/IEnSteelMaterial.cs index 6ebbaa1..89ef41f 100644 --- a/Materials/IMaterials/StandardMaterials/En/IEnSteelMaterial.cs +++ b/Materials/IMaterials/StandardMaterials/En/IEnSteelMaterial.cs @@ -21,7 +21,5 @@ public interface IEnSteelMaterial : IEnMaterial /// γM2 partial factor for resistance of cross-sections in tension to fracture /// Ratio TensionFracturePartialFactor { get; } - - string GetDesignation(); } } diff --git a/Materials/IMaterials/StandardMaterials/En/IEnSteelSpecification.cs b/Materials/IMaterials/StandardMaterials/En/IEnSteelSpecification.cs index c101bc5..73e4da6 100644 --- a/Materials/IMaterials/StandardMaterials/En/IEnSteelSpecification.cs +++ b/Materials/IMaterials/StandardMaterials/En/IEnSteelSpecification.cs @@ -12,7 +12,5 @@ public interface IEnSteelSpecification : ITaxonomySerializable EnSteelImpactTemperatureProperty ImpactTemperatureProperty { get; set; } EnSteelQuality Quality { get; set; } bool HollowSection { get; set; } - - string GetDesignation(EnSteelGrade grade); } } diff --git a/Materials/MaterialTests/StandardMaterials/En/EnSteelSpecificationTests.cs b/Materials/MaterialTests/StandardMaterials/En/EnSteelSpecificationTests.cs index ad3f838..8c102dd 100644 --- a/Materials/MaterialTests/StandardMaterials/En/EnSteelSpecificationTests.cs +++ b/Materials/MaterialTests/StandardMaterials/En/EnSteelSpecificationTests.cs @@ -207,7 +207,7 @@ public void GetSpecificationDesignationTests(string steelDesignation, string exp Assert.True(EnSteelMaterial.TryCreateFromDesignition(steelDesignation, nationalAnnex, out EnSteelMaterial material)); // Assert - Assert.Equal(expected, material.GetDesignation()); + Assert.Equal(expected, material.GetCodeDesignation()); } [Fact] diff --git a/Materials/Materials/StandardMaterials/En/EnSteelMaterial.cs b/Materials/Materials/StandardMaterials/En/EnSteelMaterial.cs index b02514d..e32b029 100644 --- a/Materials/Materials/StandardMaterials/En/EnSteelMaterial.cs +++ b/Materials/Materials/StandardMaterials/En/EnSteelMaterial.cs @@ -103,9 +103,14 @@ public static bool TryCreateFromDesignition(string designition, NationalAnnex na } } - public string GetDesignation() + public string GetShortDesignation() { - return Specification.GetDesignation(Grade); + return ((EnSteelSpecification)Specification).GetShortDesignation(Grade); + } + + public string GetCodeDesignation() + { + return ((EnSteelSpecification)Specification).GetCodeDesignation(Grade); } private void SetPartialFactors(NationalAnnex nationalAnnex) diff --git a/Materials/Materials/StandardMaterials/En/EnSteelSpecification.cs b/Materials/Materials/StandardMaterials/En/EnSteelSpecification.cs index de1b26a..2595283 100644 --- a/Materials/Materials/StandardMaterials/En/EnSteelSpecification.cs +++ b/Materials/Materials/StandardMaterials/En/EnSteelSpecification.cs @@ -13,7 +13,7 @@ public class EnSteelSpecification : IEnSteelSpecification internal EnSteelSpecification() { } - public void Validate(EnSteelGrade grade) + internal void Validate(EnSteelGrade grade) { if (CorrosionResistance != EnSteelCorrosionResistance.None) { @@ -147,7 +147,7 @@ public void Validate(EnSteelGrade grade) } } - public string GetDesignation(EnSteelGrade grade) + internal string GetShortDesignation(EnSteelGrade grade) { Validate(grade); string j0 = Quality.ToString(); @@ -169,25 +169,35 @@ public string GetDesignation(EnSteelGrade grade) description = (j0 + w + n + l + h).Replace("None", string.Empty); } - return $"Steel EN 10025-5 - {grade}{description}"; + } + + return $"{grade}{description}"; + } + + internal string GetCodeDesignation(EnSteelGrade grade) + { + string designation = GetShortDesignation(grade); + if (CorrosionResistance != EnSteelCorrosionResistance.None) + { + return $"Steel EN 10025-5 - {designation}"; } switch (DeliveryCondition) { case EnSteelDeliveryCondition.AR: - return $"Steel EN 10025-2 - {grade}{description}"; + return $"Steel EN 10025-2 - {designation}"; case EnSteelDeliveryCondition.N: - return $"Steel EN 10025-3 - {grade}{description}"; + return $"Steel EN 10025-3 - {designation}"; case EnSteelDeliveryCondition.M: - return $"Steel EN 10025-4 - {grade}{description}"; + return $"Steel EN 10025-4 - {designation}"; case EnSteelDeliveryCondition.Q: - return $"Steel EN 10025-6 - {grade}{description}"; + return $"Steel EN 10025-6 - {designation}"; default: - return $"Steel EN 10025 - {grade}{description}"; + return $"Steel EN 10025 - {designation}"; } } }