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

📄 elmt_shell_4n_q.c

📁 有限元分析源代码
💻 C
📖 第 1 页 / 共 4 页
字号:
           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 + -