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

📄 dkt.cpp

📁 Finite element program for mechanical problem. It can solve various problem in solid problem
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#include "dkt.h"#include "gadaptivity.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>dktelem::dktelem (void){  long i,j;  nne=3;  ndofe=9;  tncomp=3;  napfun=3;  ned=3;  nned=2;  intordmm=3;  ssst=plate;  nb=1;  ncomp = new long [nb];  ncomp[0]=3;  cncomp = new long [nb];  cncomp[0]=0;  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;  tnip=0;  for (i=0;i<nb;i++){    for (j=0;j<nb;j++){      tnip+=nip[i][j];    }  }  intordsm[0][0]=3;}dktelem::~dktelem (void){  long i;  for (i=0;i<nb;i++){    delete [] nip[i];    delete [] intordsm[i];  }  delete [] nip;  delete [] intordsm;  delete [] ncomp;  delete [] cncomp;}void dktelem::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 assembles matrix of base functions      @param gm - geometric matrix   @param x,y - array containing node coordinates   @param l - areacoordinates      15.3.2002*/void dktelem::geom_matrix (matrix &gm,vector &x,vector &y,vector &l){  double det,dx1,dy1,dx12,dy12,dx31,dy31;  vector sx(3),sy(3),q(3),pb(3),pc(3),dl(3);    //  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]));  dl[0] = sqrt((x[1]-x[0])*(x[1]-x[0])+(y[1]-y[0])*(y[1]-y[0]));  dl[1] = sqrt((x[2]-x[1])*(x[2]-x[1])+(y[2]-y[1])*(y[2]-y[1]));  dl[2] = sqrt((x[0]-x[2])*(x[0]-x[2])+(y[0]-y[2])*(y[0]-y[2]));  //   der   dL(1)/dy . det  sx[0]=x[2]-x[1];  sx[1]=x[0]-x[2];  sx[2]=x[1]-x[0];  //   der   dL(1)/dx . det  sy[0]=y[1]-y[2];  sy[1]=y[2]-y[0];  sy[2]=y[0]-y[1];  // dl0= betwen node 1,2  q[0]=dl[0]*dl[0];  q[1]=dl[1]*dl[1];  q[2]=dl[2]*dl[2];  pb[0]=(sy[0]*sy[0]/4.-sx[0]*sx[0]/2.)/q[1];  pb[1]=(sy[1]*sy[1]/4.-sx[1]*sx[1]/2.)/q[2];  pb[2]=(sy[2]*sy[2]/4.-sx[2]*sx[2]/2.)/q[0];  pc[0]=(sx[0]*sx[0]/4.-sy[0]*sy[0]/2.)/q[1];  pc[1]=(sx[1]*sx[1]/4.-sy[1]*sy[1]/2.)/q[2];  pc[2]=(sx[2]*sx[2]/4.-sy[2]*sy[2]/2.)/q[0];    dx1= sy[0]*(l[0]-1./4.)/det;  dy1= sx[0]*(l[0]-1./4.)/det;  dx12=(sy[0]*l[1]+sy[1]*l[0])/det;  dy12=(sx[0]*l[1]+sx[1]*l[0])/det;  dx31=(sy[2]*l[0]+sy[0]*l[2])/det;  dy31=(sx[2]*l[0]+sx[0]*l[2])/det;         gm[0][0]= 6.*(sx[2]/q[0]*dx12-sx[1]/q[2]*dx31);  gm[0][1]=-3.*(sx[1]*sy[1]/q[2]*dx31+sx[2]*sy[2]/q[0]*dx12);  gm[0][2]= 4.*(dx1-pc[1]*dx31-pc[2]*dx12);  gm[1][0]=-6.*(sy[2]/q[0]*dy12-sy[1]/q[2]*dy31);  gm[1][1]=-4.*(dy1-pb[1]*dy31-pb[2]*dy12);  gm[1][2]= 3.*(sx[1]*sy[1]/q[2]*dy31+sx[2]*sy[2]/q[0]*dy12);  gm[2][0]= 6.*(sx[2]/q[0]*dy12-sx[1]/q[2]*dy31 -sy[2]/q[0]*dx12+sy[1]/q[2]*dx31);  gm[2][1]=-3.*(sx[1]*sy[1]/q[2]*dy31+sx[2]*sy[2]/q[0]*dy12) -4.*(dx1-pb[1]*dx31-pb[2]*dx12);  gm[2][2]= 4.*(dy1-pc[1]*dy31-pc[2]*dy12) +3.*(sx[1]*sy[1]/q[2]*dx31+sx[2]*sy[2]/q[0]*dx12);    dx1= sy[1]*(l[1]-1./4.)/det;  dy1= sx[1]*(l[1]-1./4.)/det;  dx12=(sy[1]*l[2]+sy[2]*l[1])/det;  dy12=(sx[1]*l[2]+sx[2]*l[1])/det;  dx31=(sy[0]*l[1]+sy[1]*l[0])/det;  dy31=(sx[0]*l[1]+sx[1]*l[0])/det;         gm[0][3]= 6.*(sx[0]/q[1]*dx12-sx[2]/q[0]*dx31);  gm[0][4]=-3.*(sx[2]*sy[2]/q[0]*dx31+sx[0]*sy[0]/q[1]*dx12);  gm[0][5]= 4.*(dx1-pc[2]*dx31-pc[0]*dx12);  gm[1][3]=-6.*(sy[0]/q[1]*dy12-sy[2]/q[0]*dy31);  gm[1][4]=-4.*(dy1-pb[2]*dy31-pb[0]*dy12);  gm[1][5]= 3.*(sx[2]*sy[2]/q[0]*dy31+sx[0]*sy[0]/q[1]*dy12);  gm[2][3]= 6.*(sx[0]/q[1]*dy12-sx[2]/q[0]*dy31 -sy[0]/q[1]*dx12+sy[2]/q[0]*dx31);  gm[2][4]=-3.*(sx[2]*sy[2]/q[0]*dy31+sx[0]*sy[0]/q[1]*dy12) -4.*(dx1-pb[2]*dx31-pb[0]*dx12);  gm[2][5]= 4.*(dy1-pc[2]*dy31-pc[0]*dy12) +3.*(sx[2]*sy[2]/q[0]*dx31+sx[0]*sy[0]/q[1]*dx12);    dx1= sy[2]*(l[2]-1./4.)/det;  dy1= sx[2]*(l[2]-1./4.)/det;  dx12=(sy[2]*l[0]+sy[0]*l[2])/det;  dy12=(sx[2]*l[0]+sx[0]*l[2])/det;  dx31=(sy[1]*l[2]+sy[2]*l[1])/det;  dy31=(sx[1]*l[2]+sx[2]*l[1])/det;         gm[0][6]= 6.*(sx[1]/q[2]*dx12-sx[0]/q[1]*dx31);  gm[0][7]=-3.*(sx[0]*sy[0]/q[1]*dx31+sx[1]*sy[1]/q[2]*dx12);  gm[0][8]= 4.*(dx1-pc[0]*dx31-pc[1]*dx12);  gm[1][6]=-6.*(sy[1]/q[2]*dy12-sy[0]/q[1]*dy31);  gm[1][7]=-4.*(dy1-pb[0]*dy31-pb[1]*dy12);  gm[1][8]= 3.*(sx[0]*sy[0]/q[1]*dy31+sx[1]*sy[1]/q[2]*dy12);  gm[2][6]= 6.*(sx[1]/q[2]*dy12-sx[0]/q[1]*dy31 -sy[1]/q[2]*dx12+sy[0]/q[1]*dx31);  gm[2][7]=-3.*(sx[0]*sy[0]/q[1]*dy31+sx[1]*sy[1]/q[2]*dy12) -4.*(dx1-pb[0]*dx31-pb[1]*dx12);  gm[2][8]= 4.*(dy1-pc[0]*dy31-pc[1]*dy12) +3.*(sx[0]*sy[0]/q[1]*dx31+sx[1]*sy[1]/q[2]*dx12);  }void dktelem::transf_matrix (ivector &nodes,matrix &tmat){  long i,n,m;  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+1][i*3+1]=Mt->nodes[nodes[i]].e1[0];  tmat[i*3+1][i*3+2]=Mt->nodes[nodes[i]].e2[0];      tmat[i*3+2][i*3+1]=Mt->nodes[nodes[i]].e1[1];  tmat[i*3+2][i*3+2]=Mt->nodes[nodes[i]].e2[1];    }  }}/**   function extracts components of the shear   part of stiffness matrix of the material to the matrix ds   20.3.2002*/void dktelem::dbmat (matrix &d,matrix &db,double t){  double c;  c=t*t*t;  db[0][0] = c*d[0][0];  db[0][1] = c*d[0][1];  db[0][2] = c*d[0][2];  db[1][0] = c*d[1][0];  db[1][1] = c*d[1][1];  db[1][2] = c*d[1][2];  db[2][0] = c*d[2][0];  db[2][1] = c*d[2][1];  db[2][2] = c*d[2][2];}/**   function computes stiffness matrix of dkt element   @param eid - element id   @param ri,ci - row and column indices   @param sm - stiffness matrix   15.3.2002*/void dktelem::stiffness_matrix (long eid,long ri,long ci,matrix &sm,vector &x,vector &y){  long i,ii;  double jac,det,thick;  ivector nodes(nne);  vector gp1(intordsm[0][0]),gp2(intordsm[0][0]),w(intordsm[0][0]),l(3),t(nne);  matrix gm(3,ndofe),d(5,5),db(3,3);  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);  ii=Mt->elements[eid].ipp[ri][ci];  gauss_points_tr (gp1.a,gp2.a,w.a,intordsm[0][0]);  for (i=0;i<intordsm[0][0];i++){    l[0]=gp1[i];  l[1]=gp2[i];  l[2]=1.0-l[0]-l[1];    geom_matrix (gm,x,y,l);    Mm->matstiff (d,ii);  ii++;    thick = t[0]*l[0]+t[1]*l[1]+t[2]*l[2];    dbmat (d,db,thick);    jac=det*w[i];    bdbj (sm.a,gm.a,db.a,jac,gm.m,gm.n);  }//  fprintf (Out,"\n\n prvek cislo %ld",eid);//  for (i=0;i<ndofe;i++){//    fprintf (Out,"\n %4ld   %20.10e",i,sm[i][i]);//  }}void dktelem::res_stiffness_matrix (long eid,matrix &sm){  long transf;  vector x(nne),y(nne);  ivector nodes(nne);  Mt->give_elemnodes (eid,nodes);  Mt->give_node_coord2d (x,y,eid);  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);  }}void dktelem::nodecoord (vector &xi,vector &eta){  xi[0] = 0.0;  eta[0] = 0.0;  xi[1] = 1.0;  eta[1] = 0.0;  xi[2] = 0.0;  eta[2] = 1.0;}void dktelem::appval (vector &l, long fi,long nc,vector &eps,double **val){  long i,j,k;  vector nodval;    k=0;  allocv (nne,nodval);  for (i=fi;i<fi+nc;i++){    for (j=0;j<nne;j++){      nodval[j]=val[j][i];    }    eps[k] = nodval[0]*l[0]+nodval[1]*l[1]+nodval[2]*l[2];    k++;  }    destrv (nodval);}/**   function computes strains in arbitrary point on element      @param xi, eta - natural coordinates of the point   @param eps - array containing strains   @param val - array containing values on element      11.5.2002*/void dktelem::res_mainip_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);  }  mainip_strains (lcid,eid,0,0,x,y,r);}/**   function computes strains in integration points of element      @param lcid - load case id   @param eid - element id   @param ri - row index   @param ci - column index      10.5.2002*/void dktelem::mainip_strains (long lcid,long eid,long ri,long ci,vector &x,vector &y,vector &r){  long i,ipp,ij;  vector l(3),eps(ncomp[0]),gp1(intordsm[0][0]),gp2(intordsm[0][0]),w(intordsm[0][0]);  matrix gm(ncomp[0],ndofe);    gauss_points_tr (gp1.a,gp2.a,w.a,intordsm[0][0]);  fprintf (Out,"\n\n eps");  fprintf (Out,"\n\n prvek cislo %ld",eid);    ipp=Mt->elements[eid].ipp[ri][ci];  for (i=0;i<intordsm[0][0];i++){    l[0]=gp1[i];  l[1]=gp2[i];  l[2]=1.0-l[0]-l[1];	    geom_matrix (gm,x,y,l);    mxv (gm,r,eps);    Mm->storestrain (lcid,ipp,cncomp[0],ncomp[0],eps);           fprintf (Out,"\n");		  for (ij=0;ij<ncomp[0];ij++){ fprintf (Out,"%20.10e",eps[ij]);	}   ipp++;  }  }void dktelem::nod_strains (long lcid,long eid,long ri,long ci){  long i,ipp;  double *lsm,*lhs,*rhs;  vector nxi(nne),neta(nne),natcoord(2),l(3);  vector eps(ncomp[0]),gp1(intordsm[0][0]),gp2(intordsm[0][0]),w(intordsm[0][0]);  ivector nodes;  lsm = new double [9];  allocv (nne,nodes);  Mt->give_elemnodes (eid,nodes);  nodecoord (nxi,neta);    lhs = new double [ncomp[0]*3];  rhs = new double [ncomp[0]*3];  gauss_points_tr (gp1.a,gp2.a,w.a,intordsm[0][0]);    nullv (lsm,9);  nullv (rhs,ncomp[0]*3);  ipp=Mt->elements[eid].ipp[ri][ci];  for (i=0;i<intordsm[0][0];i++){    l[0]=gp1[i];  l[1]=gp2[i];  l[2]=1.0-l[0]-l[1];   	Mm->givestrain (lcid,ipp,cncomp[0],ncomp[0],eps);    natcoord[0]=l[0];  natcoord[1]=l[1];    matassem_lsm (lsm,natcoord);    rhsassem_lsm (rhs,natcoord,eps);	ipp++;  }    solve_lsm (lsm,lhs,rhs,Mp->zero,3,ncomp[0]);  Mt->strain_nodal_values (nodes,nxi,neta,nxi,lhs,2,cncomp[0],ncomp[0],lcid);  delete [] lhs;  delete [] rhs;    destrv (nodes);  delete [] lsm;}/**   function computes strains on element      @param val - array containing strains on element   @param lcid - load case id   @param eid - element id      15.7.2002*/void dktelem::elem_strains (double **stra,long lcid,long eid,long ri,long ci){  long i,ipp;  double *lsm,*lhs,*rhs;  vector nxi(nne),neta(nne),natcoord(2),l(3);  vector eps(ncomp[0]),gp1(intordsm[0][0]),gp2(intordsm[0][0]),w(intordsm[0][0]);  ivector nodes;  lsm = new double [9];  nodecoord (nxi,neta);    lsm = new double [9];  allocv (nne,nodes);  Mt->give_elemnodes (eid,nodes);  nodecoord (nxi,neta);    lhs = new double [ncomp[0]*3];  rhs = new double [ncomp[0]*3];  gauss_points_tr (gp1.a,gp2.a,w.a,intordsm[0][0]);    nullv (lsm,9);  nullv (rhs,ncomp[0]*3);  ipp=Mt->elements[eid].ipp[ri][ci];  for (i=0;i<intordsm[0][0];i++){    l[0]=gp1[i];  l[1]=gp2[i];  l[2]=1.0-l[0]-l[1];   	Mm->givestrain (lcid,ipp,cncomp[0],ncomp[0],eps);    natcoord[0]=l[0];  natcoord[1]=l[1];    matassem_lsm (lsm,natcoord);    rhsassem_lsm (rhs,natcoord,eps);	ipp++;  }         solve_lsm (lsm,lhs,rhs,Mp->zero,3,ncomp[0]);  nodal_values (stra,nxi,neta,nxi,lhs,2,cncomp[0],ncomp[0]);      delete [] lhs;  delete [] rhs;  destrv (nodes);    delete [] lsm;}/**   function computes strains DKT*//**   function computes strains in arbitrary point on element      @param lcid - load case id   @param eid - element id   @param areacoord - area coordinates of the point   @param fi,li - first and last indices   @param eps - array containing strains      11.5.2002*/void dktelem::appstrain (long lcid,long eid,vector &l,long fi,long ncomp,vector &eps){  long i,j,k;  ivector nodes;  vector nodval;    if (ncomp != eps.n){    fprintf (stderr,"\n\n wrong interval of indices in function strain (%s, line %d).\n",__FILE__,__LINE__);    abort ();  }  allocv (nne,nodes);  allocv (nne,nodval);  Mt->give_elemnodes (eid,nodes);  k=0;  for (i=fi;i<fi+ncomp;i++){    for (j=0;j<nne;j++){      nodval[j]=Mt->nodes[nodes[j]].strain[lcid*tncomp+i];    }    eps[k] = nodval[0]*l[0]+nodval[1]*l[1]+nodval[2]*l[2];//    eps[k]=approx (areacoord,nodval);    k++;  }    destrv (nodes);  destrv (nodval);

⌨️ 快捷键说明

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