From 5f9d2d4bafa96db4547895b6c3630cd75f554a1a Mon Sep 17 00:00:00 2001 From: Evgeny Redikultsev Date: Thu, 23 Jun 2022 20:34:22 +0500 Subject: [PATCH] =?UTF-8?q?=D0=A1=D0=BE=D0=B7=D0=B4=D0=B0=D0=BB=20=D0=BE?= =?UTF-8?q?=D0=BF=D1=86=D0=B8=D0=B8=20=D1=82=D1=80=D0=B8=D0=B0=D0=BD=D0=B3?= =?UTF-8?q?=D1=83=D0=BB=D1=8F=D1=86=D0=B8=D0=B8=20=D0=B4=D0=BB=D1=8F=20?= =?UTF-8?q?=D1=82=D0=BE=D1=87=D0=BA=D0=B8=20=D0=B8=20=D1=81=D0=B4=D0=B5?= =?UTF-8?q?=D0=BB=D0=B0=D0=BB=20=D1=82=D0=B5=D1=81=D1=82=20=D0=B4=D0=BB?= =?UTF-8?q?=D1=8F=20=D0=B6=D0=B5=D0=BB=D0=B5=D0=B7=D0=BE=D0=B1=D0=B5=D1=82?= =?UTF-8?q?=D0=BE=D0=BD=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Triangulations/IPointTiangulationLogic.cs | 10 ++ .../IPointTriangulationLogicOptions.cs | 13 +++ ...=> IRectangleTriangulationLogicOptions.cs} | 2 +- .../Triangulations/PointTriangulationLogic.cs | 35 +++++++ .../PointTriangulationLogicOptions.cs | 26 +++++ .../RectangleTriangulationLogic.cs | 2 +- ... => RectangleTriangulationLogicOptions.cs} | 6 +- .../Triangulations/Triangulation.cs | 4 +- .../Ndms/RCSections/RCSectionTest.cs | 95 ++++++++++++++++++- .../Ndms/SteelSections/ReinforcementTest.cs | 4 +- .../RectangleTriangulationTest.cs | 2 +- 11 files changed, 184 insertions(+), 15 deletions(-) create mode 100644 StructureHelperLogics/NdmCalculations/Triangulations/IPointTiangulationLogic.cs create mode 100644 StructureHelperLogics/NdmCalculations/Triangulations/IPointTriangulationLogicOptions.cs rename StructureHelperLogics/NdmCalculations/Triangulations/{IRectangleTriangulationOptions.cs => IRectangleTriangulationLogicOptions.cs} (91%) create mode 100644 StructureHelperLogics/NdmCalculations/Triangulations/PointTriangulationLogic.cs create mode 100644 StructureHelperLogics/NdmCalculations/Triangulations/PointTriangulationLogicOptions.cs rename StructureHelperLogics/NdmCalculations/Triangulations/{RectangleTriangulationOptions.cs => RectangleTriangulationLogicOptions.cs} (77%) diff --git a/StructureHelperLogics/NdmCalculations/Triangulations/IPointTiangulationLogic.cs b/StructureHelperLogics/NdmCalculations/Triangulations/IPointTiangulationLogic.cs new file mode 100644 index 0000000..bd9217b --- /dev/null +++ b/StructureHelperLogics/NdmCalculations/Triangulations/IPointTiangulationLogic.cs @@ -0,0 +1,10 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace StructureHelperLogics.NdmCalculations.Triangulations +{ + interface IPointTiangulationLogic : ITriangulationLogic + { + } +} diff --git a/StructureHelperLogics/NdmCalculations/Triangulations/IPointTriangulationLogicOptions.cs b/StructureHelperLogics/NdmCalculations/Triangulations/IPointTriangulationLogicOptions.cs new file mode 100644 index 0000000..10fe244 --- /dev/null +++ b/StructureHelperLogics/NdmCalculations/Triangulations/IPointTriangulationLogicOptions.cs @@ -0,0 +1,13 @@ +using StructureHelperLogics.Data.Shapes; +using System; +using System.Collections.Generic; +using System.Text; + +namespace StructureHelperLogics.NdmCalculations.Triangulations +{ + public interface IPointTriangulationLogicOptions : ITriangulationLogicOptions + { + ICenter Center { get; } + double Area { get; } + } +} diff --git a/StructureHelperLogics/NdmCalculations/Triangulations/IRectangleTriangulationOptions.cs b/StructureHelperLogics/NdmCalculations/Triangulations/IRectangleTriangulationLogicOptions.cs similarity index 91% rename from StructureHelperLogics/NdmCalculations/Triangulations/IRectangleTriangulationOptions.cs rename to StructureHelperLogics/NdmCalculations/Triangulations/IRectangleTriangulationLogicOptions.cs index 9f421c1..24f2555 100644 --- a/StructureHelperLogics/NdmCalculations/Triangulations/IRectangleTriangulationOptions.cs +++ b/StructureHelperLogics/NdmCalculations/Triangulations/IRectangleTriangulationLogicOptions.cs @@ -9,7 +9,7 @@ namespace StructureHelperLogics.NdmCalculations.Triangulations /// Parameter of triangulation of rectangle part of section /// Параметры триангуляции прямоугольного участка сечения /// - public interface IRectangleTriangulationOptions : ITriangulationLogicOptions + public interface IRectangleTriangulationLogicOptions : ITriangulationLogicOptions { /// /// diff --git a/StructureHelperLogics/NdmCalculations/Triangulations/PointTriangulationLogic.cs b/StructureHelperLogics/NdmCalculations/Triangulations/PointTriangulationLogic.cs new file mode 100644 index 0000000..a7660d7 --- /dev/null +++ b/StructureHelperLogics/NdmCalculations/Triangulations/PointTriangulationLogic.cs @@ -0,0 +1,35 @@ +using LoaderCalculator.Data.Materials; +using LoaderCalculator.Data.Ndms; +using StructureHelperLogics.Data.Shapes; +using System; +using System.Collections.Generic; +using System.Text; + +namespace StructureHelperLogics.NdmCalculations.Triangulations +{ + public class PointTriangulationLogic : IPointTiangulationLogic + { + public ITriangulationLogicOptions Options { get; } + + public PointTriangulationLogic(IPointTriangulationLogicOptions options) + { + Options = options; + } + + public IEnumerable GetNdmCollection(IMaterial material) + { + IPointTriangulationLogicOptions options = Options as IPointTriangulationLogicOptions; + ICenter center = options.Center; + double area = options.Area; + List ndmCollection = new List(); + INdm ndm = new Ndm() { CenterX = center.X, CenterY = center.Y, Area = area, Material = material }; + ndmCollection.Add(ndm); + return ndmCollection; + } + + public void ValidateOptions(ITriangulationLogicOptions options) + { + throw new NotImplementedException(); + } + } +} diff --git a/StructureHelperLogics/NdmCalculations/Triangulations/PointTriangulationLogicOptions.cs b/StructureHelperLogics/NdmCalculations/Triangulations/PointTriangulationLogicOptions.cs new file mode 100644 index 0000000..c2d7c5e --- /dev/null +++ b/StructureHelperLogics/NdmCalculations/Triangulations/PointTriangulationLogicOptions.cs @@ -0,0 +1,26 @@ +using StructureHelperLogics.Data.Shapes; +using System; +using System.Collections.Generic; +using System.Text; + +namespace StructureHelperLogics.NdmCalculations.Triangulations +{ + /// + /// + /// + public class PointTriangulationLogicOptions : IPointTriangulationLogicOptions + { + /// + /// + /// + public ICenter Center { get; } + + public double Area { get; } + + public PointTriangulationLogicOptions(ICenter center, double area) + { + Center = center; + Area = area; + } + } +} diff --git a/StructureHelperLogics/NdmCalculations/Triangulations/RectangleTriangulationLogic.cs b/StructureHelperLogics/NdmCalculations/Triangulations/RectangleTriangulationLogic.cs index 9f2e6d9..f732d76 100644 --- a/StructureHelperLogics/NdmCalculations/Triangulations/RectangleTriangulationLogic.cs +++ b/StructureHelperLogics/NdmCalculations/Triangulations/RectangleTriangulationLogic.cs @@ -13,7 +13,7 @@ namespace StructureHelperLogics.NdmCalculations.Triangulations public IEnumerable GetNdmCollection(IMaterial material) { - IRectangleTriangulationOptions rectangleOptions = Options as IRectangleTriangulationOptions; + IRectangleTriangulationLogicOptions rectangleOptions = Options as IRectangleTriangulationLogicOptions; double width = rectangleOptions.Rectangle.Width; double height = rectangleOptions.Rectangle.Height; double ndmMaxSize = rectangleOptions.NdmMaxSize; diff --git a/StructureHelperLogics/NdmCalculations/Triangulations/RectangleTriangulationOptions.cs b/StructureHelperLogics/NdmCalculations/Triangulations/RectangleTriangulationLogicOptions.cs similarity index 77% rename from StructureHelperLogics/NdmCalculations/Triangulations/RectangleTriangulationOptions.cs rename to StructureHelperLogics/NdmCalculations/Triangulations/RectangleTriangulationLogicOptions.cs index d9e2aeb..59455e1 100644 --- a/StructureHelperLogics/NdmCalculations/Triangulations/RectangleTriangulationOptions.cs +++ b/StructureHelperLogics/NdmCalculations/Triangulations/RectangleTriangulationLogicOptions.cs @@ -7,7 +7,7 @@ using System.Text; namespace StructureHelperLogics.NdmCalculations.Triangulations { /// - public class RectangleTriangulationOptions : IRectangleTriangulationOptions + public class RectangleTriangulationLogicOptions : IRectangleTriangulationLogicOptions { /// public ICenter Center { get; } @@ -18,7 +18,7 @@ namespace StructureHelperLogics.NdmCalculations.Triangulations /// public int NdmMinDivision { get; } - public RectangleTriangulationOptions(ICenter center, IRectangle rectangle, double ndmMaxSize, int ndmMinDivision) + public RectangleTriangulationLogicOptions(ICenter center, IRectangle rectangle, double ndmMaxSize, int ndmMinDivision) { Center = center; Rectangle = rectangle; @@ -26,7 +26,7 @@ namespace StructureHelperLogics.NdmCalculations.Triangulations NdmMinDivision = ndmMinDivision; } - public RectangleTriangulationOptions(INdmPrimitive primitive) + public RectangleTriangulationLogicOptions(INdmPrimitive primitive) { if (! (primitive.Shape is IRectangle)) { throw new Exception("Shape type is not valid"); } Center = primitive.Center; diff --git a/StructureHelperLogics/NdmCalculations/Triangulations/Triangulation.cs b/StructureHelperLogics/NdmCalculations/Triangulations/Triangulation.cs index ac07cdb..e04eebf 100644 --- a/StructureHelperLogics/NdmCalculations/Triangulations/Triangulation.cs +++ b/StructureHelperLogics/NdmCalculations/Triangulations/Triangulation.cs @@ -63,7 +63,7 @@ namespace StructureHelperLogics.NdmCalculations.Triangulations if (shape is IRectangle) { IRectangle rectangle = shape as IRectangle; - options = new RectangleTriangulationOptions(primitive); + options = new RectangleTriangulationLogicOptions(primitive); IRectangleTriangulationLogic logic = new RectangleTriangulationLogic(options); ndms.AddRange(logic.GetNdmCollection(material)); } @@ -71,7 +71,7 @@ namespace StructureHelperLogics.NdmCalculations.Triangulations return ndms; } - private static IMaterial GetMaterial(IPrimitiveMaterial primitiveMaterial, ITriangulationOptions options) + public static IMaterial GetMaterial(IPrimitiveMaterial primitiveMaterial, ITriangulationOptions options) { IMaterial material; if (primitiveMaterial.MaterialType == MaterialTypes.Concrete) { material = GetConcreteMaterial(primitiveMaterial, options); } diff --git a/StructureHelperTests/FunctionalTests/Ndms/RCSections/RCSectionTest.cs b/StructureHelperTests/FunctionalTests/Ndms/RCSections/RCSectionTest.cs index 2177b66..dd13903 100644 --- a/StructureHelperTests/FunctionalTests/Ndms/RCSections/RCSectionTest.cs +++ b/StructureHelperTests/FunctionalTests/Ndms/RCSections/RCSectionTest.cs @@ -1,12 +1,97 @@ -using System; +using LoaderCalculator; +using LoaderCalculator.Data.Materials; +using LoaderCalculator.Data.Matrix; +using LoaderCalculator.Data.Ndms; +using LoaderCalculator.Data.SourceData; +using LoaderCalculator.Tests.Infrastructures.Logics; +using NUnit.Framework; +using StructureHelperLogics.Data.Shapes; +using StructureHelperLogics.NdmCalculations.Entities; +using StructureHelperLogics.NdmCalculations.Materials; +using StructureHelperLogics.NdmCalculations.Triangulations; using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; +using System.Threading; namespace StructureHelperTests.FunctionalTests.Ndms.RCSections { - class RCSectionTest + public class RCSectionTest { + //Theoretical limit momemt Mx = 43kN*m + [TestCase(0.000113, 0.000494, 10e3, 0d, 0d, 0.00084665917358052976d, 0.0d, 0.00020754144937701132d)] + [TestCase(0.000113, 0.000494, 40e3, 0d, 0d, 0.0033939850380287412d, 0d, 0.00082989880025069202d)] + [TestCase(0.000113, 0.000494, 42e3, 0d, 0d, 0.0056613831873867241d, 0d, 0.0014291081844183839d)] + //Theoretical limit momemt Mx = -187kN*m + [TestCase(0.000113, 0.000494, -50e3, 0d, 0d, -0.0011229555729294297d, 0d, 0.00021353225742956321d)] + [TestCase(0.000113, 0.000494, -180e3, 0d, 0d, -0.0098365950945499738d, 0d, 0.0022035516889170013d)] + [TestCase(0.000113, 0.000494, -183e3, 0d, 0d, -0.021718635290382458d, 0d, 0.0053526701372818789d)] + public void Run_ShouldPass(double topArea, double bottomArea, double mx, double my, double nz, double expectedKx, double expectedKy, double expectedEpsilonZ) + { + //Arrange + double width = 0.4; + double height = 0.6; + var ndmCollection = new List(); + ndmCollection.AddRange(GetConcreteNdms(width, height)); + ndmCollection.AddRange(GetReinforcementNdms(width, height, topArea, bottomArea)); + var loaderData = new LoaderOptions + { + Preconditions = new Preconditions + { + ConditionRate = 0.01, + MaxIterationCount = 100, + StartForceMatrix = new ForceMatrix { Mx = mx, My = my, Nz = nz } + }, + NdmCollection = ndmCollection + }; + var calculator = new Calculator(); + //Act + calculator.Run(loaderData, new CancellationToken()); + var results = calculator.Result; + //Assert + Assert.NotNull(results); + var strainMatrix = results.StrainMatrix; + Assert.NotNull(strainMatrix); + Assert.AreEqual(expectedKx, strainMatrix.Kx, ExpectedProcessor.GetAccuracyForExpectedValue(expectedKx)); + Assert.AreEqual(expectedKy, strainMatrix.Ky, ExpectedProcessor.GetAccuracyForExpectedValue(expectedKy)); + Assert.AreEqual(expectedEpsilonZ, strainMatrix.EpsZ, ExpectedProcessor.GetAccuracyForExpectedValue(expectedEpsilonZ)); + } + + private IEnumerable GetConcreteNdms(double width, double height) + { + double strength = 40e6; + ICenter center = new Center() { X = 0, Y = 0 }; + IRectangle rectangle = new Rectangle() { Width = width, Height = height, Angle = 0 }; + IPrimitiveMaterial material = new PrimitiveMaterial() { MaterialType = MaterialTypes.Concrete, ClassName = "С20", Strength = strength }; + ITriangulationOptions options = new TriangulationOptions() { LimiteState = StructureHelperLogics.Infrastructures.CommonEnums.LimitStates.Collapse, CalcTerm = StructureHelperLogics.Infrastructures.CommonEnums.CalcTerms.ShortTerm }; + INdmPrimitive primitive = new NdmPrimitive() { Center = center, Shape = rectangle, PrimitiveMaterial = material, NdmMaxSize = 1, NdmMinDivision = 20 }; + List primitives = new List(); + primitives.Add(primitive); + var ndmCollection = Triangulation.GetNdms(primitives, options); + return ndmCollection; + } + + private IEnumerable GetReinforcementNdms(double width, double height, double topArea, double bottomArea) + { + double gap = 0.05d; + double strength = 4e8; + IShape topReinforcement = new Point() { Area = topArea }; + IShape bottomReinforcement = new Point() { Area = bottomArea }; + IPrimitiveMaterial primitiveMaterial = new PrimitiveMaterial() { MaterialType = MaterialTypes.Reinforcement, ClassName = "S400", Strength = strength }; + ITriangulationOptions options = new TriangulationOptions() { LimiteState = StructureHelperLogics.Infrastructures.CommonEnums.LimitStates.Collapse, CalcTerm = StructureHelperLogics.Infrastructures.CommonEnums.CalcTerms.ShortTerm }; + IMaterial material = Triangulation.GetMaterial(primitiveMaterial, options); + ICenter centerRT = new Center() { X = width / 2 - gap, Y = height / 2 - gap }; + ICenter centerLT = new Center() { X = - (width / 2 - gap), Y = height / 2 - gap }; + ICenter centerRB = new Center() { X = width / 2 - gap, Y = - (height / 2 - gap) }; + ICenter centerLB = new Center() { X = -(width / 2 - gap), Y = - (height / 2 - gap) }; + IPointTriangulationLogicOptions optionsRT = new PointTriangulationLogicOptions(centerRT, topArea); + IPointTriangulationLogicOptions optionsLT = new PointTriangulationLogicOptions(centerLT, topArea); + IPointTriangulationLogicOptions optionsRB = new PointTriangulationLogicOptions(centerRB, bottomArea); + IPointTriangulationLogicOptions optionsLB = new PointTriangulationLogicOptions(centerLB, bottomArea); + var ndmCollection = new List(); + ndmCollection.AddRange((new PointTriangulationLogic(optionsRT)).GetNdmCollection(material)); + ndmCollection.AddRange((new PointTriangulationLogic(optionsLT)).GetNdmCollection(material)); + ndmCollection.AddRange((new PointTriangulationLogic(optionsRB)).GetNdmCollection(material)); + ndmCollection.AddRange((new PointTriangulationLogic(optionsLB)).GetNdmCollection(material)); + return ndmCollection; + } } } diff --git a/StructureHelperTests/FunctionalTests/Ndms/SteelSections/ReinforcementTest.cs b/StructureHelperTests/FunctionalTests/Ndms/SteelSections/ReinforcementTest.cs index 6b7250b..230ba3f 100644 --- a/StructureHelperTests/FunctionalTests/Ndms/SteelSections/ReinforcementTest.cs +++ b/StructureHelperTests/FunctionalTests/Ndms/SteelSections/ReinforcementTest.cs @@ -28,7 +28,7 @@ namespace StructureHelperTests.FunctionalTests.Ndms.SteelSections INdmPrimitive primitive = new NdmPrimitive() { Center = center, Shape = rectangle, PrimitiveMaterial = material, NdmMaxSize = 1, NdmMinDivision = 100 }; List primitives = new List(); primitives.Add(primitive); - var ndmList = Triangulation.GetNdms(primitives, options); + var ndmCollection = Triangulation.GetNdms(primitives, options); var loaderData = new LoaderOptions { Preconditions = new Preconditions @@ -37,7 +37,7 @@ namespace StructureHelperTests.FunctionalTests.Ndms.SteelSections MaxIterationCount = 100, StartForceMatrix = new ForceMatrix { Mx = mx, My = my, Nz = nz } }, - NdmCollection = ndmList + NdmCollection = ndmCollection }; var calculator = new Calculator(); //Act diff --git a/StructureHelperTests/UnitTests/Ndms/Triangulations/RectangleTriangulationTest.cs b/StructureHelperTests/UnitTests/Ndms/Triangulations/RectangleTriangulationTest.cs index 0666cc4..152ae97 100644 --- a/StructureHelperTests/UnitTests/Ndms/Triangulations/RectangleTriangulationTest.cs +++ b/StructureHelperTests/UnitTests/Ndms/Triangulations/RectangleTriangulationTest.cs @@ -36,7 +36,7 @@ namespace StructureHelperTests.UnitTests.Ndms.Triangulations IMaterial material = new Material(); ICenter center = new Center() { X = centerX, Y = centerY }; IRectangle rectangle = new Rectangle() { Width = width, Height = height, Angle = angle }; - IRectangleTriangulationOptions options = new RectangleTriangulationOptions(center, rectangle, ndmMaxSize, ndmMinDivision); + IRectangleTriangulationLogicOptions options = new StructureHelperLogics.NdmCalculations.Triangulations.RectangleTriangulationLogicOptions(center, rectangle, ndmMaxSize, ndmMinDivision); IRectangleTriangulationLogic logic = new StructureHelperLogics.NdmCalculations.Triangulations.RectangleTriangulationLogic(options); //Act var result = logic.GetNdmCollection(material);