📄 plelemlq.cpp
字号:
vector w,gp,t(nne),sig(tncomp),r(ndofe); matrix gm(tncomp,ndofe),grm(4,ndofe),d(tncomp,tncomp),s(4,4); // element nodes Mt->give_elemnodes (eid,nodes); // thickness of element Mc->give_thickness (eid,nodes,t); // code numbers of element Mt->give_code_numbers (eid,cn.a); // nodal displacements eldispl (lcid,eid,r.a,cn.a,ndofe); // component setting to zero fillm (0.0,sm); // array for weights of integration points allocv (intordsm[0][0],w); // array for coordinates of integration points allocv (intordsm[0][0],gp); // coordinates and weights of integration points gauss_points (gp.a,w.a,intordsm[0][0]); // number of the first integration point on element ipp=Mt->elements[eid].ipp[ri][ci]; for (i=0;i<intordsm[0][0];i++){ xi=gp[i]; for (j=0;j<intordsm[0][0];j++){ eta=gp[j]; // // linear stiffness matrix and inital deformation matrix // // strain-displacement matrix gngeom_matrix (gm,r,x,y,xi,eta,jac); // stiffness matrix of the material Mm->matstiff (d,ipp); // thickness in integration point thick = approx (xi,eta,t); jac*=thick*w[i]*w[j]; // contribution to the stiffness matrix of the element bdbjac (sm,gm,d,gm,jac); // // initial stress matrix // // gradient matrix gnl_grmatrix (grm,x,y,xi,eta,jac2); // stresses Mm->givestress (lcid,ipp,sig); s[0][0]=sig[0]; s[0][1]=sig[2]; s[1][0]=sig[2]; s[1][1]=sig[1]; s[2][2]=sig[0]; s[2][3]=sig[2]; s[3][2]=sig[2]; s[3][3]=sig[1]; // contribution to the stiffness matrix of the element bdbjac (sm,grm,s,grm,jac); ipp++; } } destrv (gp); destrv (w); }/** function computes stiffness %matrix of quadrilateral element @param lcid - load case id @param eid - element id @param sm - stiffness %matrix JK*/void planeelemlq::res_stiffness_matrix (long lcid,long eid,matrix &sm){ long transf; ivector nodes(nne); vector x(nne),y(nne); Mt->give_node_coord2d (x,y,eid); gl_stiffness_matrix (eid,0,0,sm,x,y); //gnl_stiffness_matrix (lcid,eid,0,0,sm,x,y); // transformation of stiffness matrix // (in the case of nodal coordinate systems) Mt->give_elemnodes (eid,nodes); transf = Mt->locsystems (nodes); if (transf>0){ matrix tmat (ndofe,ndofe); transf_matrix (nodes,tmat); glmatrixtransf (sm,tmat); }}/** function computes mass %matrix of the plane stress rectangular finite element with bilinear approximation functions this function is used in plane stress/strain elements (function is called by function res_mass_matrix) and shell elements @param eid - number of element @param mm - mass %matrix JK, 24.6.2001*/void planeelemlq::mass_matrix (long eid,matrix &mm,vector &x,vector &y){ long i,j; double jac,xi,eta,thick,rho; ivector nodes(nne); vector w(intordmm),gp(intordmm),t(nne),dens(nne); matrix n(napfun,ndofe); Mt->give_elemnodes (eid,nodes); Mc->give_thickness (eid,nodes,t); Mc->give_density (eid,nodes,dens); gauss_points (gp.a,w.a,intordmm); fillm (0.0,mm); for (i=0;i<intordmm;i++){ xi=gp[i]; for (j=0;j<intordmm;j++){ eta=gp[j]; jac_2d (jac,x,y,xi,eta); bf_matrix (n,xi,eta); thick = approx (xi,eta,t); rho = approx (xi,eta,dens); jac*=w[i]*w[j]*thick*rho; nnj (mm.a,n.a,jac,n.m,n.n); } } }/** function assembles mass %matrix of plane stress rectangular finite element with biquadratic approximation functions @param eid - element id @param mm - mass %matrix JK*/void planeelemlq::res_mass_matrix (long eid,matrix &mm){ long transf; ivector nodes(nne); vector x(nne),y(nne); Mt->give_node_coord2d (x,y,eid); mass_matrix (eid,mm,x,y); // transformation of mass matrix // (in the case of nodal coordinate systems) Mt->give_elemnodes (eid,nodes); transf = Mt->locsystems (nodes); if (transf>0){ matrix tmat (ndofe,ndofe); transf_matrix (nodes,tmat); glmatrixtransf (mm,tmat); }}/** function computes strains at integration points @param lcid - load case id @param eid - element id JK*/void planeelemlq::res_ip_strains (long lcid,long eid){ vector aux,x(nne),y(nne),r(ndofe); ivector cn(ndofe),nodes(nne); matrix tmat; Mt->give_node_coord2d (x,y,eid); Mt->give_elemnodes (eid,nodes); Mt->give_code_numbers (eid,cn.a); eldispl (lcid,eid,r.a,cn.a,ndofe); // transformation of displacement vector long transf = Mt->locsystems (nodes); if (transf>0){ allocv (ndofe,aux); allocm (ndofe,ndofe,tmat); transf_matrix (nodes,tmat); //locglobtransf (aux,r,tmat); lgvectortransf (aux,r,tmat); copyv (aux,r); destrv (aux); destrm (tmat); } gl_ip_strains (lcid,eid,0,0,x,y,r); //gnl_ip_strains (lcid,eid,0,0,x,y,r); }/** function computes strains at integration points of element function is used in geometrically linear problems @param lcid - load case id @param eid - element id @param ri,ci - row and column indices @param ii - number of block @param x,y - arrays with node coordinates @param r - %vector of nodal displacements JK, 10.5.2002*/void planeelemlq::gl_ip_strains (long lcid,long eid,long ri,long ci,vector &x,vector &y,vector &r){ long i,j,ii,ipp; double xi,eta,jac; vector gp,w,eps,epscum; matrix gm; // loop over blocks for (ii=0;ii<nb;ii++){ allocv (intordsm[ii][ii],gp); allocv (intordsm[ii][ii],w); allocv (ncomp[ii],eps); allocm (ncomp[ii],ndofe,gm); gauss_points (gp.a,w.a,intordsm[ii][ii]); ipp=Mt->elements[eid].ipp[ri+ii][ci+ii]; for (i=0;i<intordsm[ii][ii];i++){ xi=gp[i]; for (j=0;j<intordsm[ii][ii];j++){ eta=gp[j]; geom_matrix_block (gm,ii,x,y,xi,eta,jac); mxv (gm,r,eps); Mm->storestrain (lcid,ipp,cncomp[ii],eps); ipp++; } } destrm (gm); destrv (eps); destrv (w); destrv (gp); } // ******************************************** // exchange of values at integration points // ******************************************** // values from 4 points to 1 point ipp=Mt->elements[eid].ipp[ri][ci]; allocv (ncomp[0],epscum); allocv (ncomp[0],eps); for (i=0;i<intordsm[0][0];i++){ for (j=0;j<intordsm[0][0];j++){ Mm->givestrain (lcid,ipp,cncomp[0],eps); addv (eps,epscum,epscum); ipp++; } } cmulv (1.0/4.0,epscum,epscum); ipp=Mt->elements[eid].ipp[ri+1][ci+1]; Mm->storestrain (lcid,ipp,epscum); destrv (eps); destrv (epscum); // value from 1 point to 4 points allocv (ncomp[1],eps); Mm->givestrain (lcid,ipp,cncomp[1],eps); ipp=Mt->elements[eid].ipp[ri][ci]; Mm->storestrain (lcid,ipp,cncomp[1],eps); ipp++; Mm->storestrain (lcid,ipp,cncomp[1],eps); ipp++; Mm->storestrain (lcid,ipp,cncomp[1],eps); ipp++; Mm->storestrain (lcid,ipp,cncomp[1],eps); ipp++; destrv (eps);}/** function computes strains at integration points of element function is used in geometrically linear problems @param lcid - load case id @param eid - element id @param ri,ci - row and column indices @param ii - number of block @param x,y - arrays with node coordinates @param r - %vector of nodal displacements JK, 24.9.2005*/void planeelemlq::gnl_ip_strains (long lcid,long eid,long ri,long ci,vector &x,vector &y,vector &r){ long i,j,ipp; double xi,eta,jac,b11r,b12r,b21r,b22r; vector gp,w,eps,b11(ndofe),b12(ndofe),b21(ndofe),b22(ndofe); allocv (intordsm[0][0],gp); allocv (intordsm[0][0],w); allocv (tncomp,eps); gauss_points (gp.a,w.a,intordsm[0][0]); ipp=Mt->elements[eid].ipp[ri][ci]; for (i=0;i<intordsm[0][0];i++){ xi=gp[i]; for (j=0;j<intordsm[0][0];j++){ eta=gp[j]; bvectors (x,y,xi,eta,jac,b11,b12,b21,b22); scprd (b11,r,b11r); scprd (b12,r,b12r); scprd (b21,r,b21r); scprd (b22,r,b22r); eps[0]=b11r+0.5*b11r*b11r+0.5*b21r*b21r; eps[1]=b22r+0.5*b12r*b12r+0.5*b22r*b22r; eps[2]=b12r+b21r+b11r*b12r+b21r*b22r; Mm->storestrain (lcid,ipp,eps); ipp++; } } destrv (eps); destrv (w); destrv (gp); }/** function computes strains in nodes of element @param lcid - load case id @param eid - element id @param ri,ci - row and column indices 10.5.2002*/void planeelemlq::nod_strains_ip (long lcid,long eid,long ri,long ci){ long i,j,ipp; ivector ipnum(nne),nod(nne); vector eps(tncomp); // numbers of integration points closest to nodes // (function is from the file GEFEL/ordering.cpp) ipp=Mt->elements[eid].ipp[ri][ci]; nodip_planelq (ipp,intordsm[0][0],ipnum); // node numbers of the element Mt->give_elemnodes (eid,nod); for (i=0;i<nne;i++){ // strains at the closest integration point Mm->givestrain (lcid,ipnum[i],eps); // storage of strains to the node j=nod[i]; Mt->nodes[j].storestrain (lcid,0,eps); } }/** function computes nodal strains directly @param lcid - load case id @param eid - element id @param stra - array for strain components JK, 25.9.2004*/void planeelemlq::nod_strains_comp (long lcid,long eid,double **stra){ long i,j; double jac; ivector cn(ndofe),nodes(nne); vector x(nne),y(nne),nxi(nne),neta(nne),r(ndofe),eps(tncomp),aux; matrix tmat,gm(tncomp,ndofe); // node coordinates Mt->give_node_coord2d (x,y,eid); // node numbers Mt->give_elemnodes (eid,nodes); // code numbers of the element Mt->give_code_numbers (eid,cn.a); // nodal displacements eldispl (lcid,eid,r.a,cn.a,ndofe); // transformation of displacement vector long transf = Mt->locsystems (nodes); if (transf>0){ allocv (ndofe,aux); allocm (ndofe,ndofe,tmat); transf_matrix (nodes,tmat); //locglobtransf (aux,r,tmat); lgvectortransf (aux,r,tmat); copyv (aux,r); destrv (aux); destrm (tmat); } // natural coordinates of element nodes // (function is from the file GEFEL/ordering.cpp) nodcoord_planelq (nxi,neta); // loop over nodes for (i=0;i<nne;i++){ // geometric matrix geom_matrix (gm,x,y,nxi[i],neta[i],jac); // strain computation mxv (gm,r,eps); for (j=0;j<eps.n;j++){ stra[i][j]=eps[j]; } }}/** function computes strains at strain points @param lcid - load case id @param eid - element id @param ri,ci - row and column indices JK*/void planeelemlq::strains (long lcid,long eid,long ri,long ci){ long i,naep,ncp,sid; vector coord,eps; switch (Mm->stra.tape[eid]){ case nowhere:{ break; } case intpts:{ //allip_strains (lcid,eid,ri,ci); break; } case enodes:{ nod_strains_ip (lcid,eid,ri,ci); break; } case userdefined:{ // number of auxiliary element points naep = Mm->stra.give_naep (eid); ncp = Mm->stra.give_ncomp (eid); sid = Mm->stra.give_sid (eid); allocv (ncp,eps); allocv (2,coord); for (i=0;i<naep;i++){ Mm->stra.give_aepcoord (sid,i,coord); if (Mp->strainaver==0) //appval (coord[0],coord[1],0,ncp,eps,stra); if (Mp->strainaver==1) //appstrain (lcid,eid,coord[0],coord[1],0,ncp,eps); Mm->stra.storevalues(lcid,eid,i,eps); } destrv (eps); destrv (coord); break; } default:{ fprintf (stderr,"\n\n unknown strain point is required in function planeelemlq::strains (%s, line %d).\n",__FILE__,__LINE__); } } }/** function computes stresses at integration points @param lcid - load case id @param eid - element id JK*/void planeelemlq::res_ip_stresses (long lcid,long eid){ ip_stresses (lcid,eid,0,0);}/** function computes stresses at integration points of element @param lcid - load case id @param eid - element id @param ri,ci - row and column indices function can be used when all strain components are known at all integration points JK, 10.5.2002*/void planeelemlq::ip_stresses (long lcid,long eid,long ri,long ci){ long i,j,ii,jj,ipp; vector sig,sigcum; for (ii=0;ii<nb;ii++){ for (jj=0;jj<nb;jj++){ if (intordsm[ii][jj]==0) continue; ipp=Mt->elements[eid].ipp[ri+ii][ci+jj]; for (i=0;i<intordsm[ii][jj];i++){ for (j=0;j<intordsm[ii][jj];j++){ // computation of correct stresses if (Mp->strcomp==1) Mm->computenlstresses (ipp); ipp++; } } } } // ******************************************** // exchange of values at integration points // ******************************************** // values from 4 points to 1 point ipp=Mt->elements[eid].ipp[ri][ci]; allocv (ncomp[0],sigcum); allocv (ncomp[0],sig); for (i=0;i<intordsm[0][0];i++){ for (j=0;j<intordsm[0][0];j++){ Mm->givestress (lcid,ipp,cncomp[0],sig); addv (sig,sigcum,sigcum); ipp++; } } cmulv (1.0/4.0,sigcum,sigcum); ipp=Mt->elements[eid].ipp[ri+1][ci+1]; Mm->storestress (lcid,ipp,sigcum); destrv (sig); destrv (sigcum); // value from 1 point to 4 points allocv (ncomp[1],sig); Mm->givestrain (lcid,ipp,cncomp[1],sig); ipp=Mt->elements[eid].ipp[ri][ci]; Mm->storestrain (lcid,ipp,cncomp[1],sig); ipp++; Mm->storestrain (lcid,ipp,cncomp[1],sig); ipp++; Mm->storestrain (lcid,ipp,cncomp[1],sig); ipp++; Mm->storestrain (lcid,ipp,cncomp[1],sig); ipp++; destrv (sig);}/** function computes stresses in integration points of element @param lcid - load case id @param eid - element id @param ri,ci - row and column indices function can be used when all strain components are known at all integration points 10.5.2002*/void planeelemlq::ip_elast_stresses (long lcid,long eid,long ri,long ci){ long i,j,ii,jj,ipp; double xi,eta; vector gp,w,eps,epst,epstt,sig,auxsig; matrix d(tncomp,tncomp),dd; for (ii=0;ii<nb;ii++){ allocv (ncomp[ii],sig); allocv (ncomp[ii],auxsig); allocv (intordsm[ii][ii],gp); allocv (intordsm[ii][ii],w); gauss_points (gp.a,w.a,intordsm[ii][ii]); ipp=Mt->elements[eid].ipp[ri+ii][ci+ii]; for (i=0;i<intordsm[ii][ii];i++){ xi=gp[i]; for (j=0;j<intordsm[ii][ii];j++){ eta=gp[j]; Mm->matstiff (d,ipp); fillv (0.0,sig); for (jj=0;jj<nb;jj++){ allocv (ncomp[jj],eps); allocm (ncomp[ii],ncomp[jj],dd); // block of strains
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -