📄 plelemrotlq.cpp
字号:
#include "plelemrotlq.h"#include "global.h"#include "globmat.h"#include "genfile.h"#include "node.h"#include "element.h"#include "intpoints.h"#include <stdlib.h>#include <math.h>planeelemrotlq::planeelemrotlq (void){ long i,j; nne=4; ndofe=12; tncomp=3; napfun=3; intordmm=2; ned=4; nned=2; nb=2; ncomp = new long [nb]; ncomp[0]=2; ncomp[1]=1; cncomp = new long [nb]; cncomp[0]=0; cncomp[1]=2; nip = new long* [nb]; intordsm = new long* [nb]; for (i=0;i<nb;i++){ nip[i] = new long [nb]; intordsm[i] = new long [nb]; } intordsm[0][0]=3; intordsm[0][1]=0; intordsm[1][0]=0; intordsm[1][1]=3; nip[0][0]=9; nip[0][1]=0; nip[1][0]=0; nip[1][1]=9; tnip=0; for (i=0;i<nb;i++){ for (j=0;j<nb;j++){ tnip+=nip[i][j]; } }}planeelemrotlq::~planeelemrotlq (void){ long i; for (i=0;i<nb;i++){ delete [] nip[i]; delete [] intordsm[i]; } delete [] nip; delete [] intordsm; delete [] cncomp; delete [] ncomp;}void planeelemrotlq::eleminit (long eid){ long ii,jj; Mt->elements[eid].nb=nb; Mt->elements[eid].intordsm = new long* [nb]; Mt->elements[eid].nip = new long* [nb]; for (ii=0;ii<nb;ii++){ Mt->elements[eid].intordsm[ii] = new long [nb]; Mt->elements[eid].nip[ii] = new long [nb]; for (jj=0;jj<nb;jj++){ Mt->elements[eid].intordsm[ii][jj]=intordsm[ii][jj]; Mt->elements[eid].nip[ii][jj]=nip[ii][jj]; } }}/** function prepares auxiliary data for element with rotational degrees of freedom @param x,y - vectors of node coordinates @param l - vector of lengths @param nx,ny - vectors of normal vectors components 8.12.2001*/void planeelemrotlq::auxdata (vector &x,vector &y,vector &l,vector &nx,vector &ny){ double sx,sy; sx=x[1]-x[0]; sy=y[1]-y[0]; l[0]=sqrt(sx*sx+sy*sy); nx[0]=sy/l[0]; ny[0]=sx*(-1.0)/l[0]; sx=x[2]-x[1]; sy=y[2]-y[1]; l[1]=sqrt(sx*sx+sy*sy); nx[1]=sy/l[1]; ny[1]=sx*(-1.0)/l[1]; sx=x[3]-x[2]; sy=y[3]-y[2]; l[2]=sqrt(sx*sx+sy*sy); nx[2]=sy/l[2]; ny[2]=sx*(-1.0)/l[2]; sx=x[0]-x[3]; sy=y[0]-y[3]; l[3]=sqrt(sx*sx+sy*sy); nx[3]=sy/l[3]; ny[3]=sx*(-1.0)/l[3];}/** function approximates function defined by nodal values @param xi,eta - coordinates on element @param nodval - nodal values*/double planeelemrotlq::approx (double xi,double eta,vector &nodval){ double f; vector bf(nne); bf_lin_4_2d (bf.a,xi,eta); scprd (bf,nodval,f); return f;}/** function returns matrix of base function 9.7.2001*/void planeelemrotlq::bf_matrix (matrix &n,double xi,double eta,vector &l,vector &nx,vector &ny){ long i,j,k,m,ii,jj; vector bf(nne); fillm (0.0,n); bf_rot_4_2d (bf.a,xi,eta,nx.a,ny.a,l.a); j=0; k=1; m=2; ii=4; jj=8; for (i=0;i<nne;i++){ n[0][j]=bf[i]; n[0][m]=bf[ii]; n[1][k]=bf[i]; n[1][m]=bf[jj]; j+=3; k+=3; m+=3; ii++; jj++; }}void planeelemrotlq::geom_matrix (matrix &gm,vector &x,vector &y,double xi,double eta, vector &l,vector &nx,vector &ny,double &jac){ long i,i1,i2,i3,ii,jj; vector dx(3*nne),dy(3*nne); dx_bf_rot_4_2d (dx.a,xi,eta,nx.a,ny.a,l.a); dy_bf_rot_4_2d (dy.a,xi,eta,nx.a,ny.a,l.a); derivatives_2d (dx,dy,jac,x,y,xi,eta); fillm (0.0,gm); i1=0; i2=1; i3=2; ii=4; jj=8; for (i=0;i<nne;i++){ gm[0][i1]=dx[i]; gm[0][i3]=dx[ii]; gm[1][i2]=dy[i]; gm[1][i3]=dy[jj]; gm[2][i1]=dy[i]; gm[2][i2]=dx[i]; gm[2][i3]=dy[ii]+dx[jj]; i1+=3; i2+=3; i3+=3; ii++; jj++; } /* gm[0][0]=dx[0]; gm[0][2]=dx[4]; gm[0][3]=dx[1]; gm[0][5]=dx[5]; gm[0][6]=dx[2]; gm[0][8]=dx[6]; gm[0][9]=dx[3]; gm[0][11]=dx[7]; gm[1][1]=dy[0]; gm[1][2]=dy[8]; gm[1][4]=dy[1]; gm[1][5]=dy[9]; gm[1][7]=dy[2]; gm[1][8]=dy[10]; gm[1][10]=dy[3]; gm[1][11]=dy[11]; gm[2][0]=dy[0]; gm[2][1]=dx[0]; gm[2][2]=dy[4]+dx[8]; gm[2][3]=dy[1]; gm[2][4]=dx[1]; gm[2][5]=dy[5]+dx[9]; gm[2][6]=dy[2]; gm[2][7]=dx[2]; gm[2][8]=dy[6]+dx[10]; gm[2][9]=dy[3]; gm[2][10]=dx[3]; gm[2][11]=dy[7]+dx[11]; */}void planeelemrotlq::geom_matrix_block (matrix &gm,long ri,vector &x,vector &y,double xi,double eta, vector &l,vector &nx,vector &ny,double &jac){ long i,i1,i2,i3,ii,jj; vector dx(3*nne),dy(3*nne); dx_bf_rot_4_2d (dx.a,xi,eta,nx.a,ny.a,l.a); dy_bf_rot_4_2d (dy.a,xi,eta,nx.a,ny.a,l.a); derivatives_2d (dx,dy,jac,x,y,xi,eta); fillm (0.0,gm); if (ri==0){ i1=0; i2=1; i3=2; ii=4; jj=8; for (i=0;i<nne;i++){ gm[0][i1]=dx[i]; gm[0][i3]=dx[ii]; gm[1][i2]=dy[i]; gm[1][i3]=dy[jj]; i1+=3; i2+=3; i3+=3; ii++; jj++; } /* gm[0][0]=dx[0]; gm[0][2]=dx[4]; gm[0][3]=dx[1]; gm[0][5]=dx[5]; gm[0][6]=dx[2]; gm[0][8]=dx[6]; gm[0][9]=dx[3]; gm[0][11]=dx[7]; gm[1][1]=dy[0]; gm[1][2]=dy[8]; gm[1][4]=dy[1]; gm[1][5]=dy[9]; gm[1][7]=dy[2]; gm[1][8]=dy[10]; gm[1][10]=dy[3]; gm[1][11]=dy[11]; */ } if (ri==1){ i1=0; i2=1; i3=2; ii=4; jj=8; for (i=0;i<nne;i++){ gm[0][i1]=dy[i]; gm[0][i2]=dx[i]; gm[0][i3]=dy[ii]+dx[jj]; i1+=3; i2+=3; i3+=3; ii++; jj++; } /* gm[0][0]=dy[0]; gm[0][1]=dx[0]; gm[0][2]=dy[4]+dx[8]; gm[0][3]=dy[1]; gm[0][4]=dx[1]; gm[0][5]=dy[5]+dx[9]; gm[0][6]=dy[2]; gm[0][7]=dx[2]; gm[0][8]=dy[6]+dx[10]; gm[0][9]=dy[3]; gm[0][10]=dx[3]; gm[0][11]=dy[7]+dx[11]; */ } }void planeelemrotlq::addgeommat (matrix &gm,vector &x,vector &y,double xi,double eta, vector &l,vector &nx,vector &ny,double &jac){ long i,i1,i2,i3,ii,jj; vector bf(ndofe),dx(ndofe),dy(ndofe); bf_rot_4_2d (bf.a,xi,eta,nx.a,ny.a,l.a); dx_bf_rot_4_2d (dx.a,xi,eta,nx.a,ny.a,l.a); dy_bf_rot_4_2d (dy.a,xi,eta,nx.a,ny.a,l.a); derivatives_2d (dx,dy,jac,x,y,xi,eta); fillm (0.0,gm); i1=0; i2=1; i3=2; ii=4; jj=8; for (i=0;i<nne;i++){ gm[0][i1]=0.0-dy[i]/2.0; gm[0][i2]=dx[i]/2.0; gm[0][i3]=dx[jj]/2.0-dy[ii]/2.0-bf[i]; i1+=3; i2+=3; i3+=3; ii++; jj++; } /* gm[0][0]=0.0-dy[0]/2.0; gm[0][1]=dx[0]/2.0; gm[0][2]=dx[8]/2.0-dy[4]/2.0-bf[0]; gm[0][3]=0.0-dy[1]/2.0; gm[0][4]=dx[1]/2.0; gm[0][5]=dx[9]/2.0-dy[5]/2.0-bf[1]; gm[0][6]=0.0-dy[2]/2.0; gm[0][7]=dx[2]/2.0; gm[0][8]=dx[10]/2.0-dy[6]/2.0-bf[2]; gm[0][9]=0.0-dy[3]/2.0; gm[0][10]=dx[3]/2.0; gm[0][11]=dx[11]/2.0-dy[7]/2.0-bf[3]; */}void planeelemrotlq::dmatblock (long ri,long ci,matrix &d, matrix &dd){ fillm (0.0,dd); if (ri==0 && ci==0){ dd[0][0]=d[0][0]; dd[0][1]=d[0][1]; dd[1][0]=d[1][0]; dd[1][1]=d[1][1]; } if (ri==0 && ci==1){ dd[0][0]=d[0][2]; dd[1][0]=d[1][2]; } if (ri==1 && ci==0){ dd[0][0]=d[2][0]; dd[0][1]=d[2][1]; } if (ri==1 && ci==1){ dd[0][0]=d[2][2]; }}/** transformation matrix x_g = T x_l*/void planeelemrotlq::transf_matrix (ivector &nodes,matrix &tmat){ long i,n,m; fillm (0.0,tmat); n=nodes.n; m=tmat.m; for (i=0;i<m;i++){ tmat[i][i]=1.0; } for (i=0;i<n;i++){ if (Mt->nodes[nodes[i]].transf>0){ tmat[i*3][i*3] = Mt->nodes[nodes[i]].e1[0]; tmat[i*3][i*3+1] = Mt->nodes[nodes[i]].e2[0]; tmat[i*3][i*3+2] = 0.0; tmat[i*3+1][i*3] = Mt->nodes[nodes[i]].e1[1]; tmat[i*3+1][i*3+1] = Mt->nodes[nodes[i]].e2[1]; tmat[i*3+1][i*3+2] = 0.0; tmat[i*3+2][i*3] = 0.0; tmat[i*3+2][i*3+1] = 0.0; tmat[i*3+2][i*3+2] = 1.0; } }}/** function computes stiffness matrix of plane stress quadrilateral finite element with rotational degrees of freedom with bilinear approximation functions @param eid - number of element @param sm - stiffness matrix 8.12.2001*/void planeelemrotlq::stiffness_matrix (long eid,long ri,long ci,matrix &sm,vector &x,vector &y){ long i,j,ii,jj,ipp; double xi,eta,ww1,ww2,jac,thick; ivector nodes(nne); vector l(nne),nx(nne),ny(nne),w,gp,t(nne); matrix gmr,gmc,dd,d(tncomp,tncomp); Mt->give_elemnodes (eid,nodes); Mc->give_thickness (eid,nodes,t); auxdata (x,y,l,nx,ny); fillm (0.0,sm); for (ii=0;ii<nb;ii++){ allocm (ncomp[ii],ndofe,gmr); for (jj=0;jj<nb;jj++){ if (intordsm[ii][jj]==0) continue; allocv (intordsm[ii][jj],w); allocv (intordsm[ii][jj],gp); allocm (ncomp[jj],ndofe,gmc); allocm (ncomp[ii],ncomp[jj],dd); ipp=Mt->elements[eid].ipp[ii][jj]; gauss_points (gp.a,w.a,intordsm[ii][jj]); for (i=0;i<intordsm[ii][jj];i++){ xi=gp[i]; ww1=w[i]; for (j=0;j<intordsm[ii][jj];j++){ eta=gp[j]; ww2=w[j]; // geometrical matrix geom_matrix_block (gmr,ii,x,y,xi,eta,l,nx,ny,jac); geom_matrix_block (gmc,jj,x,y,xi,eta,l,nx,ny,jac); // matrix of stiffness of the material Mm->matstiff (d,ipp); dmatblock (ii,jj,d,dd); thick = approx (xi,eta,t); jac*=thick*ww1*ww2; // contribution to the stiffness matrix of the element //bdbj (sm.a,gm.a,d.a,jac,gm.m,gm.n); bdbjac (sm,gmr,dd,gmc,jac); ipp++; } } destrm (dd); destrm (gmc); destrv (gp); destrv (w); } destrm (gmr); } allocv (1,w); allocv (1,gp); gauss_points (gp.a,w.a,1); allocm (1,ndofe,gmr); allocm (ndofe,ndofe,gmc); for (i=0;i<1;i++){ for (j=0;j<1;j++){ xi=gp[i]; eta=gp[j]; addgeommat (gmr,x,y,xi,eta,l,nx,ny,jac); mtxm (gmr,gmr,gmc); thick = approx (xi,eta,t); cmulm (thick*jac*w[i]*w[j],gmc); addm (sm,gmc,sm); } } /* allocv (2,w); allocv (2,gp); gauss_points (gp.a,w.a,2); allocm (1,ndofe,gmr); allocm (ndofe,ndofe,gmc); for (i=0;i<2;i++){ for (j=0;j<2;j++){ xi=gp[i]; eta=gp[j]; addgeommat (gmr,x,y,xi,eta,l,nx,ny,jac); mtxm (gmr,gmr,gmc); thick = approx (xi,eta,t); cmulm (thick*jac*w[i]*w[j],gmc); addm (sm,gmc,sm); } } */ destrm (gmc); destrm (gmr); destrv (gp); destrv (w);}void planeelemrotlq::res_stiffness_matrix (long eid,matrix &sm){ long transf; ivector nodes(nne);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -