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

📄 mechtop.cpp

📁 Finite element program for mechanical problem. It can solve various problem in solid problem
💻 CPP
📖 第 1 页 / 共 5 页
字号:
/**   function returns node numbers on required element edge      @param eid - element id   @param edid - edge id   @param nodes - array containing edge nodes      5.3.2002*/void mechtop::give_edge_nodes (long eid,long edid,long *nodes){  long nne;  elemtype te;  ivector nod;    te = give_elem_type (eid);  nne = give_nne (eid);  allocv (nne,nod);  give_elemnodes (eid,nod);    switch (te){  case planeelementlt:{    if (edid==0){  nodes[0]=nod[0];  nodes[1]=nod[1]; }    if (edid==1){  nodes[0]=nod[1];  nodes[1]=nod[2]; }    if (edid==2){  nodes[0]=nod[2];  nodes[1]=nod[0]; }    break;  }  case planeelementqt:{    if (edid==0){  nodes[0]=nod[0];  nodes[1]=nod[1];  nodes[2]=nod[3]; }    if (edid==1){  nodes[0]=nod[1];  nodes[1]=nod[2];  nodes[2]=nod[4]; }    if (edid==2){  nodes[0]=nod[2];  nodes[1]=nod[0];  nodes[2]=nod[5]; }    break;  }  case planeelementrotlt:{    if (edid==0){  nodes[0]=nod[1];  nodes[1]=nod[2]; }    if (edid==1){  nodes[0]=nod[2];  nodes[1]=nod[0]; }    if (edid==2){  nodes[0]=nod[0];  nodes[1]=nod[1]; }    break;  }  case planeelementlq:{    if (edid==0){  nodes[0]=nod[0];  nodes[1]=nod[1]; }    if (edid==1){  nodes[0]=nod[1];  nodes[1]=nod[2]; }    if (edid==2){  nodes[0]=nod[2];  nodes[1]=nod[3]; }    if (edid==3){  nodes[0]=nod[3];  nodes[1]=nod[0]; }    break;  }  case planeelementqq:{    if (edid==0){  nodes[0]=nod[0];  nodes[1]=nod[4];  nodes[2]=nod[1]; }    if (edid==1){  nodes[0]=nod[1];  nodes[1]=nod[5];  nodes[2]=nod[2]; }    if (edid==2){  nodes[0]=nod[2];  nodes[1]=nod[6];  nodes[2]=nod[3]; }    if (edid==3){  nodes[0]=nod[3];  nodes[1]=nod[7];  nodes[2]=nod[0]; }    break;  }  case planeelementrotlq:{    if (edid==0){  nodes[0]=nod[0];  nodes[1]=nod[1]; }    if (edid==1){  nodes[0]=nod[1];  nodes[1]=nod[2]; }    if (edid==2){  nodes[0]=nod[2];  nodes[1]=nod[3]; }    if (edid==3){  nodes[0]=nod[3];  nodes[1]=nod[0]; }    break;  }  case planeelementsubqt:{    if (edid==0){  nodes[0]=nod[0];  nodes[1]=nod[1];  nodes[2]=nod[3]; }    if (edid==1){  nodes[0]=nod[1];  nodes[1]=nod[2];  nodes[2]=nod[4]; }    if (edid==2){  nodes[0]=nod[2];  nodes[1]=nod[0];  nodes[2]=nod[5]; }    break;  }  case axisymmlt:{    if (edid==0){  nodes[0]=nod[0];  nodes[1]=nod[1]; }    if (edid==1){  nodes[0]=nod[1];  nodes[1]=nod[2]; }    if (edid==2){  nodes[0]=nod[2];  nodes[1]=nod[0]; }    break;  }  case linearhex:{    if (edid==0){   nodes[0]=nod[0];  nodes[1]=nod[1]; }    if (edid==1){   nodes[0]=nod[0];  nodes[1]=nod[1]; }    if (edid==2){   nodes[0]=nod[0];  nodes[1]=nod[1]; }    if (edid==3){   nodes[0]=nod[0];  nodes[1]=nod[1]; }    if (edid==4){   nodes[0]=nod[0];  nodes[1]=nod[1]; }    if (edid==5){   nodes[0]=nod[0];  nodes[1]=nod[1]; }    if (edid==6){   nodes[0]=nod[0];  nodes[1]=nod[1]; }    if (edid==7){   nodes[0]=nod[0];  nodes[1]=nod[1]; }    if (edid==8){   nodes[0]=nod[0];  nodes[1]=nod[1]; }    if (edid==9){   nodes[0]=nod[0];  nodes[1]=nod[1]; }    if (edid==10){  nodes[0]=nod[0];  nodes[1]=nod[1]; }    if (edid==11){  nodes[0]=nod[0];  nodes[1]=nod[1]; }    break;  }  default:{    fprintf (stderr,"\n\n unknown element type is required in function give_edge_nodes (file %s, line %d).\n",__FILE__,__LINE__);  }  }    destrv (nod);}/**   function returns numbers of nodes defining apropriate element      @param eid - element id   @param nodes - array containing nodes      22.7.2001*/void mechtop::give_elemnodes (long eid,ivector &nodes){  Gtm->give_nodes (eid,nodes);}/**   function extracts all code numbers of actual element      @param eid - element id   @param cn - array containing all code numbers on element      25.6.2001*/void mechtop::give_code_numbers (long eid,long *cn){  Gtm->give_code_numbers (eid,cn);}/**   function extracts code numbers of actual node      @param nid - node id   @param cn - array containing code numbers on node      7.12.2002*/void mechtop::give_node_code_numbers (long nid,long *cn){  Gtm->give_node_code_numbers (nid,cn);}/**   function extracts code numbers of multipliers on actual node      @param nid - node id   @param lid - layer id   @param cn - array containing all code numbers on node      7.12.2002*/void mechtop::give_mult_code_numbers (long nid,long lid,long *cn){  Gtm->give_mult_code_numbers (nid,lid,cn);}/**   function returns node coordinates of the appropriate element      @param x,y - vectors containing node coordinates   @param eid - element id      19.7.2001*/void mechtop::give_node_coord1d (vector &x,long eid){  Gtm->give_node_coord1d (x,eid);}/**   function returns node coordinates of the appropriate element      @param x,y - vectors containing node coordinates   @param eid - element id      19.7.2001*/void mechtop::give_node_coord2d (vector &x,vector &y,long eid){  Gtm->give_node_coord2d (x,y,eid);}/**   function returns node coordinates of the appropriate element      @param x,z - vectors containing coordinates   @param eid - element id      19.7.2001*/void mechtop::give_node_coord2dxz (vector &x,vector &z,long eid){  Gtm->give_node_coord2dxz (x,z,eid);}/**   function returns node coordinates of the appropriate element      @param x,y,z - vectors containing coordinates   @param eid - element id      19.7.2001*/void mechtop::give_node_coord3d (vector &x,vector &y,vector &z,long eid){  Gtm->give_node_coord3d (x,y,z,eid);}/**   function returns length of the appropriate element   @param eid - element id   19.7.2001*/double mechtop::give_length (long eid){  long nn = give_nne(eid);  double l;  if (nn > 2)  {    fprintf(stderr, "\n\nInvalid number of node on element is detected");    fprintf(stderr, "\n function give_length(), (file %s, line %d)", __FILE__, __LINE__);  }  vector x(nn), y(nn), z(nn);  Gtm->give_node_coord3d (x, y, z, eid);  l = sqrt(sqr(x[1]-x[0]) + sqr(y[1]-y[0]) + sqr(z[1]-z[0]));  return l;}/**   function returns area of the appropriate element   @param eid - element id   19.7.2001*/double mechtop::give_area (long eid){  long nn = give_nne(eid);  double a = 0.0;  if (nn < 2)  {    fprintf(stderr, "\n\nInvalid number of node on element is detected");    fprintf(stderr, "\n function give_area(), (file %s, line %d)", __FILE__, __LINE__);  }  vector x(nn), y(nn), z(nn);  Gtm->give_node_coord3d (x, y, z, eid);  switch (Mt->give_elem_type(eid))  {    case planeelementlt:    case planeelementqt:    case planeelementrotlt:      a = ((x[1]-x[0])*(y[2]-y[0])-(x[2]-x[0])*(y[1]-y[0]))/2.0;      break;    case planeelementlq:    case planeelementqq:    case planeelementrotlq:      a = ((x[1]-x[0])*(y[2]-y[0])-(x[2]-x[0])*(y[1]-y[0]) + (x[2]-x[0])*(y[3]-y[0])-(x[3]-x[0])*(y[2]-y[0]) ) / 2.0;      break;    case cctel:    case dktel:    case dstel:      a = ((x[1]-x[0])*(y[2]-y[0])-(x[2]-x[0])*(y[1]-y[0]))/2.0;      break;    case q4plateel:      a = ((x[1]-x[0])*(y[2]-y[0])-(x[2]-x[0])*(y[1]-y[0]) + (x[2]-x[0])*(y[3]-y[0])-(x[3]-x[0])*(y[2]-y[0]) ) / 2.0;      break;    default :      fprintf(stderr, "\n\nInvalide element type is required in function give_area (file %s, line %d).\n ", __FILE__, __LINE__);  }  return a;}/**   function returns volume of the appropriate element   @param eid - element id   19.7.2001*/double mechtop::give_volume (long eid){  long nn = give_nne(eid);  double v = 0.0;  if (nn < 2)  {    fprintf(stderr, "\n\n Invalid number of node on element is detected function give_volume (file %s, line %d).\n", __FILE__, __LINE__);  }  vector x(nn), y(nn), z(nn);  Gtm->give_node_coord3d (x, y, z, eid);  switch (Mt->give_elem_type(eid))  {    case lineartet:    case linearhex:    case quadrhex:      jac_3d (v, x, y, z, 0.0, 0.0, 0.0);      break;    default :      fprintf(stderr, "\n\n Invalide element type is required in function give_volume (file %s, line %d).\n", __FILE__, __LINE__);  }  return v;}/**   function returns maximum number of components of strain/stress array at nodes via    parameter max_ncompstrn and maximum number of components of strain/stress array on    elements via parameter max_ncompstre      @param max_ncompstrn - maximum number of components of strain/stress array at nodes   @param max_ncompstre - maximum number of components of strain/stress array on elements*/void mechtop::give_maxncompstr (long &max_ncompstrn, long &max_ncompstre){  long i;  max_ncompstrn = max_ncompstre = 0;  for (i=0;i<ne;i++)  {    if (max_ncompstre < Mm->ip[elements[i].ipp[0][0]].ncompstr)      max_ncompstre = Mm->ip[elements[i].ipp[0][0]].ncompstr;  }        for (i=0;i<nn;i++)  {    if (max_ncompstrn < nodes[i].ncompstr)      max_ncompstrn = nodes[i].ncompstr;  }      }/**   function returns maximum number of components of other array at nodes via    parameter max_nncompo and maximum number of components of eqother array on    elements via parameter max_encompo      @param max_encompo - maximum number of components of other array at nodes   @param max_nncompo - maximum number of components of eqother array on elements*/void mechtop::give_maxncompo (long &max_nncompo, long &max_encompo){  long i;  max_nncompo = max_encompo = 0;  for (i=0;i<ne;i++)  {    if (max_encompo < Mm->ip[elements[i].ipp[0][0]].ncompeqother)      max_encompo = Mm->ip[elements[i].ipp[0][0]].ncompeqother;  }        for (i=0;i<nn;i++)  {    if (max_nncompo < nodes[i].ncompother)      max_nncompo = nodes[i].ncompother;  }      }/**   function returns number of local coordinate systems on element      @param nod - array containing node numbers*/long mechtop::locsystems (ivector &nod){  long i,j,n;  n=nod.n;  j=0;  for (i=0;i<n;i++){    j+=nodes[nod[i]].transf;  }  return j;}/**   function alocates array containing reactions*/void mechtop::comreacnod (void){  long i,j,ndofn;    for (i=0;i<nn;i++){    ndofn = Gtm->give_ndofn (i);    for (j=0;j<ndofn;j++){      if (Gtm->give_dof (i,j)<1){	nodes[i].react=1;	if (nodes[i].r==NULL)	  nodes[i].r = new double [ndofn];	memset (nodes[i].r,0,ndofn*sizeof(double));	break;      }    }  }}/**   function marks elements necessary for reaction evaluation*/void mechtop::comreacelem (void){  long i,j,k,nne;  ivector nod;    for (i=0;i<ne;i++){    if (Gtm->leso[i]==1){      nne=Gtm->give_nne (i);      allocv (nne,nod);      Gtm->give_nodes (i,nod);      for (j=0;j<nne;j++){	k=nod[j];	if (nodes[k].react==1){	  elements[i].react=1;	  break;	}

⌨️ 快捷键说明

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