diff --git a/Libraries/LoaderCalculator.dll b/Libraries/LoaderCalculator.dll new file mode 100644 index 0000000..d2054c8 Binary files /dev/null and b/Libraries/LoaderCalculator.dll differ diff --git a/StructureHelper.csproj b/StructureHelper.csproj index 73e59fd..ccb845b 100644 --- a/StructureHelper.csproj +++ b/StructureHelper.csproj @@ -128,6 +128,8 @@ Designer - + + + \ No newline at end of file diff --git a/StructureHelper.sln b/StructureHelper.sln index 587bc98..f02c1d9 100644 --- a/StructureHelper.sln +++ b/StructureHelper.sln @@ -5,7 +5,12 @@ VisualStudioVersion = 16.0.32002.261 MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StructureHelper", "StructureHelper.csproj", "{BAD27E27-4444-4300-ADF8-E21042C0781D}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StructureHelperTests", ".\StructureHelperTests\StructureHelperTests.csproj", "{7AC480BB-8A34-4913-B7AA-C6A5D7F35509}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StructureHelperTests", "StructureHelperTests\StructureHelperTests.csproj", "{7AC480BB-8A34-4913-B7AA-C6A5D7F35509}" + ProjectSection(ProjectDependencies) = postProject + {23138426-7994-46A7-834D-08AFB9741A86} = {23138426-7994-46A7-834D-08AFB9741A86} + EndProjectSection +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StructureHelperLogics", "..\StructureHelperLogics\StructureHelperLogics\StructureHelperLogics.csproj", "{23138426-7994-46A7-834D-08AFB9741A86}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -21,6 +26,10 @@ Global {7AC480BB-8A34-4913-B7AA-C6A5D7F35509}.Debug|Any CPU.Build.0 = Debug|Any CPU {7AC480BB-8A34-4913-B7AA-C6A5D7F35509}.Release|Any CPU.ActiveCfg = Release|Any CPU {7AC480BB-8A34-4913-B7AA-C6A5D7F35509}.Release|Any CPU.Build.0 = Release|Any CPU + {23138426-7994-46A7-834D-08AFB9741A86}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {23138426-7994-46A7-834D-08AFB9741A86}.Debug|Any CPU.Build.0 = Debug|Any CPU + {23138426-7994-46A7-834D-08AFB9741A86}.Release|Any CPU.ActiveCfg = Release|Any CPU + {23138426-7994-46A7-834D-08AFB9741A86}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/StructureHelperTests/Infrastructures/Logics/ExpectedProcessor.cs b/StructureHelperTests/Infrastructures/Logics/ExpectedProcessor.cs new file mode 100644 index 0000000..f729eac --- /dev/null +++ b/StructureHelperTests/Infrastructures/Logics/ExpectedProcessor.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace LoaderCalculator.Tests.Infrastructures.Logics +{ + internal static class ExpectedProcessor + { + internal static double GetAccuracyForExpectedValue(double expectedValue, double accuracy = 0.001d) + { + if (expectedValue == 0d) { return 1.0e-15d; } + else return Math.Abs(expectedValue) * accuracy; + } + } +} diff --git a/StructureHelperTests/LibrariesTests/Ndms/RCSections/RCSectionTest.cs b/StructureHelperTests/LibrariesTests/Ndms/RCSections/RCSectionTest.cs new file mode 100644 index 0000000..f50917f --- /dev/null +++ b/StructureHelperTests/LibrariesTests/Ndms/RCSections/RCSectionTest.cs @@ -0,0 +1,184 @@ +using LoaderCalculator.Data.Materials; +using LoaderCalculator.Data.Materials.MaterialBuilders; +using LoaderCalculator.Data.Matrix; +using LoaderCalculator.Data.Ndms; +using LoaderCalculator.Data.Ndms.Transformations; +using LoaderCalculator.Data.Planes; +using LoaderCalculator.Data.SourceData; +using LoaderCalculator.Infrastructure; +using LoaderCalculator.Tests.Infrastructures.Logics; +using LoaderCalculator.Triangulations; +using Moq; +using NUnit.Framework; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading; +namespace LoaderCalculator.Tests.FunctionalTests.SectionTests +{ + public class RCSectionTest + { + private IMaterialOptions _reinforcementOptions; + private IMaterialBuilder _reinforcementBuilder; + private IBuilderDirector _reinforcementDirector; + private IMaterialOptions _concreteOptions; + private IMaterialBuilder _concreteBuilder; + private IBuilderDirector _concreteDirector; + [SetUp] + public void Setup() + { + _reinforcementOptions = new ReinforcementOptions(); + _reinforcementBuilder = new ReinforcementBuilder(_reinforcementOptions); + _reinforcementDirector = new BuilderDirector(_reinforcementBuilder); + _concreteOptions = new ConcreteOptions(); + _concreteBuilder = new ConcreteBuilder(_concreteOptions); + _concreteDirector = new BuilderDirector(_concreteBuilder); + } + //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; + ArrangeMaterial(LimitStates.Collapse, true); + List ndmList = new List(); + ndmList.AddRange(GetConcreteNdms(width, height)); + ndmList.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 = ndmList + }; + 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)); + } + //Longitudenal prestrain only + [TestCase(0.000494, 0.000494, 0d, 0d, 0d, 0d, 0d, 0d, 0d, 0.0d, 0d)] + [TestCase(0.000494, 0.000494, 0d, 0d, 0d, 0d, 0d, 0.001d, 0d, 0.0d, -4.410e-05d)] + [TestCase(0.000494, 0.000494, 0d, 0d, 0d, 0d, 0d, 0.0015d, 0d, 0.0d, -6.666e-05d)] + [TestCase(0.000494, 0.000494, 0d, 0d, 0d, 0d, 0d, 0.002d, 0d, 0.0d, -8.131e-05d)] + [TestCase(0.000494, 0.000494, 0d, 0d, 0d, 0d, 0d, 0.003d, 0d, 0.0d, -8.131e-05d)] + [TestCase(0.000494, 0.000494, 0d, 0d, 0d, 0d, 0d, -0.001d, 0d, 0.0d, 0.001d)] + [TestCase(0.000494, 0.000494, 0d, 0d, 0d, 0d, 0d, -0.002d, 0d, 0.0d, 0.002d)] + //Curvature prestrain only + [TestCase(0.000494, 0.000494, 0d, 0d, 0d, -1e-5d, 0d, 0d, 5.4638e-6d, 0.0d, 1.069e-06d)] + //Test shows that prestrain and external forces are neglegiate one by another + [TestCase(0.000494, 0.000494, 0d, 0d, 3.952e5d, 0d, 0d, 0.001d, 0d, 0.0d, 0d)] + [TestCase(0.000494, 0.000494, 0d, 0d, 6.873e5d, 0d, 0d, 0.002d, 0d, 0.0d, -1.703e-8d)] + [TestCase(0.000494, 0.000494, 0d, 0d, 6.873e5d, 0d, 0d, 0.003d, 0d, 0.0d, -3.796e-8d)] + public void Run_ShouldPassPrestrain(double topArea, double bottomArea, double mx, double my, double nz, double prestrainKx, double prestrainKy, double prestrainEpsZ, double expectedKx, double expectedKy, double expectedEpsilonZ) + { + //Arrange + double width = 0.4; + double height = 0.6; + ArrangeMaterial(LimitStates.Collapse, true); + List ndmList = new List(); + IStrainMatrix prestrainMatrix = new StrainMatrix() { Kx = prestrainKx, Ky = prestrainKy, EpsZ = prestrainEpsZ }; + ndmList.AddRange(GetConcreteNdms(width, height)); + var reinforcement = GetReinforcementNdms(width, height, topArea, bottomArea); + NdmTransform.SetPrestrain(reinforcement, prestrainMatrix); + ndmList.AddRange(reinforcement); + var loaderData = new LoaderOptions + { + Preconditions = new Preconditions + { + ConditionRate = 0.001, + MaxIterationCount = 100, + StartForceMatrix = new ForceMatrix { Mx = mx, My = my, Nz = nz } + }, + NdmCollection = ndmList + }; + 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 void ArrangeMaterial(LimitStates limitStates, bool isShortTerm) + { + _reinforcementOptions.InitModulus = 2.0e11; + _reinforcementOptions.LimitState = limitStates; + _reinforcementOptions.IsShortTerm = isShortTerm; + _reinforcementOptions.Strength = 400.0e6; + + _concreteOptions.LimitState = limitStates; + _concreteOptions.IsShortTerm = isShortTerm; + _concreteOptions.Strength = 40.0e6; + } + + private IEnumerable GetConcreteNdms(double width, double heigth) + { + IMaterial _material = _concreteDirector.BuildMaterial(); + RectangleTriangulationLogicOptions logicOptions = new RectangleTriangulationLogicOptions(width, heigth, 1, 20); + var logic = Triangulation.GetLogicInstance(logicOptions); + var ndmCollection = logic.GetNdmCollection(new RectangularPlane { Material = _material }); + return ndmCollection; + } + + private IEnumerable GetReinforcementNdms(double width, double heigth, double topArea, double bottomArea) + { + IMaterial _material = _reinforcementDirector.BuildMaterial(); + double gap = 0.05; + var ndmCollection = new INdm[] + { + new Ndm + { + Area = topArea, + CenterX = width / 2 - gap, + CenterY = heigth / 2 - gap, + Material = _material + }, + new Ndm + { + Area = topArea, + CenterX = -(width / 2 - gap), + CenterY = heigth / 2 - gap, + Material = _material + }, + new Ndm + { + Area = bottomArea, + CenterX = width / 2 - gap, + CenterY = -(heigth / 2 - gap), + Material = _material + }, + new Ndm + { + Area = bottomArea, + CenterX = -(width / 2 - gap), + CenterY = -(heigth / 2 - gap), + Material = _material + } + }; + return ndmCollection; + } + } +} diff --git a/StructureHelperTests/StructureHelperTests.csproj b/StructureHelperTests/StructureHelperTests.csproj index 5576498..f2ac88c 100644 --- a/StructureHelperTests/StructureHelperTests.csproj +++ b/StructureHelperTests/StructureHelperTests.csproj @@ -1,7 +1,7 @@  - - + + Debug AnyCPU @@ -39,30 +39,51 @@ 4 - - ..\StructureHelper\packages\MSTest.TestFramework.2.1.2\lib\net45\Microsoft.VisualStudio.TestPlatform.TestFramework.dll - - - ..\StructureHelper\packages\MSTest.TestFramework.2.1.2\lib\net45\Microsoft.VisualStudio.TestPlatform.TestFramework.Extensions.dll - - - - - - + + + + + + ..\packages\Castle.Core.5.0.0\lib\net462\Castle.Core.dll + + + ..\Libraries\LoaderCalculator.dll + True + + + ..\packages\Moq.4.18.1\lib\net462\Moq.dll + + + ..\packages\NUnit.3.13.3\lib\net45\nunit.framework.dll + + + + ..\packages\System.Runtime.CompilerServices.Unsafe.4.5.3\lib\net461\System.Runtime.CompilerServices.Unsafe.dll + + + ..\packages\System.Threading.Tasks.Extensions.4.5.4\lib\net461\System.Threading.Tasks.Extensions.dll + + + + + + + + {23138426-7994-46a7-834d-08afb9741a86} + StructureHelperLogics + + - This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. - - + + - \ No newline at end of file diff --git a/StructureHelperTests/StructureHelperTests.csproj.bak b/StructureHelperTests/StructureHelperTests.csproj.bak new file mode 100644 index 0000000..8bbe88a --- /dev/null +++ b/StructureHelperTests/StructureHelperTests.csproj.bak @@ -0,0 +1,64 @@ + + + + Debug + AnyCPU + {7AC480BB-8A34-4913-B7AA-C6A5D7F35509} + Library + Properties + StructureHelperTests + StructureHelperTests + v4.7.2 + 512 + {3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + 15.0 + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) + $(ProgramFiles)\Common Files\microsoft shared\VSTT\$(VisualStudioVersion)\UITestExtensionPackages + False + UnitTest + + + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/StructureHelperTests/TestExampleClass.cs b/StructureHelperTests/TestExampleClass.cs deleted file mode 100644 index 6c778ba..0000000 --- a/StructureHelperTests/TestExampleClass.cs +++ /dev/null @@ -1,14 +0,0 @@ -using Microsoft.VisualStudio.TestTools.UnitTesting; -using System; - -namespace StructureHelperTests -{ - [TestClass] - public class TestExampleClass - { - [TestMethod] - public void TestMethod() - { - } - } -} diff --git a/StructureHelperTests/UnitTests/Ndms/Triangulations/RectangleTriangulationTest.cs b/StructureHelperTests/UnitTests/Ndms/Triangulations/RectangleTriangulationTest.cs new file mode 100644 index 0000000..d3b14ec --- /dev/null +++ b/StructureHelperTests/UnitTests/Ndms/Triangulations/RectangleTriangulationTest.cs @@ -0,0 +1,51 @@ +using LoaderCalculator.Data.Materials; +using LoaderCalculator.Data.Materials.MaterialBuilders; +using LoaderCalculator.Data.Matrix; +using LoaderCalculator.Data.Ndms; +using LoaderCalculator.Data.Ndms.Transformations; +using LoaderCalculator.Data.Planes; +using LoaderCalculator.Data.SourceData; +using LoaderCalculator.Infrastructure; +using LoaderCalculator.Tests.Infrastructures.Logics; +using LoaderCalculator.Triangulations; +using Moq; +using NUnit.Framework; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using StructureHelperLogics.NdmCalculations.Triangulations; +using StructureHelperLogics.Data.Shapes; + +namespace StructureHelperTests.UnitTests.Ndms.Triangulations +{ + public class RectangleTriangulationTest + { + //Участок по центру + [TestCase(0d, 0d, 1.0d, 1.0d, 0d, 0.02d, 1, 50 * 50, -0.49d, -0.49d)] + //Участок со смещением от центра + [TestCase(2d, 2d, 1.0d, 1.0d, 0d, 0.02d, 1, 50 * 50, 1.51d, 1.51d)] + [TestCase(2d, 1d, 1.0d, 1.0d, 0d, 0.02d, 1, 50 * 50, 1.51d, 0.51d)] + //Участок с поворотом на 1 радиан + [TestCase(0d, 0d, 1.0d, 1.0d, 1d, 0.02d, 1, 50 * 50, 0.14757265268048089d, -0.67706891243125777d)] + //Участок со смещением и поворотом на 1 радиан + [TestCase(2d, 2d, 1.0d, 1.0d, 1d, 0.02d, 1, 50 * 50, -0.45476470519903267d, 2.0864776689208147d)] + public void Run_ShouldPass (double centerX, double centerY, double width, double height, double angle, double ndmMaxSize, int ndmMinDivision, int expectedCount, double expectedFirstCenterX, double expectedFirstCenterY) + { + //Arrange + IMaterial material = new Material(); + ICenter center = new Center() { CenterX = centerX, CenterY = centerY }; + IRectangle rectangle = new Rectangle() { Width = width, Height = height, Angle = angle }; + IRectangleTriangulationOptions options = new RectangleTriangulationOptions(center, rectangle, ndmMaxSize, ndmMinDivision); + IRectangleTriangulationLogic logic = new StructureHelperLogics.NdmCalculations.Triangulations.RectangleTriangulationLogic(options); + //Act + var result = logic.GetNdmCollection(material); + //Assert + Assert.NotNull(result); + Assert.AreEqual(expectedCount, result.Count()); + var firstNdm = result.First(); + Assert.AreEqual(expectedFirstCenterX, firstNdm.CenterX); + Assert.AreEqual(expectedFirstCenterY, firstNdm.CenterY); + } + } +} diff --git a/StructureHelperTests/packages.config b/StructureHelperTests/packages.config index f84cb10..e3e465e 100644 --- a/StructureHelperTests/packages.config +++ b/StructureHelperTests/packages.config @@ -1,5 +1,9 @@  - - + + + + + + \ No newline at end of file