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

📄 elmt_psps.c

📁 有限元分析源代码
💻 C
📖 第 1 页 / 共 3 页
字号:
    t[0] =  0.5; t[1] =  0.5;    t[2] = -0.5; t[3] = -0.5;  switch(nodes_per_elmt) {     case 3:     case 4:    /* form 4-node quadrilateral shape function                  */    /* shape function:                  Ni = shape[2][i]         */    /*                                  node no. i = 1, .. 4     */    /* derivatives of shape functions:  dNi/d(ss) = shape[0][i]  */    /*                                  dNi/d(tt) = shape[1][i]  */    for(i = 1; i <= 4; i++){        shp[2][i-1]      = (0.5 + s[i-1] * ss) * ( 0.5 + t[i-1] * tt);         shp_temp[0][i-1] = s[i-1] * (0.5 + t[i-1] * tt);                        shp_temp[1][i-1] = t[i-1] * (0.5 + s[i-1] * ss);    }    /* form triangle by adding third and fourth node together */    if(nodes_per_elmt == 3) {         shp[2][2] = shp[2][2] + shp[2][3];        for(i = 0; i <= 1; i++)            shp_temp[i][2] = shp_temp[i][2] + shp_temp[i][3];    }     /* construct jacobian matrix and its determinant */     for(i = 1; i <= no_dimen; i++)      /* no_dimen = 2 */         for(j = 1; j <= no_dimen; j++) {             xs[i-1][j-1] = 0.0;             for(k = 1; k <= nodes_per_elmt; k++)                 xs[i-1][j-1] = xs[i-1][j-1] + coord[i-1][k-1].value*shp_temp[j-1][k-1];         }     *jacobian = xs[0][0] * xs[1][1] - xs[0][1] *xs[1][0];    if(flg == TRUE) return;    /* compute Jacobain inverse matrix */    sx[0][0] = xs[1][1]/ *jacobian;    sx[1][1] = xs[0][0]/ *jacobian;    sx[0][1] = - xs[0][1]/ *jacobian;    sx[1][0] = - xs[1][0]/ *jacobian;    /* form global derivatives */    /* save dNi/dx, dNi/dy into shp[2][node] */      for(i = 1; i <= nodes_per_elmt; i++){        shp[0][i-1] = shp_temp[0][i-1]*sx[0][0] + shp_temp[1][i-1]*sx[0][1];        shp[1][i-1] = shp_temp[0][i-1]*sx[1][0] + shp_temp[1][i-1]*sx[1][1];        }    break;    case 5: case 6: case 7: case 8:       shp0(ss, tt, shp, node_connect, nodes_per_elmt);    break;    default:    break;  }#ifdef DEBUG   printf(" in shape () \n");    for(j = 1; j <= nodes_per_elmt; j++){            printf("   dN/dx[%d] = %lf ", j , shp[0][j-1]);            printf("   dN/dy[%d] = %lf ", j , shp[1][j-1]);            printf("       N[%d] = %lf \n", j , shp[2][j-1]);   }   printf(" leaving shape () \n");#endif   MatrixFreeIndirectDouble(shp_temp, 2);    return;}/* ================================ *//* shap0                            *//* ================================ */int shp0(s,t,shp,ix,nel)double s,t,shp[4][10];int  *ix;int nel;{double s2, t2;int i,j,k,l;    s2 = (1- s * s)/2;    t2 = (1 - t * t)/2;    for(i = 5; i<= 9 ;i++)    for(j =1;j<= 3 ; j++)        shp[j][i] = 0.0;    /* midside nodes (serendipty)  */    if(ix[5] == 0) goto NEXT1;        shp[1][5] = -s*(1-t);        shp[2][5] = -s2;        shp[3][5] =  s2*(1-t);    NEXT1:        if(nel < 6) goto NEXT7;        if(ix[6] == 0) goto NEXT2;        shp[1][6] = t2;        shp[2][6] = - t *(1+s);        shp[3][6] =   t2*(1+s);   NEXT2:        if(nel < 7) goto NEXT7;        if(ix[7] == 0) goto NEXT3;        shp[1][7] = -s*(1 + t);        shp[2][7] = s2;        shp[3][7] = s2*(1+t);   NEXT3:        if(nel < 8) goto NEXT7;        if(ix[8] == 0) goto NEXT4;        shp[1][8] = -t2;        shp[2][8] = - t *(1-s);        shp[3][8] = t2*(1-s);     /* interior node (langragian) */   NEXT4:        if(nel < 9) goto NEXT7;        if(ix[9] == 0) goto NEXT7;        shp[1][9] = -4 * s *  t2;        shp[2][9] = -4 * t * s2;        shp[3][9] =  4 * s2 * t2;     /* correct edge nodes for interior node(langrangian) */        for(j=1;j<=3;j++) {            for(i=1;i<=4;i++)                shp[j][i] = shp[j][i] - 0.25 * shp[j][9];                for(i=5;i<=8;i++)                if(ix[i] != 0)	           shp[j][i] = shp[j][i] - .5 *shp[j][9];        }     /* correct corner nodes for presence of mideside nodes */   NEXT7:        k = 8;        for(i=1;i<=4;i++){            l = i +4;            for(j=1;j<=3;j++)                shp[j][i] = shp[j][i] - 0.50 *(shp[j][k] + shp[j][l]);                k = 1;        }        return(1);}/* ======================== *//* gauss  integration       *//* ======================== */#ifdef __STDC__gauss(double *sg, double *ag, int lt)#elsegauss(sg, ag, lt)double *sg, *ag;int lt;#endif{double t;int    i;#ifdef DEBUG   printf(" ******enter gauss() \n");   printf("       no_integ_pts = %d \n", lt);#endifswitch(lt) {  case 1:         sg[1] = 0.0;         ag[1] = 2.0;         break;  case 2:         sg[1] = -1/sqrt(3.);         sg[2] =  -sg[1];         ag[1] = 1.0;          ag[2] = 1.0;          break;  case 3:         sg[1] = -sqrt(0.6);         sg[2] = 0.0;         sg[3] = -sg[1];         ag[1] = 5.0/9.0;          ag[2] = 8.0/9.0;          ag[3] = ag[1];          break;  case 4:         t = sqrt(4.8);         sg[1] =  sqrt((3+t)/7);         sg[2] =  sqrt((3-t)/7);         sg[3] = -sg[2];         sg[4] = -sg[1];         t  = 1/3/t;         ag[1] = 0.5-t;          ag[2] = 0.5+t;          ag[3] = ag[2];          ag[4] = ag[1];          break;  default:         break;  }#ifdef DEBUG      printf(" In gauss(): \n");   for (i = 1; i <= lt; i++) {      printf("           : integ_coord[%d] = %lf \n",i, sg[i]);      printf("           : weight[%d]      = %lf \n",i, ag[i]);   }   printf(" ******leaving gauss() \n");#endif  return (1);}/*====================================================*//* pgauss(no_integ_pts,lint,sg,tg,wg)                 *//* input:                                             *//*        no_integ_pts   no of gaussian integ pts     *//*                       in one-direction             *//* output:                                            *//*        lint           no_integ_pts*no_integ_pts    *//*        sg             coordinates in xi direction  *//*        tg             coordinates in eta direction *//*        wg             weight coeffcient            *//*====================================================*/int pgauss(l, lint, r, z, w)int l, *lint;double r[], z[], w[];{int i, j, k;double g, h;double g4[5], h4[5], lr[10], lz[10], lw[10];lr[1] = lr[4] =lr[8] = -1;lr[2] = lr[3] =lr[6] =  1;lr[5] = lr[7] =lr[9] =  0;lz[1] = lz[2] =lz[5] = -1;lz[3] = lz[4] =lz[7] =  1;lz[6] = lz[8] =lz[9] =  0;lw[3] = lw[4] = lw[1] = lw[2] = 25;lw[5] = lw[6] = lw[7] = lw[8] = 40;lw[9] = 64;    if(l < 0) {       *lint = 3;       g = sqrt((double) 1.0/3.0);       h = sqrt((double) 2.0/3.0);       r[1] = -h; r[2] =  h; r[3] = 0;       z[1] = -g; z[2] = -g; z[3] = g;       w[1] =  1; w[2] =  1; w[3] = 2;       return (1);    }    *lint = l*l;    switch (l) {	case 1: /*  1 x 1 integration */	     r[0] = 0.0;	     z[0] = 0.0;	     w[0] = 4.0;	     break;        case 2: /*  2 x 2 integration */             g = 1.0/sqrt((double) 3.0);             for(i = 1; i<= 4; i++) {                 r[i-1] = g * lr[i];                 z[i-1] = g * lz[i];                 w[i-1] = 1.0;             }             break;        case 3: /* 3 x 3 integration */             g = sqrt((double) 0.6);             h = 1.0/81.0;             for(i = 1; i<= 9; i++) {                 r[i-1] = g * lr[i];                 z[i-1] = g * lz[i];                 w[i-1] = h * lw[i];             }             break;        case 4: /* 4 x 4 integration */             g = sqrt((double) 4.8);             h = sqrt((double) 30.0)/36;             g4[1] = sqrt((double) (3+g)/7.0);             g4[4] = -g4[1];             g4[2] = sqrt((double) (3-g)/7.0);             g4[3] = -g4[2];             h4[1] = 0.5 - h;             h4[2] = 0.5 + h;             h4[3] = 0.5 + h;             h4[4] = 0.5 - h;             i = 0;             for(j = 1; j<= 4; j++) {                 for(k = 1; k<= 4; k++) {                     i = i +1;                     r[i-1] = g4[k];                     z[i-1] = g4[j];                     w[i-1] = h4[j]* h4[k];                 }             }             break;    }    return(1);}/* ========================================== *//* pstres                                     *//* ========================================== */int pstres(sig,sg4,sg5,sg6)double *sig;double sg4,sg5,sg6;{    printf("******In function pstres\n ");    return(1);}/*=============================================*//* material matrix                             *//*=============================================*/double **MATER_MAT_PLANE(E, nu)double E, nu;{ double **m1;double temp;    m1 = MatrixAllocIndirectDouble(3, 3);        temp =  E/(1.0-nu*nu);    m1[0][0]= m1[1][1] = temp;    m1[0][1]= m1[1][0] = nu*temp;     m1[2][2]= E/2.0/(1.0+nu);     m1[0][2] = m1[2][0] = m1[1][2] = m1[2][1] = 0.0;    return(m1);}/* =================================================================== *//* Calculate Equivalent Nodal Loads                                    *//*                                                                     *//* These element level procedures determine Eqvivalent Nodal Loads due *//* to element loadings. The loads are added directly to nodal loads.   *//*                                                                     *//*  Negative Eqv (= Fixed end forces) added to local elmt forces       *//*   Sign Convention:  P, by,bx,etc positive along Y,X axis            *//*   sld01 Equivalent Loading Procedure for 2 D finite element         *//* =================================================================== */ARRAY *sld01( p,task)ARRAY *p;int task;{ELEMENT         *el;  ELEMENT_LOADS  *ell; ELOAD_LIB      *elp; double shp[4][10],sg[17],tg[17],wg[17],pq[4],dj[4],xyp[4],xye[4][5];double h, dv,dv1,dv2,ax,ay,jacobain;int mash,gash,gish,gosh,nash,l,lint,nsfr,lne,ncord,nln;int i,j,lnew, k,igauss;int no_integ_pts;    switch(task){        case PRESSLD:             nsfr  = 2;/* conter for variation type; para =2 */             lne   = 4;/* no of element face */             ncord = 3;             nln = nsfr + 1;             ell  =  p->elmt_load_ptr;             for(lnew=1;lnew<=lne; lnew++){                 h = -1;                 for (j=1; j<=nln; j++){                      elp  =  &ell->elib_ptr[lnew-1];                      mash =   elp->nopl[j];                      for(k=1; k<=ncord; k++)                          xye[k][j] = p->coord[mash][k].value;                 }            if(p->nodes_per_elmt == 4) no_integ_pts  =  2;    /* 4-node element */            if(p->nodes_per_elmt == 8) no_integ_pts  =  3;    /* 8-node element */            l = no_integ_pts;                 pgauss(l,lint,sg,tg,wg);                 for(igauss=1;igauss<=lint;igauss++){                     shape(sg[igauss],h,p->coord,shp,jacobain,p->no_dimen,p->nodes_per_elmt, p->node_connect,0);                     for(i = 1; i <= ncord; i++){                         gash = 0;                         gosh = 0;                         gish = 0;                         for (k=1; k<=nln; k++){                              if(i<=2){;                                 gosh = gosh +   elp->pr->uMatrix.daa[k][i] * shp[3][k];                                 gish = gish + xye[i][k] * shp[1][k];                              }                         }                         xyp[i] = gash;                         if(i<=2){                            pq[i] = gosh;                            dj[i] = gish;                         }                     }                     dv = wg[igauss];                     if(ncord == 3) dv = dv + xyp[3];                     if(p->nodes_per_elmt == AXISYM) dv = 6.283185 * xyp[1];                        dv1 = dv + dj[1];                        dv2 = dv + dj[2];                        ay = dv1*pq[1] + dv2*pq[2];                        ax = dv1 * pq[2] - dv2 * pq[1];                        for (i=1; i<=nln; i++){                             nash = p->dof_per_node * ( ell->elib_ptr[lnew -1].nopl[i] - 1)  + 2;                              mash = nash -1;                             F[mash] = F[mash] + shp[3][i] * ax;                             F[nash] = F[nash] + shp[3][i] * ay;                        }                 }            }            break;       default:            break;    }    return(p);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -