コード例 #1
0
        public void Cantilever()
        {
            FiniteElementModel model = new FiniteElementModel(ModelType.Beam1D); // we will create and analyze a 1D beam system
            FiniteElementNode  node1 = model.NodeFactory.Create(0);              // create a node at the origin

            model.ConstrainNode(node1, DegreeOfFreedom.Z);                       // constrain the node from moving in the Z-axis
            model.ConstrainNode(node1, DegreeOfFreedom.YY);                      // constrain this node from rotating around the Y-axis

            FiniteElementNode node2 = model.NodeFactory.Create(3.0);             // create a second node at a distance 1 metre along the X axis

            IMaterial     material = new GenericElasticMaterial(0, 210000000000, 0, 0);
            ICrossSection section  = new GenericCrossSection(0.0001, 0.0002);

            model.ElementFactory.CreateLinear1DBeam(node1, node2, material, section);

            ForceVector force = model.ForceFactory.CreateFor1DBeam(-10000, 0);     // Create a force of 10 KiloNewtons in the z direction

            model.ApplyForceToNode(force, node2);                                  // Apply that force to the second node

            IFiniteElementSolver solver  = new MatrixInversionLinearSolver(model); // Create a new instance of the solver class and pass it the model to solve
            FiniteElementResults results = solver.Solve();                         // ask the solver to solve the model and return results

            ReactionVector reaction = results.GetReaction(node1);                  //get the reaction at the first node

            Assert.AreEqual(10000, reaction.Z, 0.001);                             // Check that we have calculated a reaction of 10 KiloNewtons in the Z-axis
            Assert.AreEqual(-30000, reaction.YY, 0.001);                           // Check that we have calculated a reaction of -30 KiloNewtonMetres around the YY axis.

            DisplacementVector displacement = results.GetDisplacement(node2);      // get the displacement at the second node

            Assert.AreEqual(-0.00214, displacement.Z, 0.0005);
            Assert.AreEqual(0.00107, displacement.YY, 0.0001);
        }
コード例 #2
0
        public void ReversedCantilever()
        {
            FiniteElementModel model = new FiniteElementModel(ModelType.Beam1D);
            FiniteElementNode  node1 = model.NodeFactory.Create(0);

            model.ConstrainNode(node1, DegreeOfFreedom.Z);
            model.ConstrainNode(node1, DegreeOfFreedom.YY);

            FiniteElementNode node2 = model.NodeFactory.Create(3.0);

            IMaterial     material = new GenericElasticMaterial(0, 210000000000, 0, 0);
            ICrossSection section  = new GenericCrossSection(0.0001, 0.0002);

            model.ElementFactory.CreateLinear1DBeam(node2, node1, material, section);  //connecting the nodes in reverse order to the Cantilever() example

            ForceVector force = model.ForceFactory.CreateFor1DBeam(-10000, 0);

            model.ApplyForceToNode(force, node2);

            IFiniteElementSolver solver  = new MatrixInversionLinearSolver(model);
            FiniteElementResults results = solver.Solve();

            ReactionVector reaction = results.GetReaction(node1);

            Assert.AreEqual(10000, reaction.Z, 0.001);
            Assert.AreEqual(-30000, reaction.YY, 0.001);

            DisplacementVector displacement = results.GetDisplacement(node2);

            Assert.AreEqual(-0.00214, displacement.Z, 0.0005);
            Assert.AreEqual(0.00107, displacement.YY, 0.0001);
        }
コード例 #3
0
        public void CalculateGridOf3BeamsAnd24Dof()
        {
            FiniteElementModel model = new FiniteElementModel(ModelType.Slab2D);

            FiniteElementNode node1 = model.NodeFactory.Create(4, 4);

            FiniteElementNode node2 = model.NodeFactory.Create(4, 0);

            model.ConstrainNode(node2, DegreeOfFreedom.Z);
            model.ConstrainNode(node2, DegreeOfFreedom.XX);
            model.ConstrainNode(node2, DegreeOfFreedom.YY);

            FiniteElementNode node3 = model.NodeFactory.Create(0, 0);

            model.ConstrainNode(node3, DegreeOfFreedom.Z);
            model.ConstrainNode(node3, DegreeOfFreedom.XX);
            model.ConstrainNode(node3, DegreeOfFreedom.YY);

            FiniteElementNode node4 = model.NodeFactory.Create(0, 4);

            model.ConstrainNode(node4, DegreeOfFreedom.Z);
            model.ConstrainNode(node4, DegreeOfFreedom.XX);
            model.ConstrainNode(node4, DegreeOfFreedom.YY);

            IMaterial     material = new GenericElasticMaterial(0, 210000000000, 0, 84000000000);
            ICrossSection section  = new GenericCrossSection(0.02, 0.0002, 0.0002, 0.00005);

            model.ElementFactory.CreateLinear3DBeam(node1, node2, material, section);
            model.ElementFactory.CreateLinear3DBeam(node1, node3, material, section);
            model.ElementFactory.CreateLinear3DBeam(node1, node4, material, section);

            ForceVector force = model.ForceFactory.Create(0, 0, -20000, 0, 0, 0);

            model.ApplyForceToNode(force, node1);

            IFiniteElementSolver solver  = new LinearSolverSVD(model);
            FiniteElementResults results = solver.Solve();

            DisplacementVector node1Displacement = results.GetDisplacement(node1);
            ReactionVector     node2Reaction     = results.GetReaction(node2);
            ReactionVector     node3Reaction     = results.GetReaction(node3);
            ReactionVector     node4Reaction     = results.GetReaction(node4);

            Assert.AreEqual(-0.0033, node1Displacement.Z, 0.0001);
            Assert.AreEqual(-0.0010, node1Displacement.XX, 0.0001);
            Assert.AreEqual(0.0010, node1Displacement.YY, 0.0001);

            Assert.AreEqual(10794, node2Reaction.Z, 1);
            Assert.AreEqual(31776, node2Reaction.XX, 1);
            Assert.AreEqual(-1019, node2Reaction.YY, 1);

            Assert.AreEqual(-1587, node3Reaction.Z, 1);
            Assert.AreEqual(4030, node3Reaction.XX, 1);
            Assert.AreEqual(-4030, node3Reaction.YY, 1);

            Assert.AreEqual(10794, node4Reaction.Z, 1);
            Assert.AreEqual(1019, node4Reaction.XX, 1);
            Assert.AreEqual(-31776, node4Reaction.YY, 1);
        }
コード例 #4
0
ファイル: Triangle.cs プロジェクト: iainsproat/SharpFE
        public void FourTriangleAFrame()
        {
            FiniteElementModel model = new FiniteElementModel(ModelType.Membrane3D);
            FiniteElementNode node1 = model.NodeFactory.Create(0.0, 0.0, 0.0);
            model.ConstrainNode(node1, DegreeOfFreedom.X);
            model.ConstrainNode(node1, DegreeOfFreedom.Y);
            model.ConstrainNode(node1, DegreeOfFreedom.Z);

            FiniteElementNode node2 = model.NodeFactory.Create(1.0, 0.0, 0.0);
            model.ConstrainNode(node2, DegreeOfFreedom.X);
            model.ConstrainNode(node2, DegreeOfFreedom.Y);
            model.ConstrainNode(node2, DegreeOfFreedom.Z);

            FiniteElementNode node3 = model.NodeFactory.Create(0.0, 1.0, 0.5);

            FiniteElementNode node4 = model.NodeFactory.Create(1.0, 1.0, 0.5);

            FiniteElementNode node5 = model.NodeFactory.Create(0.0, 2.0, 0.0);
            model.ConstrainNode(node5, DegreeOfFreedom.X);
            model.ConstrainNode(node5, DegreeOfFreedom.Y);
            model.ConstrainNode(node5, DegreeOfFreedom.Z);

            FiniteElementNode node6 = model.NodeFactory.Create(1.0, 2.0, 0.0);
            model.ConstrainNode(node6, DegreeOfFreedom.X);
            model.ConstrainNode(node6, DegreeOfFreedom.Y);
            model.ConstrainNode(node6, DegreeOfFreedom.Z);

            IMaterial material = new GenericElasticMaterial(0, 200000, 0.2, 84000);

            model.ElementFactory.CreateLinearConstantStrainTriangle(node1, node2, node3, material, 0.1);
            model.ElementFactory.CreateLinearConstantStrainTriangle(node2, node4, node3, material, 0.1);
            model.ElementFactory.CreateLinearConstantStrainTriangle(node3, node4, node5, material, 0.1);
            model.ElementFactory.CreateLinearConstantStrainTriangle(node4, node6, node5, material, 0.1);

            ForceVector force = model.ForceFactory.Create(0, 0, -10, 0, 0, 0);
            model.ApplyForceToNode(force, node3);
            model.ApplyForceToNode(force, node4);

            IFiniteElementSolver solver = new LinearSolverSVD(model);
            FiniteElementResults results = solver.Solve();

            ReactionVector reaction1 = results.GetReaction(node1); //get the reaction at the first node
            Console.WriteLine("\nReaction1 : \n" + reaction1);
            ReactionVector reaction2 = results.GetReaction(node2);
            Console.WriteLine("\nReaction2 : \n" + reaction2);
            Assert.AreEqual(20, reaction1.Y + reaction2.Y, 0.001);

            DisplacementVector displacement3 = results.GetDisplacement(node3);  // get the displacement at the second node
            Console.WriteLine("\nDisplacement3 : \n" + displacement3);
            Assert.AreNotEqual(0.0, displacement3.X); // TODO calculate the actual value, rather than just checking we have any value
            Assert.AreNotEqual(0.0, displacement3.Y); // TODO calculate the actual value, rather than just checking we have any value
            Assert.AreNotEqual(0.0, displacement3.Z); // TODO calculate the actual value, rather than just checking we have any value

            DisplacementVector displacement4 = results.GetDisplacement(node4);  // get the displacement at the second node
            Console.WriteLine("\nDisplacement4 : \n" + displacement4);
            Assert.AreNotEqual(0.0, displacement4.X); // TODO calculate the actual value, rather than just checking we have any value
            Assert.AreNotEqual(0.0, displacement4.Y); // TODO calculate the actual value, rather than just checking we have any value
            Assert.AreNotEqual(0.0, displacement4.Z); // TODO calculate the actual value, rather than just checking we have any value
        }
コード例 #5
0
        public void OneVerticalQuadFixed3PointsMembrane()
        {
            FiniteElementModel model = new FiniteElementModel(ModelType.Membrane3D);
            FiniteElementNode  node1 = model.NodeFactory.Create(0.0, 0.0, 0.0);

            model.ConstrainNode(node1, DegreeOfFreedom.X);
            model.ConstrainNode(node1, DegreeOfFreedom.Y);
            model.ConstrainNode(node1, DegreeOfFreedom.Z);

            FiniteElementNode node2 = model.NodeFactory.Create(1.0, 0.0, 0.0);

            model.ConstrainNode(node2, DegreeOfFreedom.X);
            model.ConstrainNode(node2, DegreeOfFreedom.Y);
            model.ConstrainNode(node2, DegreeOfFreedom.Z);

            FiniteElementNode node3 = model.NodeFactory.Create(1.0, 0.0, 1.0);

            model.ConstrainNode(node3, DegreeOfFreedom.X);
            model.ConstrainNode(node3, DegreeOfFreedom.Y);
            model.ConstrainNode(node3, DegreeOfFreedom.Z);

            FiniteElementNode node4 = model.NodeFactory.Create(0.0, 0.0, 1.0);

            model.ConstrainNode(node4, DegreeOfFreedom.Y);

            IMaterial material = new GenericElasticMaterial(0, 210000000000, 0.3, 0);

            model.ElementFactory.CreateLinearConstantStressQuadrilateral(node1, node2, node3, node4, material, 0.1);

            ForceVector force = model.ForceFactory.Create(10000, 0, 0, 0, 0, 0);

            model.ApplyForceToNode(force, node4);

            IFiniteElementSolver solver  = new MatrixInversionLinearSolver(model);
            FiniteElementResults results = solver.Solve();

            ReactionVector reaction1 = results.GetReaction(node1);

            Console.WriteLine("\nReaction1 : \n" + reaction1);
            ReactionVector reaction2 = results.GetReaction(node2);

            Console.WriteLine("\nReaction2 : \n" + reaction2);
            ReactionVector reaction3 = results.GetReaction(node3);

            Console.WriteLine("\nReaction3 : \n" + reaction3);
            DisplacementVector displacement4 = results.GetDisplacement(node4);

            Console.WriteLine("\nDisplacement4 : \n" + displacement4);

            Assert.AreEqual(2621, reaction1.X, 1);
            Assert.AreEqual(-3039, reaction1.Z, 1);
            Assert.AreEqual(-5660, reaction2.X, 1);
            Assert.AreEqual(1706, reaction2.Z, 1);
            Assert.AreEqual(-6961, reaction3.X, 1);
            Assert.AreEqual(1333, reaction3.Z, 1);

            Assert.AreEqual(0.0000012400, displacement4.X, 0.0000000001);
            Assert.AreEqual(0.0000004875, displacement4.Z, 0.0000000001);
        }
コード例 #6
0
        public void Can_calculate_BendingStiffnessEIy()
        {
            material = new GenericElasticMaterial(0, 210000000000, 0.3, 80769200000);
            section  = new SolidRectangle(0.1, 0.1);
            SUT      = elementFactory.CreateLinear1DBeam(start, end, material, section);

            Assert.AreEqual(1750000, SUT.BendingStiffnessEIy, 1);
        }
コード例 #7
0
        public void ThreeNodeSimplySupportedBeam() //TODO verify results using independent check
        {
            FiniteElementModel model = new FiniteElementModel(ModelType.Frame2D);
            FiniteElementNode  node1 = model.NodeFactory.CreateFor2DTruss(0, 0);

            model.ConstrainNode(node1, DegreeOfFreedom.X);
            model.ConstrainNode(node1, DegreeOfFreedom.Z);

            FiniteElementNode node2 = model.NodeFactory.CreateFor2DTruss(1, 0);

            FiniteElementNode node3 = model.NodeFactory.CreateFor2DTruss(2, 0);

            model.ConstrainNode(node3, DegreeOfFreedom.Z);

            IMaterial     material = new GenericElasticMaterial(0, 10000000000, 0, 0);
            ICrossSection section  = new GenericCrossSection(0.0001, 0.0002);

            model.ElementFactory.CreateLinear1DBeam(node1, node2, material, section);
            model.ElementFactory.CreateLinear1DBeam(node2, node3, material, section);

            ForceVector force = model.ForceFactory.Create(0, 0, -10000, 0, 0, 0);

            model.ApplyForceToNode(force, node2);

            IFiniteElementSolver solver = new MatrixInversionLinearSolver(model);

            Stiffness.GlobalModelStiffnessMatrixBuilder gmsmb = new SharpFE.Stiffness.GlobalModelStiffnessMatrixBuilder(model);
            Console.WriteLine(gmsmb.BuildKnownForcesUnknownDisplacementStiffnessMatrix());

            FiniteElementResults results = solver.Solve();

            DisplacementVector node1Displacement = results.GetDisplacement(node1);

            Console.WriteLine("node1Displacement : " + node1Displacement);

            DisplacementVector node2Displacement = results.GetDisplacement(node2);

            Console.WriteLine("node2Displacement : " + node2Displacement);

            DisplacementVector node3Displacement = results.GetDisplacement(node3);

            Console.WriteLine("node3Displacement : " + node3Displacement);

            ReactionVector node1Reaction = results.GetReaction(node1);

            Console.WriteLine("node1Reaction : " + node1Reaction);

            ReactionVector node3Reaction = results.GetReaction(node3);

            Console.WriteLine("node5Reaction : " + node3Reaction);

            Assert.AreEqual(-0.000833333, node2Displacement.Z, 0.0000001);
            Assert.AreEqual(5000, node1Reaction.Z, 0.001);
            Assert.AreEqual(5000, node3Reaction.Z, 0.001);
            Assert.AreEqual(0, node2Displacement.YY, 0.0001);
            Assert.AreEqual(0.00125, node1Displacement.YY, 0.0000001);
            Assert.AreEqual(-0.00125, node3Displacement.YY, 0.0000001);
        }
コード例 #8
0
        public void Calculate2DPortalFrameOf3BeamsAnd12Dof()
        {
            FiniteElementModel model = new FiniteElementModel(ModelType.Full3D);
            FiniteElementNode  node1 = model.NodeFactory.Create(-3, 0, 0);

            model.ConstrainNode(node1, DegreeOfFreedom.X);
            model.ConstrainNode(node1, DegreeOfFreedom.Y);
            model.ConstrainNode(node1, DegreeOfFreedom.Z);
            model.ConstrainNode(node1, DegreeOfFreedom.XX);
            model.ConstrainNode(node1, DegreeOfFreedom.YY);

            FiniteElementNode node2 = model.NodeFactory.Create(-3, 0, 6);

            FiniteElementNode node3 = model.NodeFactory.Create(3, 0, 6);

            FiniteElementNode node4 = model.NodeFactory.Create(3, 0, 0);

            model.ConstrainNode(node4, DegreeOfFreedom.X);
            model.ConstrainNode(node4, DegreeOfFreedom.Y);
            model.ConstrainNode(node4, DegreeOfFreedom.Z);
            model.ConstrainNode(node4, DegreeOfFreedom.XX);
            model.ConstrainNode(node4, DegreeOfFreedom.YY);

            IMaterial     material = new GenericElasticMaterial(0, 210000000000, 0, 84000000);
            ICrossSection section  = new GenericCrossSection(0.0002, 0.0002, 0.0002, 0.00005);

            model.ElementFactory.CreateLinear3DBeam(node1, node2, material, section);
            model.ElementFactory.CreateLinear3DBeam(node2, node3, material, section);
            model.ElementFactory.CreateLinear3DBeam(node3, node4, material, section);

            ForceVector force2 = model.ForceFactory.Create(15000, 0, 0, 0, -10000, 0);

            model.ApplyForceToNode(force2, node2);

            IFiniteElementSolver solver  = new LinearSolverSVD(model);
            FiniteElementResults results = solver.Solve();

            DisplacementVector node2Displacement = results.GetDisplacement(node2);
            DisplacementVector node3Displacement = results.GetDisplacement(node3);
            ReactionVector     node1Reaction     = results.GetReaction(node1);
            ReactionVector     node4Reaction     = results.GetReaction(node4);

            Assert.AreEqual(0.0052843, node2Displacement.X, 0.0001);
            Assert.AreEqual(0.0006522, node2Displacement.Z, 0.0001);
            Assert.AreEqual(0.0005, node2Displacement.YY, 0.0001);

            Assert.AreEqual(0.0044052, node3Displacement.X, 0.0001);
            Assert.AreEqual(-0.0006522, node3Displacement.Z, 0.0001);
            Assert.AreEqual(0.0006, node3Displacement.YY, 0.0001);

            Assert.AreEqual(-9000, node1Reaction.X, 500);
            Assert.AreEqual(-5000, node1Reaction.Z, 500);
            Assert.AreEqual(-30022, node1Reaction.YY, 500);

            Assert.AreEqual(-6000, node4Reaction.X, 500);
            Assert.AreEqual(5000, node4Reaction.Z, 500);
            Assert.AreEqual(-22586, node4Reaction.YY, 500);
        }
コード例 #9
0
ファイル: Triangle.cs プロジェクト: xiaoxiongnpu/SharpFE
        public void TwoTriangleWall()
        {
            FiniteElementModel model = new FiniteElementModel(ModelType.Membrane3D); // we will create and analyze a 2D slab system
            FiniteElementNode  node1 = model.NodeFactory.Create(0.0, 0.0, 0.0);      // create a node at the origin

            model.ConstrainNode(node1, DegreeOfFreedom.X);                           // constrain the node from moving in the x-axis
            model.ConstrainNode(node1, DegreeOfFreedom.Y);                           // constrain the node from moving in the y-axis
            model.ConstrainNode(node1, DegreeOfFreedom.Z);                           // constrain the node from moving in the z-axis

            FiniteElementNode node2 = model.NodeFactory.Create(1.0, 0.0, 0.0);       // create a second node at a distance 1 metre along the X axis

            model.ConstrainNode(node2, DegreeOfFreedom.X);                           // constrain the node from moving in the x-axis
            model.ConstrainNode(node2, DegreeOfFreedom.Y);                           // constrain the node from moving in the y-axis
            model.ConstrainNode(node2, DegreeOfFreedom.Z);                           // constrain the node from moving in the z-axis

            FiniteElementNode node3 = model.NodeFactory.Create(0.0, 1.0, 0.0);

            model.ConstrainNode(node3, DegreeOfFreedom.Z);             // constrain the node from moving in the z-axis

            FiniteElementNode node4 = model.NodeFactory.Create(1.0, 1.0, 0.0);

            model.ConstrainNode(node4, DegreeOfFreedom.Z);             // constrain the node from moving in the z-axis

            IMaterial material = new GenericElasticMaterial(0, 200000, 0.2, 84000);

            model.ElementFactory.CreateLinearConstantStrainTriangle(node1, node2, node3, material, 0.1);             // create a triangle of thickness of 0.1 metres
            model.ElementFactory.CreateLinearConstantStrainTriangle(node2, node4, node3, material, 0.1);

            ForceVector force = model.ForceFactory.Create(0, -10); // Create a force of 10 Newtons in the y direction

            model.ApplyForceToNode(force, node3);                  // Apply that force to the third node
            model.ApplyForceToNode(force, node4);

            IFiniteElementSolver solver  = new MatrixInversionLinearSolver(model);
            FiniteElementResults results = solver.Solve();

            ReactionVector reaction1 = results.GetReaction(node1);             //get the reaction at the first node

            Console.WriteLine("\nReaction1 : \n" + reaction1);
            ReactionVector reaction2 = results.GetReaction(node2);

            Console.WriteLine("\nReaction2 : \n" + reaction2);
            Assert.AreEqual(20, reaction1.Y + reaction2.Y, 0.001);

            DisplacementVector displacement3 = results.GetDisplacement(node3);              // get the displacement at the second node

            Console.WriteLine("\nDisplacement3 : \n" + displacement3);
            Assert.AreNotEqual(0.0, displacement3.X);                          // TODO calculate the actual value, rather than just checking we have any value
            Assert.AreNotEqual(0.0, displacement3.Y);                          // TODO calculate the actual value, rather than just checking we have any value
            Assert.AreEqual(0.0, displacement3.Z);                             // TODO calculate the actual value, rather than just checking we have any value

            DisplacementVector displacement4 = results.GetDisplacement(node4); // get the displacement at the second node

            Console.WriteLine("\nDisplacement4 : \n" + displacement4);
            Assert.AreNotEqual(0.0, displacement4.X);          // TODO calculate the actual value, rather than just checking we have any value
            Assert.AreNotEqual(0.0, displacement4.Y);          // TODO calculate the actual value, rather than just checking we have any value
            Assert.AreEqual(0.0, displacement4.Z);             // TODO calculate the actual value, rather than just checking we have any value
        }
コード例 #10
0
ファイル: Beam3DIn2DModel.cs プロジェクト: iainsproat/SharpFE
        public void Calculate2DFrameOf3BeamsAnd12Dof()
        {
            FiniteElementModel model = new FiniteElementModel(ModelType.Full3D);
            FiniteElementNode node1 = model.NodeFactory.Create(0, 0, 3);
            model.ConstrainNode(node1, DegreeOfFreedom.X);
            model.ConstrainNode(node1, DegreeOfFreedom.Y);
            model.ConstrainNode(node1, DegreeOfFreedom.Z);
            model.ConstrainNode(node1, DegreeOfFreedom.XX);
            model.ConstrainNode(node1, DegreeOfFreedom.YY);

            FiniteElementNode node2 = model.NodeFactory.Create(3, 0, 3);

            FiniteElementNode node3 = model.NodeFactory.Create(6, 0, 0);

            FiniteElementNode node4 = model.NodeFactory.Create(9, 0, 0);
            model.ConstrainNode(node4, DegreeOfFreedom.X);
            model.ConstrainNode(node4, DegreeOfFreedom.Y);
            model.ConstrainNode(node4, DegreeOfFreedom.Z);
            model.ConstrainNode(node4, DegreeOfFreedom.XX);
            model.ConstrainNode(node4, DegreeOfFreedom.YY);

            IMaterial material = new GenericElasticMaterial(0, 210000000000, 0, 84000000000);
            ICrossSection section = new GenericCrossSection(0.0001, 0.0002, 0.0002, 0.00005);

            model.ElementFactory.CreateLinear3DBeam(node1, node2, material, section);
            model.ElementFactory.CreateLinear3DBeam(node2, node3, material, section);
            model.ElementFactory.CreateLinear3DBeam(node3, node4, material, section);

            ForceVector force2 = model.ForceFactory.Create(0, 0, -10000, 0, 5000, 0);
            model.ApplyForceToNode(force2, node2);

            ForceVector force3 = model.ForceFactory.Create(0, 0, -10000, 0, -5000, 0);
            model.ApplyForceToNode(force3, node3);

            IFiniteElementSolver solver = new LinearSolverSVD(model);
            FiniteElementResults results = solver.Solve();

            DisplacementVector node2Displacement = results.GetDisplacement(node2);
            DisplacementVector node3Displacement = results.GetDisplacement(node3);
            ReactionVector node1Reaction = results.GetReaction(node1);
            ReactionVector node4Reaction = results.GetReaction(node4);

            Assert.AreEqual(0, node2Displacement.X, 0.0001);
            Assert.AreEqual(-0.0013496, node2Displacement.Z, 0.0001); ///NOTE this value of -0.0013496 matches the example, but -0.0314233 was calculated using a commercial finite element software
            Assert.AreEqual(0.00059173, node2Displacement.YY, 0.0001); ///NOTE this value of 0.00059173 does not match the example, but was verified using a commercial finite element software

            Assert.AreEqual(0, node3Displacement.X, 0.0001);
            Assert.AreEqual(-0.0013496, node3Displacement.Z, 0.0001); ///NOTE this value matches the example, but was verified using a commercial finite element software
            Assert.AreEqual(-0.00059173, node3Displacement.YY, 0.0001); ///NOTE this value of -0.00059173 does not match the example, but was verified using a commercial finite element software

            Assert.AreEqual(0, node1Reaction.X, 1);
            Assert.AreEqual(10000, node1Reaction.Z, 1);
            Assert.AreEqual(-23284, node1Reaction.YY, 1); ///NOTE this value of -23284 does not match the example, but was verified using a commercial finite element software

            Assert.AreEqual(0, node4Reaction.X, 1);
            Assert.AreEqual(10000, node4Reaction.Z, 1);
            Assert.AreEqual(23284, node4Reaction.YY, 1); ///NOTE this value of 23284 does not match the example, but was verified using a commercial finite element software
        }
コード例 #11
0
        public void Can_calculate_ShearStiffnessGAz()
        {
            material = new GenericElasticMaterial(0, 210000000000, 0.3, 80769200000);
            section  = new SolidRectangle(0.1, 0.1);
            SUT      = elementFactory.CreateLinear1DBeam(start, end, material, section);

            Assert.Inconclusive("Have not yet properly calculated as to what is expected");
            Assert.AreEqual(675508000, SUT.ShearStiffnessGAz, 1);
        }
コード例 #12
0
 public void SetUp()
 {
     nodeFactory    = new NodeFactory(ModelType.Truss1D);
     start          = nodeFactory.Create(0);
     end            = nodeFactory.Create(1);
     elementFactory = new ElementFactory(ModelType.Truss1D);
     material       = new GenericElasticMaterial(0, 0.1, 0, 0);
     section        = new SolidRectangle(0.1, 1);
     SUT            = elementFactory.CreateLinearTruss(start, end, material, section);
 }
コード例 #13
0
        public void Calculate2DTrussOf3BarsAnd8Dof()
        {
            FiniteElementModel model = new FiniteElementModel(ModelType.Truss2D);

            FiniteElementNode node1 = model.NodeFactory.CreateFor2DTruss(0, 0);

            FiniteElementNode node2 = model.NodeFactory.CreateFor2DTruss(0, 10);

            model.ConstrainNode(node2, DegreeOfFreedom.X);
            model.ConstrainNode(node2, DegreeOfFreedom.Z);

            FiniteElementNode node3 = model.NodeFactory.CreateFor2DTruss(10, 10);

            model.ConstrainNode(node3, DegreeOfFreedom.X);
            model.ConstrainNode(node3, DegreeOfFreedom.Z);

            FiniteElementNode node4 = model.NodeFactory.CreateFor2DTruss(10, 0);

            model.ConstrainNode(node4, DegreeOfFreedom.X);
            model.ConstrainNode(node4, DegreeOfFreedom.Z);

            IMaterial     material = new GenericElasticMaterial(0, 30000000, 0, 0);
            ICrossSection section  = new SolidRectangle(2, 1);

            model.ElementFactory.CreateLinearTruss(node1, node2, material, section);
            model.ElementFactory.CreateLinearTruss(node1, node3, material, section);
            model.ElementFactory.CreateLinearTruss(node1, node4, material, section);

            ForceVector externalForce = model.ForceFactory.CreateForTruss(0, -10000);

            model.ApplyForceToNode(externalForce, node1);

            IFiniteElementSolver solver  = new MatrixInversionLinearSolver(model);
            FiniteElementResults results = solver.Solve();

            ReactionVector reactionAtNode2 = results.GetReaction(node2);

            Assert.AreEqual(0, reactionAtNode2.X, 1);
            Assert.AreEqual(7929, reactionAtNode2.Z, 1);

            ReactionVector reactionAtNode3 = results.GetReaction(node3);

            Assert.AreEqual(2071, reactionAtNode3.X, 1);
            Assert.AreEqual(2071, reactionAtNode3.Z, 1);

            ReactionVector reactionAtNode4 = results.GetReaction(node4);

            Assert.AreEqual(-2071, reactionAtNode4.X, 1);
            Assert.AreEqual(0, reactionAtNode4.Z, 1);

            DisplacementVector displacementAtNode1 = results.GetDisplacement(node1);

            Assert.AreEqual(0.00035, displacementAtNode1.X, 0.00001);               ///NOTE this does not match the example in the book, but was instead verified by commercial FE software.  It appears as it may be an errata in the book.
            Assert.AreEqual(-0.00132, displacementAtNode1.Z, 0.00001);              ///NOTE this does not match the example in the book, but was instead verified by commercial FE software.  It appears as it may be an errata in the book.
        }
コード例 #14
0
        public void Calculate3DFrameOf3BeamsAnd24Dof()
        {
            FiniteElementModel model = new FiniteElementModel(ModelType.Full3D);
            FiniteElementNode  node1 = model.NodeFactory.Create(0, 0, 0);

            FiniteElementNode node2 = model.NodeFactory.Create(3, 0, 0);

            model.ConstrainNode(node2, DegreeOfFreedom.X);
            model.ConstrainNode(node2, DegreeOfFreedom.Y);
            model.ConstrainNode(node2, DegreeOfFreedom.Z);

            FiniteElementNode node3 = model.NodeFactory.Create(0, 3, 0);

            model.ConstrainNode(node3, DegreeOfFreedom.X);
            model.ConstrainNode(node3, DegreeOfFreedom.Y);
            model.ConstrainNode(node3, DegreeOfFreedom.Z);

            FiniteElementNode node4 = model.NodeFactory.Create(0, 0, -4);

            model.ConstrainNode(node4, DegreeOfFreedom.X);
            model.ConstrainNode(node4, DegreeOfFreedom.Y);
            model.ConstrainNode(node4, DegreeOfFreedom.Z);

            IMaterial     material = new GenericElasticMaterial(0, 210000000000, 0.3, 84000000000);
            ICrossSection section  = new GenericCrossSection(0.02, 0.0001, 0.0002, 0.00005);

            model.ElementFactory.CreateLinear3DBeam(node1, node2, material, section);
            model.ElementFactory.CreateLinear3DBeam(node1, node3, material, section);
            model.ElementFactory.CreateLinear3DBeam(node1, node4, material, section);

            ForceVector force = model.ForceFactory.Create(-10000, -15000, 0, 0, 0, 0);

            model.ApplyForceToNode(force, node1);

            IFiniteElementSolver solver  = new LinearSolverSVD(model);
            FiniteElementResults results = solver.Solve();

            DisplacementVector node1Displacement = results.GetDisplacement(node1);
            ReactionVector     node2Reaction     = results.GetReaction(node2);
            ReactionVector     node3Reaction     = results.GetReaction(node3);
            ReactionVector     node4Reaction     = results.GetReaction(node4);

            Console.WriteLine("\nNode1 displacement : \n" + node1Displacement);
            Console.WriteLine("\nNode2 reaction : \n" + node2Reaction);
            Console.WriteLine("\nNode3 reaction : \n" + node3Reaction);
            Console.WriteLine("\nNode4 reaction : \n" + node4Reaction);

            Assert.Inconclusive("The below x, y and zz pass, but z, xx, yy fail");
            Assert.AreEqual(-0.000007109, node1Displacement.X, 0.00000001);
            Assert.AreEqual(-0.000010680, node1Displacement.Y, 0.00000001);
            Assert.AreEqual(-0.000014704, node1Displacement.Z, 0.00000001);
            Assert.AreEqual(0.000001147, node1Displacement.XX, 0.00000001);
            Assert.AreEqual(-0.000001068, node1Displacement.YY, 0.00000001);
            Assert.AreEqual(0.000000595, node1Displacement.ZZ, 0.000000001);
        }
コード例 #15
0
 public void SetUp()
 {
     nodeFactory    = new NodeFactory(ModelType.Frame2D);
     start          = nodeFactory.CreateFor2DTruss(0, 0);
     end            = nodeFactory.CreateFor2DTruss(1, 0);
     elementFactory = new ElementFactory(ModelType.Frame2D);
     material       = new GenericElasticMaterial(0, 1, 0, 1);
     section        = new GenericCrossSection(1, 1, 1, 1);
     beam           = elementFactory.CreateLinear3DBeam(start, end, material, section);
     SUT            = new Linear3DBernoulliBeamStiffnessMatrixBuilder(beam);
 }
コード例 #16
0
 public void SetUp()
 {
     nodeFactory = new NodeFactory(ModelType.Frame2D);
     start = nodeFactory.CreateFor2DTruss(0, 0);
     end = nodeFactory.CreateFor2DTruss(1, 0);
     elementFactory = new ElementFactory(ModelType.Frame2D);
     material = new GenericElasticMaterial(0, 1, 0, 1);
     section = new GenericCrossSection(1, 1, 1, 1);
     beam = elementFactory.CreateLinear3DBeam(start, end, material, section);
     SUT = new Linear3DBernoulliBeamStiffnessMatrixBuilder(beam);
 }
コード例 #17
0
        public void SetUp()
        {
            ModelType modelType = ModelType.Beam1D;

            nodeFactory    = new NodeFactory(modelType);
            start          = nodeFactory.Create(0);
            end            = nodeFactory.Create(1);
            elementFactory = new ElementFactory(modelType);
            material       = new GenericElasticMaterial(0, 0.1, 0, 0);
            section        = new SolidRectangle(0.1, 1);
            SUT            = elementFactory.CreateLinear1DBeam(start, end, material, section);
        }
コード例 #18
0
        public void Calculate3DFrameOf3BeamsAnd24Dof()
        {
            FiniteElementModel model = new FiniteElementModel(ModelType.Full3D);
            FiniteElementNode node1 = model.NodeFactory.Create(0,  0,  0);

            FiniteElementNode node2 = model.NodeFactory.Create(3,  0,  0);
            model.ConstrainNode(node2, DegreeOfFreedom.X);
            model.ConstrainNode(node2, DegreeOfFreedom.Y);
            model.ConstrainNode(node2, DegreeOfFreedom.Z);

            FiniteElementNode node3 = model.NodeFactory.Create(0,  3, 0);
            model.ConstrainNode(node3, DegreeOfFreedom.X);
            model.ConstrainNode(node3, DegreeOfFreedom.Y);
            model.ConstrainNode(node3, DegreeOfFreedom.Z);

            FiniteElementNode node4 = model.NodeFactory.Create(0, 0,  -4);
            model.ConstrainNode(node4, DegreeOfFreedom.X);
            model.ConstrainNode(node4, DegreeOfFreedom.Y);
            model.ConstrainNode(node4, DegreeOfFreedom.Z);

            IMaterial material = new GenericElasticMaterial(0, 210000000000, 0.3, 84000000000);
            ICrossSection section = new GenericCrossSection(0.02, 0.0001, 0.0002, 0.00005);

            model.ElementFactory.CreateLinear3DBeam(node1, node2, material, section);
            model.ElementFactory.CreateLinear3DBeam(node1, node3, material, section);
            model.ElementFactory.CreateLinear3DBeam(node1, node4, material, section);

            ForceVector force = model.ForceFactory.Create(-10000, -15000, 0, 0, 0, 0);
            model.ApplyForceToNode(force, node1);

            IFiniteElementSolver solver = new LinearSolverSVD(model);
            FiniteElementResults results = solver.Solve();

            DisplacementVector node1Displacement = results.GetDisplacement(node1);
            ReactionVector node2Reaction = results.GetReaction(node2);
            ReactionVector node3Reaction = results.GetReaction(node3);
            ReactionVector node4Reaction = results.GetReaction(node4);

            Console.WriteLine("\nNode1 displacement : \n" + node1Displacement);
            Console.WriteLine("\nNode2 reaction : \n" + node2Reaction);
            Console.WriteLine("\nNode3 reaction : \n" + node3Reaction);
            Console.WriteLine("\nNode4 reaction : \n" + node4Reaction);

            Assert.Inconclusive("The below x, y and zz pass, but z, xx, yy fail");
            Assert.AreEqual(-0.000007109, node1Displacement.X, 0.00000001);
            Assert.AreEqual(-0.000010680, node1Displacement.Y, 0.00000001);
            Assert.AreEqual(-0.000014704, node1Displacement.Z, 0.00000001);
            Assert.AreEqual(0.000001147, node1Displacement.XX, 0.00000001);
            Assert.AreEqual(-0.000001068, node1Displacement.YY, 0.00000001);
            Assert.AreEqual(0.000000595, node1Displacement.ZZ, 0.000000001);
        }
コード例 #19
0
        public void SimplySupportedBeam()
        {
            FiniteElementModel model = new FiniteElementModel(ModelType.Full3D);
            FiniteElementNode  node1 = model.NodeFactory.Create(0, 0, 0);

            model.ConstrainNode(node1, DegreeOfFreedom.X);
            model.ConstrainNode(node1, DegreeOfFreedom.Y);
            model.ConstrainNode(node1, DegreeOfFreedom.Z);
            model.ConstrainNode(node1, DegreeOfFreedom.XX);

            FiniteElementNode node2 = model.NodeFactory.Create(1.0, 0, 0);

            model.ConstrainNode(node2, DegreeOfFreedom.X);
            model.ConstrainNode(node2, DegreeOfFreedom.Y);
            model.ConstrainNode(node2, DegreeOfFreedom.Z);
            model.ConstrainNode(node2, DegreeOfFreedom.XX);

            IMaterial     material = new GenericElasticMaterial(0, 210000000000, 0, 84000000000);
            ICrossSection section  = new GenericCrossSection(0.0001, 0.0002, 0.0002, 0.00005);

            model.ElementFactory.CreateLinear3DBeam(node1, node2, material, section);

            ForceVector moment = model.ForceFactory.Create(0, 0, 0, 0, 10000, 0);

            model.ApplyForceToNode(moment, node1);

            IFiniteElementSolver solver  = new MatrixInversionLinearSolver(model);
            FiniteElementResults results = solver.Solve();

            // check the results
            DisplacementVector displacementAtNode1 = results.GetDisplacement(node1);

            Assert.AreEqual(0, displacementAtNode1.Z, 0.001);
            Assert.AreEqual(0.00007936, displacementAtNode1.YY, 0.000001);

            DisplacementVector displacementAtNode2 = results.GetDisplacement(node2);

            Assert.AreEqual(0, displacementAtNode2.Z, 0.001);
            Assert.AreEqual(-0.00003968, displacementAtNode2.YY, 0.000001);

            ReactionVector reactionAtNode1 = results.GetReaction(node1);

            Assert.AreEqual(-10000, reactionAtNode1.Z, 0.001);
            Assert.AreEqual(0, reactionAtNode1.YY, 0.001);

            ReactionVector reactionAtNode2 = results.GetReaction(node2);

            Assert.AreEqual(10000, reactionAtNode2.Z, 0.001);
            Assert.AreEqual(0, reactionAtNode2.YY, 0.001);
        }
コード例 #20
0
        public void OneQuadMembraneLateralLoad()
        {
            FiniteElementModel model = new FiniteElementModel(ModelType.Membrane2D);
            FiniteElementNode  node1 = model.NodeFactory.Create(0.0, 0.0);

            model.ConstrainNode(node1, DegreeOfFreedom.X);
            model.ConstrainNode(node1, DegreeOfFreedom.Y);

            FiniteElementNode node2 = model.NodeFactory.Create(1.0, 0.0);

            model.ConstrainNode(node2, DegreeOfFreedom.Y);

            FiniteElementNode node3 = model.NodeFactory.Create(1.0, 1.0);

            FiniteElementNode node4 = model.NodeFactory.Create(0.0, 1.0);

            IMaterial material = new GenericElasticMaterial(0, 210000000000, 0.3, 0);

            model.ElementFactory.CreateLinearConstantStressQuadrilateral(node1, node2, node3, node4, material, 0.1);

            ForceVector force = model.ForceFactory.Create(10000, 0);

            model.ApplyForceToNode(force, node4);

            IFiniteElementSolver solver  = new MatrixInversionLinearSolver(model);
            FiniteElementResults results = solver.Solve();

            ReactionVector reaction1 = results.GetReaction(node1);
//			Console.WriteLine("\nReaction1 : \n" + reaction1);
            ReactionVector reaction2 = results.GetReaction(node2);

//			Console.WriteLine("\nReaction2 : \n" + reaction2);
            Assert.AreEqual(0, reaction1.Y + reaction2.Y, 1);
            Assert.AreEqual(-10000, reaction1.X, 1);

            DisplacementVector displacement3 = results.GetDisplacement(node3);
            DisplacementVector displacement4 = results.GetDisplacement(node4);

            Console.WriteLine("\nDisplacement3 : \n" + displacement3);
            Console.WriteLine("\nDisplacement4 : \n" + displacement4);

            Assert.AreEqual(0.000002619047, displacement3.X, 0.0000000001);
            Assert.AreEqual(-0.000001428571, displacement3.Y, 0.0000000001);

            Assert.AreEqual(0.000004047618, displacement4.X, 0.0000000001);
            Assert.AreEqual(0.000001428571, displacement4.Y, 0.0000000001);
        }
コード例 #21
0
        public void CalculateModelOfTwoBarsAndOneSpringWithFourDegreesOfFreedom()
        {
            FiniteElementModel model = new FiniteElementModel(ModelType.Truss1D);
            FiniteElementNode  node1 = model.NodeFactory.Create(0);

            model.ConstrainNode(node1, DegreeOfFreedom.X);

            FiniteElementNode node2 = model.NodeFactory.Create(2.0);

            FiniteElementNode node3 = model.NodeFactory.Create(4.0);

            FiniteElementNode node4 = model.NodeFactory.Create(6.0);

            model.ConstrainNode(node4, DegreeOfFreedom.X);

            IMaterial     material = new GenericElasticMaterial(0, 70000000000, 0, 0);
            ICrossSection section  = new SolidRectangle(0.02, 0.01);

            model.ElementFactory.CreateLinearTruss(node1, node2, material, section);
            model.ElementFactory.CreateLinearTruss(node2, node3, material, section);
            model.ElementFactory.CreateLinearConstantSpring(node3, node4, 2000000);


            ForceVector externalForce = model.ForceFactory.Create(8000);

            model.ApplyForceToNode(externalForce, node2);

            IFiniteElementSolver solver  = new MatrixInversionLinearSolver(model);
            FiniteElementResults results = solver.Solve();

            DisplacementVector displacementAtNode2 = results.GetDisplacement(node2);

            Assert.AreEqual(0.000935, displacementAtNode2.X, 0.001);

            DisplacementVector displacementAtNode3 = results.GetDisplacement(node3);

            Assert.AreEqual(0.000727, displacementAtNode3.X, 0.001);

            ReactionVector reactionAtNode1 = results.GetReaction(node1);

            Assert.AreEqual(-6546, reactionAtNode1.X, 1);

            ReactionVector reactionAtNode4 = results.GetReaction(node4);

            Assert.AreEqual(-1455, reactionAtNode4.X, 1);
        }
コード例 #22
0
        public void Equality_depends_on_material_and_CrossSection()
        {
            Assert.IsTrue(SUT.Equals(SUT));

            LinearTruss equal = elementFactory.CreateLinearTruss(start, end, material, section);

            Assert.IsTrue(SUT.Equals(equal));

            GenericElasticMaterial material2       = new GenericElasticMaterial(0, 2, 0, 0);
            LinearTruss            unequalMaterial = elementFactory.CreateLinearTruss(start, end, material2, section);

            Assert.IsFalse(SUT.Equals(unequalMaterial));

            SolidRectangle section2            = new SolidRectangle(2, 1);
            LinearTruss    unequalCrossSection = elementFactory.CreateLinearTruss(start, end, material, section2);

            Assert.IsFalse(SUT.Equals(unequalCrossSection));
        }
コード例 #23
0
        public void HashCode_changes_with_Material_and_CrossSection()
        {
            int SUTOriginalHash = SUT.GetHashCode();

            LinearTruss equal = elementFactory.CreateLinearTruss(start, end, material, section);

            Assert.AreEqual(SUTOriginalHash, equal.GetHashCode());

            GenericElasticMaterial material2       = new GenericElasticMaterial(0, 2, 0, 0);
            LinearTruss            unequalMaterial = elementFactory.CreateLinearTruss(start, end, material2, section);

            Assert.AreNotEqual(SUTOriginalHash, unequalMaterial.GetHashCode());

            SolidRectangle section2            = new SolidRectangle(2, 1);
            LinearTruss    unequalCrossSection = elementFactory.CreateLinearTruss(start, end, material, section2);

            Assert.AreNotEqual(SUTOriginalHash, unequalCrossSection.GetHashCode());
        }
コード例 #24
0
        public void SimplySupportedBeam()                                        //TODO verify using independent check
        {
            FiniteElementModel model = new FiniteElementModel(ModelType.Beam1D); // we will create and analyze a 1D beam system
            FiniteElementNode  node1 = model.NodeFactory.Create(0);              // create a node at the origin

            model.ConstrainNode(node1, DegreeOfFreedom.Z);                       // constrain the node from moving in the Z-axis

            FiniteElementNode node2 = model.NodeFactory.Create(1.0);             // create a second node at a distance 1 metre along the X axis

            model.ConstrainNode(node2, DegreeOfFreedom.Z);                       // constrain the node from moving in the Z-axis

            IMaterial     material = new GenericElasticMaterial(0, 210000000000, 0, 0);
            ICrossSection section  = new GenericCrossSection(0.0001, 0.0002);

            model.ElementFactory.CreateLinear3DBeam(node1, node2, material, section); // create a spring between the two nodes of a stiffness of 2000 Newtons per metre

            ForceVector moment = model.ForceFactory.CreateFor1DBeam(0, 10000);        // Create a clockwise(?) moment of 10 KiloNewtonmetres around the yy axis

            model.ApplyForceToNode(moment, node1);                                    // Apply that moment to the first node

            IFiniteElementSolver solver  = new MatrixInversionLinearSolver(model);    // Create a new instance of the solver class and pass it the model to solve
            FiniteElementResults results = solver.Solve();                            // ask the solver to solve the model and return results

            // check the results
            DisplacementVector displacementAtNode1 = results.GetDisplacement(node1);

            Assert.AreEqual(0, displacementAtNode1.Z, 0.001);
            Assert.AreEqual(0.00007936, displacementAtNode1.YY, 0.00000001);

            DisplacementVector displacementAtNode2 = results.GetDisplacement(node2);

            Assert.AreEqual(0, displacementAtNode2.Z, 0.001);
            Assert.AreEqual(-0.00003968, displacementAtNode2.YY, 0.00000001);

            ReactionVector reactionAtNode1 = results.GetReaction(node1);

            Assert.AreEqual(-10000, reactionAtNode1.Z, 0.001);
            Assert.AreEqual(0, reactionAtNode1.YY, 0.001);

            ReactionVector reactionAtNode2 = results.GetReaction(node2);

            Assert.AreEqual(10000, reactionAtNode2.Z, 0.001);
            Assert.AreEqual(0, reactionAtNode2.YY, 0.001);
        }
コード例 #25
0
        public void ThreeNodeCantilever()
        {
            FiniteElementModel model = new FiniteElementModel(ModelType.Full3D);
            FiniteElementNode  node1 = model.NodeFactory.Create(0, 0, 0);

            model.ConstrainNode(node1, DegreeOfFreedom.X);
            model.ConstrainNode(node1, DegreeOfFreedom.Y);
            model.ConstrainNode(node1, DegreeOfFreedom.Z);
            model.ConstrainNode(node1, DegreeOfFreedom.XX);
            model.ConstrainNode(node1, DegreeOfFreedom.YY);
            model.ConstrainNode(node1, DegreeOfFreedom.ZZ);

            FiniteElementNode node2 = model.NodeFactory.Create(1.5, 0, 0);
            FiniteElementNode node3 = model.NodeFactory.Create(3.0, 0, 0);

            IMaterial     material = new GenericElasticMaterial(0, 210000000000, 0, 84000000000);
            ICrossSection section  = new GenericCrossSection(0.0001, 0.0002, 0.0002, 0.00005);

            model.ElementFactory.CreateLinear3DBeam(node1, node2, material, section);
            model.ElementFactory.CreateLinear3DBeam(node2, node3, material, section);

            ForceVector force = model.ForceFactory.Create(0, 0, -10000, 0, 0, 0);

            model.ApplyForceToNode(force, node3);

            IFiniteElementSolver solver  = new MatrixInversionLinearSolver(model);
            FiniteElementResults results = solver.Solve();

            ReactionVector reaction = results.GetReaction(node1);

            Assert.AreEqual(10000, reaction.Z, 0.001);
            Assert.AreEqual(-30000, reaction.YY, 0.001);

            DisplacementVector displacement2 = results.GetDisplacement(node2);

            Assert.AreEqual(-0.000670, displacement2.Z, 0.0005);
            Assert.AreEqual(0.000804, displacement2.YY, 0.0001);

            DisplacementVector displacement3 = results.GetDisplacement(node3);

            Assert.AreEqual(-0.00214, displacement3.Z, 0.0005);
            Assert.AreEqual(0.00107, displacement3.YY, 0.0001);
        }
コード例 #26
0
ファイル: Quad.cs プロジェクト: iainsproat/SharpFE
        public void OneQuadMembrane()
        {
            FiniteElementModel model = new FiniteElementModel(ModelType.Membrane2D);
            FiniteElementNode node1 = model.NodeFactory.Create(0.0, 0.0);
            model.ConstrainNode(node1, DegreeOfFreedom.X);
            model.ConstrainNode(node1, DegreeOfFreedom.Y);

            FiniteElementNode node2 = model.NodeFactory.Create(1.0, 0.0);
            model.ConstrainNode(node2, DegreeOfFreedom.Y);

            FiniteElementNode node3 = model.NodeFactory.Create(1.0, 1.0);

            FiniteElementNode node4 = model.NodeFactory.Create(0.0, 1.0);

            IMaterial material = new GenericElasticMaterial(0, 210000000000, 0.3, 0);

            model.ElementFactory.CreateLinearConstantStressQuadrilateral(node1, node2, node3, node4, material, 0.1);

            ForceVector force = model.ForceFactory.Create(0, -10000);
            model.ApplyForceToNode(force, node3);
            model.ApplyForceToNode(force, node4);

            IFiniteElementSolver solver = new MatrixInversionLinearSolver(model);
            FiniteElementResults results = solver.Solve();

            ReactionVector reaction1 = results.GetReaction(node1);
            //			Console.WriteLine("\nReaction1 : \n" + reaction1);
            ReactionVector reaction2 = results.GetReaction(node2);
            //			Console.WriteLine("\nReaction2 : \n" + reaction2);
            Assert.AreEqual(20000, reaction1.Y + reaction2.Y, 1);
            DisplacementVector displacement3 = results.GetDisplacement(node3);
            DisplacementVector displacement4 = results.GetDisplacement(node4);
            //			Console.WriteLine("\nDisplacement3 : \n" + displacement3);
            //			Console.WriteLine("\nDisplacement4 : \n" + displacement4);
            Assert.AreEqual( 0.0000002857, displacement3.X, 0.0000000001);
            Assert.AreEqual(-0.0000009524, displacement3.Y, 0.0000000001);

            Assert.AreEqual(0, displacement4.X, 0.0000001);
            Assert.AreEqual(-0.0000009524, displacement4.Y, 0.0000000001);
        }
コード例 #27
0
        public void Calculate3DPortalFrameOf8BeamsAnd48Dof()
        {
            FiniteElementModel model = new FiniteElementModel(ModelType.Full3D);
            FiniteElementNode  node1 = model.NodeFactory.Create(0, 0, 0);

            model.ConstrainNode(node1, DegreeOfFreedom.X);
            model.ConstrainNode(node1, DegreeOfFreedom.Y);
            model.ConstrainNode(node1, DegreeOfFreedom.Z);

            FiniteElementNode node2 = model.NodeFactory.Create(0, -4, 0);

            model.ConstrainNode(node2, DegreeOfFreedom.X);
            model.ConstrainNode(node2, DegreeOfFreedom.Y);
            model.ConstrainNode(node2, DegreeOfFreedom.Z);

            FiniteElementNode node3 = model.NodeFactory.Create(4, -4, 0);

            model.ConstrainNode(node3, DegreeOfFreedom.X);
            model.ConstrainNode(node3, DegreeOfFreedom.Y);
            model.ConstrainNode(node3, DegreeOfFreedom.Z);

            FiniteElementNode node4 = model.NodeFactory.Create(4, 0, 0);

            model.ConstrainNode(node4, DegreeOfFreedom.X);
            model.ConstrainNode(node4, DegreeOfFreedom.Y);
            model.ConstrainNode(node4, DegreeOfFreedom.Z);

            FiniteElementNode node5 = model.NodeFactory.Create(0, 0, 5);
            FiniteElementNode node6 = model.NodeFactory.Create(0, -4, 5);
            FiniteElementNode node7 = model.NodeFactory.Create(4, -4, 5);
            FiniteElementNode node8 = model.NodeFactory.Create(4, 0, 5);

            IMaterial     material = new GenericElasticMaterial(0, 210000000000, 0, 84000000000);
            ICrossSection section  = new GenericCrossSection(0.02, 0.0001, 0.0002, 0.00005);

            model.ElementFactory.CreateLinear3DBeam(node1, node5, material, section);
            model.ElementFactory.CreateLinear3DBeam(node2, node6, material, section);
            model.ElementFactory.CreateLinear3DBeam(node3, node7, material, section);
            model.ElementFactory.CreateLinear3DBeam(node4, node8, material, section);
            model.ElementFactory.CreateLinear3DBeam(node5, node6, material, section);
            model.ElementFactory.CreateLinear3DBeam(node6, node7, material, section);
            model.ElementFactory.CreateLinear3DBeam(node7, node8, material, section);
            model.ElementFactory.CreateLinear3DBeam(node8, node5, material, section);

            ForceVector force = model.ForceFactory.Create(-15000, 0, 0, 0, 0, 0);

            model.ApplyForceToNode(force, node7);

            IFiniteElementSolver solver  = new LinearSolverSVD(model);
            FiniteElementResults results = solver.Solve();

            ReactionVector     node1Reaction     = results.GetReaction(node1);
            ReactionVector     node2Reaction     = results.GetReaction(node2);
            ReactionVector     node3Reaction     = results.GetReaction(node3);
            ReactionVector     node4Reaction     = results.GetReaction(node4);
            DisplacementVector node5Displacement = results.GetDisplacement(node5);
            DisplacementVector node6Displacement = results.GetDisplacement(node6);
            DisplacementVector node7Displacement = results.GetDisplacement(node7);
            DisplacementVector node8Displacement = results.GetDisplacement(node8);

//            Console.WriteLine("\nNode5 displacement : \n" + node5Displacement);
//            Console.WriteLine("\nNode6 displacement : \n" + node6Displacement);
//            Console.WriteLine("\nNode7 displacement : \n" + node7Displacement);
//            Console.WriteLine("\nNode8 displacement : \n" + node8Displacement);

            Assert.Inconclusive("The below tests pass for y-displacements, but fail for x-displacements");
            Assert.AreEqual(-0.0026743, node5Displacement.X, 0.0001);
            Assert.AreEqual(0.0038697, node5Displacement.Y, 0.0001);
            Assert.AreEqual(-0.0107708, node6Displacement.X, 0.0001);
            Assert.AreEqual(0.0038697, node6Displacement.Y, 0.0001);
            Assert.AreEqual(-0.0107780, node7Displacement.X, 0.0001);
            Assert.AreEqual(-0.0038697, node7Displacement.Y, 0.0001);
            Assert.AreEqual(-0.0026743, node8Displacement.X, 0.0001);
            Assert.AreEqual(-0.0038697, node8Displacement.Y, 0.0001);
        }
コード例 #28
0
ファイル: TrussIn3DModel.cs プロジェクト: iainsproat/SharpFE
        public void Calculate3DTrussOf4BarsAnd15Dof()
        {
            FiniteElementModel model = new FiniteElementModel(ModelType.Truss3D);

            FiniteElementNode node1 = model.NodeFactory.Create(4, 4, 3);

            FiniteElementNode node2 = model.NodeFactory.Create(0, 4, 0);
            model.ConstrainNode(node2, DegreeOfFreedom.X);
            model.ConstrainNode(node2, DegreeOfFreedom.Y);
            model.ConstrainNode(node2, DegreeOfFreedom.Z);

            FiniteElementNode node3 = model.NodeFactory.Create(0, 4, 6);
            model.ConstrainNode(node3, DegreeOfFreedom.X);
            model.ConstrainNode(node3, DegreeOfFreedom.Y);
            model.ConstrainNode(node3, DegreeOfFreedom.Z);

            FiniteElementNode node4 = model.NodeFactory.Create(4, 0, 3);
            model.ConstrainNode(node4, DegreeOfFreedom.X);
            model.ConstrainNode(node4, DegreeOfFreedom.Y);
            model.ConstrainNode(node4, DegreeOfFreedom.Z);

            FiniteElementNode node5 = model.NodeFactory.Create(8, -1, 1);
            model.ConstrainNode(node5, DegreeOfFreedom.X);
            model.ConstrainNode(node5, DegreeOfFreedom.Y);
            model.ConstrainNode(node5, DegreeOfFreedom.Z);

            IMaterial material = new GenericElasticMaterial(0, 210000000000, 0, 0);
            ICrossSection section = new SolidRectangle(0.01, 0.01);

            model.ElementFactory.CreateLinearTruss(node1, node2, material, section);
            model.ElementFactory.CreateLinearTruss(node1, node3, material, section);
            model.ElementFactory.CreateLinearTruss(node1, node4, material, section);
            model.ElementFactory.CreateLinearTruss(node1, node5, material, section);

            ForceVector externalForce = model.ForceFactory.Create(0, -10000, 0, 0, 0, 0);
            model.ApplyForceToNode(externalForce, node1);

            IFiniteElementSolver solver = new MatrixInversionLinearSolver(model);
            FiniteElementResults results = solver.Solve();

            ReactionVector reactionAtNode2 = results.GetReaction(node2);
            Assert.AreEqual(270.9, reactionAtNode2.X, 1);
            Assert.AreEqual(0, reactionAtNode2.Y, 1);
            Assert.AreEqual(203.2, reactionAtNode2.Z, 1);

            ReactionVector reactionAtNode3 = results.GetReaction(node3);
            Assert.AreEqual(1354.6, reactionAtNode3.X, 1);
            Assert.AreEqual(0, reactionAtNode3.Y, 1);
            Assert.AreEqual(-1016, reactionAtNode3.Z, 1);

            ReactionVector reactionAtNode4 = results.GetReaction(node4);
            Assert.AreEqual(0, reactionAtNode4.X, 1);
            Assert.AreEqual(7968.1, reactionAtNode4.Y, 1);
            Assert.AreEqual(0, reactionAtNode4.Z, 1);

            ReactionVector reactionAtNode5 = results.GetReaction(node5);
            Assert.AreEqual(-1625.5, reactionAtNode5.X, 1);
            Assert.AreEqual(2031.9, reactionAtNode5.Y, 1);
            Assert.AreEqual(812.8, reactionAtNode5.Z, 1);

            DisplacementVector displacementAtNode1 = results.GetDisplacement(node1);
            Assert.AreEqual(-0.0003024, displacementAtNode1.X, 0.0001); //NOTE the results given in the book are 1E03
            Assert.AreEqual(-0.0015177, displacementAtNode1.Y, 0.0001);
            Assert.AreEqual(0.0002688, displacementAtNode1.Z, 0.0001);
        }
コード例 #29
0
        public void ThreeNodeBeam()
        {
            FiniteElementModel model = new FiniteElementModel(ModelType.Full3D);
            FiniteElementNode  node1 = model.NodeFactory.Create(0, 0, 0);

            model.ConstrainNode(node1, DegreeOfFreedom.X);
            model.ConstrainNode(node1, DegreeOfFreedom.Y);
            model.ConstrainNode(node1, DegreeOfFreedom.Z);
            model.ConstrainNode(node1, DegreeOfFreedom.XX);

            FiniteElementNode node2 = model.NodeFactory.Create(1, 0, 0);

            model.ConstrainNode(node2, DegreeOfFreedom.Y);

            FiniteElementNode node3 = model.NodeFactory.Create(2, 0, 0);

            model.ConstrainNode(node3, DegreeOfFreedom.Y);
            model.ConstrainNode(node3, DegreeOfFreedom.Z);

            IMaterial     material = new GenericElasticMaterial(0, 10000000000, 0.3, 1000000000);
            ICrossSection section  = new SolidRectangle(1, 1);

            model.ElementFactory.CreateLinear3DBeam(node1, node2, material, section);
            model.ElementFactory.CreateLinear3DBeam(node2, node3, material, section);

            ForceVector force = model.ForceFactory.Create(0, 0, -10000, 0, 0, 0);

            model.ApplyForceToNode(force, node2);

            IFiniteElementSolver solver = new MatrixInversionLinearSolver(model);

            Stiffness.GlobalModelStiffnessMatrixBuilder gmsmb = new SharpFE.Stiffness.GlobalModelStiffnessMatrixBuilder(model);
            Console.WriteLine(gmsmb.BuildKnownForcesUnknownDisplacementStiffnessMatrix());

            FiniteElementResults results = solver.Solve();

            DisplacementVector node1Displacement = results.GetDisplacement(node1);

            Console.WriteLine("node1Displacement : \n" + node1Displacement);

            DisplacementVector node2Displacement = results.GetDisplacement(node2);

            Console.WriteLine("node2Displacement : \n" + node2Displacement);

            DisplacementVector node3Displacement = results.GetDisplacement(node3);

            Console.WriteLine("node3Displacement : \n" + node3Displacement);

            ReactionVector node1Reaction = results.GetReaction(node1);

            Console.WriteLine("node1Reaction : \n" + node1Reaction);

            ReactionVector node3Reaction = results.GetReaction(node3);

            Console.WriteLine("node5Reaction : \n" + node3Reaction);

            Assert.AreEqual(0, node2Displacement.XX, 0.00001);
            Assert.AreEqual(0, node2Displacement.Y, 0.00001);
            Assert.AreEqual(0, node2Displacement.ZZ, 0.0001);
            Assert.AreEqual(-0.000002, node2Displacement.Z, 0.0000001);

            Assert.AreEqual(5000, node1Reaction.Z, 0.00001);
            Assert.AreEqual(5000, node3Reaction.Z, 0.00001);
            Assert.AreEqual(0, node2Displacement.YY, 0.0001);
            Assert.AreEqual(0.000003, node1Displacement.YY, 0.0000001);
            Assert.AreEqual(-0.000003, node3Displacement.YY, 0.0000001);
        }
コード例 #30
0
        public void CalculateGridOf3BeamsAnd24Dof()
        {
            FiniteElementModel model = new FiniteElementModel(ModelType.Slab2D);

            FiniteElementNode node1 = model.NodeFactory.Create(4, 4);

            FiniteElementNode node2 = model.NodeFactory.Create(4, 0);
            model.ConstrainNode(node2, DegreeOfFreedom.Z);
            model.ConstrainNode(node2, DegreeOfFreedom.XX);
            model.ConstrainNode(node2, DegreeOfFreedom.YY);

            FiniteElementNode node3 = model.NodeFactory.Create(0, 0);
            model.ConstrainNode(node3, DegreeOfFreedom.Z);
            model.ConstrainNode(node3, DegreeOfFreedom.XX);
            model.ConstrainNode(node3, DegreeOfFreedom.YY);

            FiniteElementNode node4 = model.NodeFactory.Create(0, 4);
            model.ConstrainNode(node4, DegreeOfFreedom.Z);
            model.ConstrainNode(node4, DegreeOfFreedom.XX);
            model.ConstrainNode(node4, DegreeOfFreedom.YY);

            IMaterial material = new GenericElasticMaterial(0, 210000000000, 0, 84000000000);
            ICrossSection section = new GenericCrossSection(0.02, 0.0002, 0.0002, 0.00005);

            model.ElementFactory.CreateLinear3DBeam(node1, node2, material, section);
            model.ElementFactory.CreateLinear3DBeam(node1, node3, material, section);
            model.ElementFactory.CreateLinear3DBeam(node1, node4, material, section);

            ForceVector force = model.ForceFactory.Create(0, 0, -20000, 0, 0, 0);
            model.ApplyForceToNode(force, node1);

            IFiniteElementSolver solver = new LinearSolverSVD(model);
            FiniteElementResults results = solver.Solve();

            DisplacementVector node1Displacement = results.GetDisplacement(node1);
            ReactionVector node2Reaction = results.GetReaction(node2);
            ReactionVector node3Reaction = results.GetReaction(node3);
            ReactionVector node4Reaction = results.GetReaction(node4);

            Assert.AreEqual(-0.0033, node1Displacement.Z, 0.0001);
            Assert.AreEqual(-0.0010, node1Displacement.XX, 0.0001);
            Assert.AreEqual( 0.0010, node1Displacement.YY, 0.0001);

            Assert.AreEqual(10794, node2Reaction.Z, 1);
            Assert.AreEqual(31776, node2Reaction.XX, 1);
            Assert.AreEqual(-1019, node2Reaction.YY, 1);

            Assert.AreEqual(-1587, node3Reaction.Z, 1);
            Assert.AreEqual(4030, node3Reaction.XX, 1);
            Assert.AreEqual(-4030, node3Reaction.YY, 1);

            Assert.AreEqual(10794, node4Reaction.Z, 1);
            Assert.AreEqual(1019, node4Reaction.XX, 1);
            Assert.AreEqual(-31776, node4Reaction.YY, 1);
        }
コード例 #31
0
ファイル: Beam3DIn2DModel.cs プロジェクト: iainsproat/SharpFE
        public void SimplySupportedBeam()
        {
            FiniteElementModel model = new FiniteElementModel(ModelType.Full3D);
            FiniteElementNode node1 = model.NodeFactory.Create(0, 0, 0);
            model.ConstrainNode(node1, DegreeOfFreedom.X);
            model.ConstrainNode(node1, DegreeOfFreedom.Y);
            model.ConstrainNode(node1, DegreeOfFreedom.Z);
            model.ConstrainNode(node1, DegreeOfFreedom.XX);

            FiniteElementNode node2 = model.NodeFactory.Create(1.0, 0, 0);
            model.ConstrainNode(node2, DegreeOfFreedom.X);
            model.ConstrainNode(node2, DegreeOfFreedom.Y);
            model.ConstrainNode(node2, DegreeOfFreedom.Z);
            model.ConstrainNode(node2, DegreeOfFreedom.XX);

            IMaterial material = new GenericElasticMaterial(0, 210000000000, 0, 84000000000);
            ICrossSection section = new GenericCrossSection(0.0001, 0.0002, 0.0002, 0.00005);

            model.ElementFactory.CreateLinear3DBeam(node1, node2, material, section);

            ForceVector moment = model.ForceFactory.Create(0, 0, 0, 0, 10000, 0);
            model.ApplyForceToNode(moment, node1);

            IFiniteElementSolver solver = new MatrixInversionLinearSolver(model);
            FiniteElementResults results = solver.Solve();

            // check the results
            DisplacementVector displacementAtNode1 = results.GetDisplacement(node1);
            Assert.AreEqual(0, displacementAtNode1.Z, 0.001);
            Assert.AreEqual(0.00007936, displacementAtNode1.YY, 0.000001);

            DisplacementVector displacementAtNode2 = results.GetDisplacement(node2);
            Assert.AreEqual(0, displacementAtNode2.Z, 0.001);
            Assert.AreEqual(-0.00003968, displacementAtNode2.YY, 0.000001);

            ReactionVector reactionAtNode1 = results.GetReaction(node1);
            Assert.AreEqual(-10000, reactionAtNode1.Z, 0.001);
            Assert.AreEqual(0, reactionAtNode1.YY, 0.001);

            ReactionVector reactionAtNode2 = results.GetReaction(node2);
            Assert.AreEqual(10000, reactionAtNode2.Z, 0.001);
            Assert.AreEqual(0, reactionAtNode2.YY, 0.001);
        }
コード例 #32
0
ファイル: Beam3DIn2DModel.cs プロジェクト: iainsproat/SharpFE
        public void PortalFrame()
        {
            FiniteElementModel model = new FiniteElementModel(ModelType.Full3D);
            FiniteElementNode node1 = model.NodeFactory.Create(-10, 0, 0);
            model.ConstrainNode(node1, DegreeOfFreedom.X);
            model.ConstrainNode(node1, DegreeOfFreedom.Y);
            model.ConstrainNode(node1, DegreeOfFreedom.Z);
            model.ConstrainNode(node1, DegreeOfFreedom.XX);

            FiniteElementNode node2 = model.NodeFactory.Create(-10, 0, 10);
            FiniteElementNode node3 = model.NodeFactory.Create(0, 0, 14);
            FiniteElementNode node4 = model.NodeFactory.Create(10, 0, 10);

            FiniteElementNode node5 = model.NodeFactory.Create(10, 0, 0);
            model.ConstrainNode(node5, DegreeOfFreedom.X);
            model.ConstrainNode(node5, DegreeOfFreedom.Y);
            model.ConstrainNode(node5, DegreeOfFreedom.Z);
            model.ConstrainNode(node5, DegreeOfFreedom.XX);

            IMaterial material = new GenericElasticMaterial(0, 210000000000, 0, 84000000000);
            ICrossSection section = new GenericCrossSection(0.0001, 0.0002, 0.0002, 0.00005);

            model.ElementFactory.CreateLinear3DBeam(node1, node2, material, section);
            model.ElementFactory.CreateLinear3DBeam(node2, node3, material, section);
            model.ElementFactory.CreateLinear3DBeam(node3, node4, material, section);
            model.ElementFactory.CreateLinear3DBeam(node4, node5, material, section);

            ForceVector force = model.ForceFactory.Create(0, 0, 10000, 0, 0, 0);
            model.ApplyForceToNode(force, node3);

            IFiniteElementSolver solver = new LinearSolverSVD(model);
            FiniteElementResults results = solver.Solve();

            DisplacementVector node1Displacement = results.GetDisplacement(node1);
            DisplacementVector node2Displacement = results.GetDisplacement(node2);
            DisplacementVector node3Displacement = results.GetDisplacement(node3);
            DisplacementVector node4Displacement = results.GetDisplacement(node4);
            DisplacementVector node5Displacement = results.GetDisplacement(node5);
            ReactionVector node1Reaction = results.GetReaction(node1);
            ReactionVector node5Reaction = results.GetReaction(node5);

            Assert.AreEqual(0, node1Displacement.X, 0.0001);
            Assert.AreEqual(0, node1Displacement.Z, 0.0001);
            Assert.AreEqual(0.0010985, node1Displacement.YY, 0.0001);

            Assert.AreEqual(0.004027, node2Displacement.X, 0.0001);
            Assert.AreEqual(0.002381, node2Displacement.Z, 0.0001);
            Assert.AreEqual(-0.000996, node2Displacement.YY, 0.0001);

            Assert.AreEqual(0, node3Displacement.X, 0.0001);
            Assert.AreEqual(0.01723, node3Displacement.Z, 0.0001);
            Assert.AreEqual(0, node3Displacement.YY, 0.0001);

            Assert.AreEqual(-0.004027, node4Displacement.X, 0.0001);
            Assert.AreEqual(0.002381, node4Displacement.Z, 0.0001);
            Assert.AreEqual(0.000996, node4Displacement.YY, 0.0001);

            Assert.AreEqual(0, node5Displacement.X, 0.0001);
            Assert.AreEqual(0, node5Displacement.Z, 0.0001);
            Assert.AreEqual(-0.0010985, node5Displacement.YY, 0.0001);

            Assert.AreEqual(-1759, node1Reaction.X, 1);
            Assert.AreEqual(-5000, node1Reaction.Z, 1);
            Assert.AreEqual(0, node1Reaction.YY, 1);

            Assert.AreEqual(1759, node5Reaction.X, 1);
            Assert.AreEqual(-5000, node5Reaction.Z, 1);
            Assert.AreEqual(0, node5Reaction.YY, 1);
        }
コード例 #33
0
        public void Calculate3DTrussOf4BarsAnd15Dof()
        {
            FiniteElementModel model = new FiniteElementModel(ModelType.Truss3D);

            FiniteElementNode node1 = model.NodeFactory.Create(4, 4, 3);

            FiniteElementNode node2 = model.NodeFactory.Create(0, 4, 0);

            model.ConstrainNode(node2, DegreeOfFreedom.X);
            model.ConstrainNode(node2, DegreeOfFreedom.Y);
            model.ConstrainNode(node2, DegreeOfFreedom.Z);

            FiniteElementNode node3 = model.NodeFactory.Create(0, 4, 6);

            model.ConstrainNode(node3, DegreeOfFreedom.X);
            model.ConstrainNode(node3, DegreeOfFreedom.Y);
            model.ConstrainNode(node3, DegreeOfFreedom.Z);

            FiniteElementNode node4 = model.NodeFactory.Create(4, 0, 3);

            model.ConstrainNode(node4, DegreeOfFreedom.X);
            model.ConstrainNode(node4, DegreeOfFreedom.Y);
            model.ConstrainNode(node4, DegreeOfFreedom.Z);

            FiniteElementNode node5 = model.NodeFactory.Create(8, -1, 1);

            model.ConstrainNode(node5, DegreeOfFreedom.X);
            model.ConstrainNode(node5, DegreeOfFreedom.Y);
            model.ConstrainNode(node5, DegreeOfFreedom.Z);

            IMaterial     material = new GenericElasticMaterial(0, 210000000000, 0, 0);
            ICrossSection section  = new SolidRectangle(0.01, 0.01);

            model.ElementFactory.CreateLinearTruss(node1, node2, material, section);
            model.ElementFactory.CreateLinearTruss(node1, node3, material, section);
            model.ElementFactory.CreateLinearTruss(node1, node4, material, section);
            model.ElementFactory.CreateLinearTruss(node1, node5, material, section);

            ForceVector externalForce = model.ForceFactory.Create(0, -10000, 0, 0, 0, 0);

            model.ApplyForceToNode(externalForce, node1);

            IFiniteElementSolver solver  = new MatrixInversionLinearSolver(model);
            FiniteElementResults results = solver.Solve();

            ReactionVector reactionAtNode2 = results.GetReaction(node2);

            Assert.AreEqual(270.9, reactionAtNode2.X, 1);
            Assert.AreEqual(0, reactionAtNode2.Y, 1);
            Assert.AreEqual(203.2, reactionAtNode2.Z, 1);

            ReactionVector reactionAtNode3 = results.GetReaction(node3);

            Assert.AreEqual(1354.6, reactionAtNode3.X, 1);
            Assert.AreEqual(0, reactionAtNode3.Y, 1);
            Assert.AreEqual(-1016, reactionAtNode3.Z, 1);

            ReactionVector reactionAtNode4 = results.GetReaction(node4);

            Assert.AreEqual(0, reactionAtNode4.X, 1);
            Assert.AreEqual(7968.1, reactionAtNode4.Y, 1);
            Assert.AreEqual(0, reactionAtNode4.Z, 1);

            ReactionVector reactionAtNode5 = results.GetReaction(node5);

            Assert.AreEqual(-1625.5, reactionAtNode5.X, 1);
            Assert.AreEqual(2031.9, reactionAtNode5.Y, 1);
            Assert.AreEqual(812.8, reactionAtNode5.Z, 1);

            DisplacementVector displacementAtNode1 = results.GetDisplacement(node1);

            Assert.AreEqual(-0.0003024, displacementAtNode1.X, 0.0001);             //NOTE the results given in the book are 1E03
            Assert.AreEqual(-0.0015177, displacementAtNode1.Y, 0.0001);
            Assert.AreEqual(0.0002688, displacementAtNode1.Z, 0.0001);
        }
コード例 #34
0
ファイル: Quad.cs プロジェクト: iainsproat/SharpFE
        public void QuadMembraneAFrameLateralLoad()
        {
            FiniteElementModel model = new FiniteElementModel(ModelType.Membrane3D);
            FiniteElementNode node1 = model.NodeFactory.Create(0.0, 0.0, 0.0);
            model.ConstrainNode(node1, DegreeOfFreedom.X);
            model.ConstrainNode(node1, DegreeOfFreedom.Y);
            model.ConstrainNode(node1, DegreeOfFreedom.Z);

            FiniteElementNode node2 = model.NodeFactory.Create(1.0, 0.0, 0.0);
            model.ConstrainNode(node2, DegreeOfFreedom.Y);
            model.ConstrainNode(node2, DegreeOfFreedom.Z);

            FiniteElementNode node3 = model.NodeFactory.Create(1.0, 1.0, 1.0);
            FiniteElementNode node4 = model.NodeFactory.Create(0.0, 1.0, 1.0);

            FiniteElementNode node5 = model.NodeFactory.Create(1.0, 2.0, 0.0);
            model.ConstrainNode(node5, DegreeOfFreedom.Y);
            model.ConstrainNode(node5, DegreeOfFreedom.Z);

            FiniteElementNode node6 = model.NodeFactory.Create(0.0, 2.0, 0.0);
            model.ConstrainNode(node6, DegreeOfFreedom.X);
            model.ConstrainNode(node6, DegreeOfFreedom.Y);
            model.ConstrainNode(node6, DegreeOfFreedom.Z);

            IMaterial material = new GenericElasticMaterial(0, 210000000000, 0.3, 0);

            model.ElementFactory.CreateLinearConstantStressQuadrilateral(node1, node2, node3, node4, material, 0.01);
            model.ElementFactory.CreateLinearConstantStressQuadrilateral(node5, node6, node4, node3, material, 0.01);

            ForceVector force = model.ForceFactory.Create(10000, 0, 0, 0, 0, 0);
            model.ApplyForceToNode(force, node3);
            model.ApplyForceToNode(force, node4);

            IFiniteElementSolver solver = new MatrixInversionLinearSolver(model);
            FiniteElementResults results = solver.Solve();

            ReactionVector reaction1 = results.GetReaction(node1);
            Console.WriteLine("\nReaction1 : \n" + reaction1);
            ReactionVector reaction2 = results.GetReaction(node2);
            Console.WriteLine("\nReaction2 : \n" + reaction2);
            ReactionVector reaction5 = results.GetReaction(node5);
            Console.WriteLine("\nReaction2 : \n" + reaction2);
            ReactionVector reaction6 = results.GetReaction(node6);
            Console.WriteLine("\nReaction2 : \n" + reaction2);

            DisplacementVector displacement3 = results.GetDisplacement(node3);
            DisplacementVector displacement4 = results.GetDisplacement(node4);
            Console.WriteLine("\nDisplacement3 : \n" + displacement3);
            Console.WriteLine("\nDisplacement4 : \n" + displacement4);

            Assert.AreEqual( 0.00003367, displacement3.X, 0.0000001);
            Assert.AreEqual( 0, displacement3.Y, 0.0000000001);
            Assert.AreEqual( 0.00002020147, displacement3.Z, 0.0000000001);

            Assert.AreEqual(0.00002861940, displacement4.X, 0.0000001);
            Assert.AreEqual(0, displacement4.Y, 0.0000000001);
            Assert.AreEqual(-0.00002020147, displacement4.Z, 0.0000000001);
        }
コード例 #35
0
ファイル: Beam3DIn2DModel.cs プロジェクト: iainsproat/SharpFE
        public void ThreeNodeSimplySupportedBeam()
        {
            FiniteElementModel model = new FiniteElementModel(ModelType.Full3D);
            FiniteElementNode node1 = model.NodeFactory.Create(0, 0, 0);
            model.ConstrainNode(node1, DegreeOfFreedom.X);
            model.ConstrainNode(node1, DegreeOfFreedom.Y);
            model.ConstrainNode(node1, DegreeOfFreedom.Z);
            model.ConstrainNode(node1, DegreeOfFreedom.XX);

            FiniteElementNode node2 = model.NodeFactory.Create(1, 0, 0);

            FiniteElementNode node3 = model.NodeFactory.Create(2, 0, 0);
            model.ConstrainNode(node3, DegreeOfFreedom.X);
            model.ConstrainNode(node3, DegreeOfFreedom.Y);
            model.ConstrainNode(node3, DegreeOfFreedom.Z);
            model.ConstrainNode(node3, DegreeOfFreedom.XX);

            IMaterial material = new GenericElasticMaterial(0, 10000000000, 0, 84000000000);
            ICrossSection section = new GenericCrossSection(0.0001, 0.0002, 0.0002, 0.00005);

            model.ElementFactory.CreateLinear3DBeam(node1, node2, material, section);
            model.ElementFactory.CreateLinear3DBeam(node2,node3,material,section);

            ForceVector force = model.ForceFactory.Create(0, 0, -10000, 0, 0, 0);
            model.ApplyForceToNode(force, node2);

            IFiniteElementSolver solver = new MatrixInversionLinearSolver(model);

            Stiffness.GlobalModelStiffnessMatrixBuilder gmsmb = new SharpFE.Stiffness.GlobalModelStiffnessMatrixBuilder(model);
            Console.WriteLine(gmsmb.BuildKnownForcesUnknownDisplacementStiffnessMatrix());

            FiniteElementResults results = solver.Solve();

            DisplacementVector node1Displacement = results.GetDisplacement(node1);
            Console.WriteLine("node1Displacement : " + node1Displacement);

            DisplacementVector node2Displacement = results.GetDisplacement(node2);
            Console.WriteLine("node2Displacement : " + node2Displacement);

            DisplacementVector node3Displacement = results.GetDisplacement(node3);
            Console.WriteLine("node3Displacement : " + node3Displacement);

            ReactionVector node1Reaction = results.GetReaction(node1);
            Console.WriteLine("node1Reaction : " + node1Reaction);

            ReactionVector node3Reaction = results.GetReaction(node3);
            Console.WriteLine("node5Reaction : " + node3Reaction);

            Assert.AreEqual(-0.000833333, node2Displacement.Z, 0.0000001);
            Assert.AreEqual(5000, node1Reaction.Z, 0.001);
            Assert.AreEqual(5000, node3Reaction.Z, 0.001);
            Assert.AreEqual(0, node2Displacement.YY, 0.0001);
            Assert.AreEqual( 0.00125, node1Displacement.YY, 0.0000001);
            Assert.AreEqual(-0.00125, node3Displacement.YY, 0.0000001);
        }
コード例 #36
0
ファイル: Triangle.cs プロジェクト: iainsproat/SharpFE
        public void TwoTriangleWall()
        {
            FiniteElementModel model = new FiniteElementModel(ModelType.Membrane3D); // we will create and analyze a 2D slab system
            FiniteElementNode node1 = model.NodeFactory.Create(0.0, 0.0, 0.0); // create a node at the origin
            model.ConstrainNode(node1, DegreeOfFreedom.X); // constrain the node from moving in the x-axis
            model.ConstrainNode(node1, DegreeOfFreedom.Y); // constrain the node from moving in the y-axis
            model.ConstrainNode(node1, DegreeOfFreedom.Z); // constrain the node from moving in the z-axis

            FiniteElementNode node2 = model.NodeFactory.Create(1.0, 0.0, 0.0); // create a second node at a distance 1 metre along the X axis
            model.ConstrainNode(node2, DegreeOfFreedom.X); // constrain the node from moving in the x-axis
            model.ConstrainNode(node2, DegreeOfFreedom.Y); // constrain the node from moving in the y-axis
            model.ConstrainNode(node2, DegreeOfFreedom.Z); // constrain the node from moving in the z-axis

            FiniteElementNode node3 = model.NodeFactory.Create(0.0, 1.0, 0.0);
            model.ConstrainNode(node3, DegreeOfFreedom.Z); // constrain the node from moving in the z-axis

            FiniteElementNode node4 = model.NodeFactory.Create(1.0, 1.0, 0.0);
            model.ConstrainNode(node4, DegreeOfFreedom.Z); // constrain the node from moving in the z-axis

            IMaterial material = new GenericElasticMaterial(0, 200000, 0.2, 84000);

            model.ElementFactory.CreateLinearConstantStrainTriangle(node1, node2, node3, material, 0.1); // create a triangle of thickness of 0.1 metres
            model.ElementFactory.CreateLinearConstantStrainTriangle(node2, node4, node3, material, 0.1);

            ForceVector force = model.ForceFactory.Create(0, -10); // Create a force of 10 Newtons in the y direction
            model.ApplyForceToNode(force, node3); // Apply that force to the third node
            model.ApplyForceToNode(force, node4);

            IFiniteElementSolver solver = new MatrixInversionLinearSolver(model);
            FiniteElementResults results = solver.Solve();

            ReactionVector reaction1 = results.GetReaction(node1); //get the reaction at the first node
            Console.WriteLine("\nReaction1 : \n" + reaction1);
            ReactionVector reaction2 = results.GetReaction(node2);
            Console.WriteLine("\nReaction2 : \n" + reaction2);
            Assert.AreEqual(20, reaction1.Y + reaction2.Y, 0.001);

            DisplacementVector displacement3 = results.GetDisplacement(node3);  // get the displacement at the second node
            Console.WriteLine("\nDisplacement3 : \n" + displacement3);
            Assert.AreNotEqual(0.0, displacement3.X); // TODO calculate the actual value, rather than just checking we have any value
            Assert.AreNotEqual(0.0, displacement3.Y); // TODO calculate the actual value, rather than just checking we have any value
            Assert.AreEqual(0.0, displacement3.Z); // TODO calculate the actual value, rather than just checking we have any value

            DisplacementVector displacement4 = results.GetDisplacement(node4);  // get the displacement at the second node
            Console.WriteLine("\nDisplacement4 : \n" + displacement4);
            Assert.AreNotEqual(0.0, displacement4.X); // TODO calculate the actual value, rather than just checking we have any value
            Assert.AreNotEqual(0.0, displacement4.Y); // TODO calculate the actual value, rather than just checking we have any value
            Assert.AreEqual(0.0, displacement4.Z); // TODO calculate the actual value, rather than just checking we have any value
        }
コード例 #37
0
ファイル: TrussIn3DModel.cs プロジェクト: iainsproat/SharpFE
        public void Calculate3DTrussOf3BarsAnd12Dof()
        {
            FiniteElementModel model = new FiniteElementModel(ModelType.Truss3D);

            FiniteElementNode node1 = model.NodeFactory.Create(72,0,0);
            model.ConstrainNode(node1, DegreeOfFreedom.Y);

            FiniteElementNode node2 = model.NodeFactory.Create(0, 36, 0);
            model.ConstrainNode(node2, DegreeOfFreedom.X);
            model.ConstrainNode(node2, DegreeOfFreedom.Y);
            model.ConstrainNode(node2, DegreeOfFreedom.Z);

            FiniteElementNode node3 = model.NodeFactory.Create(0, 36, 72);
            model.ConstrainNode(node3, DegreeOfFreedom.X);
            model.ConstrainNode(node3, DegreeOfFreedom.Y);
            model.ConstrainNode(node3, DegreeOfFreedom.Z);

            FiniteElementNode node4 = model.NodeFactory.Create(0, 0, -48);
            model.ConstrainNode(node4, DegreeOfFreedom.X);
            model.ConstrainNode(node4, DegreeOfFreedom.Y);
            model.ConstrainNode(node4, DegreeOfFreedom.Z);

            IMaterial material = new GenericElasticMaterial(0, 1200000, 0, 0);
            ICrossSection section1 = new SolidRectangle(1, 0.302);
            ICrossSection section2 = new SolidRectangle(1, 0.729); ///NOTE example also refers to this as A1.  Assume errata in book
            ICrossSection section3 = new SolidRectangle(1, 0.187); ///NOTE example also refers to this as A1.  Assume errata in book

            model.ElementFactory.CreateLinearTruss(node1, node2, material, section1);
            model.ElementFactory.CreateLinearTruss(node1, node3, material, section2);
            model.ElementFactory.CreateLinearTruss(node1, node4, material, section3);

            ForceVector externalForce = model.ForceFactory.Create(0, 0, -1000, 0, 0, 0);
            model.ApplyForceToNode(externalForce, node1);

            IFiniteElementSolver solver = new MatrixInversionLinearSolver(model);
            FiniteElementResults results = solver.Solve();

            ReactionVector reactionAtNode1 = results.GetReaction(node1);
            Assert.AreEqual(0, reactionAtNode1.X, 1);
            Assert.AreEqual(-223.1632, reactionAtNode1.Y, 1);
            Assert.AreEqual(0, reactionAtNode1.Z, 1);

            ReactionVector reactionAtNode2 = results.GetReaction(node2);
            Assert.AreEqual(256.1226, reactionAtNode2.X, 1);
            Assert.AreEqual(-128.0613, reactionAtNode2.Y, 1);
            Assert.AreEqual(0, reactionAtNode2.Z, 1);

            ReactionVector reactionAtNode3 = results.GetReaction(node3);
            Assert.AreEqual(-702.4491, reactionAtNode3.X, 1);
            Assert.AreEqual(351.2245, reactionAtNode3.Y, 1);
            Assert.AreEqual(702.4491, reactionAtNode3.Z, 1);

            ReactionVector reactionAtNode4 = results.GetReaction(node4);
            Assert.AreEqual(446.3264, reactionAtNode4.X, 1);
            Assert.AreEqual(0, reactionAtNode4.Y, 1);
            Assert.AreEqual(297.5509, reactionAtNode4.Z, 1);

            DisplacementVector displacementAtNode1 = results.GetDisplacement(node1);
            Assert.AreEqual(-0.0711, displacementAtNode1.X, 0.0001);
            Assert.AreEqual(0, displacementAtNode1.Y, 0.0001);
            Assert.AreEqual(-0.2662, displacementAtNode1.Z, 0.0001);
        }
コード例 #38
0
ファイル: Beam1DIn2DModel.cs プロジェクト: iainsproat/SharpFE
        public void SimplySupportedBeam()
        {
            FiniteElementModel model = new FiniteElementModel(ModelType.Beam1D); // we will create and analyze a 1D beam system
            FiniteElementNode node1 = model.NodeFactory.Create(0); // create a node at the origin
            model.ConstrainNode(node1, DegreeOfFreedom.Z); // constrain the node from moving in the Z-axis

            FiniteElementNode node2 = model.NodeFactory.Create(1.0); // create a second node at a distance 1 metre along the X axis
            model.ConstrainNode(node2, DegreeOfFreedom.Z); // constrain the node from moving in the Z-axis

            IMaterial material = new GenericElasticMaterial(0, 210000000000, 0, 0);
            ICrossSection section = new GenericCrossSection(0.0001, 0.0002);

            model.ElementFactory.CreateLinear3DBeam(node1, node2, material, section); // create a spring between the two nodes of a stiffness of 2000 Newtons per metre

            ForceVector moment = model.ForceFactory.CreateFor1DBeam(0, 10000); // Create a clockwise(?) moment of 10 KiloNewtonmetres around the yy axis
            model.ApplyForceToNode(moment, node1); // Apply that moment to the first node

            IFiniteElementSolver solver = new MatrixInversionLinearSolver(model); // Create a new instance of the solver class and pass it the model to solve
            FiniteElementResults results = solver.Solve(); // ask the solver to solve the model and return results

            // check the results
            DisplacementVector displacementAtNode1 = results.GetDisplacement(node1);
            Assert.AreEqual(0, displacementAtNode1.Z, 0.001);
            Assert.AreEqual(0.00007936, displacementAtNode1.YY, 0.00000001);

            DisplacementVector displacementAtNode2 = results.GetDisplacement(node2);
            Assert.AreEqual(0, displacementAtNode2.Z, 0.001);
            Assert.AreEqual(-0.00003968, displacementAtNode2.YY, 0.00000001);

            ReactionVector reactionAtNode1 = results.GetReaction(node1);
            Assert.AreEqual(-10000, reactionAtNode1.Z, 0.001);
            Assert.AreEqual(0, reactionAtNode1.YY, 0.001);

            ReactionVector reactionAtNode2 = results.GetReaction(node2);
            Assert.AreEqual(10000, reactionAtNode2.Z, 0.001);
            Assert.AreEqual(0, reactionAtNode2.YY, 0.001);
        }
コード例 #39
0
        public void PitchedRoofPortalFrame()
        {
            FiniteElementModel model = new FiniteElementModel(ModelType.Full3D);
            FiniteElementNode  node1 = model.NodeFactory.Create(-10, 0, 0);

            model.ConstrainNode(node1, DegreeOfFreedom.X);
            model.ConstrainNode(node1, DegreeOfFreedom.Z);
            model.ConstrainNode(node1, DegreeOfFreedom.Y);
            model.ConstrainNode(node1, DegreeOfFreedom.XX);

            FiniteElementNode node2 = model.NodeFactory.Create(-10, 0, 10);
            FiniteElementNode node3 = model.NodeFactory.Create(0, 0, 14);
            FiniteElementNode node4 = model.NodeFactory.Create(10, 0, 10);

            FiniteElementNode node5 = model.NodeFactory.Create(10, 0, 0);

            model.ConstrainNode(node5, DegreeOfFreedom.X);
            model.ConstrainNode(node5, DegreeOfFreedom.Z);
            model.ConstrainNode(node5, DegreeOfFreedom.Y);
            model.ConstrainNode(node5, DegreeOfFreedom.XX);

            IMaterial     material = new GenericElasticMaterial(0, 210000000000, 0.3, 84000000000);
            ICrossSection section  = new GenericCrossSection(0.0001, 0.0002, 0.0002, 0.00005);

            model.ElementFactory.CreateLinear3DBeam(node1, node2, material, section);
            model.ElementFactory.CreateLinear3DBeam(node2, node3, material, section);
            model.ElementFactory.CreateLinear3DBeam(node3, node4, material, section);
            model.ElementFactory.CreateLinear3DBeam(node4, node5, material, section);

            ForceVector force = model.ForceFactory.Create(0, 0, 10000, 0, 0, 0);

            model.ApplyForceToNode(force, node3);

            IFiniteElementSolver solver  = new LinearSolverSVD(model);
            FiniteElementResults results = solver.Solve();

            DisplacementVector node1Displacement = results.GetDisplacement(node1);
            DisplacementVector node2Displacement = results.GetDisplacement(node2);
            DisplacementVector node3Displacement = results.GetDisplacement(node3);
            DisplacementVector node4Displacement = results.GetDisplacement(node4);
            DisplacementVector node5Displacement = results.GetDisplacement(node5);
            ReactionVector     node1Reaction     = results.GetReaction(node1);
            ReactionVector     node5Reaction     = results.GetReaction(node5);

            Assert.AreEqual(0, node1Displacement.X, 0.0001);
            Assert.AreEqual(0, node1Displacement.Y, 0.0001);
            Assert.AreEqual(0, node1Displacement.Z, 0.0001);
            Assert.AreEqual(0.0010985, node1Displacement.YY, 0.0001);

            Assert.AreEqual(0.004027, node2Displacement.X, 0.0001);
            Assert.AreEqual(0, node2Displacement.Y, 0.0001);
            Assert.AreEqual(0.002381, node2Displacement.Z, 0.0001);
            Assert.AreEqual(-0.000996, node2Displacement.YY, 0.0001);

            Assert.AreEqual(0, node3Displacement.X, 0.0001);
            Assert.AreEqual(0, node3Displacement.Y, 0.0001);
            Assert.AreEqual(0.01723, node3Displacement.Z, 0.0001);
            Assert.AreEqual(0, node3Displacement.YY, 0.0001);

            Assert.AreEqual(-0.004027, node4Displacement.X, 0.0001);
            Assert.AreEqual(0, node4Displacement.Y, 0.0001);
            Assert.AreEqual(0.002381, node4Displacement.Z, 0.0001);
            Assert.AreEqual(0.000996, node4Displacement.YY, 0.0001);

            Assert.AreEqual(0, node5Displacement.X, 0.0001);
            Assert.AreEqual(0, node5Displacement.Y, 0.0001);
            Assert.AreEqual(0, node5Displacement.Z, 0.0001);
            Assert.AreEqual(-0.0010985, node5Displacement.YY, 0.0001);

            Assert.AreEqual(-5000, node1Reaction.Z, 1);
            Assert.AreEqual(-1759, node1Reaction.X, 1);
            Assert.AreEqual(0, node1Reaction.YY, 1);

            Assert.AreEqual(-5000, node5Reaction.Z, 1);
            Assert.AreEqual(1759, node5Reaction.X, 1);
            Assert.AreEqual(0, node5Reaction.YY, 1);
        }
コード例 #40
0
        public void QuadMembraneAFrame()
        {
            FiniteElementModel model = new FiniteElementModel(ModelType.Membrane3D);
            FiniteElementNode  node1 = model.NodeFactory.Create(0.0, 0.0, 0.0);

            model.ConstrainNode(node1, DegreeOfFreedom.X);
            model.ConstrainNode(node1, DegreeOfFreedom.Y);
            model.ConstrainNode(node1, DegreeOfFreedom.Z);

            FiniteElementNode node2 = model.NodeFactory.Create(1.0, 0.0, 0.0);

            model.ConstrainNode(node2, DegreeOfFreedom.Y);
            model.ConstrainNode(node2, DegreeOfFreedom.Z);

            FiniteElementNode node3 = model.NodeFactory.Create(1.0, 1.0, 1.0);
            FiniteElementNode node4 = model.NodeFactory.Create(0.0, 1.0, 1.0);

            FiniteElementNode node5 = model.NodeFactory.Create(1.0, 2.0, 0.0);

            model.ConstrainNode(node5, DegreeOfFreedom.Y);
            model.ConstrainNode(node5, DegreeOfFreedom.Z);

            FiniteElementNode node6 = model.NodeFactory.Create(0.0, 2.0, 0.0);

            model.ConstrainNode(node6, DegreeOfFreedom.X);
            model.ConstrainNode(node6, DegreeOfFreedom.Y);
            model.ConstrainNode(node6, DegreeOfFreedom.Z);

            IMaterial material = new GenericElasticMaterial(0, 210000000000, 0.3, 0);

            model.ElementFactory.CreateLinearConstantStressQuadrilateral(node1, node2, node3, node4, material, 0.1);
            model.ElementFactory.CreateLinearConstantStressQuadrilateral(node5, node6, node4, node3, material, 0.1);

            ForceVector force = model.ForceFactory.Create(0, 0, -10000, 0, 0, 0);

            model.ApplyForceToNode(force, node3);
            model.ApplyForceToNode(force, node4);

            IFiniteElementSolver solver  = new MatrixInversionLinearSolver(model);
            FiniteElementResults results = solver.Solve();

            ReactionVector reaction1 = results.GetReaction(node1);

            Console.WriteLine("\nReaction1 : \n" + reaction1);
            ReactionVector reaction2 = results.GetReaction(node2);

            Console.WriteLine("\nReaction2 : \n" + reaction2);
            ReactionVector reaction5 = results.GetReaction(node5);

            Console.WriteLine("\nReaction2 : \n" + reaction2);
            ReactionVector reaction6 = results.GetReaction(node6);

            Console.WriteLine("\nReaction2 : \n" + reaction2);
            Assert.AreEqual(20000, reaction1.Z + reaction2.Z + reaction5.Z + reaction6.Z, 1);

            DisplacementVector displacement3 = results.GetDisplacement(node3);
            DisplacementVector displacement4 = results.GetDisplacement(node4);

            Console.WriteLine("\nDisplacement3 : \n" + displacement3);
            Console.WriteLine("\nDisplacement4 : \n" + displacement4);
            Assert.AreEqual(0.0000002020, displacement3.X, 0.0000000001);
            Assert.AreEqual(0, displacement3.Y, 0.0000000001);
            Assert.AreEqual(-0.0000013469, displacement3.Z, 0.0000000001);

            Assert.AreEqual(0, displacement4.X, 0.0000000001);
            Assert.AreEqual(0, displacement4.Y, 0.0000000001);
            Assert.AreEqual(-0.0000013469, displacement4.Z, 0.0000000001);
        }
コード例 #41
0
        public void Calculate3DTrussOf3BarsAnd12Dof()
        {
            FiniteElementModel model = new FiniteElementModel(ModelType.Truss3D);

            FiniteElementNode node1 = model.NodeFactory.Create(72, 0, 0);

            model.ConstrainNode(node1, DegreeOfFreedom.Y);

            FiniteElementNode node2 = model.NodeFactory.Create(0, 36, 0);

            model.ConstrainNode(node2, DegreeOfFreedom.X);
            model.ConstrainNode(node2, DegreeOfFreedom.Y);
            model.ConstrainNode(node2, DegreeOfFreedom.Z);

            FiniteElementNode node3 = model.NodeFactory.Create(0, 36, 72);

            model.ConstrainNode(node3, DegreeOfFreedom.X);
            model.ConstrainNode(node3, DegreeOfFreedom.Y);
            model.ConstrainNode(node3, DegreeOfFreedom.Z);

            FiniteElementNode node4 = model.NodeFactory.Create(0, 0, -48);

            model.ConstrainNode(node4, DegreeOfFreedom.X);
            model.ConstrainNode(node4, DegreeOfFreedom.Y);
            model.ConstrainNode(node4, DegreeOfFreedom.Z);

            IMaterial     material = new GenericElasticMaterial(0, 1200000, 0, 0);
            ICrossSection section1 = new SolidRectangle(1, 0.302);
            ICrossSection section2 = new SolidRectangle(1, 0.729);             ///NOTE example also refers to this as A1.  Assume errata in book
            ICrossSection section3 = new SolidRectangle(1, 0.187);             ///NOTE example also refers to this as A1.  Assume errata in book

            model.ElementFactory.CreateLinearTruss(node1, node2, material, section1);
            model.ElementFactory.CreateLinearTruss(node1, node3, material, section2);
            model.ElementFactory.CreateLinearTruss(node1, node4, material, section3);

            ForceVector externalForce = model.ForceFactory.Create(0, 0, -1000, 0, 0, 0);

            model.ApplyForceToNode(externalForce, node1);

            IFiniteElementSolver solver  = new MatrixInversionLinearSolver(model);
            FiniteElementResults results = solver.Solve();

            ReactionVector reactionAtNode1 = results.GetReaction(node1);

            Assert.AreEqual(0, reactionAtNode1.X, 1);
            Assert.AreEqual(-223.1632, reactionAtNode1.Y, 1);
            Assert.AreEqual(0, reactionAtNode1.Z, 1);

            ReactionVector reactionAtNode2 = results.GetReaction(node2);

            Assert.AreEqual(256.1226, reactionAtNode2.X, 1);
            Assert.AreEqual(-128.0613, reactionAtNode2.Y, 1);
            Assert.AreEqual(0, reactionAtNode2.Z, 1);

            ReactionVector reactionAtNode3 = results.GetReaction(node3);

            Assert.AreEqual(-702.4491, reactionAtNode3.X, 1);
            Assert.AreEqual(351.2245, reactionAtNode3.Y, 1);
            Assert.AreEqual(702.4491, reactionAtNode3.Z, 1);

            ReactionVector reactionAtNode4 = results.GetReaction(node4);

            Assert.AreEqual(446.3264, reactionAtNode4.X, 1);
            Assert.AreEqual(0, reactionAtNode4.Y, 1);
            Assert.AreEqual(297.5509, reactionAtNode4.Z, 1);

            DisplacementVector displacementAtNode1 = results.GetDisplacement(node1);

            Assert.AreEqual(-0.0711, displacementAtNode1.X, 0.0001);
            Assert.AreEqual(0, displacementAtNode1.Y, 0.0001);
            Assert.AreEqual(-0.2662, displacementAtNode1.Z, 0.0001);
        }
コード例 #42
0
ファイル: Triangle.cs プロジェクト: xiaoxiongnpu/SharpFE
        public void FourTriangleAFrame()
        {
            FiniteElementModel model = new FiniteElementModel(ModelType.Membrane3D);
            FiniteElementNode  node1 = model.NodeFactory.Create(0.0, 0.0, 0.0);

            model.ConstrainNode(node1, DegreeOfFreedom.X);
            model.ConstrainNode(node1, DegreeOfFreedom.Y);
            model.ConstrainNode(node1, DegreeOfFreedom.Z);

            FiniteElementNode node2 = model.NodeFactory.Create(1.0, 0.0, 0.0);

            model.ConstrainNode(node2, DegreeOfFreedom.X);
            model.ConstrainNode(node2, DegreeOfFreedom.Y);
            model.ConstrainNode(node2, DegreeOfFreedom.Z);

            FiniteElementNode node3 = model.NodeFactory.Create(0.0, 1.0, 0.5);

            FiniteElementNode node4 = model.NodeFactory.Create(1.0, 1.0, 0.5);

            FiniteElementNode node5 = model.NodeFactory.Create(0.0, 2.0, 0.0);

            model.ConstrainNode(node5, DegreeOfFreedom.X);
            model.ConstrainNode(node5, DegreeOfFreedom.Y);
            model.ConstrainNode(node5, DegreeOfFreedom.Z);

            FiniteElementNode node6 = model.NodeFactory.Create(1.0, 2.0, 0.0);

            model.ConstrainNode(node6, DegreeOfFreedom.X);
            model.ConstrainNode(node6, DegreeOfFreedom.Y);
            model.ConstrainNode(node6, DegreeOfFreedom.Z);

            IMaterial material = new GenericElasticMaterial(0, 200000, 0.2, 84000);

            model.ElementFactory.CreateLinearConstantStrainTriangle(node1, node2, node3, material, 0.1);
            model.ElementFactory.CreateLinearConstantStrainTriangle(node2, node4, node3, material, 0.1);
            model.ElementFactory.CreateLinearConstantStrainTriangle(node3, node4, node5, material, 0.1);
            model.ElementFactory.CreateLinearConstantStrainTriangle(node4, node6, node5, material, 0.1);

            ForceVector force = model.ForceFactory.Create(0, 0, -10, 0, 0, 0);

            model.ApplyForceToNode(force, node3);
            model.ApplyForceToNode(force, node4);

            IFiniteElementSolver solver  = new LinearSolverSVD(model);
            FiniteElementResults results = solver.Solve();

            ReactionVector reaction1 = results.GetReaction(node1);             //get the reaction at the first node

            Console.WriteLine("\nReaction1 : \n" + reaction1);
            ReactionVector reaction2 = results.GetReaction(node2);

            Console.WriteLine("\nReaction2 : \n" + reaction2);
            Assert.AreEqual(20, reaction1.Y + reaction2.Y, 0.001);

            DisplacementVector displacement3 = results.GetDisplacement(node3);              // get the displacement at the second node

            Console.WriteLine("\nDisplacement3 : \n" + displacement3);
            Assert.AreNotEqual(0.0, displacement3.X);                          // TODO calculate the actual value, rather than just checking we have any value
            Assert.AreNotEqual(0.0, displacement3.Y);                          // TODO calculate the actual value, rather than just checking we have any value
            Assert.AreNotEqual(0.0, displacement3.Z);                          // TODO calculate the actual value, rather than just checking we have any value

            DisplacementVector displacement4 = results.GetDisplacement(node4); // get the displacement at the second node

            Console.WriteLine("\nDisplacement4 : \n" + displacement4);
            Assert.AreNotEqual(0.0, displacement4.X);             // TODO calculate the actual value, rather than just checking we have any value
            Assert.AreNotEqual(0.0, displacement4.Y);             // TODO calculate the actual value, rather than just checking we have any value
            Assert.AreNotEqual(0.0, displacement4.Z);             // TODO calculate the actual value, rather than just checking we have any value
        }
コード例 #43
0
ファイル: Beam3DIn2DModel.cs プロジェクト: iainsproat/SharpFE
        public void Cantilever()
        {
            FiniteElementModel model = new FiniteElementModel(ModelType.Full3D); // we will create and analyze a 1D beam system
            FiniteElementNode node1 = model.NodeFactory.Create(0, 0, 0); // create a node at the origin
            model.ConstrainNode(node1, DegreeOfFreedom.X);
            model.ConstrainNode(node1, DegreeOfFreedom.Y);
            model.ConstrainNode(node1, DegreeOfFreedom.Z); // constrain the node from moving in the Z-axis
            model.ConstrainNode(node1, DegreeOfFreedom.XX);
            model.ConstrainNode(node1, DegreeOfFreedom.YY); // constrain this node from rotating around the Y-axis
            model.ConstrainNode(node1, DegreeOfFreedom.ZZ);

            FiniteElementNode node2 = model.NodeFactory.Create(3.0, 0, 0); // create a second node at a distance 1 metre along the X axis

            IMaterial material = new GenericElasticMaterial(0, 210000000000, 0, 84000000000);
            ICrossSection section = new GenericCrossSection(0.0001, 0.0002, 0.0002, 0.00005);

            model.ElementFactory.CreateLinear3DBeam(node1, node2, material, section);

            ForceVector force = model.ForceFactory.Create(0, 0, -10000, 0, 0, 0); // Create a force of 10 KiloNewtons in the z direction
            model.ApplyForceToNode(force, node2); // Apply that force to the second node

            IFiniteElementSolver solver = new MatrixInversionLinearSolver(model); // Create a new instance of the solver class and pass it the model to solve
            FiniteElementResults results = solver.Solve(); // ask the solver to solve the model and return results

            ReactionVector reaction = results.GetReaction(node1); //get the reaction at the first node
            Assert.AreEqual(10000, reaction.Z, 0.001);   // Check that we have calculated a reaction of 10 KiloNewtons in the Z-axis
            Assert.AreEqual(-30000, reaction.YY, 0.001); // Check that we have calculated a reaction of -30 KiloNewtonMetres around the YY axis.

            DisplacementVector displacement = results.GetDisplacement(node2);  // get the displacement at the second node
            Assert.AreEqual(-0.00214, displacement.Z, 0.0005);
            Assert.AreEqual(0.00107, displacement.YY, 0.0001);
        }
コード例 #44
0
ファイル: SharpFeTest.cs プロジェクト: EmilPoulsen/Frixel
        public void AnalyzeSimple2DBuilding()
        {
            FiniteElementModel model = new FiniteElementModel(ModelType.Truss2D);

            //add nodes
            FiniteElementNode node0 = model.NodeFactory.CreateFor2DTruss(0, 0);
            FiniteElementNode node1 = model.NodeFactory.CreateFor2DTruss(3, 0);
            FiniteElementNode node2 = model.NodeFactory.CreateFor2DTruss(6, 0);
            FiniteElementNode node3 = model.NodeFactory.CreateFor2DTruss(9, 0);

            FiniteElementNode node4 = model.NodeFactory.CreateFor2DTruss(0, 3);
            FiniteElementNode node5 = model.NodeFactory.CreateFor2DTruss(3, 3);
            FiniteElementNode node6 = model.NodeFactory.CreateFor2DTruss(6, 3);
            FiniteElementNode node7 = model.NodeFactory.CreateFor2DTruss(9, 3);

            FiniteElementNode node8  = model.NodeFactory.CreateFor2DTruss(0, 6);
            FiniteElementNode node9  = model.NodeFactory.CreateFor2DTruss(3, 6);
            FiniteElementNode node10 = model.NodeFactory.CreateFor2DTruss(6, 6);
            FiniteElementNode node11 = model.NodeFactory.CreateFor2DTruss(9, 6);

            //add constraints
            model.ConstrainNode(node0, DegreeOfFreedom.X);
            model.ConstrainNode(node0, DegreeOfFreedom.Z);
            model.ConstrainNode(node1, DegreeOfFreedom.X);
            model.ConstrainNode(node1, DegreeOfFreedom.Z);
            model.ConstrainNode(node2, DegreeOfFreedom.X);
            model.ConstrainNode(node2, DegreeOfFreedom.Z);
            model.ConstrainNode(node3, DegreeOfFreedom.X);
            model.ConstrainNode(node3, DegreeOfFreedom.Z);

            //properties
            IMaterial     material = new GenericElasticMaterial(0, 70000000, 0, 0);
            ICrossSection section  = new SolidRectangle(0.03, 0.01);

            //add horizontal elements
            LinearTruss truss0 = model.ElementFactory.CreateLinearTruss(node0, node1, material, section);
            LinearTruss truss1 = model.ElementFactory.CreateLinearTruss(node1, node2, material, section);
            LinearTruss truss2 = model.ElementFactory.CreateLinearTruss(node2, node3, material, section);

            LinearTruss truss3 = model.ElementFactory.CreateLinearTruss(node4, node5, material, section);
            LinearTruss truss4 = model.ElementFactory.CreateLinearTruss(node5, node6, material, section);
            LinearTruss truss5 = model.ElementFactory.CreateLinearTruss(node6, node7, material, section);

            LinearTruss truss6 = model.ElementFactory.CreateLinearTruss(node8, node9, material, section);
            LinearTruss truss7 = model.ElementFactory.CreateLinearTruss(node9, node10, material, section);
            LinearTruss truss8 = model.ElementFactory.CreateLinearTruss(node10, node11, material, section);

            //add vert elements
            LinearTruss truss9  = model.ElementFactory.CreateLinearTruss(node0, node4, material, section);
            LinearTruss truss10 = model.ElementFactory.CreateLinearTruss(node4, node8, material, section);

            LinearTruss truss11 = model.ElementFactory.CreateLinearTruss(node1, node5, material, section);
            LinearTruss truss12 = model.ElementFactory.CreateLinearTruss(node5, node9, material, section);

            LinearTruss truss13 = model.ElementFactory.CreateLinearTruss(node2, node6, material, section);
            LinearTruss truss14 = model.ElementFactory.CreateLinearTruss(node6, node10, material, section);

            LinearTruss truss15 = model.ElementFactory.CreateLinearTruss(node3, node7, material, section);
            LinearTruss truss16 = model.ElementFactory.CreateLinearTruss(node7, node11, material, section);

            //add bracing
            LinearTruss truss17 = model.ElementFactory.CreateLinearTruss(node1, node6, material, section);
            LinearTruss truss18 = model.ElementFactory.CreateLinearTruss(node2, node5, material, section);

            LinearTruss truss19 = model.ElementFactory.CreateLinearTruss(node5, node10, material, section);
            LinearTruss truss20 = model.ElementFactory.CreateLinearTruss(node6, node9, material, section);

            ForceVector force50Z = model.ForceFactory.CreateForTruss(0, 50000);

            model.ApplyForceToNode(force50Z, node11);
            //model.ApplyForceToNode(force50Z, node8);

            IFiniteElementSolver solver  = new MatrixInversionLinearSolver(model);
            FiniteElementResults results = solver.Solve();

            DisplacementVector displacementAtNode11 = results.GetDisplacement(node11);

            double dispX = displacementAtNode11.X;
            double dispY = displacementAtNode11.Y;

            //Assert.AreEqual(7.1429, displacementAtNode11.X, 0.001);
            //Assert.AreEqual(-9.0386, displacementAtNode11.Z, 0.001);

            //FiniteElementNode node2 = model.NodeFactory.CreateFor2DTruss(0, 3);
        }
コード例 #45
0
ファイル: Quad.cs プロジェクト: iainsproat/SharpFE
        public void OneVerticalQuadFixed3PointsMembrane()
        {
            FiniteElementModel model = new FiniteElementModel(ModelType.Membrane3D);
            FiniteElementNode node1 = model.NodeFactory.Create(0.0, 0.0, 0.0);
            model.ConstrainNode(node1, DegreeOfFreedom.X);
            model.ConstrainNode(node1, DegreeOfFreedom.Y);
            model.ConstrainNode(node1, DegreeOfFreedom.Z);

            FiniteElementNode node2 = model.NodeFactory.Create(1.0, 0.0, 0.0);
            model.ConstrainNode(node2, DegreeOfFreedom.X);
            model.ConstrainNode(node2, DegreeOfFreedom.Y);
            model.ConstrainNode(node2, DegreeOfFreedom.Z);

            FiniteElementNode node3 = model.NodeFactory.Create(1.0, 0.0, 1.0);
            model.ConstrainNode(node3, DegreeOfFreedom.X);
            model.ConstrainNode(node3, DegreeOfFreedom.Y);
            model.ConstrainNode(node3, DegreeOfFreedom.Z);

            FiniteElementNode node4 = model.NodeFactory.Create(0.0, 0.0, 1.0);
            model.ConstrainNode(node4, DegreeOfFreedom.Y);

            IMaterial material = new GenericElasticMaterial(0, 210000000000, 0.3, 0);

            model.ElementFactory.CreateLinearConstantStressQuadrilateral(node1, node2, node3, node4, material, 0.1);

            ForceVector force = model.ForceFactory.Create(10000, 0, 0, 0, 0, 0);
            model.ApplyForceToNode(force, node4);

            IFiniteElementSolver solver = new MatrixInversionLinearSolver(model);
            FiniteElementResults results = solver.Solve();

            ReactionVector reaction1 = results.GetReaction(node1);
            Console.WriteLine("\nReaction1 : \n" + reaction1);
            ReactionVector reaction2 = results.GetReaction(node2);
            Console.WriteLine("\nReaction2 : \n" + reaction2);
            ReactionVector reaction3 = results.GetReaction(node3);
            Console.WriteLine("\nReaction3 : \n" + reaction3);
            DisplacementVector displacement4 = results.GetDisplacement(node4);
            Console.WriteLine("\nDisplacement4 : \n" + displacement4);

            Assert.AreEqual( 2621, reaction1.X, 1);
            Assert.AreEqual(-3039, reaction1.Z, 1);
            Assert.AreEqual(-5660, reaction2.X, 1);
            Assert.AreEqual( 1706, reaction2.Z, 1);
            Assert.AreEqual(-6961, reaction3.X, 1);
            Assert.AreEqual( 1333, reaction3.Z, 1);

            Assert.AreEqual( 0.0000012400, displacement4.X, 0.0000000001);
            Assert.AreEqual( 0.0000004875, displacement4.Z, 0.0000000001);
        }
コード例 #46
0
ファイル: SharpFeTest.cs プロジェクト: EmilPoulsen/Frixel
        public void AnalyzeSimple2DFrame()
        {
            FiniteElementModel model = new FiniteElementModel(ModelType.Truss2D);

            //build geometric model and constraints

            FiniteElementNode node1 = model.NodeFactory.CreateFor2DTruss(0, 0);

            model.ConstrainNode(node1, DegreeOfFreedom.X);
            model.ConstrainNode(node1, DegreeOfFreedom.Z);

            FiniteElementNode node2 = model.NodeFactory.CreateFor2DTruss(0, 3);

            FiniteElementNode node3 = model.NodeFactory.CreateFor2DTruss(3, 0);

            FiniteElementNode node4 = model.NodeFactory.CreateFor2DTruss(3, 3);

            FiniteElementNode node5 = model.NodeFactory.CreateFor2DTruss(6, 0);

            model.ConstrainNode(node5, DegreeOfFreedom.Z);

            FiniteElementNode node6 = model.NodeFactory.CreateFor2DTruss(6, 3);

            IMaterial     material = new GenericElasticMaterial(0, 70000000, 0, 0);
            ICrossSection section  = new SolidRectangle(0.03, 0.01);


            LinearTruss truss1  = model.ElementFactory.CreateLinearTruss(node1, node2, material, section);
            LinearTruss truss2  = model.ElementFactory.CreateLinearTruss(node1, node3, material, section);
            LinearTruss truss3  = model.ElementFactory.CreateLinearTruss(node2, node3, material, section);
            LinearTruss truss4  = model.ElementFactory.CreateLinearTruss(node2, node4, material, section);
            LinearTruss truss5  = model.ElementFactory.CreateLinearTruss(node1, node4, material, section);
            LinearTruss truss6  = model.ElementFactory.CreateLinearTruss(node3, node4, material, section);
            LinearTruss truss7  = model.ElementFactory.CreateLinearTruss(node3, node6, material, section);
            LinearTruss truss8  = model.ElementFactory.CreateLinearTruss(node4, node5, material, section);
            LinearTruss truss9  = model.ElementFactory.CreateLinearTruss(node4, node6, material, section);
            LinearTruss truss10 = model.ElementFactory.CreateLinearTruss(node3, node5, material, section);
            LinearTruss truss11 = model.ElementFactory.CreateLinearTruss(node5, node6, material, section);

            //apply forces

            ForceVector force50Z = model.ForceFactory.CreateForTruss(0, -50000);

            model.ApplyForceToNode(force50Z, node2);
            model.ApplyForceToNode(force50Z, node6);

            ForceVector force100Z = model.ForceFactory.CreateForTruss(0, -100000);

            model.ApplyForceToNode(force100Z, node4);

            //solve model
            IFiniteElementSolver solver  = new MatrixInversionLinearSolver(model);
            FiniteElementResults results = solver.Solve();

            //assert results

            ReactionVector reactionAtNode1 = results.GetReaction(node1);

            Assert.AreEqual(0, reactionAtNode1.X, 1);
            Assert.AreEqual(100000, reactionAtNode1.Z, 1);

            ReactionVector reactionAtNode5 = results.GetReaction(node1);

            Assert.AreEqual(0, reactionAtNode5.X, 1);
            Assert.AreEqual(100000, reactionAtNode5.Z, 1);

            DisplacementVector displacementAtNode2 = results.GetDisplacement(node2);

            Assert.AreEqual(7.1429, displacementAtNode2.X, 0.001);
            Assert.AreEqual(-9.0386, displacementAtNode2.Z, 0.001);

            DisplacementVector displacementAtNode3 = results.GetDisplacement(node3);

            Assert.AreEqual(5.2471, displacementAtNode3.X, 0.001);
            Assert.AreEqual(-16.2965, displacementAtNode3.Z, 0.001);

            DisplacementVector displacementAtNode4 = results.GetDisplacement(node4);

            Assert.AreEqual(5.2471, displacementAtNode4.X, 0.001);
            Assert.AreEqual(-20.0881, displacementAtNode4.Z, 0.001);

            DisplacementVector displacementAtNode5 = results.GetDisplacement(node5);

            Assert.AreEqual(10.4942, displacementAtNode5.X, 0.001);
            Assert.AreEqual(0, displacementAtNode5.Z, 0.001);

            DisplacementVector displacementAtNode6 = results.GetDisplacement(node6);

            Assert.AreEqual(3.3513, displacementAtNode6.X, 0.001);
            Assert.AreEqual(-9.0386, displacementAtNode6.Z, 0.001);
        }
コード例 #47
0
ファイル: Beam3DIn2DModel.cs プロジェクト: iainsproat/SharpFE
        public void ThreeNodeCantilever()
        {
            FiniteElementModel model = new FiniteElementModel(ModelType.Full3D);
            FiniteElementNode node1 = model.NodeFactory.Create(0, 0, 0);
            model.ConstrainNode(node1, DegreeOfFreedom.X);
            model.ConstrainNode(node1, DegreeOfFreedom.Y);
            model.ConstrainNode(node1, DegreeOfFreedom.Z);
            model.ConstrainNode(node1, DegreeOfFreedom.XX);
            model.ConstrainNode(node1, DegreeOfFreedom.YY);
            model.ConstrainNode(node1, DegreeOfFreedom.ZZ);

            FiniteElementNode node2 = model.NodeFactory.Create(1.5, 0, 0);
            FiniteElementNode node3 = model.NodeFactory.Create(3.0, 0, 0);

            IMaterial material = new GenericElasticMaterial(0, 210000000000, 0, 84000000000);
            ICrossSection section = new GenericCrossSection(0.0001, 0.0002, 0.0002, 0.00005);

            model.ElementFactory.CreateLinear3DBeam(node1, node2, material, section);
            model.ElementFactory.CreateLinear3DBeam(node2, node3, material, section);

            ForceVector force = model.ForceFactory.Create(0, 0, -10000, 0, 0, 0);
            model.ApplyForceToNode(force, node3);

            IFiniteElementSolver solver = new MatrixInversionLinearSolver(model);
            FiniteElementResults results = solver.Solve();

            ReactionVector reaction = results.GetReaction(node1);
            Assert.AreEqual(10000, reaction.Z, 0.001);
            Assert.AreEqual(-30000, reaction.YY, 0.001);

            DisplacementVector displacement2 = results.GetDisplacement(node2);
            Assert.AreEqual(-0.000670, displacement2.Z, 0.0005);
            Assert.AreEqual(0.000804, displacement2.YY, 0.0001);

            DisplacementVector displacement3 = results.GetDisplacement(node3);
            Assert.AreEqual(-0.00214, displacement3.Z, 0.0005);
            Assert.AreEqual(0.00107, displacement3.YY, 0.0001);
        }
コード例 #48
0
        public void Calculate3DPortalFrameOf8BeamsAnd48Dof()
        {
            FiniteElementModel model = new FiniteElementModel(ModelType.Full3D);
            FiniteElementNode node1 = model.NodeFactory.Create(0, 0, 0);
            model.ConstrainNode(node1, DegreeOfFreedom.X);
            model.ConstrainNode(node1, DegreeOfFreedom.Y);
            model.ConstrainNode(node1, DegreeOfFreedom.Z);

            FiniteElementNode node2 = model.NodeFactory.Create(0, -4, 0);
            model.ConstrainNode(node2, DegreeOfFreedom.X);
            model.ConstrainNode(node2, DegreeOfFreedom.Y);
            model.ConstrainNode(node2, DegreeOfFreedom.Z);

            FiniteElementNode node3 = model.NodeFactory.Create(4, -4, 0);
            model.ConstrainNode(node3, DegreeOfFreedom.X);
            model.ConstrainNode(node3, DegreeOfFreedom.Y);
            model.ConstrainNode(node3, DegreeOfFreedom.Z);

            FiniteElementNode node4 = model.NodeFactory.Create(4, 0, 0);
            model.ConstrainNode(node4, DegreeOfFreedom.X);
            model.ConstrainNode(node4, DegreeOfFreedom.Y);
            model.ConstrainNode(node4, DegreeOfFreedom.Z);

            FiniteElementNode node5 = model.NodeFactory.Create(0, 0, 5);
            FiniteElementNode node6 = model.NodeFactory.Create(0, -4, 5);
            FiniteElementNode node7 = model.NodeFactory.Create(4, -4, 5);
            FiniteElementNode node8 = model.NodeFactory.Create(4, 0, 5);

            IMaterial material = new GenericElasticMaterial(0, 210000000000, 0, 84000000000);
            ICrossSection section = new GenericCrossSection(0.02, 0.0001, 0.0002, 0.00005);

            model.ElementFactory.CreateLinear3DBeam(node1, node5, material, section);
            model.ElementFactory.CreateLinear3DBeam(node2, node6, material, section);
            model.ElementFactory.CreateLinear3DBeam(node3, node7, material, section);
            model.ElementFactory.CreateLinear3DBeam(node4, node8, material, section);
            model.ElementFactory.CreateLinear3DBeam(node5, node6, material, section);
            model.ElementFactory.CreateLinear3DBeam(node6, node7, material, section);
            model.ElementFactory.CreateLinear3DBeam(node7, node8, material, section);
            model.ElementFactory.CreateLinear3DBeam(node8, node5, material, section);

            ForceVector force = model.ForceFactory.Create(-15000, 0, 0, 0, 0, 0);
            model.ApplyForceToNode(force, node7);

            IFiniteElementSolver solver = new LinearSolverSVD(model);
            FiniteElementResults results = solver.Solve();

            ReactionVector node1Reaction = results.GetReaction(node1);
            ReactionVector node2Reaction = results.GetReaction(node2);
            ReactionVector node3Reaction = results.GetReaction(node3);
            ReactionVector node4Reaction = results.GetReaction(node4);
            DisplacementVector node5Displacement = results.GetDisplacement(node5);
            DisplacementVector node6Displacement = results.GetDisplacement(node6);
            DisplacementVector node7Displacement = results.GetDisplacement(node7);
            DisplacementVector node8Displacement = results.GetDisplacement(node8);

            //            Console.WriteLine("\nNode5 displacement : \n" + node5Displacement);
            //            Console.WriteLine("\nNode6 displacement : \n" + node6Displacement);
            //            Console.WriteLine("\nNode7 displacement : \n" + node7Displacement);
            //            Console.WriteLine("\nNode8 displacement : \n" + node8Displacement);

            Assert.Inconclusive("The below tests pass for y-displacements, but fail for x-displacements");
            Assert.AreEqual(-0.0026743, node5Displacement.X, 0.0001);
            Assert.AreEqual(0.0038697, node5Displacement.Y, 0.0001);
            Assert.AreEqual(-0.0107708, node6Displacement.X, 0.0001);
            Assert.AreEqual(0.0038697, node6Displacement.Y, 0.0001);
            Assert.AreEqual(-0.0107780, node7Displacement.X, 0.0001);
            Assert.AreEqual(-0.0038697, node7Displacement.Y, 0.0001);
            Assert.AreEqual(-0.0026743, node8Displacement.X, 0.0001);
            Assert.AreEqual(-0.0038697, node8Displacement.Y, 0.0001);
        }
コード例 #49
0
ファイル: Beam3DIn2DModel.cs プロジェクト: iainsproat/SharpFE
        public void Calculate2DPortalFrameOf3BeamsAnd12Dof()
        {
            FiniteElementModel model = new FiniteElementModel(ModelType.Full3D);
            FiniteElementNode node1 = model.NodeFactory.Create(-3, 0, 0);
            model.ConstrainNode(node1, DegreeOfFreedom.X);
            model.ConstrainNode(node1, DegreeOfFreedom.Y);
            model.ConstrainNode(node1, DegreeOfFreedom.Z);
            model.ConstrainNode(node1, DegreeOfFreedom.XX);
            model.ConstrainNode(node1, DegreeOfFreedom.YY);

            FiniteElementNode node2 = model.NodeFactory.Create(-3, 0, 6);

            FiniteElementNode node3 = model.NodeFactory.Create(3, 0, 6);

            FiniteElementNode node4 = model.NodeFactory.Create(3, 0, 0);
            model.ConstrainNode(node4, DegreeOfFreedom.X);
            model.ConstrainNode(node4, DegreeOfFreedom.Y);
            model.ConstrainNode(node4, DegreeOfFreedom.Z);
            model.ConstrainNode(node4, DegreeOfFreedom.XX);
            model.ConstrainNode(node4, DegreeOfFreedom.YY);

            IMaterial material = new GenericElasticMaterial(0, 210000000000, 0, 84000000);
            ICrossSection section = new GenericCrossSection(0.0002, 0.0002, 0.0002, 0.00005);

            model.ElementFactory.CreateLinear3DBeam(node1, node2, material, section);
            model.ElementFactory.CreateLinear3DBeam(node2, node3, material, section);
            model.ElementFactory.CreateLinear3DBeam(node3, node4, material, section);

            ForceVector force2 = model.ForceFactory.Create(15000, 0, 0, 0, -10000, 0);
            model.ApplyForceToNode(force2, node2);

            IFiniteElementSolver solver = new LinearSolverSVD(model);
            FiniteElementResults results = solver.Solve();

            DisplacementVector node2Displacement = results.GetDisplacement(node2);
            DisplacementVector node3Displacement = results.GetDisplacement(node3);
            ReactionVector node1Reaction = results.GetReaction(node1);
            ReactionVector node4Reaction = results.GetReaction(node4);

            Assert.AreEqual(0.0052843, node2Displacement.X, 0.0001);
            Assert.AreEqual(0.0006522, node2Displacement.Z, 0.0001);
            Assert.AreEqual(0.0005, node2Displacement.YY, 0.0001);

            Assert.AreEqual(0.0044052, node3Displacement.X, 0.0001);
            Assert.AreEqual(-0.0006522, node3Displacement.Z, 0.0001);
            Assert.AreEqual(0.0006, node3Displacement.YY, 0.0001);

            Assert.AreEqual(-9000, node1Reaction.X, 500);
            Assert.AreEqual(-5000, node1Reaction.Z, 500);
            Assert.AreEqual(-30022, node1Reaction.YY, 500);

            Assert.AreEqual(-6000, node4Reaction.X, 500);
            Assert.AreEqual(5000, node4Reaction.Z, 500);
            Assert.AreEqual(-22586, node4Reaction.YY, 500);
        }
コード例 #50
0
ファイル: Beam1DIn2DModel.cs プロジェクト: iainsproat/SharpFE
        public void ReversedCantilever()
        {
            FiniteElementModel model = new FiniteElementModel(ModelType.Beam1D);
            FiniteElementNode node1 = model.NodeFactory.Create(0);
            model.ConstrainNode(node1, DegreeOfFreedom.Z);
            model.ConstrainNode(node1, DegreeOfFreedom.YY);

            FiniteElementNode node2 = model.NodeFactory.Create(3.0);

            IMaterial material = new GenericElasticMaterial(0, 210000000000, 0, 0);
            ICrossSection section = new GenericCrossSection(0.0001, 0.0002);

            model.ElementFactory.CreateLinear1DBeam(node2, node1, material, section);  //connecting the nodes in reverse order to the Cantilever() example

            ForceVector force = model.ForceFactory.CreateFor1DBeam(-10000, 0);
            model.ApplyForceToNode(force, node2);

            IFiniteElementSolver solver = new MatrixInversionLinearSolver(model);
            FiniteElementResults results = solver.Solve();

            ReactionVector reaction = results.GetReaction(node1);
            Assert.AreEqual(10000, reaction.Z, 0.001);
            Assert.AreEqual(-30000, reaction.YY, 0.001);

            DisplacementVector displacement = results.GetDisplacement(node2);
            Assert.AreEqual(-0.00214, displacement.Z, 0.0005);
            Assert.AreEqual(0.00107, displacement.YY, 0.0001);
        }