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

📄 fe_matrix.c

📁 有限元分析源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
#endif{int  isw = 16;    p = elmlib(p,isw) ;    return(p);} #define PLASTIC 2/* ======================================================*//* function  double   *Transform_Force(frp,F,nn )        *//*  Calculates  Transform_Force Matrix  Ti   for         *//*  Relation:        Abi = Ti . Ami                      *//*  Converts the actions in Ami(at end of the member)    *//*  to the statically equivalent actions in Abi          *//*         ( at the working points of the rigid bodies ) *//* Input - frame pointer frp,                            *//*      F: Force Vector for the problem which is partially *//*            modified for node nu 'nn' in transforming  *//*            node force from this point to wkg pt of RB *//* ===================================================== */#ifdef __STDC__QUANTITY *Transform_Force(EFRAME *frp, QUANTITY *F, int nn )#elseQUANTITY *Transform_Force(frp,F,nn )EFRAME   *frp;QUANTITY *F;int nn ;#endif{int      i,k,rb_no,rb_elmt_type;double   **Fj, **Ff, **Tfj;double   cgx,cgy,cgz ,temp;   k   = frp->no_dof;       /*for general case*/   Fj  = MatrixAllocIndirectDouble(k,1);   Tfj = MatrixAllocIndirectDouble(k,k);   rb_no = frp->node[nn -1].rb_num;   rb_elmt_type = 7;   rb_elmt_type = frp->rigid[rb_no -1].rb_type;   /* ------------------------------------------------------------------- */   /* compute coordinates of node wrt ref point- cg(wkg pt) of rigid body */   /* ------------------------------------------------------------------- */    cgx = frp->node[nn-1].coord[1].value - frp->rigid[rb_no -1].xcg.value;    cgy = frp->node[nn-1].coord[2].value - frp->rigid[rb_no -1].ycg.value;/********    if(frp->ndm >=3)       cgz  =   frp->node[nn-1].coord[3] - frp->rigid[rb_no -1].zcg;    else       cgz  = 0.0;**********/    /* Transformation Matrix */    Tfj = (double **)Transformation_Matrix(Tfj,(char *)rb_elmt_type,frp->no_dof, cgx,cgy,cgz);    Tfj = (double **)Modify_T_Matrix(Tfj, frp,frp->no_dof ,rb_no);    /* Transformation Matrix- store for further use */    frp->node[nn -1].TrT->uMatrix.daa = (double **) dMatrixTranspose(Tfj,frp->no_dof,frp->no_dof);    for(i = 1; i<=k;i++)        Fj[i][1] = F[(nn  - 1) * frp->no_dof +i].value;    Ff = (double **) dMatrixMult(Tfj, frp->no_dof, frp->no_dof,Fj, frp->no_dof, 1);    for(i = 1; i<=k;i++)        F[(nn  - 1) * frp->no_dof+i].value = Ff[i][1];    MatrixFreeIndirectDouble(Ff, frp->no_dof);    MatrixFreeIndirectDouble(Fj, frp->no_dof);    MatrixFreeIndirectDouble(Tfj, frp->no_dof);    return(F);}/*  *  ============================================================================  *  Bound_Disp : Checks for displacement at restraint boundary nodes for an elmt              *   *  Input - frame pointer frp, element no   *  ============================================================================  */ #ifdef __STDC__int Bound_Disp(EFRAME *frp, ARRAY *p, int elmt_no)#elseint Bound_Disp(frp,p, elmt_no)EFRAME  *frp;ARRAY   *p;int     elmt_no;#endif{ELEMENT *el;double  displ;int     i,j,k,nen, no_dof,out;    el  = &frp->element[elmt_no -1];      /* element ptr   */    p   = Assign_p_Array(frp,elmt_no,p, 10);    nen = p->nodes_per_elmt;    no_dof = p->dof_per_node;   /*ed feb 6  MIN(p->dof_per_node,frp->no_dof)*/    out = NO;         /* default outcome  initialized */    for(i = 1; i<=nen;i++){        for(j = 1; j<=no_dof;j++){            k = el->d_array[(i-1) *no_dof + j];            if(k<0) {           /* fixed or restrained dofs */               displ = frp->node[el->node_connect[i]  - 1].disp[j].value;                p->nodal_loads[(i-1) * no_dof + j].value = displ;               if(displ != 0.0) out = YES;            }            else               p->nodal_loads[(i-1) * no_dof + j].value = 0.0;        }    }    return(out);}/* =========== *//* Modify_Load *//* =========== */#ifdef __STDC__QUANTITY *Modify_Load(QUANTITY *b, EFRAME *frp, ARRAY *p, int elmt_no)#elseQUANTITY *Modify_Load(b, frp, p, elmt_no)QUANTITY *b;EFRAME   *frp;ARRAY    *p;int      elmt_no;#endif{ELEMENT  *el;MATRIX   *Ke;int      *Ld;int      i,j,k;    el = &frp->element[elmt_no -1];    p  = Assign_p_Array(frp,elmt_no,p, LOAD_MATRIX);    Ke = Element_Matrix(p,STIFF);    Ld = el->d_array;    for(i = 1; i<=p->size_of_stiff;i++) {        k = Ld[i];        if(k>0) {           for(j = 1; j<=p->size_of_stiff;j++)               b[k].value = b[k].value - Ke->uMatrix.daa[i][j] * p->nodal_loads[j].value;        }    }    return(b);}/* ============================================== *//*   Function to Add input loadvector pl          *//*                      to loadvector fvector     *//* ============================================== */#ifdef __STDC__QUANTITY *Addload_Vector(EFRAME *frp, ARRAY *p, QUANTITY *fvector,  QUANTITY *pl, int elmt_no)#elseQUANTITY *Addload_Vector(frp,p,fvector, pl, elmt_no)EFRAME   *frp;ARRAY    *p;QUANTITY *fvector, *pl;int      elmt_no;#endif{int      j,k;int      i,iid,ii;ELEMENT  *el;int      *ldofg;char     *el_type;int      elmt_attr_no;    el           = &frp->element[elmt_no -1];    elmt_attr_no = el->elmt_attr_no;    el_type      = frp->eattr[elmt_attr_no-1].elmt_type;    ldofg        = frp->eattr[elmt_no-1].map_ldof_to_gdof;    for(i=1;i<=p->nodes_per_elmt;i++){        ii  = el->node_connect[i];        iid = (ii-1) * frp->no_dof;        for(j = 1; j<= p->dof_per_node; j++){            k = ldofg[j-1];            if(k > 0)              fvector[iid + k].value += pl[(i-1)*p->dof_per_node+ j].value;        }    }    return(fvector);}/* =============================== *//* Function to Assemble Nodal Load *//* =============================== */#ifdef __STDC__QUANTITY *Assemble_Nodal_Load(EFRAME *frp, QUANTITY *fv)#elseQUANTITY *Assemble_Nodal_Load(frp, fv)EFRAME   *frp;QUANTITY *fv;#endif{NODE               *np;NODE_LOADS        *nlp;int i,node, dof, nload; /* Initialize load vector */    for(dof=1; dof<=frp->no_eq; dof++)        fv[dof].value = 0.;    for(nload = 1; nload <= frp->no_node_loads; nload++) {        nlp  = &frp->nforces[nload-1];        node = nlp->node_f;        for(i =1; i <= frp->no_dof; i++)            fv[(node -1) *  frp->no_dof + i ].value = nlp->fn[i].value;    }    return (fv);}/* ======================================= *//*   Function to Assemble  Gravity  Load   *//* ======================================= */#ifdef __STDC__QUANTITY *Assemble_Gravity_Load(EFRAME *frp, QUANTITY *fv)#elseQUANTITY *Assemble_Gravity_Load(frp, fv)EFRAME   *frp;QUANTITY *fv;#endif{NODE               *np;NODE_LOADS        *nlp;int i,node, dof, nload;   /* FILL IN DETAILS LATER */   return (fv);}/* =========================================== *//*   Function to Apply the Boundary conditions *//*   to the global stiffness matrix            *//* =========================================== */#ifdef __STDC__double **Boundary_Conditions(EFRAME *frp)#elsedouble **Boundary_Conditions(frp)EFRAME *frp;#endif{NODE                *np;NODE_LOADS         *nlp;int  i,node, dof, nload;   for(node=1;node<=frp->no_nodes;node++) {       np   = &frp->node[node-1];       for(i =1; i<= frp->no_dof; i++) {       if(np->bound_id[i] >0) {           for(dof=1;dof<=TDOF;dof++) {               K[dof][(node-1)*frp->no_dof +i] = 0.;               K[(node-1)*frp->no_dof + 1][dof] = 0.;           }           K[(node-1)*frp->no_dof + 1][(node-1)*frp->no_dof+ 1] = 0.;           F[(node-1)*frp->no_dof + 1]   = 0.;       }       }   }   return (K);}/* ==================================== *//*   Function to compute nodal forces   *//* ==================================== */#ifdef __STDC__QUANTITY *Nodal_Forces(EFRAME *frp)#elseQUANTITY *Nodal_Forces(frp)EFRAME   *frp;#endif{int i,j;    /* Initialize nodal force vector : Compute [K]*{d} = {Fn} */     for(i=1; i<=TDOF; i++) Fn[i].value = 0.;         for(i=1;i<=TDOF;i++)         for(j=1;j<=TDOF;j++)             Fn[i].value += K[i][j]*d[j];     return (Fn);}/* =======================================  *//*   Function to Assemble  Centrifugal  Load*//* =======================================  */#ifdef __STDC__QUANTITY *Assemble_Ctrfgl_Load(EFRAME *frp, QUANTITY *fv)#elseQUANTITY *Assemble_Ctrfgl_Load(frp,fv)EFRAME   *frp;QUANTITY *fv;#endif{NODE               *np;NODE_LOADS        *nlp;int i,node, dof, nload; /* to be changed */   for(dof=1; dof<=frp->no_eq; dof++)      fv[dof].value   = 0.;   for(nload = 1; nload <= frp->no_node_loads; nload++) {     nlp  = &frp->nforces[nload-1];     node = nlp->node_f;         for(i =1; i <= frp->no_dof; i++)             fv[(node -1) *  frp->no_dof + i ].value = nlp->fn[i].value;   }   return (fv);}/* Functions for design rule checking */#ifdef __STDC__MATRIX *Get_Coord(MATRIX *m)#elseMATRIX *Get_Coord(m)MATRIX *m;#endif{MATRIX *coord;int    nodeno;int        ii;#ifdef DEBUG       printf("*** Enter Get_Coord()\n");#endif       nodeno = (int) m->uMatrix.daa[0][0];       coord  = MatrixAllocIndirect("Node Coord", DOUBLE_ARRAY, 1, frame->no_dimen);       if( CheckUnits() == ON ) {          for( ii=0 ; ii<frame->no_dimen ; ii++ ) {             coord->uMatrix.daa[0][ii] = frame->node[nodeno-1].coord[ii].value;             UnitsCopy( &(coord->spColUnits[ii]), frame->node[nodeno-1].coord[ii].dimen );          }          ZeroUnits( &(coord->spRowUnits[0]) );       }       else {          for( ii=0 ; ii<frame->no_dimen ; ii++ )             coord->uMatrix.daa[0][ii] = frame->node[nodeno-1].coord[ii].value;       }#ifdef DEBUG       printf("*** Leave Get_Coord()\n");#endif    return(coord);}#ifdef __STDC__MATRIX *Get_Node(MATRIX *m)#elseMATRIX *Get_Node(m)MATRIX *m;#endif{MATRIX *connect;int      elmtno;int          ii;#ifdef DEBUG       printf("*** Enter Get_Node()\n");#endif       elmtno   = (int) m->uMatrix.daa[0][0];       connect  = MatrixAllocIndirect("Node Connect", DOUBLE_ARRAY, 1, frame->no_nodes_per_elmt);       if( CheckUnits() == ON ) {          for( ii=0 ; ii<frame->no_nodes_per_elmt ; ii++ ) {             connect->uMatrix.daa[0][ii] = (double) frame->element[elmtno-1].node_connect[ii];             ZeroUnits( &(connect->spColUnits[ii]) );          }          ZeroUnits( &(connect->spRowUnits[0]) );       }       else {          for( ii=0 ; ii<frame->no_nodes_per_elmt ; ii++ )             connect->uMatrix.daa[0][ii] = (double) frame->element[elmtno-1].node_connect[ii];       }#ifdef DEBUG

⌨️ 快捷键说明

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