Beispiel #1
0
        public static void TestSingleElement()
        {
            var model = new Model();

            var elm = new TriangleElement();

            var arr = new[]
            {
                new Node(1, 1, 0),
                new Node(3.25, 0.5, 0),
                new Node(3.733, 1.92, 0),
            };

            arr.CopyTo(elm.Nodes, 0);

            model.Nodes.AddRange(arr);
            model.Elements.Add(elm);

            model.Nodes[2].Loads.Add(new NodalLoad(new Force(1, 1, 1, 1, 1, 1) * -5000));

            model.Nodes[0].Constraints     =
                model.Nodes[1].Constraints =
                    Constraints.Fixed;

            elm.Behavior            = TriangleElementBehaviours.Shell;
            elm.MembraneFormulation = MembraneFormulation.PlaneStress;
            elm.Material            = new UniformIsotropicMaterial(2100, 0.3);
            elm.Section             = new UniformParametric2DSection(0.2);

            model.Solve();

            Console.WriteLine(model.Nodes[2].GetNodalDisplacement().ToString(5));

            //var force = elm.GetLocalInternalForceAt(LoadCase.DefaultLoadCase, -0.57735, -0.57735);
        }
        private static void TestTriangle()
        {
            var t  = 0.01;
            var e  = 210e9;
            var nu = 0.2;

            var n1 = new Node(new Point(0, 0, 0));
            var n2 = new Node(new Point(3, 5, 7));
            var n3 = new Node(new Point(1, -5, 4));

            var dkt = new TriangleFlatShell()
            {
                Behavior       = PlaneElementBehaviour.ThinPlate,
                PoissonRatio   = nu,
                ElasticModulus = e,
                Thickness      = t
            };


            dkt.Nodes[0] = n1;
            dkt.Nodes[1] = n2;
            dkt.Nodes[2] = n3;

            var tri = new TriangleElement();

            tri.Behavior = PlateElementBehaviours.Shell;
            tri.Section  = new UniformParametric2DSection()
            {
                T = t
            };
            tri.Material = new UniformIsotropicMaterial(e, nu);// {E = e, Nu = nu};

            tri.Nodes[0] = n1;
            tri.Nodes[1] = n2;
            tri.Nodes[2] = n3;


            var kTri = tri.GetLocalStifnessMatrix();
            var kDkt = dkt.GetLocalPlateBendingStiffnessMatrix();

            var d = kTri - kDkt;

            var xi  = 0.162598494;
            var eta = 0.284984989;

            var b1   = new DktHelper().GetBMatrixAt(tri, xi, eta);
            var lpts = dkt.GetLocalPoints();

            var b2 = DktElement.GetBMatrix(xi, eta,
                                           new[] { lpts[0].X, lpts[1].X, lpts[2].X },
                                           new[] { lpts[0].Y, lpts[1].Y, lpts[2].Y });

            // new DktHelper().GetBMatrixAt(tri, tri.GetTransformationMatrix(), xi, eta);


            tri.GetLocalStifnessMatrix();
            //GC.Collect();

            var db = b1 - b2;
        }
        /// <summary>
        /// Reads an element from an Abaqus input file
        /// </summary>
        /// <param name="elementline">A line with the element props</param>
        /// <param name="delimiter">The separator char</param>
        /// <param name="nodes">A list of nodes - starts at 0 -> = node-1</param>
        /// <returns>An element</returns>
        private static TriangleElement ReadTriangleElement(string elementline, char delimiter, NodeCollection nodes)
        {
            var elm = new TriangleElement();

            string[] split;
            int      elementNr;//, nodeNr1, nodeNr2, nodeNr3, nodeNr4;

            try
            {
                split = elementline.Split(delimiter);

                elementNr = Convert.ToInt32(split[0]);
                //subtract 1. The nodes are numbered from 1-> end and are stored as 0-> end-1
                elm.Nodes[0] = nodes[Convert.ToInt32(split[1]) - 1];
                elm.Nodes[1] = nodes[Convert.ToInt32(split[2]) - 1];
                elm.Nodes[2] = nodes[Convert.ToInt32(split[3]) - 1];
                elm.label    = elementNr.ToString();
            }
            catch (Exception ex)
            {
                throw new Exception("Something went wrong with reading the nodes! Error with line: " + elementline);
            }

            return(elm);
        }
Beispiel #4
0
        public void Dkt_GetBMatrix()
        {
            var element = new TriangleElement();

            element.Nodes[0] = new Node(1, 2, 3);
            element.Nodes[1] = new Node(4, 5, 6);
            element.Nodes[2] = new Node(7, 8, 9);

            var helper = new DktHelper();

            var b = helper.GetBMatrixAt(element, 0, 0, 0);

            var exact = new Matrix(3, 6);
        }
        public static Model Generate3DTriangleElementGridTest(int m, int n, int l)
        {
            var buf = new Model();

            var dx = 0.15;
            var dy = 0.15;
            var dz = 0.15;

            var nodes = new Node[m, n, l];

            for (int i = 0; i < m; i++)
            {
                for (int j = 0; j < n; j++)
                {
                    for (int k = 0; k < l; k++)
                    {
                        var pos = new Point(j * dx, i * dy, k * dz);
                        var nde = new Node()
                        {
                            Location = pos
                        };
                        buf.Nodes.Add(nde);
                        nodes[i, j, k] = nde;
                    }
                }
            }

            //elements parallel to XZ
            for (int j = 0; j < n; j++)
            {
                for (int i = 0; i < m - 1; i++)
                {
                    for (int k = 0; k < l - 1; k++)
                    {
                        {
                            var elm2 = new TriangleElement();
                            elm2.Nodes[0] = nodes[i, j, k];
                            elm2.Nodes[1] = nodes[i, j, k + 1];
                            elm2.Nodes[2] = nodes[i + 1, j, k];

                            buf.Elements.Add(elm2);
                        }

                        {
                            var elm2 = new TriangleElement();
                            elm2.Nodes[0] = nodes[i + 1, j, k + 1];
                            elm2.Nodes[1] = nodes[i, j, k + 1];
                            elm2.Nodes[2] = nodes[i + 1, j, k];

                            buf.Elements.Add(elm2);
                        }
                    }
                }
            }


            //elements parallel to YZ
            for (int i = 0; i < m; i++)
            {
                for (int j = 0; j < n - 1; j++)
                {
                    for (int k = 0; k < l - 1; k++)
                    {
                        {
                            var elm2 = new TriangleElement();
                            elm2.Nodes[0] = nodes[i, j, k];
                            elm2.Nodes[1] = nodes[i, j, k + 1];
                            elm2.Nodes[2] = nodes[i, j + 1, k];

                            buf.Elements.Add(elm2);
                        }

                        {
                            var elm2 = new TriangleElement();
                            elm2.Nodes[0] = nodes[i, j + 1, k + 1];
                            elm2.Nodes[1] = nodes[i, j, k + 1];
                            elm2.Nodes[2] = nodes[i, j + 1, k];

                            buf.Elements.Add(elm2);
                        }
                    }
                }
            }

            //elements parallel to XY
            for (int k = 0; k < l; k++)
            {
                for (int j = 0; j < n - 1; j++)
                {
                    for (int i = 0; i < m - 1; i++)
                    {
                        {
                            var elm2 = new TriangleElement();
                            elm2.Nodes[0] = nodes[i, j, k];
                            elm2.Nodes[1] = nodes[i + 1, j, k];
                            elm2.Nodes[2] = nodes[i, j + 1, k];

                            buf.Elements.Add(elm2);
                        }

                        {
                            var elm2 = new TriangleElement();
                            elm2.Nodes[0] = nodes[i + 1, j + 1, k];
                            elm2.Nodes[1] = nodes[i + 1, j, k];
                            elm2.Nodes[2] = nodes[i, j + 1, k];

                            buf.Elements.Add(elm2);
                        }
                    }
                }
            }


            foreach (var elm in buf.Elements)
            {
                var triElm = elm as TriangleElement;


                if (triElm == null)
                {
                    continue;
                }

                triElm.Behavior = PlateElementBehaviours.Shell;



                var h = 0.03;
                var w = 0.003;

                var e  = 210e9;
                var nu = 0.3;

                var sec = (Sections.UniformParametric2DSection)(triElm.Section = new Sections.UniformParametric2DSection());

                var mat = triElm.Material = Materials.UniformIsotropicMaterial.CreateFromYoungPoisson(e, nu);

                sec.T = 0.003;
            }


            for (int i = 0; i < m; i++)
            {
                nodes[i, 0, 0].Constraints = Constraint.Fixed;
            }
            for (int i = 0; i < m; i++)
            {
                nodes[i, n - 1, 0].Loads.Add(new NodalLoad(new Force(1500, 0, 0, 0, 0, 0), LoadCase.DefaultLoadCase));
            }
            return(buf);
        }
        /// <summary>
        ///
        /// </summary>
        /// <param name="m">number of levels in X direction</param>
        /// <param name="n">number of levels in Y direction</param>
        /// <param name="l">number of levels in Z direction</param>
        /// <returns></returns>
        public static Model Generate3DTriangleElementGrid(int m, int n, int l)
        {
            var buf = new Model();

            var dx = 1.0;
            var dy = 1.0;
            var dz = 1.0;

            var nodes = new Node[m, n, l];

            for (int i = 0; i < m; i++)
            {
                for (int j = 0; j < n; j++)
                {
                    for (int k = 0; k < l; k++)
                    {
                        var pos = new Point(j * dx, i * dy, k * dz);
                        var nde = new Node()
                        {
                            Location = pos
                        };
                        buf.Nodes.Add(nde);
                        nodes[i, j, k] = nde;
                    }
                }
            }

            //elements parallel to XZ
            for (int j = 0; j < n; j++)
            {
                for (int i = 0; i < m - 1; i++)
                {
                    for (int k = 0; k < l - 1; k++)
                    {
                        {
                            var elm2 = new TriangleElement();
                            elm2.Nodes[0] = nodes[i, j, k];
                            elm2.Nodes[1] = nodes[i, j, k + 1];
                            elm2.Nodes[2] = nodes[i + 1, j, k];

                            buf.Elements.Add(elm2);
                        }

                        {
                            var elm2 = new TriangleElement();
                            elm2.Nodes[0] = nodes[i + 1, j, k + 1];
                            elm2.Nodes[1] = nodes[i, j, k + 1];
                            elm2.Nodes[2] = nodes[i + 1, j, k];

                            buf.Elements.Add(elm2);
                        }
                    }
                }
            }


            //elements parallel to YZ
            for (int i = 0; i < m; i++)
            {
                for (int j = 0; j < n - 1; j++)
                {
                    for (int k = 0; k < l - 1; k++)
                    {
                        {
                            var elm2 = new TriangleElement();
                            elm2.Nodes[0] = nodes[i, j, k];
                            elm2.Nodes[1] = nodes[i, j, k + 1];
                            elm2.Nodes[2] = nodes[i, j + 1, k];

                            buf.Elements.Add(elm2);
                        }

                        {
                            var elm2 = new TriangleElement();
                            elm2.Nodes[0] = nodes[i, j + 1, k + 1];
                            elm2.Nodes[1] = nodes[i, j, k + 1];
                            elm2.Nodes[2] = nodes[i, j + 1, k];

                            buf.Elements.Add(elm2);
                        }
                    }
                }
            }

            //elements parallel to XY
            for (int k = 0; k < l; k++)
            {
                for (int j = 0; j < n - 1; j++)
                {
                    for (int i = 0; i < m - 1; i++)
                    {
                        {
                            var elm2 = new TriangleElement();
                            elm2.Nodes[0] = nodes[i, j, k];
                            elm2.Nodes[1] = nodes[i + 1, j, k];
                            elm2.Nodes[2] = nodes[i, j + 1, k];

                            buf.Elements.Add(elm2);
                        }

                        {
                            var elm2 = new TriangleElement();
                            elm2.Nodes[0] = nodes[i + 1, j + 1, k];
                            elm2.Nodes[1] = nodes[i + 1, j, k];
                            elm2.Nodes[2] = nodes[i, j + 1, k];

                            buf.Elements.Add(elm2);
                        }
                    }
                }
            }


            foreach (var elm in buf.Elements)
            {
                var triElm = elm as TriangleElement;


                if (triElm == null)
                {
                    continue;
                }

                triElm.Behavior = PlateElementBehaviours.Shell;



                var h = RandomHelper.GetRandomNumber(0.01, 0.1);
                var w = RandomHelper.GetRandomNumber(0.01, 0.1);

                var e  = RandomHelper.GetRandomNumber(100e9, 200e9);
                var nu = RandomHelper.GetRandomNumber(0.2, 0.3);

                var sec = (Sections.UniformParametric2DSection)(triElm.Section = new Sections.UniformParametric2DSection());

                var mat = triElm.Material = Materials.UniformIsotropicMaterial.CreateFromYoungPoisson(e, nu);

                sec.T = 0.1;
            }


            for (int i = 0; i < m; i++)
            {
                for (int j = 0; j < n; j++)
                {
                    nodes[i, j, 0].Constraints = Constraint.Fixed;
                }
            }



            return(buf);
        }
        public ValidationResult Validate()
        {
            var val = new ValidationResult();

            val.Title = "I Beam torsion with triangle element";

            var span = val.Span = new HtmlTag("span");

            {//report
                span.Add("p").Text("Validate an I Beam nodal displacement and reactions and internal forces");
                span.Add("h3").Text("Validate with");
                span.Add("paragraph").Text("SAP2000");
                span.Add("h3").Text("Validate objective");


                span.Add("paragraph").Text("compare nodal displacement for a model consist of Triangle Elements");

                span.Add("h3").Text("Model Definition");

                span.Add("paragraph")
                .Text("An I shaped beam, totally fixed on one side and under a couple force on other side")
                .AddClosedTag("br");

                span.Add("h3").Text("Validation Result");
            }
            //var magic = 0;

            //example #13 p175


            #region creating model

            var model = new Model();

            var l = UnitConverter.In2M(40);
            var w = UnitConverter.In2M(10);
            var h = UnitConverter.In2M(5);
            var t = UnitConverter.In2M(0.25);

            var e  = UnitConverter.Ksi2Pas(10000); //10'000 ksi
            var no = 0.3;

            var n = 9;

            var xSpan = l / (n - 1);

            var nodes = new Node[n][];

            for (var i = 0; i < n; i++)
            {
                var x = i * xSpan;

                nodes[i] = new Node[7];

                nodes[i][0] = new Node(x, 0, 0);
                nodes[i][1] = new Node(x, w / 2, 0);
                nodes[i][2] = new Node(x, w, 0);

                nodes[i][3] = new Node(x, w / 2, h / 2);

                nodes[i][4] = new Node(x, 0, h);
                nodes[i][5] = new Node(x, w / 2, h);
                nodes[i][6] = new Node(x, w, h);

                model.Nodes.AddRange(nodes[i]);
            }

            var pairs = new int[6][];

            pairs[0] = new int[] { 0, 1 };
            pairs[1] = new int[] { 1, 2 };
            pairs[2] = new int[] { 1, 3 };
            pairs[3] = new int[] { 3, 5 };
            pairs[4] = new int[] { 4, 5 };
            pairs[5] = new int[] { 5, 6 };


            var mat = new Materials.UniformIsotropicMaterial(e, no);
            var sec = new Sections.UniformParametric2DSection(t);


            for (var i = 0; i < n - 1; i++)
            {
                for (int j = 0; j < 6; j++)
                {
                    var n11 = nodes[i][pairs[j][0]];
                    var n12 = nodes[i][pairs[j][1]];

                    var n21 = nodes[i + 1][pairs[j][0]];
                    var n22 = nodes[i + 1][pairs[j][1]];

                    {
                        var elm1 = new TriangleElement()
                        {
                            Material = mat, Section = sec
                        };

                        elm1.Nodes[0] = n11;
                        elm1.Nodes[1] = n12;
                        elm1.Nodes[2] = n21;

                        model.Elements.Add(elm1);

                        var elm2 = new TriangleElement()
                        {
                            Material = mat, Section = sec
                        };

                        elm2.Nodes[0] = n21;
                        elm2.Nodes[1] = n22;
                        elm2.Nodes[2] = n12;

                        model.Elements.Add(elm2);
                    }
                }
            }

            //loading
            nodes.Last()[0].Loads.Add(new NodalLoad(new Force(0, UnitConverter.Kip2N(1.6), 0, 0, 0, 0)));
            nodes.Last()[6].Loads.Add(new NodalLoad(new Force(0, -UnitConverter.Kip2N(1.6), 0, 0, 0, 0)));

            nodes[0].ToList().ForEach(i => i.Constraints = Constraints.Fixed);

            #endregion

            model.Trace.Listeners.Add(new BriefFiniteElementNet.Common.ConsoleTraceListener());
            new ModelWarningChecker().CheckModel(model);

            model.Solve_MPC();

            //show the model
            //ModelVisualizer.TestShowVisualizer(model);

            //generate a list of all results
            List <string> results = new List <string>();
            results.Add("Index ; S11 ; S12 ; S13 ; S21 ; S22 ; S23 ; S31 ; S32 ; S33 ; SVM");
            foreach (var element in model.Elements)
            {
                var el     = (TriangleElement)element;
                var index  = el.GetIndex();
                var cauchy = el.GetInternalStress(new double[] { 0.166666666, 0.1666666, 1.0 }, LoadCombination.DefaultLoadCombination, SectionPoints.Envelope);
                results.Add(index + ";" + cauchy.S11 + ";" + cauchy.S12 + ";" + cauchy.S13 + ";" + cauchy.S21 + ";" + cauchy.S22 + ";" + cauchy.S23
                            + ";" + cauchy.S31 + ";" + cauchy.S32 + ";" + cauchy.S33 + ";" + CauchyStressTensor.GetVonMisesStress(cauchy));

                cauchy = el.GetInternalStress(new double[] { 0.6666666, 0.1666666, 1.0 }, LoadCombination.DefaultLoadCombination, SectionPoints.Envelope);
                results.Add(index + ";" + cauchy.S11 + ";" + cauchy.S12 + ";" + cauchy.S13 + ";" + cauchy.S21 + ";" + cauchy.S22 + ";" + cauchy.S23
                            + ";" + cauchy.S31 + ";" + cauchy.S32 + ";" + cauchy.S33 + ";" + CauchyStressTensor.GetVonMisesStress(cauchy));

                cauchy = el.GetInternalStress(new double[] { 0.166666666, 0.6666666, 1.0 }, LoadCombination.DefaultLoadCombination, SectionPoints.Envelope);
                results.Add(index + ";" + cauchy.S11 + ";" + cauchy.S12 + ";" + cauchy.S13 + ";" + cauchy.S21 + ";" + cauchy.S22 + ";" + cauchy.S23
                            + ";" + cauchy.S31 + ";" + cauchy.S32 + ";" + cauchy.S33 + ";" + CauchyStressTensor.GetVonMisesStress(cauchy));
            }
            //Write data if needed
            //File.WriteAllLines("Insert path here!!", results.ToArray());


            var A = nodes.Last()[2];
            var B = nodes.Last()[4];
            var C = nodes.First()[1];
            var D = nodes.First()[0];
            var E = nodes.Last()[6];

            /*
             * for (int i = 0; i < nodes.Last().Length; i++)
             * {
             *  nodes.Last()[i].Label = i.ToString();
             * }
             */

            /**/
            A.Label = "A";
            B.Label = "B";
            C.Label = "C";
            D.Label = "D";
            E.Label = "E";
            /**/


            var n50 = model.Nodes[50];
            var n56 = model.Nodes[56];
            var n57 = model.Nodes[57];


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

                var da = 1 / 0.0254 * A.GetNodalDisplacement().Displacements;        // [inch]
                var db = 1 / 0.0254 * B.GetNodalDisplacement().Displacements;        // [inch]

                var d50 = 1 / 0.0254 * n50.GetNodalDisplacement().Displacements;     // [inch]
                var d56 = 1 / 0.0254 * n56.GetNodalDisplacement().Displacements;     // [inch]
                var d57 = 1 / 0.0254 * n57.GetNodalDisplacement().Displacements;     // [inch]

                var sap2000Da = new Vector(-0.014921, 0.085471, 0.146070);           //tbl 7.14
                var sap2000Db = new Vector(-0.014834, -0.085475, -0.144533);         //tbl 7.14

                var abaqusDa = new Vector(-15.4207E-03, 88.2587E-03, 150.910E-03);   //node 9
                var abaqusDb = new Vector(-15.3246E-03, -88.2629E-03, -148.940E-03); //node 5

                var abaqus8  = new Vector(-120.875E-06, 88.3894E-03, -1.01662E-03);  //node 8
                var abaqus12 = new Vector(15.3931E-03, 89.1206E-03, -149.515E-03);   //node 12
                var abaqus41 = new Vector(-189.084E-06, 72.3778E-03, -734.918E-06);  //node 41


                span.Add("paragraph").Text(string.Format("Validation output for nodal displacements:"));

                span.Add("paragraph").Text(string.Format("Err at node A (displacement): {0:0.00}%", Util.GetErrorPercent(da, abaqusDa))).AddClosedTag("br");;
                span.Add("paragraph").Text(string.Format("Err at node B (displacement): {0:0.00}%", Util.GetErrorPercent(db, abaqusDb))).AddClosedTag("br");;

                span.Add("paragraph").Text(string.Format("Err at node 41 (57) (displacement): {0:0.00}%", Util.GetErrorPercent(d50, abaqus41))).AddClosedTag("br");;
                span.Add("paragraph").Text(string.Format("Err at node 12 (56) (displacement): {0:0.00}%", Util.GetErrorPercent(d56, abaqus12))).AddClosedTag("br");;
                span.Add("paragraph").Text(string.Format("Err at node 08 (50) (displacement): {0:0.00}%", Util.GetErrorPercent(d57, abaqus8))).AddClosedTag("br");;
            }

            {//element stress
                {
                    var e81 = model.Elements[85] as TriangleElement;

                    var tr = e81.GetTransformationManager();

                    //t = 1/t;

                    var am = tr.TransformLocalToGlobal(e81.GetLocalInternalStress(LoadCase.DefaultLoadCase, 1 / 6.0, 1 / 6.0, 0) * (1 / t));
                    var at = tr.TransformLocalToGlobal(e81.GetLocalInternalStress(LoadCase.DefaultLoadCase, 1 / 6.0, 1 / 6.0, +1) * (1 / t));
                    var ab = tr.TransformLocalToGlobal(e81.GetLocalInternalStress(LoadCase.DefaultLoadCase, 1 / 6.0, 1 / 6.0, -1) * (1 / t));

                    var bm = tr.TransformLocalToGlobal(e81.GetLocalInternalStress(LoadCase.DefaultLoadCase, 4 / 6.0, 1 / 6.0, 0) * (1 / t));
                    var bt = tr.TransformGlobalToLocal(e81.GetLocalInternalStress(LoadCase.DefaultLoadCase, 4 / 6.0, 1 / 6.0, +1) * (1 / t));
                    var bb = tr.TransformLocalToGlobal(e81.GetLocalInternalStress(LoadCase.DefaultLoadCase, 4 / 6.0, 1 / 6.0, -1) * (1 / t));

                    var cm = tr.TransformLocalToGlobal(e81.GetLocalInternalStress(LoadCase.DefaultLoadCase, 1 / 6.0, 4 / 6.0, 0) * (1 / t));
                    var ct = tr.TransformLocalToGlobal(e81.GetLocalInternalStress(LoadCase.DefaultLoadCase, 1 / 6.0, 4 / 6.0, +1) * (1 / t));
                    var cb = tr.TransformLocalToGlobal(e81.GetLocalInternalStress(LoadCase.DefaultLoadCase, 1 / 6.0, 4 / 6.0, -1) * (1 / t));

                    var abacus_at = new CauchyStressTensor()
                    {
                        S11 = 103.814E-03, S22 = 249.185E-03, S12 = 1.03438, S21 = 1.03438
                    } *-1e9;
                    var abacus_bt = new CauchyStressTensor()
                    {
                        S11 = -34.7168E-03, S22 = -538.942E-03, S12 = 1.03438, S21 = 1.08243
                    } *-1e9;
                    var abacus_ct = new CauchyStressTensor()
                    {
                        S11 = -201.062E-03, S22 = -1.18348, S12 = 747.243E-03, S21 = 747.243E-03
                    } *-1e9;

                    var e1 = Util.GetErrorPercent(at, abacus_ct);
                    var e2 = Util.GetErrorPercent(bt, abacus_at);
                    var e3 = Util.GetErrorPercent(ct, abacus_bt);

                    span.Add("paragraph").Text(string.Format("Validation output for element stress:"));

                    span.Add("paragraph").Text(string.Format("Err at p1 element 81 (stress): {0:0.00}%", e1)).AddClosedTag("br");
                    span.Add("paragraph").Text(string.Format("Err at p2 element 81 (stress): {0:0.00}%", e2)).AddClosedTag("br");
                    span.Add("paragraph").Text(string.Format("Err at p3 element 81 (stress): {0:0.00}%", e3)).AddClosedTag("br");

                    //in abaqus e81 connected to 8-12-41
                    //in bfe e85 connected to 57-56-50
                }
            }

            return(val);
        }
Beispiel #8
0
        public override TriangleCoordinatedMechanicalProperties GetMaterialPropertiesAt(TriangleElement targetElement, params double[] isoCoords)
        {
            var buf = new TriangleCoordinatedMechanicalProperties();
            var mat = new AnisotropicMaterialInfo();

            mat.Ex = mat.Ey = mat.Ez = this.E;

            mat.NuXy         = mat.NuYx =
                mat.NuYz     = mat.NuZy =
                    mat.NuXz = mat.NuZx =
                        this.Nu;

            buf.Matterial = mat;

            return(buf);
        }
        /// <summary>
        /// convert abaqus iso coords to bfe coords
        /// </summary>
        /// <param name="elm">target triangle element</param>
        /// <param name="elementTransformation">target triangle element</param>
        /// <param name="v">coordinations in <see cref="elm"/>'s local coordination system (abaqus)</param>
        /// <returns></returns>
        public static double[] AbaqusCoord2BfeCoord(TriangleElement elm, Vector v)
        {
            ///abaqus local coordination def: comment from https://engineering.stackexchange.com/questions/48285/abaqus-stri3-element-local-coordination-system?noredirect=1#comment87622_48285
            ///bfe local coordination def: comment from

            {
                //abaqus
                var v12 = elm.Nodes[1].Location - elm.Nodes[0].Location; //from node 2 to node 1
                var v13 = elm.Nodes[2].Location - elm.Nodes[0].Location; //from node 3 to node 1

                var n = Vector.Cross(v12, v13).GetUnit();                //unit of positive normal

                var cosOneTenth = Math.Cos(0.1 * Math.PI / 180);         //cos(0.1 deg)

                var takeI        = false;                                //take projection of I vector as local x dir
                var cos_normal_i = Vector.Dot(n, Vector.I);              //cos angle between I and positive normal unit
                var angle_n_i    = Math.Acos(cos_normal_i) * 180.0 / Math.PI;

                //due to Math.Acos documentation, 0° ≤ angle_n_i ≤ 180°
                if (angle_n_i < 179.9 && angle_n_i > 0.1)
                {
                    takeI = true;
                }
                else
                {
                    takeI = false;
                }

                var _1Axis = takeI ? Vector.I : Vector.J;//needs to be projected on the plane with normal of `n`

                //vector to plane project https://www.maplesoft.com/support/help/maple/view.aspx?path=MathApps%2FProjectionOfVectorOntoPlane

                var alpha = Vector.Dot(n, _1Axis) / n.Length;

                var proj1 = _1Axis - alpha * n;            //it is local x axis

                var local1 = proj1;                        //local x axis in global 3d
                var local3 = n;                            //local y axis in global 3d
                var local2 = Vector.Cross(local3, local1); //local z axis in global 3d

                var lamX = local1.GetUnit();               //Lambda_X
                var lamY = local2.GetUnit();               //Lambda_Y
                var lamZ = local3.GetUnit();               //Lambda_Z

                var lambda = Matrix.OfJaggedArray(new[]    //eq. 5.13
                {
                    new[] { lamX.X, lamY.X, lamZ.X },
                    new[] { lamX.Y, lamY.Y, lamZ.Y },
                    new[] { lamX.Z, lamY.Z, lamZ.Z }
                });

                var tr = TransformManagerL2G.MakeFromLambdaMatrix(lambda.AsMatrix());

                //lambda for transform between abaqus local coordination system <> global system

                //first need to convert v from element coord system to
                //TODO: these are right only if both abaqus and bfe local system origins are same

                Vector local;

                {//transform from abaus local to bfe local
                    var abaqusLocal = v;
                    var global      = tr.TransformLocalToGlobal(abaqusLocal);
                    var bfeLocal    = elm.GetTransformationManager().TransformGlobalToLocal(global);

                    local = bfeLocal;
                }


                return(new double[] { local.X, local.Y, local.Z });
            }
        }
        public ValidationResult Validate()
        {
            var val = new ValidationResult();

            //var magic = 0;

            //example #13 p175

            #region creating model

            var model = new Model();

            var l = UnitConverter.In2M(40);
            var w = UnitConverter.In2M(10);
            var h = UnitConverter.In2M(5);
            var t = UnitConverter.In2M(0.25);

            var e  = UnitConverter.Ksi2Pas(10000); //10'000 ksi
            var no = 0.3;

            var n = 9;

            var xSpan = l / (n - 1);

            var nodes = new Node[n][];

            for (var i = 0; i < n; i++)
            {
                var x = i * xSpan;

                nodes[i] = new Node[7];

                nodes[i][0] = new Node(x, 0, 0);
                nodes[i][1] = new Node(x, w / 2, 0);
                nodes[i][2] = new Node(x, w, 0);

                nodes[i][3] = new Node(x, w / 2, h / 2);

                nodes[i][4] = new Node(x, 0, h);
                nodes[i][5] = new Node(x, w / 2, h);
                nodes[i][6] = new Node(x, w, h);

                model.Nodes.AddRange(nodes[i]);
            }

            var pairs = new int[6][];

            pairs[0] = new int[] { 0, 1 };
            pairs[1] = new int[] { 1, 2 };
            pairs[2] = new int[] { 1, 3 };
            pairs[3] = new int[] { 3, 5 };
            pairs[4] = new int[] { 4, 5 };
            pairs[5] = new int[] { 5, 6 };


            var mat = new Materials.UniformIsotropicMaterial(e, no);
            var sec = new Sections.UniformParametric2DSection(t);


            for (var i = 0; i < n - 1; i++)
            {
                for (int j = 0; j < 6; j++)
                {
                    var n11 = nodes[i][pairs[j][0]];
                    var n12 = nodes[i][pairs[j][1]];

                    var n21 = nodes[i + 1][pairs[j][0]];
                    var n22 = nodes[i + 1][pairs[j][1]];

                    {
                        var elm1 = new TriangleElement()
                        {
                            Material = mat, Section = sec
                        };

                        elm1.Nodes[0] = n11;
                        elm1.Nodes[1] = n12;
                        elm1.Nodes[2] = n21;

                        model.Elements.Add(elm1);

                        var elm2 = new TriangleElement()
                        {
                            Material = mat, Section = sec
                        };

                        elm2.Nodes[0] = n21;
                        elm2.Nodes[1] = n22;
                        elm2.Nodes[2] = n12;

                        model.Elements.Add(elm2);
                    }
                }
            }

            //loading
            nodes.Last()[0].Loads.Add(new NodalLoad(new Force(0, UnitConverter.Kip2N(1.6), 0, 0, 0, 0)));
            nodes.Last()[6].Loads.Add(new NodalLoad(new Force(0, -UnitConverter.Kip2N(1.6), 0, 0, 0, 0)));

            nodes[0].ToList().ForEach(i => i.Constraints = Constraints.Fixed);

            #endregion

            model.Trace.Listeners.Add(new BriefFiniteElementNet.Common.ConsoleTraceListener());
            new ModelWarningChecker().CheckModel(model);



            model.Solve();

            var A = nodes.Last()[2];
            var B = nodes.Last()[4];
            var C = nodes.First()[1];
            var D = nodes.First()[0];
            var E = nodes.Last()[6];

            /*
             * for (int i = 0; i < nodes.Last().Length; i++)
             * {
             *  nodes.Last()[i].Label = i.ToString();
             * }
             */

            /**/
            A.Label = "A";
            B.Label = "B";
            C.Label = "C";
            D.Label = "D";
            E.Label = "E";
            /**/


            var n50 = model.Nodes[50];
            var n56 = model.Nodes[56];
            var n57 = model.Nodes[57];



            val.Title = "I Beam torsion with triangle element";

            var da = 1 / 0.0254 * A.GetNodalDisplacement().Displacements;        // [inch]
            var db = 1 / 0.0254 * B.GetNodalDisplacement().Displacements;        // [inch]

            var d50 = 1 / 0.0254 * n50.GetNodalDisplacement().Displacements;     // [inch]
            var d56 = 1 / 0.0254 * n56.GetNodalDisplacement().Displacements;     // [inch]
            var d57 = 1 / 0.0254 * n57.GetNodalDisplacement().Displacements;     // [inch]

            var sap2000Da = new Vector(-0.014921, 0.085471, 0.146070);           //tbl 7.14
            var sap2000Db = new Vector(-0.014834, -0.085475, -0.144533);         //tbl 7.14

            var abaqusDa = new Vector(-15.4207E-03, 88.2587E-03, 150.910E-03);   //node 9
            var abaqusDb = new Vector(-15.3246E-03, -88.2629E-03, -148.940E-03); //node 5

            var abaqus8  = new Vector(-120.875E-06, 88.3894E-03, -1.01662E-03);  //node 8
            var abaqus12 = new Vector(15.3931E-03, 89.1206E-03, -149.515E-03);   //node 12
            var abaqus41 = new Vector(-189.084E-06, 72.3778E-03, -734.918E-06);  //node 41

            Console.WriteLine("Err at A against abaqus (displacement): {0:0.00}%", GetError(da, abaqusDa));
            Console.WriteLine("Err at B against abaqus (displacement): {0:0.00}%", GetError(db, abaqusDb));

            Console.WriteLine("Err at 41 (57) against abaqus (displacement): {0:0.00}%", GetError(d50, abaqus41));
            Console.WriteLine("Err at 12 (56) against abaqus (displacement): {0:0.00}%", GetError(d56, abaqus12));
            Console.WriteLine("Err at 08 (50) against abaqus (displacement): {0:0.00}%", GetError(d57, abaqus8));


            model.ReIndexElements();
            model.ReIndexNodes();

            //ModelVisualizerControl.VisualizeInNewWindow(model);

            {
                var e81 = model.Elements[85] as TriangleElement;


                var tr = e81.GetTransformationManager();

                //t = 1/t;

                var am = tr.TransformLocalToGlobal(e81.GetLocalInternalStress(LoadCase.DefaultLoadCase, 1 / 6.0, 1 / 6.0, 0) * (1 / t));
                var at = tr.TransformLocalToGlobal(e81.GetLocalInternalStress(LoadCase.DefaultLoadCase, 1 / 6.0, 1 / 6.0, +1) * (1 / t));
                var ab = tr.TransformLocalToGlobal(e81.GetLocalInternalStress(LoadCase.DefaultLoadCase, 1 / 6.0, 1 / 6.0, -1) * (1 / t));

                var bm = tr.TransformLocalToGlobal(e81.GetLocalInternalStress(LoadCase.DefaultLoadCase, 4 / 6.0, 1 / 6.0, 0) * (1 / t));
                var bt = tr.TransformLocalToGlobal(e81.GetLocalInternalStress(LoadCase.DefaultLoadCase, 4 / 6.0, 1 / 6.0, +1) * (1 / t));
                var bb = tr.TransformLocalToGlobal(e81.GetLocalInternalStress(LoadCase.DefaultLoadCase, 4 / 6.0, 1 / 6.0, -1) * (1 / t));

                var cm = tr.TransformLocalToGlobal(e81.GetLocalInternalStress(LoadCase.DefaultLoadCase, 1 / 6.0, 4 / 6.0, 0) * (1 / t));
                var ct = tr.TransformLocalToGlobal(e81.GetLocalInternalStress(LoadCase.DefaultLoadCase, 1 / 6.0, 4 / 6.0, +1) * (1 / t));
                var cb = tr.TransformLocalToGlobal(e81.GetLocalInternalStress(LoadCase.DefaultLoadCase, 1 / 6.0, 4 / 6.0, -1) * (1 / t));

                var abacus_at = new CauchyStressTensor()
                {
                    S11 = 103.814E-03, S22 = 249.185E-03, S12 = 1.03438, S21 = 1.03438
                } *-1e9;
                var abacus_bt = new CauchyStressTensor()
                {
                    S11 = -34.7168E-03, S22 = -538.942E-03, S12 = 1.03438, S21 = 1.08243
                } *-1e9;
                var abacus_ct = new CauchyStressTensor()
                {
                    S11 = -201.062E-03, S22 = -1.18348, S12 = 747.243E-03, S21 = 747.243E-03
                } *-1e9;

                var e1 = GetError(at, abacus_ct);
                var e2 = GetError(bt, abacus_at);
                var e3 = GetError(ct, abacus_bt);

                Console.WriteLine("Err at p1 element 81 (stress): {0:0.00}%", e1);
                Console.WriteLine("Err at p2 element 81 (stress): {0:0.00}%", e2);
                Console.WriteLine("Err at p3 element 81 (stress): {0:0.00}%", e3);

                //in abaqus e81 connected to 8-12-41
                //in bfe e85 connected to 57-56-50
            }

            for (int i = 0; i < model.Elements.Count; i++)
            {
                model.Elements[i].Label = i.ToString();
            }

            throw new NotImplementedException();
        }
        static Model Generate3DTriangleElementGridTest(int m, int n, int l)
        {
            var buf = new Model();
            var dx  = 0.15;
            var dy  = 0.15;
            var dz  = 0.15;

            var nodes = new Node[m, n, l];

            for (int i = 0; i < m; i++)
            {
                for (int j = 0; j < n; j++)
                {
                    for (int k = 0; k < l; k++)
                    {
                        var pos = new Point(j * dx, i * dy, k * dz);
                        var nde = new Node()
                        {
                            Location = pos
                        };
                        buf.Nodes.Add(nde);
                        nodes[i, j, k] = nde;
                    }
                }
            }

            //elements parallel to XZ
            for (int j = 0; j < n; j++)
            {
                for (int i = 0; i < m - 1; i++)
                {
                    for (int k = 0; k < l - 1; k++)
                    {
                        {
                            var elm2 = new TriangleElement();
                            elm2.Nodes[0] = nodes[i, j, k];
                            elm2.Nodes[1] = nodes[i, j, k + 1];
                            elm2.Nodes[2] = nodes[i + 1, j, k];

                            buf.Elements.Add(elm2);
                        }

                        {
                            var elm2 = new TriangleElement();
                            elm2.Nodes[0] = nodes[i + 1, j, k + 1];
                            elm2.Nodes[1] = nodes[i, j, k + 1];
                            elm2.Nodes[2] = nodes[i + 1, j, k];

                            buf.Elements.Add(elm2);
                        }
                    }
                }
            }


            //elements parallel to YZ
            for (int i = 0; i < m; i++)
            {
                for (int j = 0; j < n - 1; j++)
                {
                    for (int k = 0; k < l - 1; k++)
                    {
                        {
                            var elm2 = new TriangleElement();
                            elm2.Nodes[0] = nodes[i, j, k];
                            elm2.Nodes[1] = nodes[i, j, k + 1];
                            elm2.Nodes[2] = nodes[i, j + 1, k];

                            buf.Elements.Add(elm2);
                        }

                        {
                            var elm2 = new TriangleElement();
                            elm2.Nodes[0] = nodes[i, j + 1, k + 1];
                            elm2.Nodes[1] = nodes[i, j, k + 1];
                            elm2.Nodes[2] = nodes[i, j + 1, k];

                            buf.Elements.Add(elm2);
                        }
                    }
                }
            }

            //elements parallel to XY
            for (int k = 0; k < l; k++)
            {
                for (int j = 0; j < n - 1; j++)
                {
                    for (int i = 0; i < m - 1; i++)
                    {
                        {
                            var elm2 = new TriangleElement();
                            elm2.Nodes[0] = nodes[i, j, k];
                            elm2.Nodes[1] = nodes[i + 1, j, k];
                            elm2.Nodes[2] = nodes[i, j + 1, k];

                            buf.Elements.Add(elm2);
                        }

                        {
                            var elm2 = new TriangleElement();
                            elm2.Nodes[0] = nodes[i + 1, j + 1, k];
                            elm2.Nodes[1] = nodes[i + 1, j, k];
                            elm2.Nodes[2] = nodes[i, j + 1, k];

                            buf.Elements.Add(elm2);
                        }
                    }
                }
            }
            double t  = 0.003;
            double E  = 210e9;
            double nu = 0.3;


            foreach (var elm in buf.Elements)
            {
                var triElm = elm as TriangleElement;


                if (triElm == null)
                {
                    continue;
                }

                triElm.Material            = new UniformIsotropicMaterial(E, nu);
                triElm.Section             = new UniformParametric2DSection(t);
                triElm.Behavior            = PlaneElementBehaviours.FullThinShell;
                triElm.MembraneFormulation = MembraneFormulation.PlaneStress;
            }


            for (int i = 0; i < m; i++)
            {
                nodes[i, 0, 0].Constraints = Constraint.Fixed;
            }
            for (int i = 0; i < m; i++)
            {
                nodes[i, n - 1, 0].Loads.Add(new NodalLoad(new Force(0, 2500, 2500, 0, 0, 0), LoadCase.DefaultLoadCase));
            }


            return(buf);
        }
        public ValidationResult Validate()
        {
            var val = new ValidationResult();

            //var magic = 0;

            //example #13 p175

            #region creating model

            var model = new Model();

            var l = UnitConverter.In2M(40);
            var w = UnitConverter.In2M(10);
            var h = UnitConverter.In2M(5);
            var t = UnitConverter.In2M(0.25);

            var e  = UnitConverter.Ksi2Pas(10000); //10'000 ksi
            var no = 0.3;

            var n = 9;

            var xSpan = l / (n - 1);

            var nodes = new Node[n][];

            for (var i = 0; i < n; i++)
            {
                var x = i * xSpan;

                nodes[i] = new Node[7];

                nodes[i][0] = new Node(x, 0, 0);
                nodes[i][1] = new Node(x, w / 2, 0);
                nodes[i][2] = new Node(x, w, 0);

                nodes[i][3] = new Node(x, w / 2, h / 2);

                nodes[i][4] = new Node(x, 0, h);
                nodes[i][5] = new Node(x, w / 2, h);
                nodes[i][6] = new Node(x, w, h);

                model.Nodes.AddRange(nodes[i]);
            }

            var pairs = new int[6][];

            pairs[0] = new int[] { 0, 1 };
            pairs[1] = new int[] { 1, 2 };
            pairs[2] = new int[] { 1, 3 };
            pairs[3] = new int[] { 3, 5 };
            pairs[4] = new int[] { 4, 5 };
            pairs[5] = new int[] { 5, 6 };


            var mat = new Materials.UniformIsotropicMaterial(e, no);
            var sec = new Sections.UniformParametric2DSection(t);


            for (var i = 0; i < n - 1; i++)
            {
                for (int j = 0; j < 6; j++)
                {
                    var n11 = nodes[i][pairs[j][0]];
                    var n12 = nodes[i][pairs[j][1]];

                    var n21 = nodes[i + 1][pairs[j][0]];
                    var n22 = nodes[i + 1][pairs[j][1]];

                    {
                        var elm1 = new TriangleElement()
                        {
                            Material = mat, Section = sec
                        };

                        elm1.Nodes[0] = n11;
                        elm1.Nodes[1] = n12;
                        elm1.Nodes[2] = n21;

                        model.Elements.Add(elm1);

                        var elm2 = new TriangleElement()
                        {
                            Material = mat, Section = sec
                        };

                        elm2.Nodes[0] = n21;
                        elm2.Nodes[1] = n22;
                        elm2.Nodes[2] = n12;

                        model.Elements.Add(elm2);
                    }
                }
            }

            //loading
            nodes.Last()[0].Loads.Add(new NodalLoad(new Force(0, UnitConverter.Kip2N(1.6), 0, 0, 0, 0)));
            nodes.Last()[6].Loads.Add(new NodalLoad(new Force(0, -UnitConverter.Kip2N(1.6), 0, 0, 0, 0)));

            nodes[0].ToList().ForEach(i => i.Constraints = Constraints.Fixed);

            #endregion

            model.Trace.Listeners.Add(new BriefFiniteElementNet.Common.ConsoleTraceListener());
            new ModelWarningChecker().CheckModel(model);


            //ModelVisualizerControl.VisualizeInNewWindow(model);

            model.Solve();

            var A = nodes.Last()[2];
            var B = nodes.Last()[4];
            var C = nodes.First()[1];
            var D = nodes.First()[0];
            var E = nodes.Last()[6];

            /*
             * for (int i = 0; i < nodes.Last().Length; i++)
             * {
             *  nodes.Last()[i].Label = i.ToString();
             * }
             */

            /**/
            A.Label = "A";
            B.Label = "B";
            C.Label = "C";
            D.Label = "D";
            E.Label = "E";
            /**/


            val.Title = "I Beam torsion with triangle element";

            var da = 1 / 0.0254 * A.GetNodalDisplacement().Displacements;        // [inch]
            var db = 1 / 0.0254 * B.GetNodalDisplacement().Displacements;        // [inch]

            var sap2000Da = new Vector(-0.014921, 0.085471, 0.146070);           //tbl 7.14
            var sap2000Db = new Vector(-0.014834, -0.085475, -0.144533);         //tbl 7.14

            var abaqusDa = new Vector(-15.4207E-03, 88.2587E-03, 150.910E-03);   //node 9
            var abaqusDb = new Vector(-15.3246E-03, -88.2629E-03, -148.940E-03); //node 5

            Console.WriteLine("Err at A against abaqus (displacement): {0:0.00}%", GetError(da, abaqusDa));
            Console.WriteLine("Err at B against abaqus (displacement): {0:0.00}%", GetError(db, abaqusDb));


            {
                var e81 = model.Elements[85] as TriangleElement;

                var stress = e81.GetLocalInternalStress(LoadCase.DefaultLoadCase, 1 / 6.0, 1 / 6.0, 0);
            }

            for (int i = 0; i < model.Elements.Count; i++)
            {
                model.Elements[i].Label = i.ToString();
            }

            throw new NotImplementedException();
        }
Beispiel #13
0
 /// <summary>
 /// Gets the material properties at defined length.
 /// </summary>
 /// <param name="isoCoords">The location, in isoparametric coordination</param>
 /// <returns>the mechanical properties of element</returns>
 public abstract TriangleCoordinatedMechanicalProperties GetMaterialPropertiesAt
     (TriangleElement targetElement, params double[] isoCoords);