📄 elmt_shell_4n_q.c
字号:
dv1 = d[1-1] * dv; dv2 = d[2-1] * dv; dv3 = d[3-1] * dv; dv4 = d[4-1] * dv; dv5 = d[5-1] * dv; dv6 = d[6-1] * dv; i1 = 1; for( i=1; i<=4; i++ ) { /* Recover the previously computed shape functions */ shp1i = shp[0][i-1][k-1]; shp2i = shp[1][i-1][k-1]; shp3i = shp[2][i-1][k-1]; if( qdflg ) { shp11 = shp1[0][i-1][k-1]; shp12 = shp1[1][i-1][k-1]; shp13 = shp1[2][i-1][k-1]; shp21 = shp2[0][i-1][k-1]; shp22 = shp2[1][i-1][k-1]; shp23 = shp2[2][i-1][k-1]; a13 = -dv1*shp11 - dv2*shp22; a23 = -dv2*shp11 - dv1*shp22; a31 = dv3*shp2i; a32 = dv3*shp1i; a33 = -dv3*(shp12+shp21); } i2 = i1-1; /* Compute the loading term */ pp[i1-1] += shp3i*bl[0] *dv; pp[i1 ] += shp3i*bl[1] *dv; pp[i1+1] += shp3i*bl[2] *dv; pp[i1+2] += shp13*bl[2] *dv*tc; pp[i1+3] += shp23*bl[2] *dv*tc; pp[i1+4] -= (shp13*bl[0]+shp23*bl[1])*dv*tc; /* Form the stress-displacement matrix (Bi-trans 8 D) */ a11 = dv1*shp1i; a12 = dv2*shp2i; a21 = dv2*shp1i; a22 = dv1*shp2i; /* Form the plate stress-displacement matrix */ for( ii=ii1; ii<=ii2; ii++ ) { btd[0][ii-1] = dv4*bm[0][ii-1][i-1] + dv5*bm[1][ii-1][i-1]; btd[1][ii-1] = dv5*bm[0][ii-1][i-1] + dv4*bm[1][ii-1][i-1]; btd[2][ii-1] = dv6*bm[2][ii-1][i-1]; } /* Loop on columns */ j1 = i1; for( j=i; j<=4; j++ ) { j2 = j1 - 1; xn = shp[0][j-1][k-1]; yn = shp[1][j-1][k-1]; sn = shp[2][j-1][k-1]; if( qdflg ) { x1n = - shp1[0][j-1][k-1]; y2n = - shp2[1][j-1][k-1]; x2n = - shp1[1][j-1][k-1]; y1n = - shp2[0][j-1][k-1]; xyn = x2n + y1n; } /* Compute the membrane part */ s[i1-1][j1-1] += a11*xn + a31*yn; s[i1 ][j1-1] += a12*xn + a32*yn; s[i1-1][j1 ] += a21*yn + a31*xn; s[i1 ][j1 ] += a22*yn + a32*xn; s[i1+4][j1-1] += a13*xn + a33*yn; s[i1+4][j1 ] += a23*yn + a33*xn; s[i1-1][j1+4] += a11*x1n + a21*y2n + a31*xyn; s[i1 ][j1+4] += a12*x1n + a22*y2n + a32*xyn; s[i1+4][j1+4] += a13*x1n + a23*y2n + a33*xyn; /* Compute the bending part */ for( ii=ii1; ii<=ii2; ii++ ) { for( jj=ii1; jj<=ii2; jj++ ) { for( kk=1; kk<=3; kk++ ) s[i2+ii-1][j2+jj-1] += btd[kk-1][ii-1]*bm[kk-1][jj-1][j-1]; } } j1 = j1 + ndf; } i1 = i1 + ndf; } /* Compute the hughes/brezzi rotation matrix */ if( ialph != 0 && qdflg ) { j1 = 0; for( j=1; j<=4; j++ ) { gg[j1 ] -= shp[1][j-1][k-1]*dv; gg[j1+1] += shp[0][j-1][k-1]*dv; gg[j1+5] -= 2.0*shp[2][j-1][k-1]*dv; if( ialph > 1 ) gg[j1+5] += (shp1[1][j-1][k-1] - shp2[0][j-1][k-1])*dv; j1 = j1 + ndf; } } }/* -- Perform the rank one update for the hughes/brezzi term -- */ if( ialph > 0 && qdflg ) { for( i=1; i<=nst; i++ ) { ggi = ggv * gg[i-1]; for( j=1; j<=nst; j++ ) s[i-1][j-1] += ggi * gg[j-1]; } } i1 = 1; if( yl[2][0] != 0.0 ) { for( i=1; i<=4; i++ ) { pp[i1+2] += yl[2][i-1]*pp[i1 ]; pp[i1+3] -= yl[2][i-1]*pp[i1-1]; j1 = i1; for( j=i; j<=4; j++ ) { proj06( i1-1, j1-1, s, yl[2][i-1], yl[2][j-1], nst); j1 = j1 + ndf; } i1 = i1 + ndf; } } rots06( s, pp, tr, nst, ndf );/*#ifdef DEBUG dMatrixPrint("s -- Stiffness Matrix", s, nst, nst); printf("pp vector\n"); for(i=1; i<=nst; i++) printf("%5d%15.8e\n", i, pp[i-1]); dMatrixPrint("p->displ->uMatrix.daa", p->displ->uMatrix.daa, p->displ->iNoRows, p->displ->iNoColumns);#endif*//* ---- Form residual ------------------------ */ ul = p->displ->uMatrix.daa; for( i=1; i<=nst; i++ ) { for( j=1; j<=nst; j++ ) pp[i-1] -= s[i-1][j-1]*ul[(j-1)/4][(j-1)%4]; }/* printf("pp vector\n"); for(i=1; i<=nst; i++) printf("%5d%15.8e\n", i, pp[i-1]);*/ /* Transfer stiff matrix and equiv. nodal load vector to ARRAY *p */ switch(isw) { case STIFF: p->stiff->uMatrix.daa = s; /**************************************************/ /* Assign Units to Stiffness Matrix */ /**************************************************/ if( CheckUnits() == ON ) { if(UNITS_TYPE == SI || UNITS_TYPE == SI_US ) { dimen1 = DefaultUnits("Pa"); dimen2 = DefaultUnits("m"); } else { dimen1 = DefaultUnits("psi"); dimen2 = DefaultUnits("in"); } /* node 1 */ UnitsMultRep( &(p->stiff->spColUnits[0]), dimen1, dimen2 ); UnitsCopy( &(p->stiff->spColUnits[1]), &(p->stiff->spColUnits[0]) ); UnitsCopy( &(p->stiff->spColUnits[2]), &(p->stiff->spColUnits[0]) ); UnitsMultRep( &(p->stiff->spColUnits[3]), &(p->stiff->spColUnits[0]), dimen2 ); UnitsCopy( &(p->stiff->spColUnits[4]), &(p->stiff->spColUnits[3]) ); UnitsCopy( &(p->stiff->spColUnits[5]), &(p->stiff->spColUnits[3]) ); ZeroUnits( &(p->stiff->spRowUnits[0]) ); ZeroUnits( &(p->stiff->spRowUnits[1]) ); ZeroUnits( &(p->stiff->spRowUnits[2]) ); UnitsCopy( &(p->stiff->spRowUnits[3]), dimen2 ); UnitsCopy( &(p->stiff->spRowUnits[4]), dimen2 ); UnitsCopy( &(p->stiff->spRowUnits[5]), dimen2 ); /* node i i > 1*/ for ( i = 2; i <= p->nodes_per_elmt; i++) { kk = p->dof_per_node*(i-1) + 3; for( j = 1; j <= p->dof_per_node; j++) { k = p->dof_per_node*(i-1) + j; if( k <= kk) { UnitsCopy( &(p->stiff->spColUnits[k-1]), &(p->stiff->spColUnits[0]) ); UnitsCopy( &(p->stiff->spRowUnits[k-1]), &(p->stiff->spRowUnits[0]) ); } if(k > kk) { UnitsCopy( &(p->stiff->spColUnits[k-1]), &(p->stiff->spColUnits[3]) ); UnitsCopy( &(p->stiff->spRowUnits[k-1]), &(p->stiff->spRowUnits[3]) ); } } } free((char *) dimen1->units_name); free((char *) dimen1); free((char *) dimen2->units_name); free((char *) dimen2); } break; case LOAD_MATRIX: for( i=1; i<=nst; i++ ) p->equiv_nodal_load->uMatrix.daa[i-1][0] = pp[i-1]; break; default: break; }/*#ifdef DEBUG dMatrixPrint("p->equiv_nodal_load->uMatrix.daa", p->equiv_nodal_load->uMatrix.daa, p->equiv_nodal_load->iNoRows, p->equiv_nodal_load->iNoColumns);#endif*/#ifdef DEBUG printf(" In elmt_shell_4nodes_q(): \n"); printf(" : leaving case of STIFF\n");#endif break; case STRESS: /* Compute and output the element variables */#ifdef DEBUG printf("*** elmt_shell_4nodes_q() : In case STRESS\n");#endif if(vl == NULL) vl = MatrixAllocIndirectDouble( 6, 4 ); if(eps == NULL) eps = dVectorAlloc(6); if(sigi == NULL) sigi = dVectorAlloc(6); if(sigb == NULL) sigb = dVectorAlloc(6); ul = p->displ->uMatrix.daa; for( i=1; i<=4; i++ ) { for( j=1; j<=3; j++ ) { vl[j-1][i-1] = 0.0; vl[j+2][i-1] = 0.0; for( k=1; k<=3; k++ ) { vl[j-1][i-1] += tr[j-1][k-1]*ul[k-1][i-1]; vl[j+2][i-1] += tr[j-1][k-1]*ul[k+2][i-1]; } } } l = d[15]; if( l*l != lint ) pgauss ( l, &lint, sg, tg, wg ); for( k=1; k<=lint; k++ ) { rshp06( k-1, sg[k-1], tg[k-1], yl, &xsj, ndm); /* modify the rotational shape functions */ for( i=1; i<=3; i++ ) { for( j=1; j<=4; j++ ) { shp1[i-1][j-1][0] -= gshp1[i-1][j-1]/dv; shp2[i-1][j-1][0] -= gshp2[i-1][j-1]/dv; } } stre06(p,d,vl, ndm, nel,1, &xx, &yy, &zz, eps, sigi, sigb); if( UNITS_TYPE == SI || UNITS_TYPE == SI_US ) { dimen1 = DefaultUnits("N"); dimen2 = DefaultUnits("m"); } else { dimen1 = DefaultUnits("lbf"); dimen2 = DefaultUnits("in"); } coord = dimen2->scale_factor; stress = dimen1->scale_factor/dimen2->scale_factor; moment = dimen1->scale_factor; curvtr = 1.0/dimen2->scale_factor; free((char *) dimen1->units_name); free((char *) dimen1); free((char *) dimen2->units_name); free((char *) dimen2); printf(" S h e l l S t r e s s e s"); printf("\n elmt,x-coord xx-stress xy-stress yy-stress 1-stress 2-stress angle"); printf("\n matl,y-coord xx-moment xy-moment yy-moment 1-moment 2-moment angle"); printf("\n z-coord xx-strain xy-strain yy-strain xx-curvtr xy-curvtr yy-curvtr"); if( UNITS_TYPE == SI ) printf("\n coord = m, stress = N/m, moment = N*m/m, curvtr = 1/m, angle = rad"); else printf("\n coord = in, stress = lbf/in, moment = lbf*in/in, curvtr = 1/in, angle = rad"); printf("\n - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -"); printf("\n %8.3lf%11.3e%11.3e%11.3e%11.3e%11.3e%8.2lf", xx/coord,sigi[0]/stress,sigi[1]/stress,sigi[2]/stress,sigi[3]/stress,sigi[4]/stress,sigi[5]); printf("\n %8.3lf%11.3e%11.3e%11.3e%11.3e%11.3e%8.2lf", yy/coord,sigb[0]/moment,sigb[1]/moment,sigb[2]/moment,sigb[3]/moment,sigb[4]/moment,sigb[5]); printf("\n %8.3lf%11.3e%11.3e%11.3e%11.3e%11.3e%11.3e\n\n", zz/coord,eps[0],eps[1],eps[2],eps[3]/curvtr,eps[4]/curvtr,eps[5]/curvtr); } #ifdef DEBUG printf(" In elmt_shell_4nodes_q(): \n"); printf(" : leaving case of STRESS\n");#endif break; case MASS_MATRIX: /* Compute element mass array */#ifdef DEBUG printf(" In elmt_shell_4nodes_q(): \n"); printf(" : entering case of MASS_MATRIX\n");#endif for(i=1; i<=nst; i++) pp[i-1] = 0.0; for( k=1; k<=lint; k++ ) { dv1 = dvl[k-1]*d[12]; i1 = 0; for( j=1; j<=4; j++ ) { for( i=1; i<=3; i++ ) { pp[i1+i-1] += shp[2][j-1][k-1]*dv1; s[i1+i-1][i1+i-1] = pp[i1+i-1]; } i1 = i1 + ndf; } } p->stiff->uMatrix.daa = s; /* ------------ MASS UNITS ---------------------------- */ /* The units type is determined by the SetUnitsType() */ /* ---------------------------------------------------- */ /* Initiation of Mass Units Buffer */ switch( CheckUnits() ) { case ON: if(UNITS_TYPE == SI || UNITS_TYPE == SI_US ) { dimen1 = DefaultUnits("Pa"); dimen2 = DefaultUnits("m"); } else { dimen1 = DefaultUnits("psi"); dimen2 = DefaultUnits("in"); } dimen3 = DefaultUnits("sec"); /* node no 1 */ UnitsMultRep( &(p->stiff->spColUnits[0]), dimen1, dimen2 ); UnitsCopy( &(p->stiff->spColUnits[1]), &(p->stiff->spColUnits[0]) ); UnitsCopy( &(p->stiff->spColUnits[2]), &(p->stiff->spColUnits[0]) ); UnitsMultRep( &(p->stiff->spColUnits[3]), &(p->stiff->spColUnits[0]), dimen2 ); UnitsCopy( &(p->stiff->spColUnits[4]), &(p->stiff->spColUnits[3]) ); UnitsCopy( &(p->stiff->spColUnits[5]), &(p->stiff->spColUnits[3]) ); UnitsPowerRep( &(p->stiff->spRowUnits[0]), dimen3, 2.0, NO ); UnitsCopy( &(p->stiff->spRowUnits[1]), &(p->stiff->spRowUnits[0]) ); UnitsCopy( &(p->stiff->spRowUnits[2]), &(p->stiff->spRowUnits[0]) ); UnitsMultRep( &(p->stiff->spRowUnits[3]), dimen2, &(p->stiff->spRowUnits[0]) ); UnitsCopy( &(p->stiff->spRowUnits[4]), &(p->stiff->spRowUnits[3]) ); UnitsCopy( &(p->stiff->spRowUnits[5]), &(p->stiff->spRowUnits[3]) ); /* node no > 1 */ for(i = 2; i <= p->nodes_per_elmt; i++) { for(j = 1; j <= p->dof_per_node; j++) { k = p->dof_per_node*(i-1)+j; if(j <= 3) { UnitsCopy( &(p->stiff->spColUnits[k-1]), &(p->stiff->spColUnits[0]) ); UnitsCopy( &(p->stiff->spRowUnits[k-1]), &(p->stiff->spRowUnits[0]) ); } else { UnitsCopy( &(p->stiff->spColUnits[k-1]), &(p->stiff->spColUnits[3]) ); UnitsCopy( &(p->stiff->spRowUnits[k-1]), &(p->stiff->spRowUnits[3]) ); } } } free((char *) dimen1->units_name); free((char *) dimen1); free((char *) dimen2->units_name); free((char *) dimen2); free((char *) dimen3->units_name); free((char *) dimen3); break; case OFF: break; default: break; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -