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

📄 plelemlq.cpp

📁 Finite element program for mechanical problem. It can solve various problem in solid problem
💻 CPP
📖 第 1 页 / 共 4 页
字号:
  vector w,gp,t(nne),sig(tncomp),r(ndofe);  matrix gm(tncomp,ndofe),grm(4,ndofe),d(tncomp,tncomp),s(4,4);    //  element nodes  Mt->give_elemnodes (eid,nodes);  //  thickness of element  Mc->give_thickness (eid,nodes,t);  //  code numbers of element  Mt->give_code_numbers (eid,cn.a);  //  nodal displacements  eldispl (lcid,eid,r.a,cn.a,ndofe);    //  component setting to zero  fillm (0.0,sm);    //  array for weights of integration points  allocv (intordsm[0][0],w);  //  array for coordinates of integration points  allocv (intordsm[0][0],gp);    //  coordinates and weights of integration points  gauss_points (gp.a,w.a,intordsm[0][0]);    //  number of the first integration point on element  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];            //      //  linear stiffness matrix and inital deformation matrix      //            //  strain-displacement matrix      gngeom_matrix (gm,r,x,y,xi,eta,jac);            //  stiffness matrix of the material      Mm->matstiff (d,ipp);            //  thickness in integration point      thick = approx (xi,eta,t);            jac*=thick*w[i]*w[j];            //  contribution to the stiffness matrix of the element      bdbjac (sm,gm,d,gm,jac);                  //      //  initial stress matrix      //            //  gradient matrix      gnl_grmatrix (grm,x,y,xi,eta,jac2);            //  stresses      Mm->givestress (lcid,ipp,sig);            s[0][0]=sig[0];  s[0][1]=sig[2];      s[1][0]=sig[2];  s[1][1]=sig[1];      s[2][2]=sig[0];  s[2][3]=sig[2];      s[3][2]=sig[2];  s[3][3]=sig[1];      //  contribution to the stiffness matrix of the element      bdbjac (sm,grm,s,grm,jac);            ipp++;    }  }    destrv (gp);  destrv (w);  }/**   function computes stiffness %matrix of quadrilateral element      @param lcid - load case id   @param eid - element id   @param sm - stiffness %matrix      JK*/void planeelemlq::res_stiffness_matrix (long lcid,long eid,matrix &sm){  long transf;  ivector nodes(nne);  vector x(nne),y(nne);  Mt->give_node_coord2d (x,y,eid);    gl_stiffness_matrix (eid,0,0,sm,x,y);  //gnl_stiffness_matrix (lcid,eid,0,0,sm,x,y);    //  transformation of stiffness matrix  //  (in the case of nodal coordinate systems)  Mt->give_elemnodes (eid,nodes);  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 rectangular   finite element with bilinear approximation functions      this function is used in plane stress/strain elements (function is called   by function res_mass_matrix) and shell elements   @param eid - number of element   @param mm - mass %matrix      JK, 24.6.2001*/void planeelemlq::mass_matrix (long eid,matrix &mm,vector &x,vector &y){  long i,j;  double jac,xi,eta,thick,rho;  ivector nodes(nne);  vector w(intordmm),gp(intordmm),t(nne),dens(nne);  matrix n(napfun,ndofe);  Mt->give_elemnodes (eid,nodes);  Mc->give_thickness (eid,nodes,t);  Mc->give_density (eid,nodes,dens);  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);            thick = approx (xi,eta,t);      rho = approx (xi,eta,dens);      jac*=w[i]*w[j]*thick*rho;            nnj (mm.a,n.a,jac,n.m,n.n);    }  }  }/**   function assembles mass %matrix of plane stress rectangular   finite element with biquadratic approximation functions      @param eid - element id   @param mm - mass %matrix      JK*/void planeelemlq::res_mass_matrix (long eid,matrix &mm){  long transf;  ivector nodes(nne);  vector x(nne),y(nne);    Mt->give_node_coord2d (x,y,eid);  mass_matrix (eid,mm,x,y);    //  transformation of mass matrix  //  (in the case of nodal coordinate systems)  Mt->give_elemnodes (eid,nodes);  transf = Mt->locsystems (nodes);  if (transf>0){    matrix tmat (ndofe,ndofe);    transf_matrix (nodes,tmat);    glmatrixtransf (mm,tmat);  }}/**   function computes strains at integration points      @param lcid - load case id   @param eid - element id      JK*/void planeelemlq::res_ip_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);  }    gl_ip_strains (lcid,eid,0,0,x,y,r);  //gnl_ip_strains (lcid,eid,0,0,x,y,r);  }/**   function computes strains at integration points of element   function is used in geometrically linear problems      @param lcid - load case id   @param eid - element id   @param ri,ci - row and column indices   @param ii - number of block   @param x,y - arrays with node coordinates   @param r - %vector of nodal displacements      JK, 10.5.2002*/void planeelemlq::gl_ip_strains (long lcid,long eid,long ri,long ci,vector &x,vector &y,vector &r){  long i,j,ii,ipp;  double xi,eta,jac;  vector gp,w,eps,epscum;  matrix gm;    //  loop over blocks  for (ii=0;ii<nb;ii++){        allocv (intordsm[ii][ii],gp);    allocv (intordsm[ii][ii],w);    allocv (ncomp[ii],eps);    allocm (ncomp[ii],ndofe,gm);        gauss_points (gp.a,w.a,intordsm[ii][ii]);        ipp=Mt->elements[eid].ipp[ri+ii][ci+ii];    for (i=0;i<intordsm[ii][ii];i++){      xi=gp[i];      for (j=0;j<intordsm[ii][ii];j++){	eta=gp[j];		geom_matrix_block (gm,ii,x,y,xi,eta,jac);	mxv (gm,r,eps);		Mm->storestrain (lcid,ipp,cncomp[ii],eps);	ipp++;      }    }        destrm (gm);  destrv (eps);  destrv (w);  destrv (gp);  }    // ********************************************  //  exchange of values at integration points  // ********************************************  //  values from 4 points to 1 point  ipp=Mt->elements[eid].ipp[ri][ci];  allocv (ncomp[0],epscum);  allocv (ncomp[0],eps);  for (i=0;i<intordsm[0][0];i++){    for (j=0;j<intordsm[0][0];j++){      Mm->givestrain (lcid,ipp,cncomp[0],eps);      addv (eps,epscum,epscum);      ipp++;    }  }    cmulv (1.0/4.0,epscum,epscum);  ipp=Mt->elements[eid].ipp[ri+1][ci+1];  Mm->storestrain (lcid,ipp,epscum);  destrv (eps);  destrv (epscum);  //  value from 1 point to 4 points  allocv (ncomp[1],eps);  Mm->givestrain (lcid,ipp,cncomp[1],eps);  ipp=Mt->elements[eid].ipp[ri][ci];  Mm->storestrain (lcid,ipp,cncomp[1],eps);  ipp++;  Mm->storestrain (lcid,ipp,cncomp[1],eps);  ipp++;  Mm->storestrain (lcid,ipp,cncomp[1],eps);  ipp++;  Mm->storestrain (lcid,ipp,cncomp[1],eps);  ipp++;  destrv (eps);}/**   function computes strains at integration points of element   function is used in geometrically linear problems      @param lcid - load case id   @param eid - element id   @param ri,ci - row and column indices   @param ii - number of block   @param x,y - arrays with node coordinates   @param r - %vector of nodal displacements      JK, 24.9.2005*/void planeelemlq::gnl_ip_strains (long lcid,long eid,long ri,long ci,vector &x,vector &y,vector &r){  long i,j,ipp;  double xi,eta,jac,b11r,b12r,b21r,b22r;  vector gp,w,eps,b11(ndofe),b12(ndofe),b21(ndofe),b22(ndofe);    allocv (intordsm[0][0],gp);  allocv (intordsm[0][0],w);  allocv (tncomp,eps);    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];            bvectors (x,y,xi,eta,jac,b11,b12,b21,b22);      scprd (b11,r,b11r);      scprd (b12,r,b12r);      scprd (b21,r,b21r);      scprd (b22,r,b22r);            eps[0]=b11r+0.5*b11r*b11r+0.5*b21r*b21r;      eps[1]=b22r+0.5*b12r*b12r+0.5*b22r*b22r;      eps[2]=b12r+b21r+b11r*b12r+b21r*b22r;                  Mm->storestrain (lcid,ipp,eps);      ipp++;    }  }    destrv (eps);  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 planeelemlq::nod_strains_ip (long lcid,long eid,long ri,long ci){  long i,j,ipp;  ivector ipnum(nne),nod(nne);  vector eps(tncomp);    //  numbers of integration points closest to nodes  //  (function is from the file GEFEL/ordering.cpp)  ipp=Mt->elements[eid].ipp[ri][ci];  nodip_planelq (ipp,intordsm[0][0],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 nodal strains directly      @param lcid - load case id   @param eid - element id   @param stra - array for strain components      JK, 25.9.2004*/void planeelemlq::nod_strains_comp (long lcid,long eid,double **stra){  long i,j;  double jac;  ivector cn(ndofe),nodes(nne);  vector x(nne),y(nne),nxi(nne),neta(nne),r(ndofe),eps(tncomp),aux;  matrix tmat,gm(tncomp,ndofe);    //  node coordinates  Mt->give_node_coord2d (x,y,eid);  //  node numbers  Mt->give_elemnodes (eid,nodes);  //  code numbers of the 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);  }    //  natural coordinates of element nodes  //  (function is from the file GEFEL/ordering.cpp)  nodcoord_planelq (nxi,neta);    //  loop over nodes  for (i=0;i<nne;i++){    //  geometric matrix    geom_matrix (gm,x,y,nxi[i],neta[i],jac);    //  strain computation    mxv (gm,r,eps);        for (j=0;j<eps.n;j++){      stra[i][j]=eps[j];    }  }}/**   function computes strains at strain points      @param lcid - load case id   @param eid - element id   @param ri,ci - row and column indices      JK*/void planeelemlq::strains (long lcid,long eid,long ri,long ci){  long i,naep,ncp,sid;  vector coord,eps;  switch (Mm->stra.tape[eid]){  case nowhere:{    break;  }  case intpts:{    //allip_strains (lcid,eid,ri,ci);    break;  }  case enodes:{    nod_strains_ip (lcid,eid,ri,ci);    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 computes stresses at integration points      @param lcid - load case id   @param eid - element id      JK*/void planeelemlq::res_ip_stresses (long lcid,long eid){  ip_stresses (lcid,eid,0,0);}/**   function computes stresses at integration points of element      @param lcid - load case id   @param eid - element id   @param ri,ci - row and column indices      function can be used when all strain components are known   at all integration points      JK, 10.5.2002*/void planeelemlq::ip_stresses (long lcid,long eid,long ri,long ci){  long i,j,ii,jj,ipp;  vector sig,sigcum;  for (ii=0;ii<nb;ii++){    for (jj=0;jj<nb;jj++){      if (intordsm[ii][jj]==0)  continue;            ipp=Mt->elements[eid].ipp[ri+ii][ci+jj];            for (i=0;i<intordsm[ii][jj];i++){	for (j=0;j<intordsm[ii][jj];j++){	  	  //  computation of correct stresses	  if (Mp->strcomp==1)	    Mm->computenlstresses (ipp);	  	  ipp++;	}      }    }  }      // ********************************************  //  exchange of values at integration points  // ********************************************  //  values from 4 points to 1 point  ipp=Mt->elements[eid].ipp[ri][ci];  allocv (ncomp[0],sigcum);  allocv (ncomp[0],sig);  for (i=0;i<intordsm[0][0];i++){    for (j=0;j<intordsm[0][0];j++){      Mm->givestress (lcid,ipp,cncomp[0],sig);      addv (sig,sigcum,sigcum);      ipp++;    }  }    cmulv (1.0/4.0,sigcum,sigcum);  ipp=Mt->elements[eid].ipp[ri+1][ci+1];  Mm->storestress (lcid,ipp,sigcum);  destrv (sig);  destrv (sigcum);  //  value from 1 point to 4 points  allocv (ncomp[1],sig);  Mm->givestrain (lcid,ipp,cncomp[1],sig);  ipp=Mt->elements[eid].ipp[ri][ci];  Mm->storestrain (lcid,ipp,cncomp[1],sig);  ipp++;  Mm->storestrain (lcid,ipp,cncomp[1],sig);  ipp++;  Mm->storestrain (lcid,ipp,cncomp[1],sig);  ipp++;  Mm->storestrain (lcid,ipp,cncomp[1],sig);  ipp++;  destrv (sig);}/**   function computes stresses in integration points of element      @param lcid - load case id   @param eid - element id   @param ri,ci - row and column indices      function can be used when all strain components are known   at all integration points      10.5.2002*/void planeelemlq::ip_elast_stresses (long lcid,long eid,long ri,long ci){  long i,j,ii,jj,ipp;  double xi,eta;  vector gp,w,eps,epst,epstt,sig,auxsig;  matrix d(tncomp,tncomp),dd;    for (ii=0;ii<nb;ii++){    allocv (ncomp[ii],sig);    allocv (ncomp[ii],auxsig);    allocv (intordsm[ii][ii],gp);    allocv (intordsm[ii][ii],w);        gauss_points (gp.a,w.a,intordsm[ii][ii]);        ipp=Mt->elements[eid].ipp[ri+ii][ci+ii];        for (i=0;i<intordsm[ii][ii];i++){      xi=gp[i];      for (j=0;j<intordsm[ii][ii];j++){	eta=gp[j];		Mm->matstiff (d,ipp);		fillv (0.0,sig);	for (jj=0;jj<nb;jj++){	  allocv (ncomp[jj],eps);	  allocm (ncomp[ii],ncomp[jj],dd);	  	  //  block of strains

⌨️ 快捷键说明

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