private void Set_ElementNodal_DisplayValues_Displacement_y() { int NNPE = ElementNodes.Length; for (int i = 0; i < NNPE; i++) { Node_ND_Unknowns_VectorField Unknown_i = (Node_ND_Unknowns_VectorField)ElementNodes[i].Unknowns; ElementNodes[i].Unknowns.DisplayValue = Unknown_i.Unknowns.Values[1]; } }
public Matrix_Jagged Displacements; //Nodal values of Displacements public override void AdjustFAndK(ref Vector F, ref Matrix_Jagged K) { int NNPE = ElementNodes.Length; for (int i = 0; i < NNPE; i++) { Node_ND_Unknowns_VectorField Unknowns_i = (Node_ND_Unknowns_VectorField)ElementNodes[i].Unknowns; int[] Ip = Unknowns_i.UnknownDoFs; //position of unkonw in globle matrix F.Values[Ip[0]] = 1.0E20 * Displacements.Values[i][0]; //penalty for Uix K.Values[Ip[0]][Ip[0]] = 1.0E20; F.Values[Ip[1]] = 1.0E20 * Displacements.Values[i][1]; //penalty for Uiy K.Values[Ip[1]][Ip[1]] = 1.0E20; } }
public override void Assemble(ref Vector F, Vector Fe)//override assemblage { int Ip; int NNPE = ElementNodes.Length; for (int p = 0; p < NNPE; p++) { Node_ND_Unknowns_VectorField Unknown_p = (Node_ND_Unknowns_VectorField)ElementNodes[p].Unknowns; int NDFp = Unknown_p.UnknownDoFs.Length; for (int i = 0; i < NDFp; i++) { Ip = Unknown_p.UnknownDoFs[i]; F.Values[Ip] += Fe.Values[NDFp * p + i]; } } }
public override Matrix_Jagged IntegralArgument_Ke(Vector Xi) { int NNPE = ElementNodes.Length; double Det_Jac; Vector X; Matrix_Jagged DNDX; Matrix_Jagged Ke_Arg = new Matrix_Jagged(NNPE * 2, NNPE * 2); Interpolator.Calculate_X_DNDX_DetJacobian(Xi, ElementNodes, out X, out DNDX, out Det_Jac); for (int p = 0; p < NNPE; p++)//p defines node number { Node_ND_Unknowns_VectorField Unknown_p = (Node_ND_Unknowns_VectorField)ElementNodes[p].Unknowns; int NDFp = Unknown_p.UnknownDoFs.Length; for (int i = 0; i < NDFp; i++) //loop at x direction { for (int q = 0; q < NNPE; q++) // { Node_ND_Unknowns_VectorField Unknown_q = (Node_ND_Unknowns_VectorField)ElementNodes[q].Unknowns; int NDFq = Unknown_q.UnknownDoFs.Length; for (int j = 0; j < NDFq; j++)//loop at y direction { double temp = 0; for (int m = 0; m < 2; m++) //loop at x direction { for (int n = 0; n < 2; n++) //loop at y direction { double Eimjn = 0; Eimjn = GetE(i, m, j, n);//obtain constitutive matrix temp += DNDX.Values[p][m] * Eimjn * DNDX.Values[q][n]; } } Ke_Arg.Values[NDFp * p + i][NDFq * q + j] = temp * Det_Jac; //store Ke } } } } return(Ke_Arg); }
private void RunButton_Click(object sender, EventArgs e) { FEMSolver = new FEMSolver_ND_Static(); int NE_W = Convert.ToInt32(NE_WTextBox.Text); int NE_H = Convert.ToInt32(NE_HTextBox.Text);; int NE = NE_W * NE_H; int NNPE_W = Convert.ToInt32(NNPE_WTextBox.Text); int NNPE_H = Convert.ToInt32(NNPE_HTextBox.Text); int NN_W = NE_W * (NNPE_W - 1) + 1; int NN_H = NE_H * (NNPE_H - 1) + 1; int NN = NN_W * NN_H; FEMSolver.Unknowns_NDoF = 2 * NN;//Define D.O.F.s int index = 0; Node_ND[] Nodes = new Node_ND[NN];//set up node set double Width = Convert.ToDouble(WTextBox.Text); double Height = Convert.ToDouble(HTextBox.Text); Vector DX1 = new Vector(2); DX1.Values[0] = Width / Convert.ToDouble(NN_W - 1); Vector DX2 = new Vector(2); DX2.Values[1] = Height / Convert.ToDouble(NN_H - 1); for (int j = 0; j < NN_H; j++) { for (int i = 0; i < NN_W; i++) { Nodes[index] = new Node_ND();//set up node set Nodes[index].X = Convert.ToDouble(i) * DX1 + Convert.ToDouble(j) * DX2; Node_ND_Unknowns_VectorField Unknowns = new Node_ND_Unknowns_VectorField(); Unknowns.UnknownDoFs = new int[] { index *2, 2 *index + 1 }; Unknowns.Unknowns = new Vector(2); Nodes[index].Unknowns = Unknowns; index++; } } FEMSolver.Nodes = Nodes; Element_ND.Function_Scalar_X rho = new Element_ND.Function_Scalar_X(rho_Function); Element_ND.Function_Vector_X b = new Element_ND.Function_Vector_X(b_Function); ParametricInterpolation_ND_Square Interpolator = new ParametricInterpolation_ND_Square(NNPE_W, NNPE_H); //Interpolator for boundary element sets at two directions ParametricInterpolation_ND_Line Left_RightBCInterP = new ParametricInterpolation_ND_Line(NNPE_H); ParametricInterpolation_ND_Line Bottom_UpBCInterP = new ParametricInterpolation_ND_Line(NNPE_W); int NIP_Fe_W = Convert.ToInt32(Math.Ceiling(Convert.ToDouble((NNPE_W - 1) + 1) / 2.0D)); int NIP_Fe_H = Convert.ToInt32(Math.Ceiling(Convert.ToDouble((NNPE_H - 1) + 1) / 2.0D)); QuadratureRule_ND FeQuadRule = QuadratureRules_ND_Area.Make_QuadratureRule_Rectangular_Gaussian_MxNPoints(NIP_Fe_W + 1, NIP_Fe_H + 1); Integrator_ND_Quadrature FeQuad = new Integrator_ND_Quadrature(FeQuadRule); //Quadrature rules for Fe QuadratureRule_ND HorizontalBoundaryFQR = QuadratureRules_ND_Line.Make_QuadratureRule_Gaussian_NPoint(NIP_Fe_H + 1); Integrator_ND_Quadrature Horz_BFeQ = new Integrator_ND_Quadrature(HorizontalBoundaryFQR); QuadratureRule_ND Vetical_BoundaryFQR = QuadratureRules_ND_Line.Make_QuadratureRule_Gaussian_NPoint(NIP_Fe_W + 1); Integrator_ND_Quadrature Vert_BFeQ = new Integrator_ND_Quadrature(Vetical_BoundaryFQR); int NIP_Ke_W = Convert.ToInt32(Math.Ceiling(Convert.ToDouble((NNPE_W - 2) * (NNPE_W - 2) + 1) / 2.0D)); int NIP_Ke_H = Convert.ToInt32(Math.Ceiling(Convert.ToDouble((NNPE_H - 2) * (NNPE_H - 2) + 1) / 2.0D)); QuadratureRule_ND KeQuadRule = QuadratureRules_ND_Area.Make_QuadratureRule_Rectangular_Gaussian_MxNPoints(NIP_Ke_W + 1, NIP_Ke_H + 1); Integrator_ND_Quadrature KeQuad = new Integrator_ND_Quadrature(KeQuadRule); Element_ND_Elastic[] Elements = new Element_ND_Elastic[NE]; double E = 71000000000;//Al elastic modulus double G = 26500000000; index = 0; for (int j = 0; j < NE_H; j++) { for (int i = 0; i < NE_W; i++) { Elements[index] = new Element_ND_Elastic(); int Io = (NNPE_W - 1) * i + (NNPE_H - 1) * NN_W * j; Elements[index].ElementNodes = new Node_ND[NNPE_W * NNPE_H]; int indexNodes = 0; for (int l = 0; l < NNPE_H; l++) { for (int m = 0; m < NNPE_W; m++) { Elements[index].ElementNodes[indexNodes] = Nodes[Io + m + NN_W * l]; indexNodes++; } } Elements[index].rho = rho; Elements[index].b = b; Elements[index].langmuda = langmuda_Function(E, G); Elements[index].miu = miu_Function(E, G); Elements[index].Interpolator = Interpolator; Elements[index].FeQuad = FeQuad; Elements[index].KeQuad = KeQuad; index++; } } FEMSolver.Elements = Elements; double U1_1 = Convert.ToDouble(U11TextBox.Text); double U1_2 = Convert.ToDouble(U12TextBox.Text); double U2_1 = Convert.ToDouble(U21TextBox.Text); double U2_2 = Convert.ToDouble(U22TextBox.Text); double F1_1 = Convert.ToDouble(F1_Xtextbox.Text); double F1_2 = Convert.ToDouble(F1_Ytextbox.Text); double F2_1 = Convert.ToDouble(F2_Xtextbox.Text); double F2_2 = Convert.ToDouble(F2_Ytextbox.Text); int NBE = 0;//NBE is number of node on on element side if (DirectionListBox.SelectedIndex == 0) { NBE = NE_H; } else { NBE = NE_W; } BoundaryElement_ND_Elastic_Line_SteadyState_DisplacementOnNode[] D_Left_BoundaryElements = new BoundaryElement_ND_Elastic_Line_SteadyState_DisplacementOnNode[NBE]; BoundaryElement_ND_Elastic_Line_SteadyState_ForceOnNode[] F_Left_BoundaryElements = new BoundaryElement_ND_Elastic_Line_SteadyState_ForceOnNode[NBE]; BoundaryElement_ND_Elastic_Line_SteadyState_DisplacementOnNode[] D_Right_BoundaryElements = new BoundaryElement_ND_Elastic_Line_SteadyState_DisplacementOnNode[NBE]; BoundaryElement_ND_Elastic_Line_SteadyState_ForceOnNode[] F_Right_BoundaryElements = new BoundaryElement_ND_Elastic_Line_SteadyState_ForceOnNode[NBE]; if (DirectionListBox.SelectedIndex == 0) //Left and Right { if (LeftBClistbox.SelectedIndex == 0) // Left Displacement { for (int i = 0; i < NE_H; i++) { D_Left_BoundaryElements[i] = new BoundaryElement_ND_Elastic_Line_SteadyState_DisplacementOnNode(); D_Left_BoundaryElements[i].Displacements = new Matrix_Jagged(NNPE_H, 2); D_Left_BoundaryElements[i].ElementNodes = new Node_ND[NNPE_H]; for (int j = 0; j < NNPE_H; j++) { D_Left_BoundaryElements[i].Displacements.Values[j][0] = U1_1; D_Left_BoundaryElements[i].Displacements.Values[j][1] = U1_2; D_Left_BoundaryElements[i].ElementNodes[j] = Nodes[i * (NNPE_H - 1) * NN_W + j * NN_W]; } } } if (LeftBClistbox.SelectedIndex == 1)//Left Force { for (int i = 0; i < NE_H; i++) { F_Left_BoundaryElements[i] = new BoundaryElement_ND_Elastic_Line_SteadyState_ForceOnNode(); F_Left_BoundaryElements[i].ForceX = new Vector(NNPE_H); F_Left_BoundaryElements[i].ForceY = new Vector(NNPE_H); F_Left_BoundaryElements[i].ElementNodes = new Node_ND[NNPE_H]; F_Left_BoundaryElements[i].Interpolator = Left_RightBCInterP; F_Left_BoundaryElements[i].FeQuad = Horz_BFeQ; for (int j = 0; j < NNPE_H; j++) { F_Left_BoundaryElements[i].ForceX.Values[j] = F1_1; F_Left_BoundaryElements[i].ForceY.Values[j] = F1_2; F_Left_BoundaryElements[i].ElementNodes[j] = Nodes[i * (NNPE_H - 1) * NN_W + j * NN_W]; } } } if (RightBClistbox.SelectedIndex == 0)// Right Displacement { for (int i = 0; i < NE_H; i++) { D_Right_BoundaryElements[i] = new BoundaryElement_ND_Elastic_Line_SteadyState_DisplacementOnNode(); D_Right_BoundaryElements[i].Displacements = new Matrix_Jagged(NNPE_H, 2); D_Right_BoundaryElements[i].ElementNodes = new Node_ND[NNPE_H]; for (int j = 0; j < NNPE_H; j++) { D_Right_BoundaryElements[i].Displacements.Values[j][0] = U2_1; D_Right_BoundaryElements[i].Displacements.Values[j][1] = U2_2; D_Right_BoundaryElements[i].ElementNodes[j] = Nodes[i * (NNPE_H - 1) * NN_W + j * NN_W + NN_W - 1]; } } } if (RightBClistbox.SelectedIndex == 1)//Right Force { for (int i = 0; i < NE_H; i++) { F_Right_BoundaryElements[i] = new BoundaryElement_ND_Elastic_Line_SteadyState_ForceOnNode(); F_Right_BoundaryElements[i].ForceX = new Vector(NNPE_H); F_Right_BoundaryElements[i].ForceY = new Vector(NNPE_H); F_Right_BoundaryElements[i].ElementNodes = new Node_ND[NNPE_H]; F_Right_BoundaryElements[i].Interpolator = Left_RightBCInterP; F_Right_BoundaryElements[i].FeQuad = Horz_BFeQ; for (int j = 0; j < NNPE_H; j++) { F_Right_BoundaryElements[i].ForceX.Values[j] = F2_1; F_Right_BoundaryElements[i].ForceY.Values[j] = F2_2; F_Right_BoundaryElements[i].ElementNodes[j] = Nodes[i * (NNPE_H - 1) * NN_W + j * NN_W + NN_W - 1]; } } } } if (DirectionListBox.SelectedIndex == 1) //Vertical Directions { if (LeftBClistbox.SelectedIndex == 0) // Bottom Displacement { for (int i = 0; i < NE_W; i++) { D_Left_BoundaryElements[i] = new BoundaryElement_ND_Elastic_Line_SteadyState_DisplacementOnNode(); D_Left_BoundaryElements[i].Displacements = new Matrix_Jagged(NNPE_W, 2); D_Left_BoundaryElements[i].ElementNodes = new Node_ND[NNPE_W]; for (int j = 0; j < NNPE_W; j++) { D_Left_BoundaryElements[i].Displacements.Values[j][0] = U1_1; D_Left_BoundaryElements[i].Displacements.Values[j][1] = U1_2; D_Left_BoundaryElements[i].ElementNodes[j] = Nodes[i * (NNPE_W - 1) + j]; } } } if (LeftBClistbox.SelectedIndex == 1)//Bottom Force { for (int i = 0; i < NE_W; i++) { F_Left_BoundaryElements[i] = new BoundaryElement_ND_Elastic_Line_SteadyState_ForceOnNode(); F_Left_BoundaryElements[i].ForceX = new Vector(NNPE_W); F_Left_BoundaryElements[i].ForceY = new Vector(NNPE_W); F_Left_BoundaryElements[i].ElementNodes = new Node_ND[NNPE_W]; F_Left_BoundaryElements[i].Interpolator = Bottom_UpBCInterP; F_Left_BoundaryElements[i].FeQuad = Vert_BFeQ; for (int j = 0; j < NNPE_W; j++) { F_Left_BoundaryElements[i].ForceX.Values[j] = F1_1; F_Left_BoundaryElements[i].ForceY.Values[j] = F1_2; F_Left_BoundaryElements[i].ElementNodes[j] = Nodes[i * (NNPE_W - 1) + j]; } } } if (RightBClistbox.SelectedIndex == 0)// Top Displacement { for (int i = 0; i < NE_W; i++) { D_Right_BoundaryElements[i] = new BoundaryElement_ND_Elastic_Line_SteadyState_DisplacementOnNode(); D_Right_BoundaryElements[i].Displacements = new Matrix_Jagged(NNPE_W, 2); D_Right_BoundaryElements[i].ElementNodes = new Node_ND[NNPE_W]; for (int j = 0; j < NNPE_W; j++) { D_Right_BoundaryElements[i].Displacements.Values[j][0] = U2_1; D_Right_BoundaryElements[i].Displacements.Values[j][1] = U2_2; D_Right_BoundaryElements[i].ElementNodes[j] = Nodes[NN_W * (NN_H - 1) + i * (NNPE_W - 1) + j]; } } } if (RightBClistbox.SelectedIndex == 1)//Top Force { for (int i = 0; i < NE_W; i++) { F_Right_BoundaryElements[i] = new BoundaryElement_ND_Elastic_Line_SteadyState_ForceOnNode(); F_Right_BoundaryElements[i].ForceX = new Vector(NNPE_W); F_Right_BoundaryElements[i].ForceY = new Vector(NNPE_W); F_Right_BoundaryElements[i].ElementNodes = new Node_ND[NNPE_W]; F_Right_BoundaryElements[i].Interpolator = Bottom_UpBCInterP; F_Right_BoundaryElements[i].FeQuad = Vert_BFeQ; for (int j = 0; j < NNPE_W; j++) { F_Right_BoundaryElements[i].ForceX.Values[j] = F2_1; F_Right_BoundaryElements[i].ForceY.Values[j] = F2_2; F_Right_BoundaryElements[i].ElementNodes[j] = Nodes[NN_W * (NN_H - 1) + i * (NNPE_W - 1) + j]; } } } } FEMSolver.BoundaryElements = new BoundaryElement_ND_Static[NBE * 2]; for (int qq = 0; qq < NBE; qq++) { if (LeftBClistbox.SelectedIndex == 0) { FEMSolver.BoundaryElements[qq] = D_Left_BoundaryElements[qq]; } if (LeftBClistbox.SelectedIndex == 1) { FEMSolver.BoundaryElements[qq] = F_Left_BoundaryElements[qq]; } if (RightBClistbox.SelectedIndex == 0) { FEMSolver.BoundaryElements[NBE + qq] = D_Right_BoundaryElements[qq]; } if (RightBClistbox.SelectedIndex == 1) { FEMSolver.BoundaryElements[NBE + qq] = F_Right_BoundaryElements[qq]; } } if (RightBClistbox.SelectedIndex == 1 && LeftBClistbox.SelectedIndex == 1) { MessageBox.Show("No Lateral Forces Allowed on Both Sides"); } FEMSolver.SolveFEMSystem(); Node_ND.Set_UnknownForNode(FEMSolver.Nodes, FEMSolver.U); // Nodal Solutions RePlot(); }