⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 iso_axi.c

📁 C 开发的有限元软件
💻 C
📖 第 1 页 / 共 2 页
字号:
   for (i = 1 ; i <= ninteg ; i++) {      sg  = VectorData (xpoints) [i];      rr=(minx+maxx)/2+sg*(maxx-minx)/2;      ZeroMatrix(NN);      for (j = 1 ; j <= numnodes ; j++) {        MatrixData (NN) [1][2*j - 1] = MatrixData (N) [j][i] ;        MatrixData (NN) [1][2*j]     = 0.0;        MatrixData (NN) [2][2*j - 1] = 0.0;        MatrixData (NN) [2][2*j]     = MatrixData (N) [j][i] ;      }      MatrixRows (Nt) = MatrixRows (temp) = MatrixCols (NN);      TransposeMatrix (Nt, NN);      MultiplyMatrices (tempM, Nt, NN);      ScaleMatrix (tempM, tempM, VectorData (weights) [i]*VectorData (jac) [i], 0.0);      ScaleMatrix (tempM, tempM, rr*4*acos(0), 0.0);      AddMatrices (element -> M, element -> M, tempM);   }   ScaleMatrix (element -> M, element -> M, element -> material -> rho, 0.0);} Matrix IsoAQuadLocalB (element, numnodes, N, dNdx, dNdy, point,xpoints)   Element	element;   unsigned	numnodes;   Matrix	dNdx, dNdy, N;   unsigned	point;   Vector xpoints;{   unsigned		i;   double xc1,xc3,maxx,minx,rr;   double sg;   static Matrix	B = NullMatrix;   if (B == NullMatrix)       B = CreateMatrix (4,8);          xc1 = element -> node[1] -> x;      xc3 = element -> node[3] -> x;	  maxx=xc3;	  minx=xc1;       sg  = VectorData (xpoints) [point];      rr=(minx+maxx)/2+sg*(maxx-minx)/2;    for (i = 1 ; i <= numnodes ; i++) {      MatrixData (B) [1][2*i - 1] = MatrixData (dNdx) [i][point];      MatrixData (B) [1][2*i]     = 0.0;      MatrixData (B) [2][2*i - 1] = MatrixData (N) [i][point] / rr;      MatrixData (B) [2][2*i]     = 0.0;      MatrixData (B) [3][2*i - 1] = 0.0;      MatrixData (B) [3][2*i]     = MatrixData (dNdy) [i][point];      MatrixData (B) [4][2*i - 1] = MatrixData (dNdy) [i][point];      MatrixData (B) [4][2*i]     = MatrixData (dNdx) [i][point];   }   MatrixCols (B) = numnodes*2;   return B;}    Vector GlobalAQuadShapeFunctions (element, dNdxi, dNde, dNdx, dNdy,                                  ninteg,nodes)   Element	element;   int		ninteg;   Matrix	dNdxi, dNde,		dNdx, dNdy;   unsigned	nodes;{   unsigned		i,j;   static Vector	jac,			dxdxi, dxde,			dydxi, dyde = NullMatrix;   if (dyde == NullMatrix) {      dxdxi = CreateVector (4);      dxde  = CreateVector (4);      dydxi = CreateVector (4);      dyde  = CreateVector (4);      jac = CreateVector (4);   }    for (i = 1 ; i <= 4 ; i++) {      VectorData (dxdxi) [i] = 0.0;       VectorData (dxde) [i] = 0.0;       VectorData (dydxi) [i] = 0.0;       VectorData (dyde) [i] = 0.0;       VectorData (jac) [i] = 0.0;   }   for (i = 1 ; i <= ninteg ; i++) {      for (j = 1 ; j <= nodes ; j++) {         VectorData (dxdxi) [i] += MatrixData (dNdxi) [j][i]*                                   (element -> node[j] -> x);         VectorData (dxde) [i] += MatrixData (dNde) [j][i]*                                   (element -> node[j] -> x);         VectorData (dydxi) [i] += MatrixData (dNdxi) [j][i]*                                   (element -> node[j] -> y);              VectorData (dyde) [i] += MatrixData (dNde) [j][i]*                                   (element -> node[j] -> y);      }      VectorData (jac) [i] = VectorData (dxdxi)[i] * VectorData (dyde)[i] -                         VectorData (dxde)[i] * VectorData (dydxi)[i];      for (j = 1 ; j <= nodes ; j++) {         MatrixData (dNdx)[j][i] = (MatrixData (dNdxi) [j][i]*VectorData (dyde)[i] -                               MatrixData (dNde)[j][i]*VectorData (dydxi)[i])/                               VectorData (jac)[i];         MatrixData (dNdy)[j][i] = -(MatrixData (dNdxi)[j][i]*VectorData (dxde)[i] -                                MatrixData (dNde)[j][i]*VectorData (dxdxi)[i])/                                VectorData (jac)[i];       }   }   return jac;}/******************************************************************************* Function:	LocalQuadShapeFunctions** Description:  calculates the shape functions and the derivatives (w/ respect*		to xi, eta coordinates) of the shape function for a four to *		nine node axisymmetrix element	** Note:		The approach looks rather brutish, but it seems much clearer*		to me this way and we have to do each individual computation *		anyways, whether we put ourselves in a loop and use index*		notation or not ...*******************************************************************************/unsigned LocalAQuadShapeFunctions (element, ninteg, N,                                   dNdx, dNde, weights, xpoints, force_init)   Element	element;   unsigned	ninteg;   Matrix	N,		dNdx,		dNde;   unsigned	force_init;   Vector	weights,xpoints;{   unsigned		i,j,k;   double		eta,xi;   double		Nt[5];   double		de[5],dx[5];   double		*gauss_points;   double		*gauss_wts;   unsigned		numnodes;   static unsigned	prev_nodes = 0;      if (element -> node[3] -> number == element -> node[4] -> number)       numnodes = 3;   else         numnodes = 4;      if (numnodes == prev_nodes && !force_init)      return numnodes;   ninteg /= 2;	/* how many in each dimension? */   GaussPoints (ninteg, &gauss_points, &gauss_wts);      for (i = 0 ; i < ninteg ; i++) {      xi  = gauss_points [i];      for (j = 0 ; j < ninteg ; j++) {         eta = gauss_points [j];         Nt [1] = 0.25*(1 - eta)*(1 - xi);         dx [1] = 0.25*(-1 + eta);         de [1] = 0.25*(-1 + xi);         Nt [2] = 0.25*(1 - eta)*(1 + xi);         dx [2] = 0.25*(1 - eta);         de [2] = 0.25*(-1 - xi);         Nt [3] = 0.25*(1 + eta)*(1 + xi);         dx [3] = 0.25*(1 + eta);         de [3] = 0.25*(1 + xi);         Nt [4] = 0.25*(1 + eta)*(1 - xi);         dx [4] = 0.25*(-1 - eta);         de [4] = 0.25*(1 - xi);         if (numnodes == 3) {             Nt [3] += Nt [4];             dx [3] += dx [4];             de [3] += de [4];         }         for (k = 1 ; k <= 4 ; k++) {            MatrixData (N) [k][i*ninteg + j+1] = Nt [k];            MatrixData (dNdx) [k][i*ninteg + j+1] = dx [k];            MatrixData (dNde) [k][i*ninteg + j+1] = de [k];         }         VectorData (weights) [i*ninteg + j+1] = gauss_wts [j];         VectorData (xpoints)  [i*ninteg + j+1] = xi;         VectorData (xpoints)  [4+i*ninteg + j+1] = eta;       }   }   prev_nodes = numnodes;   return numnodes;}Vector IsoAQuadEquivNodalForces (element, err_count)   Element	element;   int		*err_count;{   double		L;   double		wa,wb;   double		force1,			force2;   int			count;   double		xc1,xc2,			yc1,yc2;   double		thick;   unsigned		node_a,			node_b;   unsigned		i;   static Vector 	equiv = NullMatrix;    if (equiv == NullMatrix)       equiv = CreateVector (8);   count = 0;    if (element -> numdistributed > 2) {      error ("quad element %d can have at most two distributed loads",              element -> number);      count++;   }   thick = element -> material -> t;   for (i = 1 ; i <= 8 ; i++)      VectorData (equiv) [i] = 0.0;   for (i = 1 ; i <= element -> numdistributed ; i++) {      if (element -> distributed[i] -> nvalues != 2) {         error ("load %s does not have 2 nodal values (element %d)",                 element -> distributed[i] -> name,element -> number);         count++;      }      if (element -> distributed[i] -> direction != GlobalX &&         element -> distributed[i] -> direction != GlobalY) {          error ("invalid direction specified for load %s (element %d)",                 element -> distributed[i] -> name,element -> number);          count++;      }      node_a = element -> distributed[i] -> value[1].node;      node_b = element -> distributed[i] -> value[2].node;      if (node_a < 1 || node_a > 4 || node_b < 1 || node_b > 4) {         error ("incorrect node numbering for load %s (element %d)",                 element -> distributed[i] -> name,element -> number);         count++;      }      if (node_a == node_b) {         error ("incorrect node numbering for load %s (element %d)",                 element -> distributed[i] -> name,element -> number);         count++;      }      xc1 = element -> node[node_a] -> x;      xc2 = element -> node[node_b] -> x;      yc1 = element -> node[node_a] -> y;      yc2 = element -> node[node_b] -> y;      L = sqrt ((xc1 - xc2)*(xc1 - xc2) + (yc1 - yc2)*(yc1 - yc2));      if (L <= TINY) {         error ("length of side of element %d is zero to machine precision",                 element -> number);         count ++;      } 	/* 	 * Thats all the error checking, bail out if we've had any	 */      if (count) {         *err_count = count;         return NullMatrix;      }      wa = element -> distributed[i] -> value[1].magnitude;      wb = element -> distributed[i] -> value[2].magnitude;      if (wa == wb) 		          /* uniform distributed load */         force1 = force2 = wa*L*thick/2.0;      else if (fabs(wa) > fabs(wb)) {     /* load sloping node1 to node2 */         force2 = wb*L*thick/2.0 + (wa - wb)*L*thick/6.0;         force1 = wb*L*thick/2.0 + (wa - wb)*L*thick/3.0;       }      else if (fabs(wa) < fabs(wb)) {     /* load sloping node2 to node1 */         force2 = wa*L*thick/2.0 + (wb - wa)*L*thick/6.0;         force1 = wa*L*thick/2.0 + (wb - wa)*L*thick/3.0;       }       if (element -> distributed[i] -> direction == GlobalX) {         VectorData (equiv) [2*node_a - 1] += force1;         VectorData (equiv) [2*node_b - 1] += force2;      }      else {         VectorData (equiv) [2*node_a] += force1;         VectorData (equiv) [2*node_b] += force2;      }    }	/*	 * Now that we know all is okay, allocate some memory if we	 * haven't already done so for some other element	 */   SetEquivalentForceMemory (element);   *err_count = 0;   return equiv; }*********************************************************procedure in misc.c********************************************************* /***************************************************************************** * * Function:	AxisymD * *****************************************************************************/Matrix AxisymD (element)   Element	element;{   static Matrix	D = NullMatrix;   static double	prev_nu = -99;   static double	prev_E = -99;   double 		poisson,			factor,c11,c33,c12,c13,c44,c23,c22;   if (D == NullMatrix)       D = CreateMatrix (4,4);   if (element -> material -> nu != prev_nu ||        element -> material -> E != prev_E) {      ZeroMatrix (D);}      poisson = element -> material -> nu;	  if (element -> material -> nu == 1 &&		  element -> material -> E  == 1)  {		  /* PZT5A */		  c11=12.1e10;		  c33=11.1e10;		  c12=7.54e10;		  c13=7.52e10;		  c44=2.11e10;		  c22=c11;		  c23=c13;      MatrixData (D) [1][1] = c11;      MatrixData (D) [1][2] = c12;       MatrixData (D) [1][3] = c13;      MatrixData (D) [1][4] = 0.0;      MatrixData (D) [2][1] = c12;      MatrixData (D) [2][2] = c22;       MatrixData (D) [2][3] = c23;      MatrixData (D) [2][4] = 0.0;      MatrixData (D) [3][1] = c13;      MatrixData (D) [3][2] = c23;       MatrixData (D) [3][3] = c33;      MatrixData (D) [3][4] = 0.0;      MatrixData (D) [4][1] = 0.0;      MatrixData (D) [4][2] = 0.0;       MatrixData (D) [4][3] = 0.0;      MatrixData (D) [4][4] = c44;      prev_E = element -> material -> E;      prev_nu = element -> material -> nu;   }   return D;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -