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

📄 axisymlt.cpp

📁 Finite element program for mechanical problem. It can solve various problem in solid problem
💻 CPP
📖 第 1 页 / 共 3 页
字号:
#include "axisymlt.h"#include "global.h"#include "globmat.h"#include "genfile.h"#include "element.h"#include "node.h"#include "loadcase.h"#include "intpoints.h"#include <stdlib.h>axisymlt::axisymlt (void){  long i,j;    nne=3;  ndofe=6;  tncomp=4;  napfun=2;  ned=3;  nned=2;  intordmm=3;  intordb=2;  ssst=axisymm;  //nb=3;  nb=1;  ncomp = new long [nb];  ncomp[0]=4;    /*  ncomp[0]=2;  ncomp[1]=1;  ncomp[2]=1;  */    cncomp = new long [nb];  cncomp[0]=0;    /*  cncomp[0]=0;  cncomp[1]=2;  cncomp[2]=3;  */  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;  nip[0][1]=1;  nip[0][2]=0;  nip[1][0]=1;  nip[1][1]=1;  nip[1][2]=0;  nip[2][0]=0;  nip[2][1]=0;  nip[2][2]=1;  intordsm[0][0]=1;  intordsm[0][1]=1;  intordsm[0][2]=0;  intordsm[1][0]=1;  intordsm[1][1]=1;  intordsm[1][2]=0;  intordsm[2][0]=0;  intordsm[2][1]=0;  intordsm[2][2]=1;*//*  nip[0][0]=1;  nip[0][1]=3;  nip[0][2]=0;  nip[1][0]=3;  nip[1][1]=3;  nip[1][2]=0;  nip[2][0]=0;  nip[2][1]=0;  nip[2][2]=1;  intordsm[0][0]=1;  intordsm[0][1]=3;  intordsm[0][2]=0;  intordsm[1][0]=3;  intordsm[1][1]=3;  intordsm[1][2]=0;  intordsm[2][0]=0;  intordsm[2][1]=0;  intordsm[2][2]=1;*/    /*  nip[0][0]=3;  nip[0][1]=3;  nip[0][2]=0;  nip[1][0]=3;  nip[1][1]=3;  nip[1][2]=0;  nip[2][0]=0;  nip[2][1]=0;  nip[2][2]=3;  intordsm[0][0]=3;  intordsm[0][1]=3;  intordsm[0][2]=0;  intordsm[1][0]=3;  intordsm[1][1]=3;  intordsm[1][2]=0;  intordsm[2][0]=0;  intordsm[2][1]=0;  intordsm[2][2]=3;  */    nip[0][0]=3;  intordsm[0][0]=3;    tnip=0;  for (i=0;i<nb;i++){    for (j=0;j<nb;j++){      tnip+=nip[i][j];    }  }  }axisymlt::~axisymlt (void){  long i;  for (i=0;i<nb;i++){    delete [] nip[i];    delete [] intordsm[i];  }  delete [] nip;  delete [] intordsm;    delete [] cncomp;  delete [] ncomp;}void axisymlt::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*/double axisymlt::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*/double axisymlt::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 approximation functions      @param n - matrix of approximation functions   @param areacoord - array containing area coordinates   29.3.2002*/void axisymlt::bf_matrix (matrix &n,double xi,double eta){  vector bf(nne);    bf_lin_3_2d (bf.a,xi,eta);  fillm (0.0,n);  n[0][0]=bf[0];  n[0][2]=bf[1];  n[0][4]=bf[2];    n[1][1]=bf[0];  n[1][3]=bf[1];  n[1][5]=bf[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 areacoord - area coordinates   @param x,y - node coordinates      29.3.2002*/void axisymlt::geom_matrix (matrix &gm,vector &areacoord,vector &x,vector &y){  double det,r;  vector b(3),c(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]);  //  radius  r = approx (areacoord,x);    plsb (b.a,y.a,det);  plsc (c.a,x.a,det);    fillm (0.0,gm);  gm[0][0]=b[0];  gm[0][2]=b[1];  gm[0][4]=b[2];    gm[1][1]=c[0];  gm[1][3]=c[1];  gm[1][5]=c[2];    gm[2][0]=areacoord[0]/r;  gm[2][2]=areacoord[1]/r;  gm[2][4]=areacoord[2]/r;  gm[3][0]=c[0];  gm[3][1]=b[0];  gm[3][2]=c[1];  gm[3][3]=b[1];  gm[3][4]=c[2];  gm[3][5]=b[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 areacoord - area coordinates   @param x,y - node coordinates      29.3.2002*/void axisymlt::geom_matrix_block (matrix &gm,long ri,vector &areacoord,vector &x,vector &y){  double det,r;  vector b(3),c(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]);  //  radius  r = approx (areacoord,x);    plsb (b.a,y.a,det);  plsc (c.a,x.a,det);  fillm (0.0,gm);    if (ri==0){    gm[0][0]=b[0];    gm[0][2]=b[1];    gm[0][4]=b[2];    gm[1][1]=c[0];    gm[1][3]=c[1];    gm[1][5]=c[2];  }  if (ri==1){      gm[0][0]=areacoord[0]/r;    gm[0][2]=areacoord[1]/r;    gm[0][4]=areacoord[2]/r;  }  if (ri==2){    gm[0][0]=c[0];    gm[0][1]=b[0];    gm[0][2]=c[1];    gm[0][3]=b[1];    gm[0][4]=c[2];    gm[0][5]=b[2];  }}/**   function extracts blocks from stiffness matrix of the material      @param ri,ci - row and column indices   @param d - stiffness matrix of material   @param dd - required block from stiffness matrix of material      10.5.2002*/void axisymlt::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==0 && ci==2){    dd[0][0]=d[0][3];    dd[1][0]=d[1][3];  }    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];  }  if (ri==1 && ci==2){    dd[0][0]=d[2][3];  }    if (ri==2 && ci==0){    dd[0][0]=d[3][0];  dd[0][1]=d[3][1];  }  if (ri==2 && ci==1){    dd[0][0]=d[3][2];  }  if (ri==2 && ci==2){    dd[0][0]=d[3][3];  }}/**   nutno otestovat! pak je mozne smazat tuto hlasku      transformation matrix x_g = T x_l   17.8.2001*/void axisymlt::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 triangular axisymmetric   finite element with linear approximation functions      @param eid - number of element   @param ri,ci - row and column indices   @param sm - stiffness matrix      17.8.2001*/void axisymlt::stiffness_matrix (long eid,long ri,long ci,matrix &sm){  long i,ii,jj,ipp,transf;  double jac,det,r;  ivector nodes(nne);  vector gp1,gp2,w,x(nne),y(nne),areacoord(3);  matrix gm(tncomp,ndofe),gmr,gmc,dd,d(tncomp,tncomp);    Mt->give_elemnodes (eid,nodes);  Mt->give_node_coord2d (x,y,eid);    //  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;      allocv (intordsm[ii][jj],w);      allocv (intordsm[ii][jj],gp1);      allocv (intordsm[ii][jj],gp2);            //allocm (ncomp[jj],ndofe,gmc);      //allocm (ncomp[ii],ncomp[jj],dd);            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-areacoord[0]-areacoord[1];		//  geometric matrix	geom_matrix (gm,areacoord,x,y);	//geom_matrix_block (gmr,ii,areacoord,x,y);	//geom_matrix_block (gmc,jj,areacoord,x,y);		//  matrix of stiffness of the material	Mm->matstiff (d,ipp);	//dmatblock (ii,jj,d,dd);		r = approx (areacoord,x);	jac=w[i]*r*det;		//  contribution to the stiffness matrix of the element	//bdbjac (sm,gmr,dd,gmc,jac);	bdbjac (sm,gm,d,gm,jac);		ipp++;      }            //destrm (dd);  destrm (gmc);      destrv (gp2);  destrv (gp1);  destrv (w);    }    //destrm (gmr);  }    //  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 axisymlt::res_stiffness_matrix (long eid,matrix &sm){  stiffness_matrix (eid,0,0,sm);}/**   function computes mass matrix of the triangular axisymmetric   finite element with linear approximation functions      @param eid - number of element   @param mm - mass matrix   29.3.2002*/void axisymlt::mass_matrix (long eid,matrix &mm){  long i;  double jac,det,rho,r;  ivector nodes(nne);  vector x(nne),y(nne),w(intordmm),gp1(intordmm),gp2(intordmm),dens(nne);  matrix n(napfun,ndofe);    Mt->give_elemnodes (eid,nodes);  Mt->give_node_coord2d (x,y,eid);  Mc->give_density (eid,nodes,dens);  //  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]);    gauss_points_tr (gp1.a,gp2.a,w.a,intordmm);    fillm (0.0,mm);    for (i=0;i<intordmm;i++){    bf_matrix (n,gp1[i],gp2[i]);    

⌨️ 快捷键说明

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