📄 q4plate.cpp
字号:
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 + -