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

📄 lintet.cpp

📁 Finite element program for mechanical problem. It can solve various problem in solid problem
💻 CPP
📖 第 1 页 / 共 3 页
字号:
#include <stdlib.h>#include <math.h>#include "lintet.h"#include "gadaptivity.h"#include "global.h"#include "globmat.h"#include "genfile.h"#include "intpoints.h"#include "node.h"#include "element.h"#include "loadcase.h"lintet::lintet (void){  long i,j;  //  number nodes on element  nne=4;  //  number of DOFs on element  ndofe=12;  //  number of strain/stress components  tncomp=6;  //  number of functions approximated  napfun=3;  //  order of numerical integration of mass matrix  intordmm=1;  //  number of edges on element  ned=6;  //  number of nodes on one edge  nned=2;  nsurf=4;  nnsurf=3;  //  order of numerical integration on element edges (boundaries)  intordb=3;  ssst=spacestress;    //  number of blocks (parts of geometric matrix)  nb=1;    ncomp = new long [nb];  ncomp[0]=6;    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]=1;  tnip=0;  for (i=0;i<nb;i++){    for (j=0;j<nb;j++){      tnip+=nip[i][j];    }  }  intordsm[0][0]=1;}lintet::~lintet (void){  long i;    for (i=0;i<nb;i++){    delete [] nip[i];    delete [] intordsm[i];  }  delete [] nip;  delete [] intordsm;    delete [] cncomp;  delete [] ncomp;}void lintet::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 volcoord - volume coordinates   @param nodval - nodal values      20.8.2001*/double lintet::approx (vector &volcoord,vector &nodval){  double f;  scprd (volcoord,nodval,f);    return f;}/**   function approximates function defined by nodal values      @param volcoord - volume coordinates   @param nodval - nodal values      20.8.2001*/double lintet::approx_nat (double xi,double eta,double zeta,vector &nodval){  double f;  vector volcoord(4);    volcoord[0]=xi;  volcoord[1]=eta;  volcoord[2]=zeta;  volcoord[3]=1.0-volcoord[0]-volcoord[1]-volcoord[2];    scprd (volcoord,nodval,f);    return f;}/**   function assembles matrix of base functions   @param n - matrix of base functions   @param volcoord - volume coordinates      24.8.2001*/void lintet::bf_matrix (matrix &n,vector &volcoord){  fillm (0.0,n);    n[0][0]=volcoord[0];  n[0][3]=volcoord[1];  n[0][6]=volcoord[2];  n[0][9] =volcoord[3];  n[1][1]=volcoord[0];  n[1][4]=volcoord[1];  n[1][7]=volcoord[2];  n[1][10]=volcoord[3];  n[2][2]=volcoord[0];  n[2][5]=volcoord[1];  n[2][8]=volcoord[2];  n[2][11]=volcoord[3];}void lintet::bf_matrix (matrix &n,double xi,double eta,double zeta){  fillm (0.0,n);    n[0][0]=xi;  n[0][3]=eta;  n[0][6]=zeta;  n[0][9] =1.0-xi-eta-zeta;  n[1][1]=xi;  n[1][4]=eta;  n[1][7]=zeta;  n[1][10]=1.0-xi-eta-zeta;  n[2][2]=xi;  n[2][5]=eta;  n[2][8]=zeta;  n[2][11]=1.0-xi-eta-zeta;}/**   function assembles geometric matrix   vector of strains has following ordering   eps=(e_xx, e_yy, e_zz, e_yz, e_zx, e_xy)      @param gm - geometric matrix   @param x,y,z - vectors of node coordinates      24.8.2001*/void lintet::geom_matrix (matrix &gm,vector &x,vector &y,vector &z){  long i,i1,i2,i3,i4,i5,i6,i7,i8,i9;  double det;  vector b(4),c(4),d(4);    det = det3d (x.a,y.a,z.a);    volb_3d (b.a,y.a,z.a,det);  volc_3d (c.a,x.a,z.a,det);  vold_3d (d.a,x.a,y.a,det);    i1=0;  i2=1;  i3=2;  i4=1;  i5=2;  i6=0;  i7=2;  i8=0;  i9=1;  for (i=0;i<4;i++){    gm[0][i1]=b[i];  i1+=3;    gm[1][i2]=c[i];  i2+=3;    gm[2][i3]=d[i];  i3+=3;        gm[3][i4]=d[i];  i4+=3;    gm[3][i5]=c[i];  i5+=3;        gm[4][i6]=d[i];  i6+=3;    gm[4][i7]=b[i];  i7+=3;        gm[5][i8]=c[i];  i8+=3;    gm[5][i9]=b[i];  i9+=3;  }  }/**   function assembles transformation matrix      @param nodes - nodes of element   @param tmat - transformation matrix   */void lintet::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+0][i*3]=Mt->nodes[nodes[i]].e1[0];      tmat[i*3+1][i*3]=Mt->nodes[nodes[i]].e1[1];      tmat[i*3+2][i*3]=Mt->nodes[nodes[i]].e1[2];      tmat[i*3+0][i*3+1]=Mt->nodes[nodes[i]].e2[0];      tmat[i*3+1][i*3+1]=Mt->nodes[nodes[i]].e2[1];      tmat[i*3+2][i*3+1]=Mt->nodes[nodes[i]].e2[2];      tmat[i*3+0][i*3+2]=Mt->nodes[nodes[i]].e3[0];      tmat[i*3+1][i*3+2]=Mt->nodes[nodes[i]].e3[1];      tmat[i*3+2][i*3+2]=Mt->nodes[nodes[i]].e3[2];    }  }}/**   function computes stiffness matrix of one element   @param eid - number of element   @param ri,ci - row and column indices   @param sm - stiffness matrix   19.7.2001*/void lintet::stiffness_matrix (long eid,long ri,long ci,matrix &sm){  long ipp;  double det,jac;  vector x(nne),y(nne),z(nne);  matrix gm(tncomp,ndofe),d(tncomp,tncomp);  Mt->give_node_coord3d (x,y,z,eid);  fillm (0.0,sm);  det = det3d (x.a,y.a,z.a);  ipp=Mt->elements[eid].ipp[ri][ci];  geom_matrix (gm,x,y,z);  Mm->matstiff (d,ipp);  jac=fabs(det)/6.0;  //jac=det/6.0;  if (jac<0.0) fprintf (stdout,"\n zaporny jakobian");  //jac=det/6.0;  bdbjac (sm,gm,d,gm,jac);}/**   function assembles resulting stiffness matrix of the element   @param eid - element id   @param sm - stiffness matrix   JK, 9.5.2002*/void lintet::res_stiffness_matrix (long eid,matrix &sm){  stiffness_matrix (eid,0,0,sm);}/**   function computes mass matrix      @param eid - number of element   @param mm - mass matrix      26.8.2001*/void lintet::mass_matrix (long eid,matrix &mm){  long i;  double det,jac,rho;  ivector nodes (nne);  vector x(nne),y(nne),z(nne),w(intordmm),gp1(intordmm),gp2(intordmm),gp3(intordmm),volcoord(4),dens(nne);  matrix n(napfun,ndofe);    Mt->give_elemnodes (eid,nodes);  Mc->give_density (eid,nodes,dens);  Mt->give_node_coord3d (x,y,z,eid);  gauss_points_tet (gp1.a,gp2.a,gp3.a,w.a,intordmm);  det = det3d (x.a,y.a,z.a);    fillm (0.0,mm);    for (i=0;i<intordmm;i++){    volcoord[0]=gp1[i];    volcoord[1]=gp2[i];    volcoord[2]=gp3[i];    volcoord[3]=1.0-gp1[i]-gp2[i]-gp3[i];        bf_matrix (n,volcoord);    rho = approx (volcoord,dens);        jac=det*w[i]*rho;        nnj (mm.a,n.a,jac,n.m,n.n);  }  }/**   function computes load matrix      @param eid - number of element   @param lm - load matrix   26.8.2001*/void lintet::load_matrix (long eid,matrix &lm){  long i;  double det,jac;  ivector nodes (nne);  vector x(nne),y(nne),z(nne),w(intordmm),gp1(intordmm),gp2(intordmm),gp3(intordmm),volcoord(4);  matrix n(napfun,ndofe);    Mt->give_elemnodes (eid,nodes);  Mt->give_node_coord3d (x,y,z,eid);  gauss_points_tet (gp1.a,gp2.a,gp3.a,w.a,intordmm);  det = det3d (x.a,y.a,z.a);  fillm (0.0,lm);  for (i=0;i<intordmm;i++){    volcoord[0]=gp1[i];    volcoord[1]=gp2[i];    volcoord[2]=gp3[i];    volcoord[3]=1.0-gp1[i]-gp2[i]-gp3[i];    bf_matrix (n,volcoord);    jac=det*w[i];    nnj (lm.a,n.a,jac,n.m,n.n);  }}void lintet::res_mainip_strains (long lcid,long eid){  mainip_strains (lcid,eid,0,0);}/**   function computes strains in main 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 lintet::mainip_strains (long lcid,long eid,long ri,long ci){  long ipp;  vector x(nne),y(nne),z(nne),r(ndofe),eps(tncomp),aux;  ivector nodes(nne),cn(ndofe);  matrix gm(tncomp,ndofe),tmat;  Mt->give_elemnodes (eid,nodes);  Mt->give_node_coord3d (x,y,z,eid);  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);  }  ipp=Mt->elements[eid].ipp[ri][ci];    geom_matrix (gm,x,y,z);  mxv (gm,r,eps);  Mm->storestrain (lcid,ipp,eps);  }/**   function computes strains in nodes of element      @param lcid - load case id   @param eid - element id      10.5.2002*/void lintet::nod_strains (long lcid,long eid,long ri,long ci){  long ipp;  double *lsm,*lhs,*rhs;  vector nxi(nne),neta(nne),nzeta(nne),eps(tncomp),natcoord(3);  ivector nodes(nne);    lsm = new double [16];  nodecoord (nxi,neta,nzeta);  Mt->give_elemnodes (eid,nodes);  lhs = new double [ncomp[0]*4];  rhs = new double [ncomp[0]*4];    nullv (lsm,16);  nullv (lhs,ncomp[0]*4);  nullv (rhs,ncomp[0]*4);      ipp=Mt->elements[eid].ipp[ri][ci];  Mm->givestrain (lcid,ipp,cncomp[0],ncomp[0],eps);    natcoord[0]=0.25;  natcoord[1]=0.25;  natcoord[2]=0.25;  matassem_lsm (lsm,natcoord);  rhsassem_lsm (rhs,natcoord,eps);    solve_lsm (lsm,lhs,rhs,Mp->zero,4,ncomp[0]);  Mt->strain_nodal_values (nodes,nxi,neta,nzeta,lhs,3,cncomp[0],ncomp[0],lcid);    /*  lhs[0]=eps[0];  lhs[2]=eps[1];  lhs[4]=eps[2];  lhs[6]=eps[3];  lhs[8]=eps[4];  lhs[10]=eps[5];  Mt->strain_nodal_values (nodes,nxi,neta,nzeta,lhs,3,ncomp[0],ncomp[0],lcid);  */    delete [] lsm;  delete [] lhs;  delete [] rhs;}/**   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 lintet::elem_strains (double **stra,long lcid,long eid,long ri,long ci){  long i,ii,ipp;  double xi,eta,zeta,*lsm,*lhs,*rhs;  vector nxi(nne),neta(nne),nzeta(nne),gp1,gp2,gp3,w,eps,natcoord(3);  lsm = new double [16];  nodecoord (nxi,neta,nzeta);  for (ii=0;ii<nb;ii++){    allocv (intordsm[ii][ii],gp1);    allocv (intordsm[ii][ii],gp2);    allocv (intordsm[ii][ii],gp3);    allocv (intordsm[ii][ii],w);    allocv (ncomp[ii],eps);    lhs = new double [ncomp[ii]*4];    rhs = new double [ncomp[ii]*4];    gauss_points_tet (gp1.a,gp2.a,gp3.a,w.a,intordsm[ii][ii]);    nullv (lsm,16);    nullv (rhs,ncomp[ii]*4);        ipp=Mt->elements[eid].ipp[ri+ii][ci+ii];    for (i=0;i<intordsm[ii][ii];i++){      xi=gp1[i];      eta=gp2[i];      zeta=gp3[i];            Mm->givestrain (lcid,ipp,cncomp[ii],ncomp[ii],eps);            natcoord[0]=xi;  natcoord[1]=eta;  natcoord[2]=zeta;      matassem_lsm (lsm,natcoord);      rhsassem_lsm (rhs,natcoord,eps);            ipp++;    }        solve_lsm (lsm,lhs,rhs,Mp->zero,4,ncomp[ii]);    nodal_values (stra,nxi,neta,nzeta,lhs,3,cncomp[ii],ncomp[ii]);    delete [] lhs;  delete [] rhs;    destrv (eps);  destrv (w);  destrv (gp1);  destrv (gp2);  destrv (gp3);  }    delete [] lsm;}/**   function computes strains in arbitrary point on element      @param lcid - load case id   @param eid - element id   @param volcoord - area coordinates of the point   @param fi,li - first and last indices   @param eps - array containing strains      11.5.2002*/void lintet::appstrain (long lcid,long eid,double xi,double eta,double zeta,long fi,long ncomp,vector &eps){  long i,j,k;  ivector nodes(nne);  vector nodval(nne),volcoord(4);    if (ncomp != eps.n){    fprintf (stderr,"\n\n wrong interval of indices in function strain (%s, line %d).\n",__FILE__,__LINE__);    abort ();  }    volcoord[0]=xi;  volcoord[1]=eta;  volcoord[2]=zeta;  volcoord[3]=1.0-volcoord[0]-volcoord[1]-volcoord[2];    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]=approx (volcoord,nodval);    k++;  }}/**   function computes strains in all integration points   @param lcid - load case id   @param eid - element id   @param ri,ci - row and column indices      10.5.2002*/void lintet::allip_strains (double **stra,long lcid,long eid,long ri,long ci){  long ipp;  double xi,eta,zeta;  vector eps(tncomp);    xi=0.25;  eta=0.25;  zeta=0.25;    ipp=Mt->elements[eid].ipp[ri][ci];  if (Mp->strainaver==0)    appval (xi,eta,zeta,0,tncomp,eps,stra);  if (Mp->strainaver==1)    appstrain (lcid,eid,xi,eta,zeta,0,tncomp,eps);    Mm->storestrain (lcid,ipp,eps);}void lintet::strains (long lcid,long eid,long ri,long ci){  long i,naep,ncp,sid;  double **stra;  vector coord,eps;    if (Mp->strainaver==0){    stra = new double* [nne];    for (i=0;i<nne;i++){      stra[i] = new double [tncomp];    }    elem_strains (stra,lcid,eid,ri,ci);  }  switch (Mm->stra.tape[eid]){  case nowhere:{    break;  }  case intpts:{    allip_strains (stra,lcid,eid,ri,ci);    break;  }  case enodes:{    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 (3,coord);    for (i=0;i<naep;i++){      Mm->stra.give_aepcoord (sid,i,coord);            if (Mp->strainaver==0)	appval (coord[0],coord[1],coord[2],0,ncp,eps,stra);      if (Mp->strainaver==1)	appstrain (lcid,eid,coord[0],coord[1],coord[2],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 planeelemlt::strains (%s, line %d).\n",__FILE__,__LINE__);  }  }}/**   function assembles natural coordinates of nodes of element      @param xi - array containing natural coordinates xi

⌨️ 快捷键说明

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