📄 elmt_shell_4n_q.c
字号:
#ifdef DEBUG
printf(" In elmt_shell_4nodes_q(): \n");
printf(" : leaving case of MASS_MATRIX\n");
#endif
break;
default:
break;
}
/*
MatrixFreeIndirectDouble(yl, 3);
MatrixFreeIndirectDouble(tr, 3);
MatrixFreeIndirectDouble(gshp1, 3);
MatrixFreeIndirectDouble(gshp2, 3);
MatrixFreeIndirectDouble(vl, 6);
MatrixFreeIndirectDouble(btd, 3);
MatrixFreeIndirectDouble(s, nst);
free ((char *) eps);
free ((char *) sigi);
free ((char *) sigb);
free ((char *) sg);
free ((char *) tg);
free ((char *) wg);
free ((char *) gg);
free ((char *) dvl);
free ((char *) pp);
free ((char *) d);
free ((char *) bl);
*/
#ifdef DEBUG
printf("*** leaving elmt_shell_4nodes_q() \n");
#endif
return(p);
}
/*===================================================================*/
/* Be transfered from dktb06 by L. Jin, Jan 16 */
/* ==================================================================*/
void dktb06( sg, tg,xsj )
double sg, tg,xsj;
{
double *el, **shn, *bd, *cd;
double shm1, shm2;
double *a1, *b1, *c1, *d1, *e1;
double *a2, *b2, *c2, *d2, *e2;
int i, j, k;
#ifdef DEBUG
printf("*** Entering dktb06() ***\n");
#endif
el = dVectorAlloc(3);
bd = dVectorAlloc(3);
cd = dVectorAlloc(3);
a1 = dVectorAlloc(3);
a2 = dVectorAlloc(3);
b1 = dVectorAlloc(3);
b2 = dVectorAlloc(3);
c1 = dVectorAlloc(3);
c2 = dVectorAlloc(3);
d1 = dVectorAlloc(3);
d2 = dVectorAlloc(3);
e1 = dVectorAlloc(3);
e2 = dVectorAlloc(3);
shn = MatrixAllocIndirectDouble( 2, 3 );
/* ------- Compute the area coordinates for the point -------- */
el[0] = 0.25 * (1.0 - sg) * (1.0 - tg);
el[1] = 0.25 * (1.0 + sg) * (1.0 - tg);
el[2] = 0.5 * (1.0 + tg);
/* ------- Form the shape function terms for trains -------- */
for( i=1; i<=3; i++ ) {
bd[i-1] = b[i-1]/xsj;
cd[i-1] = c[i-1]/xsj;
}
for( i=1; i<=3; i++ ) {
j = i%3 + 1;
k = j%3 + 1;
shn[0][i-1] = bd[i-1] * (el[i-1] - 1.0);
shn[1][i-1] = cd[i-1] * (el[i-1] - 1.0);
shm1 = bd[j-1]*el[k-1] + bd[k-1]*el[j-1];
shm2 = cd[j-1]*el[k-1] + cd[k-1]*el[j-1];
a1[i-1] = aa[i-1] * shm1;
a2[i-1] = aa[i-1] * shm2;
b1[i-1] = bb[i-1] * shm1;
b2[i-1] = bb[i-1] * shm2;
c1[i-1] = cc[i-1] * shm1;
c2[i-1] = cc[i-1] * shm2;
d1[i-1] = dd[i-1] * shm1;
d2[i-1] = dd[i-1] * shm2;
e1[i-1] = ee[i-1] * shm1;
e2[i-1] = ee[i-1] * shm2;
}
/* --------- Plate train displacement matrix ------------ */
for( i=1; i<=3; i++ ) {
j = i%3 + 1;
k = j%3 + 1;
bm[0][2][i-1] = a1[k-1] - a1[j-1];
bm[0][3][i-1] = b1[k-1] + b1[j-1];
bm[0][4][i-1] = c1[k-1] + c1[j-1] - shn[0][i-1];
bm[1][2][i-1] = d2[k-1] - d2[j-1];
bm[1][3][i-1] =-e2[k-1] + e2[j-1] + shn[1][i-1];
bm[1][4][i-1] =-b2[k-1] + b2[j-1];
bm[2][2][i-1] = a2[k-1] - a2[j-1] + d1[k-1] - d1[j-1];
bm[2][3][i-1] =-e1[k-1] - e1[j-1] + shn[0][i-1] - bm[1][4][i-1];
bm[2][4][i-1] = c2[k-1] + c2[j-1] - shn[1][i-1] - bm[0][3][i-1];
}
free ((char *) el);
free ((char *) bd);
free ((char *) cd);
MatrixFreeIndirectDouble(shn,2);
free ((char *) a1);
free ((char *) a2);
free ((char *) b1);
free ((char *) b2);
free ((char *) c1);
free ((char *) c2);
free ((char *) d1);
free ((char *) d2);
free ((char *) e1);
free ((char *) e2);
#ifdef DEBUG
printf("*** leaving dktb06() ***\n");
#endif
}
/*===================================================================*/
/* Be transfered from dktq06 by L. Jin, Jan 16 */
/* ==================================================================*/
void dktq06( si )
int si;
{
int i, j, k;
#ifdef DEBUG
printf("*** Entering dktq06() ***\n");
#endif
/* Form strain-displacement array for DKQ element */
for( i=1; i<=4; i++ ) {
j = (i+2) % 4 + 1;
bm[0][2][i-1] = aa[i-1]*shp[0][i+3][si] - aa[j-1]*shp[0][j+3][si];
bm[0][3][i-1] = bb[i-1]*shp[0][i+3][si] + bb[j-1]*shp[0][j+3][si];
bm[0][4][i-1] = cc[i-1]*shp[0][i+3][si] + cc[j-1]*shp[0][j+3][si] - shp[0][i-1][si];
bm[1][2][i-1] = dd[i-1]*shp[1][i+3][si] - dd[j-1]*shp[1][j+3][si];
bm[1][3][i-1] =-ee[i-1]*shp[1][i+3][si] - ee[j-1]*shp[1][j+3][si] + shp[1][i-1][si];
bm[1][4][i-1] =-bb[i-1]*shp[1][i+3][si] - bb[j-1]*shp[1][j+3][si];
bm[2][2][i-1] = aa[i-1]*shp[1][i+3][si] - aa[j-1]*shp[1][j+3][si] +
dd[i-1]*shp[0][i+3][si] - dd[j-1]*shp[0][j+3][si];
bm[2][3][i-1] =-ee[i-1]*shp[0][i+3][si] - ee[j-1]*shp[0][j+3][si] +
shp[0][i-1][si] - bm[1][4][i-1];
bm[2][4][i-1] = cc[i-1]*shp[1][i+3][si] + cc[j-1]*shp[1][j+3][si] -
shp[1][i-1][si] - bm[0][3][i-1];
}
#ifdef DEBUG
printf("*** leaving dktq06() ***\n");
#endif
}
/*===================================================================*/
/* Be transfered from hshp06 by L. Jin, Jan 16 */
/* ==================================================================*/
void hshp06( si )
int si;
{
double *shx, *shy;
int i, j, k;
#ifdef DEBUG
printf("*** Entering hshp06() ***\n");
#endif
/* ----- Form the shape function ----------------------------- */
shx = dVectorAlloc( 4 );
shy = dVectorAlloc( 4 );
for( k=1; k<=3; k++ ) {
for( i=1; i<=4; i++ ) {
shx[i-1] = shp[k-1][i+3][si]*c[i-1];
shy[i-1] = shp[k-1][i+3][si]*b[i-1];
}
j = 4;
for( i=1; i<=4; i++ ) {
shp1[k-1][i-1][si] = shy[i-1] - shy[j-1];
shp2[k-1][i-1][si] = shx[i-1] - shx[j-1];
j = i;
}
}
free ((char *) shx );
free ((char *) shy );
#ifdef DEBUG
printf("*** leaving hshp06() ***\n");
#endif
}
/*===================================================================*/
/* Be transfered from jacq06 by L. Jin, Jan 16 */
/* ==================================================================*/
void jacq06( xl )
double **xl;
{
double cxx, cyy, cxy, dz, ad, a4, b2, c2, sql, x31, y31, x42, y42;
int i, j, k;
#ifdef DEBUG
printf("*** Entering jacq06() ***\n");
#endif
/* ----- Form geometric constants for DKQ element ------- */
cxx = 0.0;
cyy = 0.0;
cxy = 0.0;
for( i=1; i<=4; i++ ) {
k = i % 4 + 1;
b[i-1] = xl[1][k-1] - xl[1][i-1];
c[i-1] = xl[0][i-1] - xl[0][k-1];
dz = xl[2][k-1] - xl[2][i-1];
b2 = b[i-1]*b[i-1];
c2 = c[i-1]*c[i-1];
cxx += dz*b2/(b2 + c2);
cyy += dz*c2/(b2 + c2);
cxy += (dz+dz)*b[i-1]*c[i-1]/(b2 + c2);
sql = (b2 + c2)/0.75;
aa[i-1] = (c[i-1] + c[i-1])/sql;
bb[i-1] = b[i-1] * c[i-1] /sql;
cc[i-1] = c2/sql;
dd[i-1] =-(b[i-1] + b[i-1])/sql;
ee[i-1] = b2/sql;
b[i-1] = b[i-1]/8.0;
c[i-1] = c[i-1]/8.0;
}
if( xl[2][0] != 0.0 ) {
x31 = xl[0][2] - xl[0][0];
y31 = xl[1][2] - xl[1][0];
x42 = xl[0][3] - xl[0][1];
y42 = xl[1][3] - xl[1][1];
a4 = (x31*y42 - x42*y31)*2.0;
ad = a4*a4/4.0;
x31 = x31/ad;
y31 = y31/ad;
x42 = x42/ad;
y42 = y42/ad;
bm[0][0][0] = -cxx*x42;
bm[1][0][0] = -cyy*x42;
bm[2][0][0] = -cxy*x42;
bm[0][1][0] = -cxx*y42;
bm[1][1][0] = -cyy*y42;
bm[2][1][0] = -cxy*y42;
bm[0][5][0] = -cxx/a4;
bm[1][5][0] = -cyy/a4;
bm[2][5][0] = -cxy/a4;
bm[0][0][1] = cxx*x31;
bm[1][0][1] = cyy*x31;
bm[2][0][1] = cxy*x31;
bm[0][1][1] = cxx*y31;
bm[1][1][1] = cyy*y31;
bm[2][1][1] = cxy*y31;
bm[0][5][1] = -cxx/a4;
bm[1][5][1] = -cyy/a4;
bm[2][5][1] = -cxy/a4;
for( i=1; i<=3; i++ ) {
bm[i-1][0][2] = -bm[i-1][0][0];
bm[i-1][1][2] = -bm[i-1][1][0];
bm[i-1][5][2] = bm[i-1][5][0];
bm[i-1][0][3] = -bm[i-1][0][1];
bm[i-1][1][3] = -bm[i-1][1][1];
bm[i-1][5][3] = bm[i-1][5][1];
}
}
#ifdef DEBUG
printf("*** leaving jacq06() ***\n");
#endif
}
/*===================================================================*/
/* Be transfered from jtri06 by L. Jin, Jan 16 */
/* ==================================================================*/
void jtri06( xl, xsj )
double **xl, *xsj;
{
double sql, cs, bs;
int i, j, k;
#ifdef DEBUG
printf("*** Entering jtri06() ***\n");
#endif
/* ----- Form the terms for the Jacobian of a triangle ------- */
for( i=1; i<=3; i++ ) {
j = i%3 + 1;
k = j%3 + 1;
b[i-1] = xl[1][k-1] - xl[1][j-1];
c[i-1] = xl[0][j-1] - xl[0][k-1];
sql = 4.0*(b[i-1]*b[i-1] + c[i-1]*c[i-1]);
cs = c[i-1]/sql;
bs = b[i-1]/sql;
aa[i-1] = 6.0*cs;
bb[i-1] = 3.0*bs*c[i-1];
cc[i-1] = c[i-1]*cs - b[i-1]*(bs+bs);
dd[i-1] =-6.0*bs;
ee[i-1] = b[i-1]*bs - c[i-1]*(cs+cs);
}
b[3] = 0.0;
c[3] = 0.0;
aa[3] = 0.0;
bb[3] = 0.0;
cc[3] = 0.0;
dd[3] = 0.0;
ee[3] = 0.0;
/* ----- Store jacobian ----------------------------------------*/
*xsj = - xl[0][0]*b[0] - xl[0][1]*b[1] - xl[0][2]*b[2];
#ifdef DEBUG
printf("*** leaving jtri06() ***\n");
#endif
}
/*===================================================================*/
/* Be transfered from proj06 by L. Jin, Jan 16 */
/* ==================================================================*/
void proj06( i1, j1, s, zi, zj, nst )
double **s;
double zi, zj;
int i1, j1, nst;
{
int i;
#ifdef DEBUG
printf("*** Entering proj06() ***\n");
#endif
/* ----- Modify the stiffness for offset projections ------- */
/* ----- Postmultiply by transformation ------------ ------- */
for( i=1; i<=6; i++ ) {
s[i1+i-1][j1+3] += zj*s[i1+i-1][j1+1];
s[i1+i-1][j1+4] -= zj*s[i1+i-1][j1 ];
}
/* --- Premultiply using modified terms from prosmultiplication --- */
for( i=1; i<=6; i++ ) {
s[i1+3][j1+i-1] += zi*s[i1+1][j1+i-1];
s[i1+4][j1+i-1] -= zi*s[i1 ][j1+i-1];
}
#ifdef DEBUG
printf("*** leaving proj06() ***\n");
#endif
}
/*===================================================================*/
/* Be transfered from rots06 by L. Jin, Jan 16 */
/* ==================================================================*/
void rots06( s, p, t, nst, ndf )
double **s, *p, **t;
int nst, ndf;
{
double **a, *b;
int i, i0, i1, ir, ii, j, j0, j1, jc, jj, k;
#ifdef DEBUG
printf("*** Entering rots06() ***\n");
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -