📄 elmt_plate.c
字号:
/* * ============================================================================= * ALADDIN Version 1.0 : * elmt_plate.c : Quadrilateral DKT Plate Bending Element * * Copyright (C) 1995 by Mark Austin, Xiaoguang Chen, and Wane-Jang Lin * Institute for Systems Research, * University of Maryland, College Park, MD 20742 * * This software is provided "as is" without express or implied warranty. * Permission is granted to use this software for any on any computer system * and to redistribute it freely, subject to the following restrictions: * * 1. The authors are not responsible for the consequences of use of * this software, even if they arise from defects in the software. * 2. The origin of this software must not be misrepresented, either * by explicit claim or by omission. * 3. Altered versions must be plainly marked as such, and must not * be misrepresented as being the original software. * 4. This notice is to remain intact. * * ------------------------------------------------------------------- * Element 8 - Quadrilateral DKT Plate Bending Element * - Written by B.K. Voon (1990) * * Note : 2-dimensional plate element from Berkeley. * : Only works for elements lying in x-z plane. Here we * assume that y-axis corresponds to vertical direction. * ------------------------------------------------------------------- * * Written by: Mark Austin, Xiaoguang Chen, and Wane-Jang Lin December 1995 * ============================================================================= */#include "defs.h"#include "units.h"#include "matrix.h"#include "fe_database.h"#include "symbol.h"#include "fe_functions.h"/*#define DEBUG *//* ================================================== *//* elmt_plate() : Quadrilateral DKT Plate Bending Element *//* ================================================== *//* p->work_material[0] = E; p->work_material[1] = G; p->work_material[2] = fy; p->work_material[3] = ET; p->work_material[4] = nu; p->work_material[5] = density; p->work_section[0] = Ixx; p->work_section[1] = Iyy; p->work_section[2] = Izz; p->work_section[3] = Ixy; p->work_section[4] = Ixz; p->work_section[5] = Iyz; p->work_section[6] = weight; p->work_section[7] = bf; p->work_section[8] = tf; p->work_section[9] = depth; p->work_section[10] = area; p->work_section[11] = thickness; *//* ---------------------------------------------------------------*//* p->work_section[i] for i>11 is used to fit each elmts needs.*//* Therefore, p->work_section[i] may be different for differnt *//* elmts when i > 11. For DKQ(T) plate element : */ /* ---------------------------------------------------------------*//* p->work_section[12] = D = (E/(1-nu^2))*t^3/12; *//* p->work_section[13] = D*nu; *//* p->work_section[14] = D*(1-nu)/2; *//* p->work_section[16] = flag ? *//* ============================================================== */ARRAY *elmt_plate(p,isw)ARRAY *p;int isw;{static double nu;static QUANTITY fy, G, E, ET, density;static double Ixx, Iyy, Izz, Ixy, Ixz, Iyz, bf, tf, A, depth, weight, EA, thickness;double ia[3][27],eps[4],sig[4],aa[5],bb[5],cc[5],dd[5],ee[5];double sg[10],tg[10],wg[10];double d1,d2,d3,d4,d5,d6,thick,xsj,dn1,dn2,dn3;double xx,yy;double **bmu;double **shp;double **bm;int i,j,l,lint,i1,k;int length1, length2, unit_length;int UNITS_SWITCH;int ii, jj, kk, k1, k2, k3;DIMENSIONS *dimen, *dimen1, *dimen2; H_Print = 0; UNITS_SWITCH = CheckUnits();#ifdef DEBUG printf("In elmt_plate() : starting with isw = %10d\n", isw);#endif if(isw != PROPTY) { shp = MatrixAllocIndirectDouble(3,8); bm = MatrixAllocIndirectDouble(3,12); } switch(isw) { case PROPTY: /* Input The Material Properties */ if(p->work_material[16].value == 0.0 ) { /* d[10] has been changed to work_material[16].value */ /* what is d[10] any way ??? a flag ? array start at 1 */ /* p->d[1]; Modulus : p->d[2]; Poisson */ /* p->d[3]; Thickness : p->d[4]; q-loading */ E.value = p->work_material[0].value; fy.value = p->work_material[2].value; ET.value = p->work_material[3].value; nu = p->work_material[4].value; density.value = p->work_material[5].value; thickness = p->work_section[11].value; p->work_section[12].value = E.value/(1.0-nu*nu)*thickness*thickness*thickness/12.0; p->work_section[13].value = nu*p->work_section[12].value; p->work_section[14].value = 0.5*(1-nu)*p->work_section[12].value; p->work_section[16].value = 1.0; switch(UNITS_SWITCH) { case ON: E.dimen = p->work_material[0].dimen; fy.dimen = p->work_material[2].dimen; ET.dimen = p->work_material[3].dimen; density.dimen = p->work_material[5].dimen; dimen = UnitsPower( p->work_section[11].dimen, 3.0, NO ); UnitsMultRep( p->work_section[12].dimen, E.dimen, dimen ); free((char *) dimen->units_name); free((char *) dimen); UnitsCopy( p->work_section[13].dimen, p->work_section[12].dimen ); UnitsCopy( p->work_section[14].dimen, p->work_section[12].dimen ); break; case OFF: break; default: break; } /* ---------------------------------------------------------*//* In fortran FEAP version *//* construct rotation parameters: u_x = 1, u_y = 2 *//* ia[1][iel] = 1, iel = elmt_type no *//* ia[2][iel] = 2 *//* construct rotation parameters: theta_x = 4, theta_y = 5 *//* ir[1][iel] = 4, iel = elmt_type no *//* ir[2][iel] = 5 *//* ---------------------------------------------------------*//*----- ia[0][p->eiel-1] = 2; ia[1][p->eiel-1] = 3; -------*/#ifdef DEBUG printf("In elmt_plate() : modulus = %10.4f\n",E.value); printf(" : poisson = %10.4f\n",nu); printf(" : thickness = %10.4f\n",thickness); printf(" : D = %10.4f\n", p->work_section[12].value); printf(" : D*v = %10.4f\n", p->work_section[13].value); printf(" : D(1-v)/2 = %10.4f\n", p->work_section[14].value); printf(" : p->work_section[16] = %10.4f\n\n", p->work_section[16].value);#endif } break; case CHERROR: case MASS_MATRIX: break; case STIFF: /* Compute The Element Tangent Array */#ifdef DEBUG printf("In elmt_plate() : Start to compute Element Tangent Array\n");#endif jacqud(p->coord,aa,bb,cc,dd,ee); l = 3; pgauss(l,&lint,sg,tg,wg); for(l=1; l <= lint; l++) {#ifdef DEBUG printf("\n\n *** STARTING INT POINT : LINT %3d\n\n", l);#endif shp = qushp8(sg[l-1],tg[l-1],shp,p->coord,&xsj); xsj = xsj*wg[l-1]; bm = dktqbm(shp,bm,aa,bb,cc,dd,ee); /* Compute Weighted Jacobian And D-matrix Constants */ d1 = p->work_section[12].value * xsj; d2 = p->work_section[13].value * xsj; d3 = p->work_section[14].value * xsj; /* Compute The Element Load Vector *//* nodal loads for(i = 1; i <= p->nodes_per_elmt; i++) { j = (i-1)*3+1; p->nodal_loads[j-1].value += (p->d[8])*xsj*(1.-sg[l-1])*(1.-tg[l-1]); }*/ /* Compute Contribution To Element Stiffness For This Point */ for(i=1;i<=12;i++) { dn1 = d1*bm[0][i-1]+d2*bm[1][i-1]; dn2 = d2*bm[0][i-1]+d1*bm[1][i-1]; dn3 = d3*bm[2][i-1]; for(j=i;j<=12;j++) p->stiff->uMatrix.daa[i-1][j-1] += dn1*bm[0][j-1]+dn2*bm[1][j-1]+dn3*bm[2][j-1]; } } /* Make Stiffness Symmetric */ for(i= 2; i<=12; i++) { i1 = i-1; for(j=1;j<=i1;j++) p->stiff->uMatrix.daa[i-1][j-1] = p->stiff->uMatrix.daa[j-1][i-1]; } /* ========================== feature not included in program yet ============ Modify Load Vector for Non-Zero Displacement Boundary Conditions : p->u[12][1] for(j=1;j<=p->size_of_stiff; j++) { if(p->displ->uMatrix.daa[j-1][0] != 0) for(i=1;i<=p->size_of_stiff;i++) p->nodal_loads[i-1].value -= p->stiff->uMatrix.daa[i-1][j-1]*p->displ->uMatrix.daa[j-1][0]; } ========================== end of feature =================================== */ /**************************************************/ /* Assign Units to Stiffness Matrix */ /**************************************************/ /* Initiation of Stiffness Units Buffer */ if( CheckUnits() == ON ) { if(UNITS_TYPE == SI) { dimen1 = DefaultUnits("Pa"); dimen2 = DefaultUnits("m"); } else { dimen1 = DefaultUnits("psi"); dimen2 = DefaultUnits("in"); } /* node 1*/ UnitsMultRep( &(p->stiff->spColUnits[0]), dimen1, dimen2 ); UnitsMultRep( &(p->stiff->spColUnits[1]), &(p->stiff->spColUnits[0]), dimen2 ); UnitsCopy( &(p->stiff->spColUnits[2]), &(p->stiff->spColUnits[1]) ); ZeroUnits( &(p->stiff->spRowUnits[0]) ); UnitsCopy( &(p->stiff->spRowUnits[1]), dimen2 ); UnitsCopy( &(p->stiff->spRowUnits[2]), dimen2 ); /* node i i > 1*/ for(i = 2; i <= p->nodes_per_elmt; i++) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -