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

📄 fe_matrix.c

📁 有限元分析源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
   p = elmlib(p,isw);   return(p->equiv_nodal_load);}/* ======================================================= *//* Set Element Vector -  Lumped Mass for Feap problem      *//* Input  - frame pointer, element number,p array          *//* Output - Local Lumped  Mass                             *//* ======================================================= */#ifdef __STDC__QUANTITY *Element_Vector(ARRAY *p, int isw)#elseQUANTITY *Element_Vector(p, isw)ARRAY     *p;int      isw;#endif{  /*printf("*** In Element_VECTOR. Flag 1. Elem_# = %d\n",p->elmt_no); */  p = elmlib(p,isw);  return(p->nodal_loads);}/* ===================================================================== *//* Rigidbody_conn                                                        *//* Input - frame pointer frp, array ptr checks if any node of an element *//*         is connected to a rigid body. It labels it by adding          *//*         a value of (one thousand * rigid_body no) to such nodes       *//*                                                                       *//* NOTE : Nodes attached to rigid body are scaled by a factor 1,000,000  *//*        in the working-element p->ix[] data structure.                 *//* ===================================================================== */#ifdef __STDC__int Rigidbody_conn(EFRAME *frp, ARRAY *p)#elseint Rigidbody_conn(frp,p)EFRAME *frp;ARRAY  *p;#endif{int i,j,k,nn, no_node,out;out = NO;    for(i = 1; i<=frp->no_rigid;i++) {        no_node = frp->rigid[i-1].nodes_conn;        for(j = 1; j<=no_node;j++){            nn = frp->rigid[i-1].in[j];            for(k = 1; k<=p->nodes_per_elmt;k++) {                if(p->node_connect[k] == nn){                   p->node_connect[k] = p->node_connect[k] + i * 1000000;                   frp->node[nn -1].rb_num = i;                   out = YES;                }            }        }    }    return(out);}/* =================================================================== *//* Transform Stiff Matrix of member connected to Rigid Body            *//* transforms action at j of member to working pointt f of Rigid Body. *//*                                                                     *//* Transforms element S. Matrix Ke to T*Ke*Tt                          *//* Input - EFRAME *frp;  ARRAY *p;                                     *//*         Member Stiff Matrix MS                                      *//* Output- Modified Member Stiff Matrix MS                             *//* =================================================================== */#ifdef __STDC__MATRIX *Transform_Stiff_Matrix(EFRAME *frp, ARRAY *p, MATRIX *MS)#elseMATRIX *Transform_Stiff_Matrix(frp, p, MS)EFRAME     *frp;ARRAY        *p;MATRIX      *MS;#endif{int    nn,i,j,k,rb_no,node_no,rb_ty;double **Tfj, **Ti, **TiT, **ktit;double cgx,cgy,cgz;    Tfj = (double **)MatrixAllocIndirectDouble(p->dof_per_node,p->dof_per_node);    Ti  = (double **)MatrixAllocIndirectDouble(p->size_of_stiff,p->size_of_stiff);    TiT = (double **)MatrixAllocIndirectDouble(p->size_of_stiff,p->size_of_stiff);    for(i = 1; i<=p->nodes_per_elmt; i++) {         nn = p->node_connect[i];        if(nn > 1000000) {           node_no = nn - rb_no * 1000000;           rb_no = nn/1000000; /* find rigid body number */    /* ---- FIX LATER            if(frp->ndm == 3) {               if(frp->basic_elmt_type == TRUSS_3D)                 rb_ty = TRUSS_3D;              else                 rb_ty = FRAME_3D;            }           else                  rb_ty = frp->rigid[rb_no -1].rb_type;            */            cgx = p->coord[1][i].value - frp->rigid[rb_no -1].xcg.value;           cgy = p->coord[2][i].value - frp->rigid[rb_no -1].ycg.value;/******** fix later           if(frp->ndm >= 3)              cgz = p->coord[3][i] - frp->rigid[rb_no -1].zcg;	   else              cgz = 0.0;****************************/           Tfj = (double **) Transformation_Matrix(Tfj,rb_ty, p->dof_per_node,cgx,cgy,cgz);           Tfj = (double **)       Modify_T_Matrix(Tfj,  frp, p->dof_per_node, rb_no);       }       else          Tfj = Transformation_Matrix(Tfj,rb_ty, p->dof_per_node,0.0,0.0,0.0);       /* get other terms by symm          */       /* printf("node at end = %d\n", i); */       for(j = 1; j<=p->dof_per_node; j++) {          for(k = 1; k<=p->dof_per_node; k++) {               Ti[(i-1)*p->dof_per_node+j][ (i-1)*p->dof_per_node+ k] = Tfj[j][k];              TiT[(i-1)*p->dof_per_node+k][ (i-1)*p->dof_per_node+ j] = Tfj[j][k];          }       }    }   /* ------------------ */   /* Transformed Matrix */   /* ------------------ */   ktit = (double **) dMatrixMult(MS->uMatrix.daa,p->size_of_stiff,p->size_of_stiff, TiT, p->size_of_stiff, p->size_of_stiff);   MS->uMatrix.daa   = (double **) dMatrixMultRep(MS->uMatrix.daa, Ti, p->size_of_stiff, p->size_of_stiff, ktit, p->size_of_stiff, p->size_of_stiff);   MatrixFreeIndirectDouble(Tfj, p->dof_per_node);   MatrixFreeIndirectDouble(Ti, p->size_of_stiff);   MatrixFreeIndirectDouble(TiT, p->size_of_stiff);   MatrixFreeIndirectDouble(ktit, p->size_of_stiff);   return(MS);}/* ============================================================ *//* Transform Mass Matrix of RigidBody:                          *//* Transforms R body Mass Matrix M =p->s to Mp = Tpc.M.Ttpc.    *//* transforms action from                                       *//*  mass centres   to  working point of Rigid Body              *//*                                                              *//*  here pcx,pcy,pcz are cordinates of mass centre c of RBODY   *//*                       wrt working point p of RBODY           *//* Input -       frame pointer frp, Array ptr p.                *//*                Member Stiff Matrix MS                        *//* Output-       Modified Member Stiff Matrix MS                *//* ============================================================ */#ifdef __STDC__MATRIX *Transform_Rigid_Body_Mass_Matrix(EFRAME *frp, ARRAY *p, MATRIX *MS)#elseMATRIX *Transform_Rigid_Body_Mass_Matrix(frp, p, MS)EFRAME   *frp;ARRAY    *p;MATRIX   *MS;#endif{int nn, i,j,k,rb_no,node_no,rb_ty;double **Tpc, **Ttpc,**MTtpc;double pcx,pcy,pcz;     /*----------------------------------------------------------------------*/     /* Alloc_Matrix                                                         */     /*----------------------------------------------------------------------*/        Tpc  = MatrixAllocIndirectDouble(p->dof_per_node,p->dof_per_node);        Ttpc = MatrixAllocIndirectDouble(p->dof_per_node,p->dof_per_node);     /*----------------------------------------------------------------------*/     /* find rigid body number */     /*----------------------------------------------------------------------*/     rb_no = p->elmt_no;              rb_ty = frp->rigid[rb_no -1].rb_type;     /*----------------------------------------------------------------------*/     /* Coordinates of mass centre c  wrt working point p(geom centre)       */     /*    = global coord of cg c - global coord of wkg pt  p                */      /*----------------------------------------------------------------------*/     pcx =     p->work_section[4].value - frp->rigid[rb_no -1].xcg.value;     pcy =     p->work_section[5].value - frp->rigid[rb_no -1].ycg.value;     pcz = 0.0;/***********     if( frp->ndm >= 3)        pcz =    p->work_section[6] - frp->rigid[rb_no -1].zcg;***************/     Tpc = (double **) Transformation_Matrix(Tpc,rb_ty, p->dof_per_node,pcx,pcy,pcz);     /*----------------------------------------------------------------------*/     /* Modify depending on the dofs constrained   */     /*----------------------------------------------------------------------*/     Tpc = (double **) Modify_T_Matrix(Tpc, frp,p->dof_per_node,rb_no);    /* Transpose of Tpc matrix */     for(j = 1; j<=p->dof_per_node;j++)        for(k = 1; k<=p->dof_per_node;k++)           Ttpc[j][k] = Tpc[k][j];            /* Product : M.Ttpc           */      /* Product : Mp = Tpc. M.Ttpc */      MTtpc = (double **) dMatrixMult(MS->uMatrix.daa, p->dof_per_node, p->dof_per_node, Ttpc, p->dof_per_node, p->dof_per_node);      MS->uMatrix.daa    = (double **) dMatrixMultRep(MS->uMatrix.daa, Tpc, p->dof_per_node, p->dof_per_node, MTtpc, p->dof_per_node, p->dof_per_node);      MatrixFreeIndirectDouble(Tpc, p->dof_per_node);      MatrixFreeIndirectDouble(Ttpc, p->dof_per_node);      MatrixFreeIndirectDouble(MTtpc, p->dof_per_node);      return(MS);}/* ======================================================*//* Transformation matrix Tfj (=Tpj) for point j to f(=p) */ /* Action:  Ap = Tpj . Aj; Disp:    Dj = Ttpj . Dp       *//*   -- for framed structures and conn rigid bodies      *//* function double **Transformation_Matrix               *//*                    (t,type,no_dof,cx,cy,cz)              *//*  input;  t         :allocated matrix                  *//*          type      : type of element                  *//*          no_dof       : no of dof                        *//*          cx,cy,cz  : coordinates of  point j wrt      *//*                                    reference point p  *//* =======================================================*/#ifdef __STDC__double **Transformation_Matrix(double **t, char *type, int no_dof, double cx, double cy, double cz)#elsedouble **Transformation_Matrix(t, type,no_dof,cx,cy,cz)double **t;char   *type;int    no_dof;double cx,cy,cz;#endif{int i,j,n;     for(n = 0; n <= NO_ELEMENTS_IN_LIBRARY; n++) {          if(!strcmp(type, elmt_library[n].name))         break;       }       for(i = 1; i <= elmt_library[n].no_dof; i++)       for(j = 1; j <= elmt_library[n].no_dof; j++)           t[i][j] = 0.0;       if(elmt_library[n].no_dof == 3) {        /*2d beam:2d bar:2d frame: grid*/             t[1][1] = 1.0;             t[2][2] = 1.0;             if(!strcmp(type,"BEAM_2D"))                t[2][1] = cx;             else if(!strcmp(type,"TRUSS_2D")) {                t[3][1] = -cy;                t[3][2] =  cx;             }             else if(!strcmp(type,"FRAME_2D")){                t[3][1] = -cy;                t[3][2] =  cx;                t[3][3] =  1;             }             else {                               /*  GRID_XY */                t[1][3] =  cy;                t[2][3] = -cx;                t[3][3] =  1;             }          }       if(elmt_library[n].no_dof == 6) {             for(i = 1; i <= 6; i++)                 t[i][i] = 1.0;                  if(!strcmp(type,"TABLE_XZ")) {   /* 3d space table o== r storey */                t[3][1] =  cz;                t[3][2] = -cx;             }             else if(!strcmp(type,"TRUSS_3D")) {   /* space truss */                t[5][1] =  cz;                t[6][1] = -cy;                t[4][2] = -cz;                t[6][2] =  cx;                t[4][3] =  cy;                t[5][3] = -cx;             }             else {                               /* space frames */                for(i = 4; i <= 6; i++)                    t[i][i] = 1.0;                t[4][2] = -cz;                t[4][3] =  cy;                t[5][1] =  cz;                t[5][3] = -cx;                t[6][1] = -cy;                t[6][2] =  cx;             }     }     return(t);}/*  *  ===================================================================== *  Modify Transformation_Matrix(T) : makes rows and columns to zero for *  dof not connected to rigid body. Diagonal terms are retained as unity  *   *  Input - frame pointer frp, prob case   *  ===================================================================== */ #ifdef __STDC__double **Modify_T_Matrix(double **T, EFRAME *frp, int no_dof, int rb_no)#elsedouble **Modify_T_Matrix(T,frp, no_dof,rb_no)double **T;EFRAME *frp;int    no_dof, rb_no;#endif{int nn, i,j,k,ndof;int rb_elmt_type;    rb_elmt_type  = frp->rigid[rb_no -1].rb_type;    /* For Storey type rigid body                     */    /* all dofs(=3) assumed to be connected to R.Body */    if(rb_elmt_type == 7) { /* Storey type rigid body ;dofs=3 */                             /* all dofs are connected hence returned unaltered     */                            /* printf("** In Modify T_Mat: Storey Type   \n");  */       return(T);    }    /* general case */    for(j = 1; j<= no_dof;j++){        ndof = frp->rigid[rb_no -1].rest_dof[j];        if(ndof >= 1) { /* dofs not connected by Rigid body are = 1 */           for(k = 1; k <= no_dof; k++)               T[j][k] =0.0;               T[j][j] = 1.0;        }    }    return(T);}/*  *  ============================================ *  Set Element Properties for Feap problem         *  Input   - p array                                *  output  - p array                                *  ============================================ */ #ifdef __STDC__ARRAY *Element_Property(ARRAY *p)#elseARRAY *Element_Property(p)ARRAY *p;#endif{   p = elmlib(p,PROPTY);   return(p);}/* ================================================ *//* Set Material Properties for Feap problem         *//* Input  - p array                                 *//* output  - p array                                *//* ================================================ */#ifdef __STDC__ARRAY *Mate_Property(ARRAY *p)#elseARRAY *Mate_Property(p)ARRAY *p;#endif{int isw = 15;    p = elmlib(p,isw);    return(p);}/* ================================================== *//* Assemble Element Property Vector                   *//* Input  - frame pointer frp, prob case              *//* ================================================== */#ifdef __STDC__ARRAY *Eload_Property(ARRAY *p)#elseARRAY *Eload_Property(p)ARRAY *p;

⌨️ 快捷键说明

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