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

📄 plelemqq.cpp

📁 Finite element program for mechanical problem. It can solve various problem in solid problem
💻 CPP
📖 第 1 页 / 共 3 页
字号:
    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 planeelemqq::strains (file %s, line %d).\n",__FILE__,__LINE__);  }  }  }/**   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 planeelemqq::nodipnum (long eid,long ri,long ci,ivector &ipnum){  long i,j;    j=intordsm[0][0];  i=Mt->elements[eid].ipp[ri][ci];  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 stresses at integration points      */void planeelemqq::res_ip_stresses (long lcid,long eid){  //mainip_stresses (lcid,eid,0,0);}/**   function computes stresses in integration points of element      @param eid - element id   @param ri - row index   @param ci - column index      10.5.2002*/void planeelemqq::ip_stresses (long lcid,long eid,long ri,long ci){  /*  long i,j,jj,ipp;  double xi,eta;  vector gp,w,eps,epst,epstt,sig,auxsig;  matrix d(tncomp,tncomp);  long ii=0;  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);		Mm->givestrain (lcid,ipp,cncomp[jj],ncomp[jj],eps);		dmatblock (ii,jj,d,dd);	mxv (dd,eps,auxsig);	addv (auxsig,sig,sig);	destrm (dd);  destrv (eps);      }            Mm->storestress (lcid,ipp,cncomp[ii],ncomp[ii],sig);            ipp++;    }  }    destrv (w);  destrv (gp);  destrv (auxsig);  destrv (sig);  */}/**   function computes stresses at nodes of element   @param lcid - load case id   @param eid - element id   @param ri,ci - row and column indices      10.5.2002*/void planeelemqq::nod_stresses_ip (long lcid,long eid,long ri,long ci){  long i,j;  ivector ipnum(nne),nod(nne);  vector sig(tncomp);    //  numbers of integration points closest to nodes  nodipnum (eid,ri,ci,ipnum);    //  node numbers of the element  Mt->give_elemnodes (eid,nod);    for (i=0;i<nne;i++){    //  stresses at the closest integration point    Mm->givestress (lcid,ipnum[i],sig);        //  storage of stresses to the node    j=nod[i];    Mt->nodes[j].storestress (lcid,0,sig);  }  }void planeelemqq::stresses (long lcid,long eid,long ri,long ci){  vector coord,sig;    switch (Mm->stre.tape[eid]){  case nowhere:{    break;  }  case intpts:{    //allip_stresses (stre,lcid,eid,ri,ci);    break;  }  case enodes:{    nod_stresses_ip (lcid,eid,ri,ci);    break;  }  case userdefined:{    /*    //  number of auxiliary element points    naep = Mm->stre.give_naep (eid);    ncp = Mm->stre.give_ncomp (eid);    sid = Mm->stre.give_sid (eid);    allocv (ncp,sig);    allocv (2,coord);    for (i=0;i<naep;i++){      Mm->stre.give_aepcoord (sid,i,coord);            if (Mp->stressaver==0)	appval (coord[0],coord[1],0,ncp,sig,stre);      if (Mp->stressaver==1)	appstress (lcid,eid,coord[0],coord[1],0,ncp,sig);            Mm->stre.storevalues(lcid,eid,i,sig);    }    destrv (sig);    destrv (coord);    */    break;  }  default:{    fprintf (stderr,"\n\n unknown stress point is required in function planeelemlq::stresses (%s, line %d).\n",__FILE__,__LINE__);  }  }}/**   function computes other values in nodes of element   @param lcid - load case id   @param eid - element id      10.5.2002*/void planeelemqq::nod_eqother_ip (long lcid,long eid,long ri,long ci){  long i,j,ncompo;  ivector ipnum(nne),nod(nne);  vector eqother;    //  numbers of integration points closest to nodes  nodipnum (eid,ri,ci,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);        ncompo = Mm->givencompeqother (ipnum[i],0);    allocv (ncompo,eqother);    Mm->giveeqother (ipnum[i],0,ncompo,eqother.a);        //  storage of strains to the node    j=nod[i];    Mt->nodes[j].storeother (lcid,0,ncompo,eqother);        destrv (eqother);  }}/**   function computes correct stresses at integration points on element   @param lcid - number of load case   @param eid - element id   @param ri,ci - row and column indices      JK, 27.11.2006*/void planeelemqq::compute_nlstress (long lcid,long eid,long ri,long ci){  long i,j,ipp;    ipp=Mt->elements[eid].ipp[ri][ci];    for (i=0;i<intordsm[0][0];i++){    for (j=0;j<intordsm[0][0];j++){            //  computation of correct stresses      if (Mp->strcomp==1)	Mm->computenlstresses (ipp);            ipp++;    }  }}/**   function computes nonlocal correct stresses at integration points on element      @param lcid - number of load case   @param eid - element id   @param ri,ci - row and column indices      JK, 27.11.2006*/void planeelemqq::compute_nonloc_nlstress (long lcid,long eid,long ri,long ci){  long i,j,ipp;    ipp=Mt->elements[eid].ipp[ri][ci];    for (i=0;i<intordsm[0][0];i++){    for (j=0;j<intordsm[0][0];j++){            //  computation of correct stresses      if (Mp->strcomp==1)	Mm->compnonloc_nlstresses (ipp);            ipp++;    }  }}/**   function computes nonlocal correct stresses at integration points on element      @param lcid - number of load case   @param eid - element id   @param ri,ci - row and column indices      JK, 27.11.2006*/void planeelemqq::compute_eigstress (long lcid,long eid,long ri,long ci){  long i,j,ipp;  vector eigstr(tncomp),sig(tncomp);  matrix d(tncomp,tncomp);    ipp=Mt->elements[eid].ipp[ri][ci];    for (i=0;i<intordsm[0][0];i++){    for (j=0;j<intordsm[0][0];j++){            Mm->giveeigstrain (ipp,eigstr);            //  matrix of stiffness of the material      Mm->matstiff (d,ipp);            mxv (d,eigstr,sig);            Mm->storeeigstress (ipp,sig);            ipp++;    }  }}/**   function integrates selected quantity over the finite element   it results in nodal values      @param iq - type of integrated quantity (see alias.h)   @param lcid - number of load case   @param eid - element id   @param ri,ci - row and column indices   @param nv - nodal values   @param x,y - node coordinates      JK, 27.11.2006*/void planeelemqq::elem_integration (integratedquant iq,long lcid,long eid,long ri,long ci,vector &nv,vector &x,vector &y){  long i,j,ipp;  double xi,eta,jac,thick;  ivector nodes(nne);  vector w,gp,t(nne),ipv(tncomp),contr(ndofe);  matrix gm(tncomp,ndofe);    Mc->give_thickness (eid,nodes,t);    fillv (0.0,nv);    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];      thick = approx (xi,eta,t);                  switch (iq){      case locstress:{	//  stress reading from integration point	Mm->givestress (lcid,ipp,ipv);	break;      }      case nonlocstress:{	//  stress reading from integration point	Mm->givestress (lcid,ipp,ipv);	break;      }      case eigstress:{	//  eigenstress reading from integration point	Mm->giveeigstress (ipp,ipv);	break;      }      default:{	fprintf (stderr,"\n\n unknown type of quantity is required in function plelemqq::elem_integration (file %s, line %d).\n",__FILE__,__LINE__);      }      }                  //  strain-displacement (geometric) matrix      geom_matrix (gm,x,y,xi,eta,jac);            //  contribution to the nodal values      mtxv (gm,ipv,contr);            cmulv (jac*w[i]*w[j]*thick,contr);            //  summation      addv(contr,nv,nv);            ipp++;    }  }  destrv (w);  destrv (gp);}/**   function computes nodal forces caused by eigenstrains   eigenstrain expresses e.g. temperature strains      @param lcid - load case id   @param eid - element id   @param nfor - array containing nodal forces      30.11.2002, JK*/void planeelemqq::res_eigstrain_forces (long lcid,long eid,vector &nfor){  long transf;  ivector nodes (nne);  vector v(ndofe),x(nne),y(nne);    Mt->give_node_coord2d (x,y,eid);    eigstrain_forces (lcid,eid,0,0,nfor,x,y);    //  transformation of nodal forces  //  (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);    //globloctransf (nfor,v,tmat);    glvectortransf (nfor,v,tmat);    copyv (v,nfor);  }}/**   function computes nodal forces caused by eigenstrains   eigenstrain expresses e.g. temperature strains      this function is used in plane stress/strain elements (function is called   by function res_eigstrain_forces) and shell elements   @param lcid - load case id   @param eid - element id   @param ri,ci - row and column indices   @param nfor - array containing nodal forces   @param x,y - nodal coordinates      30.11.2002, JK*/void planeelemqq::eigstrain_forces (long lcid,long eid,long ri,long ci,vector &nfor,vector &x,vector &y){  integratedquant iq;  iq=eigstress;    //  computation of eigenstresses  compute_eigstress (lcid,eid,ri,ci);    //  integration of stresses over the element  elem_integration (iq,lcid,eid,ri,ci,nfor,x,y);}  /**   function computes internal forces      this function is used in plane stress/strain elements (function is called   by function res_internal_forces) and shell elements   @param lcid - number of load case   @param eid - element id   @param ri,ci - row and column indices   @param ifor - vector of internal forces   @param x,y - node coordinates      25.8.2001, JK modified 23.11.2006*/void planeelemqq::internal_forces (long lcid,long eid,long ri,long ci,vector &ifor,vector &x,vector &y){  integratedquant iq;  iq=locstress;    //  computation of stresses  compute_nlstress (lcid,eid,ri,ci);    //  integration of stresses over the element  elem_integration (iq,lcid,eid,ri,ci,ifor,x,y);}/**   function computes internal forces      @param lcid - load case id   @param eid - element id   @param ifor - internal forces      JK, modified 23.11.2006*/void planeelemqq::res_internal_forces (long lcid,long eid,vector &ifor){  long transf;  ivector nodes (nne);  vector v(ndofe),x(nne),y(nne);    Mt->give_node_coord2d (x,y,eid);    internal_forces (lcid,eid,0,0,ifor,x,y);    //  transformation of nodal forces  //  (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);    //globloctransf (ifor,v,tmat);    glvectortransf (ifor,v,tmat);    copyv (v,ifor);  }}/**   function returns coordinates of integration points      @param eid - element id   @param ipp - integration point pointer   @param ri,ci - row and column indices   @param coord - vector of coordinates   10.1.2002*/void planeelemqq::ipcoord (long eid,long ipp,long ri,long ci,vector &coord){  long i,j,ii;  double xi,eta;  vector x(nne),y(nne),w(intordsm[ri][ci]),gp(intordsm[ri][ci]);    gauss_points (gp.a,w.a,intordsm[ri][ci]);  Mt->give_node_coord2d (x,y,eid);  ii=Mt->elements[eid].ipp[ri][ci];    for (i=0;i<intordsm[ri][ci];i++){    xi=gp[i];    for (j=0;j<intordsm[ri][ci];j++){      eta=gp[j];      if (ii==ipp){	coord[0]=approx (xi,eta,x);	coord[1]=approx (xi,eta,y);	coord[2]=0.0;      }      ii++;    }  }}/**   function assembles coordinates of integration points in block [ri][ci]      @param eid - element id   @param ri - row index   @param ci - column index   @param ipcoord - array containing coordinates of integration points      8.5.2002*/void planeelemqq::ipcoordblock (long eid,long ri,long ci,double **coord){  long i,j,k;  double xi,eta;  vector x(nne),y(nne),w(intordsm[ri][ci]),gp(intordsm[ri][ci]);    gauss_points (gp.a,w.a,intordsm[ri][ci]);  Mt->give_node_coord2d (x,y,eid);    k=0;  for (i=0;i<intordsm[ri][ci];i++){    xi=gp[i];    for (j=0;j<intordsm[ri][ci];j++){      eta=gp[j];            coord[k][0]=approx (xi,eta,x);

⌨️ 快捷键说明

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