Пример #1
0
        private static void Test_P_Delta_matrix()
        {
            var model = StructureGenerator.Generate3DFrameElementGrid(10, 10, 10);


            var zs = model.Nodes.Where(i => i.Constraints != Constraint.Fixed)
                     .Select(i => i.Location.Z).Distinct().ToList();

            foreach (var z in zs)
            {
                var relm = new RigidElement_MPC();

                relm.Nodes.AddRange(model.Nodes.Where(i => i.Location.Z == z));

                model.MpcElements.Add(relm);

                relm.UseForAllLoads = true;
            }

            StructureGenerator.AddRandomDisplacements(model, 0.1);


            model.Clone();

            #region

            #endregion

            CalcUtil.GenerateP_Delta_Mpc(model, LoadCase.DefaultLoadCase, new DenseIrrefFinder());
        }
Пример #2
0
        private static void Test_P_Delta_matrix()
        {
            var model = StructureGenerator.Generate3DFrameElementGrid(2, 2, 2);


            var zs = model.Nodes
                     .Where(i => i.Constraints != Constraints.Fixed)
                     .Select(i => i.Location.Z).Distinct().ToList();


            foreach (var z in zs)
            {
                var relm  = new RigidElement_MPC();
                var relm2 = new RigidElement();

                relm.Nodes.AddRange(model.Nodes.Where(i => i.Location.Z == z));
                relm2.Nodes.AddRange(model.Nodes.Where(i => i.Location.Z == z));

                model.MpcElements.Add(relm);
                model.RigidElements.Add(relm2);

                relm.UseForAllLoads  = true;
                relm2.UseForAllLoads = true;
            }

            //StructureGenerator.AddRandomDisplacements(model, 0.1);

            /**/
            foreach (var node in model.Nodes)
            {
                if (node.Constraints == Constraints.Fixed)
                {
                    node.Settlements.Add(new Settlement(new Displacement(1, 0, 0, 0, 0, 0)));
                    node.Loads.Clear();
                }
            }
            /**/


            StructureGenerator.AddRandomiseLoading(model, true, false, LoadCase.DefaultLoadCase);

            //model.Clone();

            #region

            #endregion

            model.Solve();
            //CalcUtil.GenerateP_Delta_Mpc(model, LoadCase.DefaultLoadCase,new GaussRrefFinder());
            model.LastResult.AddAnalysisResult(LoadCase.DefaultLoadCase);
            model.LastResult.AddAnalysisResult_MPC(LoadCase.DefaultLoadCase);
        }
Пример #3
0
        public static void StiffnessCenterTest()
        {
            #region model
            var model = new Model();

            model.Nodes.Add(new Node(0, 0, 0)
            {
                Label = "n0"
            });
            model.Nodes.Add(new Node(0, 2, 0)
            {
                Label = "n1"
            });
            model.Nodes.Add(new Node(4, 2, 0)
            {
                Label = "n2"
            });
            model.Nodes.Add(new Node(4, 0, 0)
            {
                Label = "n3"
            });

            model.Nodes.Add(new Node(0, 0, 1)
            {
                Label = "n4"
            });
            model.Nodes.Add(new Node(0, 2, 1)
            {
                Label = "n5"
            });
            model.Nodes.Add(new Node(4, 2, 1)
            {
                Label = "n6"
            });
            model.Nodes.Add(new Node(4, 0, 1)
            {
                Label = "n7"
            });


            var a  = 0.1 * 0.1;                    //area, assume sections are 10cm*10cm rectangular
            var iy = 0.1 * 0.1 * 0.1 * 0.1 / 12.0; //Iy
            var iz = 0.1 * 0.1 * 0.1 * 0.1 / 12.0; //Iz
            var j  = 0.1 * 0.1 * 0.1 * 0.1 / 12.0; //Polar
            var e  = 20e9;                         //young modulus, 20 [GPa]
            var nu = 0.2;                          //poissons ratio

            var sec = new Sections.UniformParametric1DSection(a, iy, iz, j);
            var mat = Materials.UniformIsotropicMaterial.CreateFromYoungPoisson(e, nu);

            model.Elements.Add(new BarElement(model.Nodes["n0"], model.Nodes["n4"])
            {
                Label = "e0", Section = sec, Material = mat
            });
            model.Elements.Add(new BarElement(model.Nodes["n1"], model.Nodes["n5"])
            {
                Label = "e1", Section = sec, Material = mat
            });
            model.Elements.Add(new BarElement(model.Nodes["n2"], model.Nodes["n6"])
            {
                Label = "e2", Section = sec, Material = mat
            });
            model.Elements.Add(new BarElement(model.Nodes["n3"], model.Nodes["n7"])
            {
                Label = "e3", Section = sec, Material = mat
            });

            model.Elements.Add(new BarElement(model.Nodes["n4"], model.Nodes["n5"])
            {
                Label = "e4", Section = sec, Material = mat
            });
            model.Elements.Add(new BarElement(model.Nodes["n5"], model.Nodes["n6"])
            {
                Label = "e5", Section = sec, Material = mat
            });
            model.Elements.Add(new BarElement(model.Nodes["n6"], model.Nodes["n7"])
            {
                Label = "e6", Section = sec, Material = mat
            });
            model.Elements.Add(new BarElement(model.Nodes["n7"], model.Nodes["n4"])
            {
                Label = "e7", Section = sec, Material = mat
            });



            model.Nodes["n0"].Constraints             =
                model.Nodes["n1"].Constraints         =
                    model.Nodes["n2"].Constraints     =
                        model.Nodes["n3"].Constraints =
                            Constraints.Fixed;
            #endregion

            var rgd = new RigidElement_MPC();

            rgd.Nodes.Add(model.Nodes["n4"]);
            rgd.Nodes.Add(model.Nodes["n5"]);
            rgd.Nodes.Add(model.Nodes["n6"]);
            //rgd.Nodes.Add(model.Nodes["n7"]);



            //var eqDof = new TelepathyLink

            model.MpcElements.Add(rgd);

            var loc = new StiffnessCenterFinder().GetCenters(model, rgd, LoadCase.DefaultLoadCase);
        }
        public ValidationResult Validate()
        {
            var model = new Model();

            var ndes = new Node[] {
                new Node(0, 0, 0),
                new Node(1, 0, 0),
                new Node(2, 0, 0),
                new Node(3, 0, 0),
            };

            /**/
            var h = 0.1;
            var w = 0.05;

            var a  = h * w;
            var iy = h * h * h * w / 12;
            var iz = w * w * w * h / 12;
            var j  = iy + iz;
            var e  = 210e9;
            var nu = 0.3;

            var g = e / (2 * 1 + nu);
            /**/

            var sec = new Sections.UniformParametric1DSection(a, iy, iz, j);
            var mat = UniformIsotropicMaterial.CreateFromYoungShear(e, g);

            //bar-element -> rigid linkg -> bar element
            {
                var barElm = new BarElement(ndes[0], ndes[1])
                {
                    Material = mat, Section = sec, Behavior = BarElementBehaviours.FullFrame
                };
                model.Elements.Add(barElm);
            }
            {
                var rigidElm = new RigidElement_MPC();
                rigidElm.Nodes = new NodeList()
                {
                    ndes[1], ndes[2]
                };
                rigidElm.UseForAllLoads = true;
                model.MpcElements.Add(rigidElm);
            }
            {
                var barElm = new BarElement(ndes[2], ndes[3])
                {
                    Material = mat, Section = sec, Behavior = BarElementBehaviours.FullFrame
                };
                model.Elements.Add(barElm);
            }
            model.Nodes.Add(ndes);

            ndes[0].Constraints = Constraints.Fixed;

            ndes[3].Loads.Add(new NodalLoad(new Force(1000, 2000, 5000, 1000, 2000, 2000)));
            //ndes[1].Loads.Add(new NodalLoad(new Force(Vector.J * 2, Vector.Zero)));

            model.Solve_MPC();

            var span = new HtmlTag("span");

            span.Add("p").Text("Validation of rigid element");
            span.Add("paragraph").Text("The rigid element connects different nodes through non-deformable elements. ");
            span.Add("h3").Text("Model Definition");

            span.Add("paragraph").Text(string.Format(CultureInfo.CurrentCulture, "A linear beam of 3 meters long, with 4 nodes, 2 bar elements and 1 rigid element in-between.")).AddClosedTag("br");

            span.Add("paragraph").Text("The first node is fixed in the 3D space.").AddClosedTag("br");
            span.Add("paragraph").Text("The last node is loaded with a random load; both forces and moments.").AddClosedTag("br");
            span.Add("paragraph").Text("The rigid element should transfer all rotational DOF from the second node to the thrid. The displacements  along the beam will be trasnfered ass well, although the the displacements in the perpendicular direct will scale.").AddClosedTag("br");

            span.Add("h3").Text("Validation Result");
            span.Add("h4").Text("Nodal Displacements");
            span.Add("paragraph").Text(string.Format("Validation output for nodal displacements:"));


            var n1   = model.Nodes[1].GetNodalDisplacement();
            var n2   = model.Nodes[2].GetNodalDisplacement();
            var diff = n1 - n2;

            //linear beam with loads -> rigid elements introduces rigid body -> Y and Z (translations perpendicular to the beam) are non zero and scaled. Set to zero to avoid confusion with result.
            diff.DY = diff.DZ = 0.0;

            //span.Add("p").AddClass("bg-info").Text(string.Format("-Max ABSOLUTE Error: {0:e3}", diff));//htmltags cannot encode the delta and teta chars so will use vector length
            span.Add("p").AddClass("bg-info")
            .Text(string.Format("-Max ABSOLUTE Error: Displacement:{0:e3} , Rotation:{1:e3}",
                                diff.Displacements.Length, diff.Rotations.Length));

            var buf = new ValidationResult();

            buf.Span  = span;
            buf.Title = "Rigid element Validation";

            return(buf);
        }
        /// <summary>
        /// Gets the stiffness center of specified <see cref="element"/>.
        /// Stiffness center of rigid element.
        /// </summary>
        /// <param name="model"></param>
        /// <param name="element"></param>
        /// <returns>stiffness centers</returns>
        public Point[] GetCenters(Model model, RigidElement_MPC element, LoadCase loadCase)
        {
            //model = model.Clone();

            var perm = CalcUtil.GenerateP_Delta_Mpc(model, loadCase, new Mathh.GaussRrefFinder());

            var adj = GetAdjacencyGraph(perm.Item1);

            var dofGroups = CalcUtil.EnumerateGraphPartsAsGroups(adj);


            //var parts=CalcUtil.

            var cse_x = new LoadCase("tmp_case_x1", LoadType.Other);

            var stl = new VirtualConstraint();

            stl.AppliedLoadCases.Add(cse_x);

            stl.Nodes.AddRange(element.Nodes);

            stl.Constraint = Constraints.Fixed;
            stl.Settlement = Displacement.Zero;



            model.MpcElements.Add(stl);

            var cnf = new SolverConfiguration(cse_x);

            cnf.SolverFactory = new CholeskySolverFactory();

            model.Solve_MPC(cnf);

            var frc = Force.Zero;

            foreach (var node in stl.Nodes)
            {
                var force = node.GetTotalExternalForces(cse_x);
                frc += force.Move(node.Location, Point.Origins);
            }

            //move frc to a place without moment, only with force

            {
                var fx = frc.Fx;
                var fy = frc.Fy;
                var fz = frc.Fz;

                var mx = frc.Mx;
                var my = frc.My;
                var mz = frc.Mz;



                var fv = new Vector(fx, fy, fz);
                var mv = new Vector(-mx, -my, -mz);

                var f = new Matrix(4, 3);

                // TODO: MAT - set values directly
                f.SetRow(0, new double[] { 0, fz, -fy });
                f.SetRow(1, new double[] { -fz, 0, fx });
                f.SetRow(2, new double[] { fy, -fx, 0 });
                f.SetRow(3, new double[] { fx, fy, fz });

                var p0 = new Matrix(3, 4);
                p0[0, 1] = p0[1, 2] = p0[2, 3] = 1;

                var p1 = new Matrix(3, 4);
                p1[0, 0] = p1[1, 2] = p1[2, 3] = 1;

                var p2 = new Matrix(3, 4);
                p2[0, 0] = p2[1, 1] = p2[2, 3] = 1;

                var d0 = p0 * f;
                var d1 = p1 * f;
                var d2 = p2 * f;

                var det0 = d0.Det3x3();
                var det1 = d1.Det3x3();
                var det2 = d2.Det3x3();

                var sols = new List <Vector>();

                if (det0 != 0)
                {
                    var sol0 = (d0.Inv3x3() * mv.ToMatrix()).ToVector();
                    sols.Add(sol0);
                }

                if (det1 != 0)
                {
                    var sol1 = (d1.Inv3x3() * mv.ToMatrix()).ToVector();
                    sols.Add(sol1);
                }

                if (det2 != 0)
                {
                    var sol2 = (d2.Inv3x3() * mv.ToMatrix()).ToVector();
                    sols.Add(sol2);
                }
            }


            throw new NotImplementedException();
        }