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

📄 plelemrotlt.cpp

📁 Finite element program for mechanical problem. It can solve various problem in solid problem
💻 CPP
📖 第 1 页 / 共 3 页
字号:
#include "plelemrotlt.h"#include "global.h"#include "globmat.h"#include "genfile.h"#include "node.h"#include "element.h"#include "intpoints.h"#include <stdlib.h>planeelemrotlt::planeelemrotlt (void){  long i,j;  nne=3;  ndofe=9;  tncomp=3;  napfun=3;  intordmm=3;  ned=3;  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];  }    nip[0][0]=3;  nip[0][1]=0;  nip[1][0]=0;  nip[1][1]=3;    tnip=0;  for (i=0;i<nb;i++){    for (j=0;j<nb;j++){      tnip+=nip[i][j];    }  }  intordsm[0][0]=3;  intordsm[0][1]=0;  intordsm[1][0]=0;  intordsm[1][1]=3;}planeelemrotlt::~planeelemrotlt (void){  long i;    for (i=0;i<nb;i++){    delete [] nip[i];    delete [] intordsm[i];  }  delete [] nip;  delete [] intordsm;    delete [] cncomp;  delete [] ncomp;}void planeelemrotlt::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 approximates function defined by nodal values      @param areacoord - vector containing area coordinates   @param nodval - nodal values      6.1.2002*/double planeelemrotlt::approx (vector &areacoord,vector &nodval){  double f;  scprd (areacoord,nodval,f);  return f;}/**   function approximates function defined by nodal values   @param xi,eta - natural coordinates   @param nodval - nodal values      1.4.2002*/double planeelemrotlt::approx_nat (double xi,double eta,vector &nodval){  double f;  vector areacoord(3);    areacoord[0]=xi;  areacoord[1]=eta;  areacoord[2]=1.0-areacoord[0]-areacoord[1];    scprd (areacoord,nodval,f);  return f;}/**   function returns matrix of base function      6.1.2002*/void planeelemrotlt::bf_matrix (matrix &n,vector &l,vector &b,vector &c){  vector bf(9);    fillm (0.0,n);  bf_rot_3_2d (bf.a,l.a,b.a,c.a);    n[0][0]=bf[0];  n[0][2]=bf[3];  n[0][3]=bf[1];  n[0][5]=bf[4];  n[0][6]=bf[2];  n[0][8]=bf[5];  n[1][1]=bf[0];  n[1][2]=bf[6];  n[1][4]=bf[1];  n[1][5]=bf[7];  n[1][7]=bf[2];  n[1][8]=bf[8];}void planeelemrotlt::geom_matrix (matrix &gm,vector &x,vector &y,vector &areacoord){  double area,det;  vector b(3),c(3),dx(9),dy(9);    //  det is equal to double area of the element  det = (x[1]-x[0])*(y[2]-y[0])-(x[2]-x[0])*(y[1]-y[0]);  area=det/2.0;  plsb (b.a,y.a,det);  plsc (c.a,x.a,det);  dx_bf_rot_3_2d (dx.a,areacoord.a,b.a,c.a);  dy_bf_rot_3_2d (dy.a,areacoord.a,b.a,c.a);  fillm (0.0,gm);    gm[0][0]=dx[0];  gm[0][2]=dx[3];  gm[0][3]=dx[1];  gm[0][5]=dx[4];  gm[0][6]=dx[2];  gm[0][8]=dx[5];  gm[1][1]=dy[0];  gm[1][2]=dy[6];  gm[1][4]=dy[1];  gm[1][5]=dy[7];  gm[1][7]=dy[2];  gm[1][8]=dy[8];    gm[2][0]=dy[0];  gm[2][1]=dx[0];  gm[2][2]=dy[3]+dx[6];  gm[2][3]=dy[1];  gm[2][4]=dx[1];  gm[2][5]=dy[4]+dx[7];  gm[2][6]=dy[2];  gm[2][7]=dx[2];  gm[2][8]=dy[5]+dx[8];  }void planeelemrotlt::geom_matrix_block (matrix &gm,long ri,vector &x,vector &y,vector &areacoord){  double area,det;  vector b(3),c(3),dx(9),dy(9);    //  det is equal to double area of the element  det = (x[1]-x[0])*(y[2]-y[0])-(x[2]-x[0])*(y[1]-y[0]);  area=det/2.0;  plsb (b.a,y.a,det);  plsc (c.a,x.a,det);    dx_bf_rot_3_2d (dx.a,areacoord.a,b.a,c.a);  dy_bf_rot_3_2d (dy.a,areacoord.a,b.a,c.a);  fillm (0.0,gm);    if (ri==0){    gm[0][0]=dx[0];    gm[0][2]=dx[3];    gm[0][3]=dx[1];    gm[0][5]=dx[4];    gm[0][6]=dx[2];    gm[0][8]=dx[5];        gm[1][1]=dy[0];    gm[1][2]=dy[6];    gm[1][4]=dy[1];    gm[1][5]=dy[7];    gm[1][7]=dy[2];    gm[1][8]=dy[8];  }    if (ri==1){    gm[0][0]=dy[0];    gm[0][1]=dx[0];    gm[0][2]=dy[3]+dx[6];    gm[0][3]=dy[1];    gm[0][4]=dx[1];    gm[0][5]=dy[4]+dx[7];    gm[0][6]=dy[2];    gm[0][7]=dx[2];    gm[0][8]=dy[5]+dx[8];  }}void planeelemrotlt::addgeommat (matrix &gm,vector &x,vector &y,vector &areacoord,double &jac){  long i,i1,i2,i3,ii,jj;  double det,area;  vector b(3),c(3),bf(ndofe),dx(ndofe),dy(ndofe);    //  det is equal to double area of the element  det = (x[1]-x[0])*(y[2]-y[0])-(x[2]-x[0])*(y[1]-y[0]);  jac = det;  area=det/2.0;  plsb (b.a,y.a,det);  plsc (c.a,x.a,det);    bf_rot_3_2d (bf.a,areacoord.a,b.a,c.a);  dx_bf_rot_3_2d (dx.a,areacoord.a,b.a,c.a);  dy_bf_rot_3_2d (dy.a,areacoord.a,b.a,c.a);    fillm (0.0,gm);    i1=0;  i2=1;  i3=2;  ii=3;  jj=6;    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++;  }}void planeelemrotlt::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 planeelemrotlt::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 planeelemrotlt::stiffness_matrix (long eid,long ri,long ci,matrix &sm,vector &x,vector &y){  long i,ii,jj,ipp;  double jac,det,thick;  ivector nodes(nne);  vector areacoord(3),t(nne),gp1,gp2,w;  matrix gmr,gmc,dd,d(tncomp,tncomp);    Mt->give_elemnodes (eid,nodes);  Mc->give_thickness (eid,nodes,t);    //  det is equal to double area of the element  det = (x[1]-x[0])*(y[2]-y[0])-(x[2]-x[0])*(y[1]-y[0]);  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;            allocm (ncomp[jj],ndofe,gmc);      allocm (ncomp[ii],ncomp[jj],dd);            allocv (nip[ii][jj],gp1);      allocv (nip[ii][jj],gp2);      allocv (nip[ii][jj],w);                  gauss_points_tr (gp1.a,gp2.a,w.a,intordsm[ii][jj]);      ipp=Mt->elements[eid].ipp[ri+ii][ci+jj];      for (i=0;i<intordsm[ii][jj];i++){        areacoord[0]=gp1[i];        areacoord[1]=gp2[i];        areacoord[2]=1.0-gp1[i]-gp2[i];                // geometric matrix        geom_matrix_block (gmr,ii,x,y,areacoord);        geom_matrix_block (gmc,jj,x,y,areacoord);                        //geom_matrix (gmr,x,y,areacoord);        //geom_matrix (gmc,x,y,areacoord);                          //  stiffness matrix of material        Mm->matstiff (d,ipp);        dmatblock (ii,jj,d,dd);                thick = approx (areacoord,t);                jac=thick*det*w[i];                //  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++;      }      destrv (w);      destrv (gp1);      destrv (gp2);      destrm (gmc);      destrm (dd);    }    destrm (gmr);  }    allocv (1,w);  allocv (1,gp1);  allocv (1,gp2);  gauss_points_tr (gp1.a,gp2.a,w.a,1);  areacoord[0]=gp1[0];  areacoord[1]=gp2[0];  areacoord[2]=1.0-gp1[0]-gp2[0];    allocm (1,ndofe,gmr);  allocm (ndofe,ndofe,gmc);    addgeommat (gmr,x,y,areacoord,jac);  mtxm (gmr,gmr,gmc);  thick = approx (areacoord,t);  cmulm (thick*jac*w[0],gmc);  addm (sm,gmc,sm);    destrm (gmc);  destrm (gmr);  destrv (gp1);  destrv (gp2);  destrv (w);      }void planeelemrotlt::res_stiffness_matrix (long eid,matrix &sm){  long transf;  vector x(nne),y(nne);  ivector nodes(nne);  Mt->give_node_coord2d (x,y,eid);  Mt->give_elemnodes (eid,nodes);  stiffness_matrix (eid,0,0,sm,x,y);  //  transformation of stiffness matrix  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 quadrilateral   finite element with rotationale degrees of freedom wtih   bilinear approximation functions      @param eid - number of element   @param mm - mass matrix      8.12.2001*/void planeelemrotlt::mass_matrix (long eid,matrix &mm,vector &x,vector &y){  long i;  double jac,area,thick,rho;  ivector nodes(nne);  vector b(3),c(3),areacoord(3),w(intordmm),gp1(intordmm),gp2(intordmm),t(nne),dens(nne);  matrix n(napfun,ndofe);    Mt->give_elemnodes (eid,nodes);  Mt->give_node_coord2d (x,y,eid);  Mc->give_thickness (eid,nodes,t);  Mc->give_density (eid,nodes,dens);  //  det is equal to double area of the element  area = ((x[1]-x[0])*(y[2]-y[0])-(x[2]-x[0])*(y[1]-y[0]))/2.0;    b_coeff (b.a,y.a);  c_coeff (c.a,x.a);  gauss_points_tr (gp1.a,gp2.a,w.a,intordmm);    fillm (0.0,mm);    for (i=0;i<intordmm;i++){        areacoord[0]=gp1[i];    areacoord[1]=gp2[i];    areacoord[2]=1.0-gp1[i]-gp2[i];        bf_matrix (n,areacoord,b,c);        thick = approx (areacoord,t);    rho = approx (areacoord,dens);        jac=w[i]*thick*rho*area*2.0;        nnj (mm.a,n.a,jac,n.m,n.n);  }  }void planeelemrotlt::res_mass_matrix (long eid,matrix &mm){  vector x(nne),y(nne);  Mt->give_node_coord2d (x,y,eid);  mass_matrix (eid,mm,x,y);}/**   function computes load matrix of the plane stress rectangular   finite element with bilinear approximation functions   load vector is obtained after premultiplying load matrix   by nodal load values   @param eid - number of element   @param lm - load matrix   25.7.2001*/void planeelemrotlt::load_matrix (long eid,matrix &lm){

⌨️ 快捷键说明

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