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

📄 linhex_nb1.cpp

📁 Finite element program for mechanical problem. It can solve various problem in solid problem
💻 CPP
📖 第 1 页 / 共 5 页
字号:
#include <stdlib.h>#include <math.h>#include "linhex.h"#include "global.h"#include "globmat.h"#include "genfile.h"#include "intpoints.h"#include "node.h"#include "element.h"#include "loadcase.h"linhex::linhex (void){  long i,j;  nne=8;  ndofe=24;  tncomp=6;  napfun=3;  intordmm=2;  ned=12;  nned=2; intordb=2;  nsurf=6;  nnsurf=4;  ssst=spacestress;    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]=8;    tnip=0;  for (i=0;i<nb;i++){    for (j=0;j<nb;j++){      tnip+=nip[i][j];    }  }  intordsm[0][0]=2;}linhex::~linhex (void){  long i;    for (i=0;i<nb;i++){    delete [] nip[i];    delete [] intordsm[i];  }  delete [] nip;  delete [] intordsm;    delete [] cncomp;  delete [] ncomp;}void linhex::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,zeta - natural coordinates   @param nodval - nodal values      20.8.2001*/double linhex::approx (double xi,double eta,double zeta,vector &nodval){  double f;  vector bf(nne);    bf_lin_hex_3d (bf.a,xi,eta,zeta);    scprd (bf,nodval,f);  return f;}/**   function assembles matrix of base functions      @param n - matrix of base functions   @param xi,eta,zeta - natural coordinates   19.7.2001*/void linhex::bf_matrix (matrix &n,double xi,double eta,double zeta){  long i,j,k,l;  vector bf(nne);  fillm (0.0,n);  bf_lin_hex_3d (bf.a,xi,eta,zeta);    j=0;  k=1;  l=2;  for (i=0;i<nne;i++){    n[0][j]=bf[i];  j+=3;    n[1][k]=bf[i];  k+=3;    n[2][l]=bf[i];  l+=3;  }}/**   function assembles strain-displacement (geometric) %matrix   @param gm - geometric %matrix   @param x,y,z - vectors containing element node coordinates   @param xi,eta,zeta - natural coordinates   @param jac - Jacobian   19.7.2001*/void linhex::geom_matrix (matrix &gm,vector &x,vector &y,vector &z,			  double xi,double eta,double zeta,double &jac){  long i,j,k,l;  vector dx(nne),dy(nne),dz(nne);  dx_bf_lin_hex_3d (dx.a,eta,zeta);  dy_bf_lin_hex_3d (dy.a,xi,zeta);  dz_bf_lin_hex_3d (dz.a,xi,eta);  derivatives_3d (dx,dy,dz,jac,x,y,z,xi,eta,zeta);  fillm (0.0,gm);  j=0;  k=1;  l=2;  for (i=0;i<nne;i++){    gm[0][j]=dx[i];    gm[1][k]=dy[i];    gm[2][l]=dz[i];        gm[3][k]=dz[i];    gm[3][l]=dy[i];        gm[4][j]=dz[i];    gm[4][l]=dx[i];        gm[5][j]=dy[i];    gm[5][k]=dx[i];        j+=3;  k+=3;  l+=3;  }}/**   function assembles geometric matrix   @param gm - geometric matrix   @param x,y,z - vectors containing element node coordinates   @param xi,eta,zeta - naturalcoordinates   @param jac - Jacobian   19.7.2001*/void linhex::geom_matrix_block (matrix &gm,long ri,vector &x,vector &y,vector &z,				double xi,double eta,double zeta,double &jac){  long i,j,k,l;  vector dx(nne),dy(nne),dz(nne);  dx_bf_lin_hex_3d (dx.a,eta,zeta);  dy_bf_lin_hex_3d (dy.a,xi,zeta);  dz_bf_lin_hex_3d (dz.a,xi,eta);  derivatives_3d (dx,dy,dz,jac,x,y,z,xi,eta,zeta);  fillm (0.0,gm);  j=0;  k=1;  l=2;  for (i=0;i<nne;i++){    gm[0][j]=dx[i];    gm[1][k]=dy[i];    gm[2][l]=dz[i];        gm[3][k]=dz[i];    gm[3][l]=dy[i];        gm[4][j]=dz[i];    gm[4][l]=dx[i];        gm[5][j]=dy[i];    gm[5][k]=dx[i];        j+=3;  k+=3;  l+=3;  }}/**   function assembles auxiliary vectors B for evaluation of stiffness %matrix   in geometrically nonlinear problems      @param x,y,z - array containing node coordinates   @param xi,eta,zeta - natural coordinates   @param jac - Jacobian   @param b11,b12,b13,b21,b22,b23,b31,b32,b33 - vectors of derivatives of shape functions      JK, 24.9.2005*/void linhex::bvectors (vector &x,vector &y,vector &z,double xi,double eta,double zeta,double &jac,		       vector &b11,vector &b12,vector &b13,		       vector &b21,vector &b22,vector &b23,		       vector &b31,vector &b32,vector &b33){  vector dx(nne),dy(nne),dz(nne);    dx_bf_lin_hex_3d (dx.a,eta,zeta);  dy_bf_lin_hex_3d (dy.a,xi,zeta);  dz_bf_lin_hex_3d (dz.a,xi,eta);    derivatives_3d (dx,dy,dz,jac,x,y,z,xi,eta,zeta);    fillv (0.0,b11);  fillv (0.0,b12);  fillv (0.0,b13);  fillv (0.0,b21);  fillv (0.0,b22);  fillv (0.0,b23);  fillv (0.0,b31);  fillv (0.0,b32);  fillv (0.0,b33);  //  du/dx  b11[0]=dx[0];  b11[3]=dx[1];  b11[6]=dx[2];  b11[9]=dx[3];   b11[12]=dx[4];  b11[15]=dx[5];  b11[18]=dx[6];  b11[21]=dx[7];  //  du/dy  b12[0]=dy[0];  b12[3]=dy[1];  b12[6]=dy[2];  b12[9]=dy[3];   b12[12]=dy[4];  b12[15]=dy[5];  b12[18]=dy[6];  b12[21]=dy[7];  //  du/dz  b13[0]=dz[0];  b13[3]=dz[1];  b13[6]=dz[2];  b13[9]=dz[3];   b13[12]=dz[4];  b13[15]=dz[5];  b13[18]=dz[6];  b13[21]=dz[7];  //  dv/dx  b21[1]=dx[0];  b21[4]=dx[1];  b21[7]=dx[2];  b21[10]=dx[3];  b21[13]=dx[4];  b21[16]=dx[5];  b21[19]=dx[6];  b21[22]=dx[7];  //  dv/dy  b22[1]=dy[0];  b22[4]=dy[1];  b22[7]=dy[2];  b22[10]=dy[3];  b22[13]=dy[4];  b22[16]=dy[5];  b22[19]=dy[6];  b22[22]=dy[7];  //  dv/dz  b23[1]=dz[0];  b23[4]=dz[1];  b23[7]=dz[2];  b23[10]=dz[3];  b23[13]=dz[4];  b23[16]=dz[5];  b23[19]=dz[6];  b23[22]=dz[7];  //  dw/dx  b31[2]=dx[0];  b31[5]=dx[1];  b31[8]=dx[2];  b31[11]=dx[3];  b31[14]=dx[4];  b31[17]=dx[5];  b31[20]=dx[6];  b31[23]=dx[7];  //  dw/dy  b32[2]=dy[0];  b32[5]=dy[1];  b32[8]=dy[2];  b32[11]=dy[3];  b32[14]=dy[4];  b32[17]=dy[5];  b32[20]=dy[6];  b32[23]=dy[7];  //  dw/dz  b33[2]=dz[0];  b33[5]=dz[1];  b33[8]=dz[2];  b33[11]=dz[3];  b33[14]=dz[4];  b33[17]=dz[5];  b33[20]=dz[6];  b33[23]=dz[7];}/**   function computes strain-displacement %matrix for geometrically nonlinear problems      @param gm - strain-displacement %matrix   @param r - array of nodal displacements   @param x,y,z - array containing node coordinates   @param xi,eta,zeta - natural coordinates   @param jac - Jacobian   JK, 24.9.2005*/void linhex::gngeom_matrix (matrix &gm,vector &r,vector &x,vector &y,vector &z,double xi,double eta,double zeta,double &jac){  long i;  double b11r,b12r,b13r,b21r,b22r,b23r,b31r,b32r,b33r;  vector b11(ndofe),b12(ndofe),b13(ndofe),b21(ndofe),b22(ndofe),b23(ndofe),b31(ndofe),b32(ndofe),b33(ndofe),av(ndofe);    fillm (0.0,gm);    bvectors (x,y,z,xi,eta,zeta,jac,b11,b12,b13,b21,b22,b23,b31,b32,b33);    scprd (b11,r,b11r);  scprd (b12,r,b12r);  scprd (b13,r,b13r);  scprd (b21,r,b21r);  scprd (b22,r,b22r);  scprd (b23,r,b23r);  scprd (b31,r,b31r);  scprd (b32,r,b32r);  scprd (b33,r,b33r);      // *******  //  E_11  // *******    //  B11 dr  for (i=0;i<ndofe;i++){    gm[0][i]+=b11[i];  }    //  r B11 B11 dr  cmulv(b11r,b11,av);  for (i=0;i<ndofe;i++){    gm[0][i]+=av[i];  }    //  r B21 B21 dr  cmulv(b21r,b21,av);  for (i=0;i<ndofe;i++){    gm[0][i]+=av[i];  }  //  r B31 B31 dr  cmulv(b31r,b31,av);  for (i=0;i<ndofe;i++){    gm[0][i]+=av[i];  }    // *******  //  E_22  // *******    //  B22 dr  for (i=0;i<ndofe;i++){    gm[1][i]+=b22[i];  }    //  r B12 B12 dr  cmulv(b12r,b12,av);  for (i=0;i<ndofe;i++){    gm[1][i]+=av[i];  }    //  r B22 B22 dr  cmulv(b22r,b22,av);  for (i=0;i<ndofe;i++){    gm[1][i]+=av[i];  }    //  r B32 B32 dr  cmulv(b32r,b32,av);  for (i=0;i<ndofe;i++){    gm[1][i]+=av[i];  }    // *******  //  E_33  // *******    //  B33 dr  for (i=0;i<ndofe;i++){    gm[2][i]+=b22[i];  }    //  r B13 B13 dr  cmulv(b13r,b13,av);  for (i=0;i<ndofe;i++){    gm[2][i]+=av[i];  }    //  r B23 B23 dr  cmulv(b23r,b23,av);  for (i=0;i<ndofe;i++){    gm[2][i]+=av[i];  }    //  r B33 B33 dr  cmulv(b33r,b33,av);  for (i=0;i<ndofe;i++){    gm[2][i]+=av[i];  }    // **************  //  E_23 = E_32  // **************    //  (B23 + B32) dr  for (i=0;i<ndofe;i++){    gm[3][i]+=b23[i]+b32[i];  }    //  r B13 B12 dr  cmulv(b13r,b12,av);  for (i=0;i<ndofe;i++){    gm[3][i]+=av[i];  }    //  r B12 B13 dr  cmulv(b12r,b13,av);  for (i=0;i<ndofe;i++){    gm[3][i]+=av[i];  }  //  r B23 B22 dr  cmulv(b23r,b22,av);  for (i=0;i<ndofe;i++){    gm[3][i]+=av[i];  }    //  r B22 B23 dr  cmulv(b22r,b23,av);  for (i=0;i<ndofe;i++){    gm[3][i]+=av[i];  }    //  r B33 B32 dr  cmulv(b33r,b32,av);  for (i=0;i<ndofe;i++){    gm[3][i]+=av[i];  }    //  r B32 B33 dr  cmulv(b32r,b33,av);  for (i=0;i<ndofe;i++){    gm[3][i]+=av[i];  }    // **************  //  E_31 = E_13  // **************    //  (B31 + B13) dr  for (i=0;i<ndofe;i++){    gm[4][i]+=b31[i]+b13[i];  }    //  r B11 B13 dr  cmulv(b11r,b13,av);  for (i=0;i<ndofe;i++){    gm[4][i]+=av[i];  }    //  r B13 B11 dr  cmulv(b13r,b11,av);  for (i=0;i<ndofe;i++){    gm[4][i]+=av[i];  }  //  r B21 B23 dr  cmulv(b21r,b23,av);  for (i=0;i<ndofe;i++){    gm[4][i]+=av[i];  }    //  r B23 B21 dr  cmulv(b23r,b21,av);  for (i=0;i<ndofe;i++){    gm[4][i]+=av[i];  }    //  r B31 B33 dr  cmulv(b31r,b33,av);  for (i=0;i<ndofe;i++){    gm[4][i]+=av[i];  }    //  r B33 B31 dr  cmulv(b33r,b31,av);  for (i=0;i<ndofe;i++){    gm[4][i]+=av[i];  }  // **************  //  E_12 = E_21  // **************    //  (B12 + B21) dr  for (i=0;i<ndofe;i++){    gm[5][i]+=b12[i]+b21[i];  }    //  r B12 B11 dr  cmulv(b12r,b11,av);  for (i=0;i<ndofe;i++){    gm[5][i]+=av[i];  }    //  r B11 B12 dr  cmulv(b11r,b12,av);  for (i=0;i<ndofe;i++){    gm[5][i]+=av[i];  }  //  r B22 B21 dr  cmulv(b22r,b21,av);  for (i=0;i<ndofe;i++){    gm[5][i]+=av[i];  }    //  r B21 B22 dr  cmulv(b21r,b22,av);  for (i=0;i<ndofe;i++){    gm[5][i]+=av[i];  }    //  r B32 B31 dr  cmulv(b32r,b31,av);  for (i=0;i<ndofe;i++){    gm[5][i]+=av[i];  }    //  r B31 B32 dr  cmulv(b31r,b32,av);  for (i=0;i<ndofe;i++){    gm[5][i]+=av[i];  }  }/**   function computes gradient %matrix for geometrically nonlinear problems      @param grm - gradient %matrix   @param x,y,z - array containing node coordinates   @param xi,eta,zeta - natural coordinates   @param jac - Jacobian   JK, 24.9.2005*/void linhex::gnl_grmatrix (matrix &grm,vector &x,vector &y,vector &z,double xi,double eta,double zeta,double &jac){  long i;  vector b11(ndofe),b12(ndofe),b13(ndofe),b21(ndofe),b22(ndofe),b23(ndofe),b31(ndofe),b32(ndofe),b33(ndofe);    bvectors (x,y,z,xi,eta,zeta,jac,b11,b12,b13,b21,b22,b23,b31,b32,b33);    for (i=0;i<ndofe;i++){    grm[0][i]=b11[i];    grm[1][i]=b12[i];    grm[2][i]=b13[i];    grm[3][i]=b21[i];    grm[4][i]=b22[i];    grm[5][i]=b23[i];    grm[6][i]=b31[i];    grm[7][i]=b32[i];    grm[8][i]=b33[i];  }}/**   function assembles transformation matrix      @param nodes - nodes of element   @param tmat - transformation matrix   */void linhex::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   function computes stiffness %matrix for geometrically linear problems   @param eid - number of element   @param ri,ci - row and column indices   @param sm - stiffness matrix   JK, 19.7.2001*/void linhex::gl_stiffness_matrix (long eid,long ri,long ci,matrix &sm){  long i,j,k,ii,jj,ipp,transf;

⌨️ 快捷键说明

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