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

📄 plelemrotlq.cpp

📁 Finite element program for mechanical problem. It can solve various problem in solid problem
💻 CPP
📖 第 1 页 / 共 3 页
字号:
#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 + -