📄 iso_axi.c
字号:
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 + -