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); }
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); }
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(); }
/// <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);