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