📄 fe_matrix.c
字号:
#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 + -