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

📄 axisymqq.cpp

📁 Finite element program for mechanical problem. It can solve various problem in solid problem
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#include "axisymqq.h"#include "axisymlq.h"#include "global.h"#include "globmat.h"#include "genfile.h"#include "element.h"#include "node.h"#include "loadcase.h"#include "intpoints.h"#include <math.h>#include <stdlib.h>axisymqq::axisymqq (void){  long i,j;    nne=8;  ndofe=16;  tncomp=4;  napfun=2;  ned=4;  nned=3;  intordmm=3;  intordb=2;  ssst=axisymm;  nb=1;    ncomp = new long [nb];  ncomp[0]=4;    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]=9;    intordsm[0][0]=3;      tnip=0;  for (i=0;i<nb;i++){    for (j=0;j<nb;j++){      tnip+=nip[i][j];    }  }}axisymqq::~axisymqq (void){  long i;    for (i=0;i<nb;i++){    delete [] intordsm[i];  }  delete intordsm;    delete [] cncomp;  delete [] ncomp;}void axisymqq::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 xi,eta - coordinates on element   @param nodval - nodal values   */double axisymqq::approx (double xi,double eta,vector &nodval){  double f;  vector bf(nne);    bf_quad_4_2d (bf.a,xi,eta);    scprd (bf,nodval,f);  return f;}/**   function returns matrix of approximation functions      @param n - matrix of approximation functions   @param xi,eta - natural coordinates      9.7.2001*/void axisymqq::bf_matrix (matrix &n,double xi,double eta){  long i,j,k;  vector bf(nne);    fillm (0.0,n);  bf_quad_4_2d (bf.a,xi,eta);    j=0;  k=1;  for (i=0;i<nne;i++){    n[0][j]=bf[i];    n[1][k]=bf[i];    j+=2;  k+=2;  }}/**   function assembles geometric matrix      epsilon_x = du/dx   epsilon_y = dv/dy   epsilon_fi = u/r   epsilon_xy = du/dy + dv/dx      @param gm - geometric matrix   @param ri - block index   @param x,y - arrays of node coordinates   @param xi,eta - natural coordinates   @param jac - jacobian      8.12.2001*/void axisymqq::geom_matrix (matrix &gm,vector &x,vector &y,double xi,double eta,double &jac){  long i,i1,i2;  double r;  vector bf(nne),dx(nne),dy(nne);    dx_bf_quad_4_2d (dx.a,xi,eta);  dy_bf_quad_4_2d (dy.a,xi,eta);  bf_quad_4_2d (bf.a,xi,eta);  derivatives_2d (dx,dy,jac,x,y,xi,eta);    r = approx (xi,eta,x);  if (fabs(r)<Mp->zero){    //fprintf (stderr,"\n\n radius is equal %e in function axisymqq::geom_matrix_block (%s, line %d)",r,__FILE__,__LINE__);    r=0.00001;  }    fillm (0.0,gm);    i1=0;  i2=1;  for (i=0;i<nne;i++){    gm[0][i1]=dx[i];    gm[1][i2]=dy[i];    gm[2][i1]=bf[i]/r;    gm[3][i1]=dy[i];    gm[3][i2]=dx[i];    i1+=2;  i2+=2;  }}/**   function assembles part of geometric matrix      epsilon_x = du/dx   epsilon_y = dv/dy   epsilon_fi = u/r   epsilon_xy = du/dy + dv/dx      @param gm - geometric matrix   @param ri - block index   @param x,y - arrays of node coordinates   @param xi,eta - natural coordinates   @param jac - jacobian      8.12.2001*/void axisymqq::geom_matrix_block (matrix &gm,long ri,vector &x,vector &y,double xi,double eta,double &jac){  if (nb==1){    geom_matrix (gm,x,y,xi,eta,jac);  }  else{    long i,i1,i2;    double r;    vector bf(nne),dx(nne),dy(nne);        dx_bf_quad_4_2d (dx.a,xi,eta);    dy_bf_quad_4_2d (dy.a,xi,eta);    bf_quad_4_2d (bf.a,xi,eta);        derivatives_2d (dx,dy,jac,x,y,xi,eta);        r = approx (xi,eta,x);    if (fabs(r)<Mp->zero){      //fprintf (stderr,"\n\n radius is equal %e in function axisymqq::geom_matrix_block (%s, line %d)",r,__FILE__,__LINE__);      r=0.00001;    }        fillm (0.0,gm);        if (ri==0){      i1=0;  i2=1;      for (i=0;i<nne;i++){	gm[0][i1]=dx[i];	gm[1][i2]=dy[i];	i1+=2;  i2+=2;      }    }    if (ri==1){      i1=0;      for (i=0;i<nne;i++){	gm[0][i1]=bf[i]/r;	i1+=2;      }    }    if (ri==2){      i1=0;  i2=1;      for (i=0;i<nne;i++){	gm[0][i1]=dy[i];	gm[0][i2]=dx[i];	i1+=2;  i2+=2;      }    }  }}/**   nutno otestovat! pak je mozne smazat tuto hlasku      transformation matrix x_g = T x_l*/void axisymqq::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*2][i*2]   = Mt->nodes[nodes[i]].e1[0];    tmat[i*2][i*2+1]   = Mt->nodes[nodes[i]].e2[0];      tmat[i*2+1][i*2] = Mt->nodes[nodes[i]].e1[1];    tmat[i*2+1][i*2+1] = Mt->nodes[nodes[i]].e2[1];    }  }}/**   function computes stiffness matrix of axisymmetric quadrilateral   finite element with bilinear approximation functions      @param eid - element id   @param ri,ci - row and column indices   @param sm - stiffness matrix   8.12.2001*/void axisymqq::stiffness_matrix (long eid,long ri,long ci,matrix &sm){  long i,j,ipp,transf;  double xi,eta,jac,r;  ivector nodes(nne);  vector x(nne),y(nne),w,gp;  matrix gm(tncomp,ndofe),d(tncomp,tncomp);    Mt->give_elemnodes (eid,nodes);  Mt->give_node_coord2d (x,y,eid);    fillm (0.0,sm);      allocv (intordsm[0][0],w);  allocv (intordsm[0][0],gp);    gauss_points (gp.a,w.a,intordsm[0][0]);    ipp=Mt->elements[eid].ipp[ri][ci];    for (i=0;i<intordsm[0][0];i++){    xi=gp[i];    for (j=0;j<intordsm[0][0];j++){      eta=gp[j];            //  geometric matrix      geom_matrix (gm,x,y,xi,eta,jac);            //  matrix of stiffness of the material      Mm->matstiff (d,ipp);            r = approx (xi,eta,x);      jac*=w[i]*w[j]*r;            //  contribution to the stiffness matrix of the element      bdbjac (sm,gm,d,gm,jac);            ipp++;    }  }  destrv (gp);  destrv (w);    //  transformation of stiffness matrix  transf = Mt->locsystems (nodes);  if (transf>0){    matrix tmat (ndofe,ndofe);    transf_matrix (nodes,tmat);    glmatrixtransf (sm,tmat);  }}/**   function computes resulting stiffness matrix of element      @param eid - element id   @param sm - stiffness matrix      10.5.2002*/void axisymqq::res_stiffness_matrix (long eid,matrix &sm){  stiffness_matrix (eid,0,0,sm);}/**   function computes mass matrix of the rectangular axisymmetric   finite element with bilinear approximation functions      @param eid - number of element   @param mm - mass matrix   24.6.2001*/void axisymqq::mass_matrix (long eid,matrix &mm){  long i,j;  double jac,xi,eta,rho,r;  ivector nodes(nne);  vector x(nne),y(nne),w(intordmm),gp(intordmm),t(nne),dens(nne);  matrix n(napfun,ndofe);    Mt->give_elemnodes (eid,nodes);  Mc->give_density (eid,nodes,dens);  Mt->give_node_coord2d (x,y,eid);  gauss_points (gp.a,w.a,intordmm);    fillm (0.0,mm);  for (i=0;i<intordmm;i++){    xi=gp[i];    for (j=0;j<intordmm;j++){      eta=gp[j];      jac_2d (jac,x,y,xi,eta);      bf_matrix (n,xi,eta);            rho = approx (xi,eta,dens);      r = approx (xi,eta,x);      jac*=w[i]*w[j]*rho*r;            nnj (mm.a,n.a,jac,n.m,n.n);    }  }  }void axisymqq::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 axisymqq::mainip_strains (long lcid,long eid,long ri,long ci){  long i,j,ipp;  double xi,eta,jac;  vector x(nne),y(nne),r(ndofe),gp,w,eps(tncomp),aux;  ivector nodes(nne),cn(ndofe);  matrix gm(tncomp,ndofe),tmat;  Mt->give_elemnodes (eid,nodes);  Mt->give_node_coord2d (x,y,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);  }      allocv (intordsm[0][0],gp);  allocv (intordsm[0][0],w);    gauss_points (gp.a,w.a,intordsm[0][0]);    ipp=Mt->elements[eid].ipp[ri][ci];  for (i=0;i<intordsm[0][0];i++){    xi=gp[i];    for (j=0;j<intordsm[0][0];j++){      eta=gp[j];            geom_matrix (gm,x,y,xi,eta,jac);      mxv (gm,r,eps);            Mm->storestrain (lcid,ipp,eps);      ipp++;    }  }    destrv (w);  destrv (gp);  }/**   function computes strains in nodes of element   @param lcid - load case id   @param eid - element id   @param ri,ci - row and column indices      10.5.2002*/void axisymqq::nod_strains_ip (long lcid,long eid){  long i,j;  ivector ipnum(nne),nod(nne);  vector eps(tncomp);    //  numbers of integration points closest to nodes  nodipnum (eid,ipnum);    //  node numbers of the element  Mt->give_elemnodes (eid,nod);    for (i=0;i<nne;i++){    //  strains at the closest integration point    Mm->givestrain (lcid,ipnum[i],eps);        //  storage of strains to the node    j=nod[i];    Mt->nodes[j].storestrain (lcid,0,eps);  }  }/**   function computes strains in nodes of element      @param lcid - load case id   @param eid - element id      JK, 23.9.2004*/void axisymqq::nod_strains_comp (long lcid,long eid){  long i,j;  double jac;  vector x(nne),y(nne),nxi(nne),neta(nne),r(ndofe),eps(tncomp),aux;  ivector nodes(nne),cn(ndofe);  matrix gm(tncomp,ndofe),tmat;    //  natural coordinates of nodes of element  nodecoord (nxi,neta);  //  node numbers of element  Mt->give_elemnodes (eid,nodes);  //  coordinates of element nodes  Mt->give_node_coord2d (x,y,eid);  //  code numbers of element  Mt->give_code_numbers (eid,cn.a);  //  nodal displacements  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);  }      for (i=0;i<nne;i++){    //  block of geometric matrix    geom_matrix (gm,x,y,nxi[i],neta[i],jac);    //  strain computation    mxv (gm,r,eps);        //  storage of nodal strains    j=nodes[i];    Mt->nodes[j].storestrain (lcid,0,eps);  }  }/**   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 axisymqq::res_allip_strains (long lcid,long eid){  allip_strains (lcid,eid,0,0);}/**   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 axisymqq::allip_strains (long lcid,long eid,long ri,long ci){  //  blocks of strain components at integration points  res_mainip_strains (lcid,eid);}void axisymqq::strains (long lcid,long eid,long ri,long ci){  vector coord,eps;    switch (Mm->stra.tape[eid]){  case nowhere:{    break;  }  case intpts:{    //allip_strains (stra,lcid,eid,ri,ci);    break;  }  case enodes:{    nod_strains_ip (lcid,eid);    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 (2,coord);    for (i=0;i<naep;i++){      Mm->stra.give_aepcoord (sid,i,coord);            if (Mp->strainaver==0)	appval (coord[0],coord[1],0,ncp,eps,stra);      if (Mp->strainaver==1)	appstrain (lcid,eid,coord[0],coord[1],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 planeelemlq::strains (%s, line %d).\n",__FILE__,__LINE__);  }  }}/**   function assembles natural coordinates of nodes of element      @param xi - array containing natural coordinates xi   @param eta - array containing natrual coordinates eta      10.5.2002*/void axisymqq::nodecoord (vector &xi,vector &eta){  xi[0] =  1.0;  eta[0] =  1.0;  xi[1] = -1.0;  eta[1] =  1.0;  xi[2] = -1.0;  eta[2] = -1.0;  xi[3] =  1.0;  eta[3] = -1.0;  xi[4] =  0.0;  eta[4] =  1.0;  xi[5] = -1.0;  eta[5] =  0.0;  xi[6] =  0.0;  eta[6] = -1.0;  xi[7] =  1.0;  eta[7] =  0.0;}/**   function returns numbers of integration point closest to element nodes      @param eid - element id   @param ri,ci - row and column indices   @param ipnum - array of numbers      JK, 25.9.2004*/void axisymqq::nodipnum (long eid,ivector &ipnum){  long i,j;    j=intordsm[0][0];  i=Mt->elements[eid].ipp[0][0];    /*  ipnum[0]=i+j*(j-1)+j-1;  ipnum[1]=i+j-1;  ipnum[2]=i;  ipnum[3]=i+j*(j-1);  */    ipnum[0]=i+8;  ipnum[1]=i+2;  ipnum[2]=i+0;  ipnum[3]=i+6;  ipnum[4]=i+5;  ipnum[5]=i+1;  ipnum[6]=i+3;  ipnum[7]=i+7;  }/**   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 axisymqq::appval (double xi,double eta,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]=approx (xi,eta,nodval);    k++;  }    destrv (nodval);}/**   function computes stresses at integration points

⌨️ 快捷键说明

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