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

📄 q4plate.cpp

📁 Finite element program for mechanical problem. It can solve various problem in solid problem
💻 CPP
📖 第 1 页 / 共 2 页
字号:
  atd_matrix (atd,x,y,eid);  fillm (0.0,lm);  for (i=0;i<intordmm;i++){    xi=gp[i];  w1=w[i];    for (j=0;j<intordmm;j++){      eta=gp[j];  w2=w[j];            bf_matrix (n,atd,x,y,gp);            thick = approx (xi,eta,t);            jac=(a+a0*l[0]+a1*l[1])/8.*w[i]*w[j];      jac*=thick;            nnj (lm.a,n.a,jac,n.m,n.n);    }  }  }void q4plate::appval (double xi,double eta,long fi,long nc,vector &eps,double **val){  long i,j,k;  vector nodval;    k=0;  allocv (nne,nodval);  for (i=fi;i<fi+nc;i++){    for (j=0;j<nne;j++){      nodval[j]=val[j][i];    }    eps[k]=approx (xi,eta,nodval);    k++;  }    destrv (nodval);}  /**   function computes strains Q4      @param lcid - load case id   @param eid - element id*/void q4plate::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  //  (in the case of nodal coordinate systems)  long transf = Mt->locsystems (nodes);  if (transf>0){    allocv (ndofe,aux);    allocm (ndofe,ndofe,tmat);    transfmat (nodes,tmat);    //locglobtransf (aux,r,tmat);    lgvectortransf (aux,r,tmat);    copyv (aux,r);    destrv (aux);    destrm (tmat);  }  ip_strains (lcid,eid,0,0,x,y,r);}/**   function computes strains at integration points of element      @param lcid - load case id   @param eid - element id   @param ri - row index   @param ci - column index   @param x,y - %vectors of nodal coordinates   @param r - %vector of nodal displacements   */void q4plate::ip_strains (long lcid,long eid,long ri,long ci,vector &x,vector &y,vector &r){  long i,j,ii,ipp;  double a;  vector gp,w,eps,aux,natcoord(2),l(3);  matrix gm,tmat,atd(16,12);    // translation to center it is necesary for w which in local coord. and no in relation  a=(x[0]+x[1]+x[2]+x[3])/4.;  x[0]=x[0]-a;  x[1]=x[1]-a;  x[2]=x[2]-a;  x[3]=x[3]-a;  a=(y[0]+y[1]+y[2]+y[3])/4.;  y[0]=y[0]-a;  y[1]=y[1]-a;  y[2]=y[2]-a;  y[3]=y[3]-a;  atd_matrix (atd,x,y,eid);    //  fprintf (Out,"\n\n eps,Mainip prvek cislo %ld\n",eid);  for (ii=0;ii<nb;ii++){    if (intordsm[ii][ii]==0)  continue;    allocv (intordsm[ii][ii],w); allocv (intordsm[ii][ii],gp);    allocm (ncomp[ii],ndofe,gm); allocv (ncomp[ii],eps);    ipp=Mt->elements[eid].ipp[ri+ii][ci+ii];         gauss_points (gp.a,w.a,intordsm[ii][ii]);        for (i=0;i<intordsm[ii][ii];i++){      l[0]=gp[i];      for (j=0;j<intordsm[ii][ii];j++){	l[1]=gp[j];	if(ii==0) geom_matrix_bending (gm,atd,x,y,l);	else if(ii==1) geom_matrix_shear (gm,atd,x,y,l);	mxv (gm,r,eps);	Mm->storestrain (lcid,ipp,cncomp[ii],eps);	ipp++;		//          fprintf (Out,"\n");	//		  for (ij=0;ij<ncomp[ii];ij++){	//		    fprintf (Out,"%20.10e",eps[ij]);	//			}      }    }    destrm (gm);  destrv (eps);  destrv (gp);  }  }/**   function assembles strains at nodes of element   strains are obtained from the nearest integration points   @param lcid - load case id   @param eid - element id   @param ri,ci - row and column indices (default value is 0, nonzero values are used in shell elements)   10.5.2002*/void q4plate::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);  }  }void q4plate::strains (long lcid,long eid,long ri,long ci){  long i,naep,ncp,sid;  double **stra;  vector coord,eps;    if (Mp->strainaver==0){    stra = new double* [nne];    for (i=0;i<nne;i++){      stra[i] = new double [tncomp];    }    //elem_strains (stra,lcid,eid,ri,ci);  }    switch (Mm->stra.tape[eid]){  case nowhere:{    break;  }  case intpts:{    //allip_strains (stra,lcid,eid,ri,ci);    break;  }  case enodes:{    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 dstelem::strains (%s, line %d).\n",__FILE__,__LINE__);  }  }  if (Mp->strainaver==0){    for (i=0;i<nne;i++){      delete [] stra[i];    }    delete [] stra;  }}void q4plate::res_ip_stresses (long lcid,long eid){  ip_stresses (lcid,eid,0,0);}void q4plate::ip_stresses (long lcid,long eid,long ri,long ci){  long i,j,ii,ipp;  double xi,eta,thick;  vector gp,w,eps,sig,natcoord(2),t(nne);  ivector nodes(nne);  matrix d(tncomp,tncomp),dd;    Mt->give_elemnodes (eid,nodes);  Mc->give_thickness (eid,nodes,t);    //  fprintf (Out,"\n\n sigma Mainip prvek cislo %ld",eid);    for (ii=0;ii<nb;ii++){       allocv (ncomp[ii],eps);  allocv (ncomp[ii],sig);    allocv (intordsm[ii][ii],gp);    allocv (intordsm[ii][ii],w);    allocm (ncomp[ii],ncomp[ii],dd);    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);	//			if (Mp->strainaver==0)	Mm->givestrain (lcid,ipp,cncomp[ii],eps);	//			if (Mp->strainaver==1)	//				appstrain (lcid,eid,xi,eta,cncomp[ii],ncomp[ii],eps);	thick=approx (xi,eta,t);	dmatblock (dd, d,ii,ii,thick);	mxv (dd,eps,sig);	Mm->storestress (lcid,ipp,cncomp[ii],sig);      	ipp++;    	      }    }        destrv (eps);  destrv (sig);  destrv (w);  destrv (gp);    destrm (dd);  }  }void q4plate::nod_stresses_ip (long lcid,long eid,long ri,long ci){  long i,j,ipp;  ivector ipnum(nne),nod(nne);  vector sig(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++){    //  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 q4plate::stresses (long lcid,long eid,long ri,long ci){  long i,naep,ncp,sid;  double **stra,**stre;  vector coord,sig;    if (Mp->stressaver==0){    stra = new double* [nne];    stre = new double* [nne];    for (i=0;i<nne;i++){      stra[i] = new double [tncomp];      stre[i] = new double [tncomp];    }    //elem_strains (stra,lcid,eid,ri,ci);    //elem_stresses (stra,stre,lcid,eid,ri,ci);  }  switch (Mm->stre.tape[eid]){  case nowhere:{    break;  }  case intpts:{    //allip_stresses (stre,lcid,eid,ri,ci);    break;  }  case enodes:{    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 planeelemrotlq::stresses (%s, line %d).\n",__FILE__,__LINE__);  }  }  if (Mp->stressaver==0){    for (i=0;i<nne;i++){      delete [] stra[i];      delete [] stre[i];    }    delete [] stra;    delete [] stre;  }}void q4plate::res_internal_forces (long lcid,long eid,vector &ifor){//  long transf;  ivector nodes(nne);  vector x(nne),y(nne);  Mt->give_node_coord2d (x,y,eid);  Mt->give_elemnodes (eid,nodes);    internal_forces (lcid,eid,0,0,ifor,x,y);//  glvectortransf3dblock (ifor,tran); From LCS To GCS in shell/*//  transformation of Forces  transf = Mt->locsystems (nodes);  if (transf>0){    matrix tmat (ndofe,ndofe);    transfmat (nodes,tmat);    locglobtransf (ifor,rl,tmat);  }*/}void q4plate::internal_forces (long lcid,long eid,long ri,long ci,vector &ifor,vector &x,vector &y){  long i,j,k,ii,jj,ipp;  double jac,a,a0,a1,thick;  ivector nodes(nne);  vector w,gp,l(2),t(nne),sig,f(ndofe);  matrix gm,atd(16,12);    // translation to center it is necesary for w which in local coord. and no in relation  a=(x[0]+x[1]+x[2]+x[3])/4.;  x[0]=x[0]-a;  x[1]=x[1]-a;  x[2]=x[2]-a;  x[3]=x[3]-a;  a=(y[0]+y[1]+y[2]+y[3])/4.;  y[0]=y[0]-a;  y[1]=y[1]-a;  y[2]=y[2]-a;  y[3]=y[3]-a;  //     jakobian  a = (x[2]-x[0])*(y[3]-y[1])-(y[2]-y[0])*(x[3]-x[1]);  a0=-(x[3]-x[2])*(y[1]-y[0])+(y[3]-y[2])*(x[1]-x[0]);  a1=-(x[2]-x[1])*(y[3]-y[0])+(y[2]-y[1])*(x[3]-x[0]);    atd_matrix (atd,x,y,eid);    Mt->give_elemnodes (eid,nodes);  Mc->give_thickness (eid,nodes,t);    fillv (0.0,ifor);    //  fprintf (Out,"\n\n eps,Sig prvek cislo %ld\n",eid);  for (ii=0;ii<nb;ii++){    for (jj=0;jj<nb;jj++){      if (intordsm[ii][jj]==0)  continue;      allocv (intordsm[ii][jj],w); allocv (intordsm[ii][jj],gp);      allocm (ncomp[jj],ndofe,gm); allocv (ncomp[jj],sig);            gauss_points (gp.a,w.a,intordsm[ii][jj]);      ipp=Mt->elements[eid].ipp[ri+ii][ci+jj];            for (i=0;i<intordsm[ii][jj];i++){	l[0]=gp[i];	for (j=0;j<intordsm[ii][jj];j++){	  l[1]=gp[j];	  	  thick=approx (l[0],l[1],t);	  if(ii==0) {	    geom_matrix_bending (gm,atd,x,y,l);	    jac=(a+a0*l[0]+a1*l[1])/8.*w[i]*w[j]*thick*thick*thick;	  }	  else if(ii==1) {	    geom_matrix_shear (gm,atd,x,y,l);	    jac=(a+a0*l[0]+a1*l[1])/8.*w[i]*w[j]*thick*5.0/6.0;	  }	  	  Mm->computenlstresses (ipp);	  Mm->givestress (lcid,ipp,cncomp[ii],sig);	  	  mtxv (gm,sig,f);	  for (k=0;k<f.n;k++){	    ifor[k]+=f[k]*jac;	    ifor[k]=0.0;                     //nekonsoliduje 	  }		  ipp++;	}      }      destrm (gm);  destrv (w);  destrv (gp);    }    destrv (sig);    }    //  fprintf (Out,"\n\n Fint prvek cislo %ld\n",eid);  // for (k=0;k<ndofe;k++){fprintf (Out," %15.5e",ifor[k]);}  }/**  function computes load vector from area forces fz of the Q4plate  20.3.2002*/void q4plate::areaforces (long eid,double *nv,vector &lm){  long i,j;  double jac,a,a0,a1,w1,w2;  ivector nodes(nne);  vector x(nne),y(nne),l(2),gp(intordmm),w(intordmm);  matrix atd(16,12),n(1,ndofe),mm(ndofe,ndofe);  Mt->give_elemnodes (eid,nodes);  Mt->give_node_coord2d (x,y,eid);// translation to center it is necesary for w which in local coord. and no in relation  a=(x[0]+x[1]+x[2]+x[3])/4.;  x[0]=x[0]-a;  x[1]=x[1]-a;  x[2]=x[2]-a;  x[3]=x[3]-a;  a=(y[0]+y[1]+y[2]+y[3])/4.;  y[0]=y[0]-a;  y[1]=y[1]-a;  y[2]=y[2]-a;  y[3]=y[3]-a;    //     jakobian  a = (x[2]-x[0])*(y[3]-y[1])-(y[2]-y[0])*(x[3]-x[1]);  a0=-(x[3]-x[2])*(y[1]-y[0])+(y[3]-y[2])*(x[1]-x[0]);  a1=-(x[2]-x[1])*(y[3]-y[0])+(y[2]-y[1])*(x[3]-x[0]);    gauss_points (gp.a,w.a,intordmm);  atd_matrix (atd,x,y,eid);    fillv (0.0,lm);    for (i=0;i<intordmm;i++){    for (j=0;j<intordmm;j++){      l[0]=gp[i];  l[1]=gp[j];  w1=w[i];  w2=w[j];      jac=(a+a0*l[0]+a1*l[1])*w1*w2;            bf_matrix (n,atd,x,y,l);            nnj (mm.a,n.a,jac,n.m,n.n);          }  }}void q4plate::inicipval(long eid, long ri, long ci, matrix &nodval, inictype *ictn){  long i, j, k, l, ipp;  long ii, jj, nv = nodval.n;  long nstra;  double xi, eta, ipval;  vector w, gp, anv(nne);  nstra = 0;  for (j = 0; j < nv; j++) // for all initial values  {    for(i = 0; i < nne; i++) // for all nodes on element      anv[i] = nodval[i][j];    for (ii = 0; ii < nb; ii++)    {      for (jj = 0; jj < nb; jj++)      {        ipp=Mt->elements[eid].ipp[ri+ii][ci+jj];        if (intordsm[ii][jj] == 0)          continue;        allocv (intordsm[ii][jj],gp);        allocv (intordsm[ii][jj],w);        gauss_points (gp.a,w.a,intordsm[ii][jj]);        for (k = 0; k < intordsm[ii][jj]; k++)        {          xi=gp[k];          for (l = 0; l < intordsm[ii][jj]; l++)          {            eta=gp[l];            //  value in integration point            ipval = approx (xi,eta,anv);            if ((ictn[i] & inistrain) && (j < Mm->ip[ipp].ncompstr))            {              Mm->ip[ipp].strain[j] += ipval;              ipp++;              continue;            }            if ((ictn[i] & inistress) && (j < nstra + Mm->ip[ipp].ncompstr))            {              Mm->ip[ipp].stress[j] += ipval;              ipp++;              continue;            }            if ((ictn[i] & iniother) && (j < nv))            {              Mm->ip[ipp].other[j] += ipval;              ipp++;              continue;            }            ipp++;          }        }        destrv (gp);  destrv (w);      }    }    if (ictn[i] & inistrain) nstra++;  }}

⌨️ 快捷键说明

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