📄 linhex.cpp
字号:
@param lcid - number of load case @param eid - element id @param ri,ci - row and column indices JK, 27.11.2006*/void linhex::compute_eigstress (long lcid,long eid,long ri,long ci){ long i,j,k,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++){ for (k=0;k<intordsm[0][0];k++){ 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 JK, 27.11.2006*/void linhex::elem_integration (integratedquant iq,long lcid,long eid,long ri,long ci,vector &nv){ long i,j,k,ipp; double xi,eta,zeta,jac; vector x(nne),y(nne),z(nne),w,gp,ipv(tncomp),contr(ndofe); matrix gm(tncomp,ndofe); Mt->give_node_coord3d (x,y,z,eid); 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]; for (k=0;k<intordsm[0][0];k++){ zeta=gp[k]; 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 linhex::elem_integration (file %s, line %d).\n",__FILE__,__LINE__); } } // strain-displacement (geometric) matrix geom_matrix (gm,x,y,z,xi,eta,zeta,jac); // contribution to the nodal values mtxv (gm,ipv,contr); cmulv (jac*w[i]*w[j]*w[k],contr); // summation addv (contr,nv,nv); ipp++; } } } destrv (w); destrv (gp); }/** function returns coordinates of integration points @param eid - element id @param ipp - integration point pointer @param coord - vector of coordinates 10.1.2002*/void linhex::ipcoord (long eid,long ipp,long ri,long ci,vector &coord){ long i,j,k,ii; double xi,eta,zeta; vector x(nne),y(nne),z(nne),w(intordsm[ri][ci]),gp(intordsm[ri][ci]); gauss_points (gp.a,w.a,intordsm[ri][ci]); Mt->give_node_coord3d (x,y,z,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]; for (k=0;k<intordsm[ri][ci];k++){ zeta=gp[k]; if (ii==ipp){ coord[0]=approx (xi,eta,zeta,x); coord[1]=approx (xi,eta,zeta,y); coord[2]=approx (xi,eta,zeta,z); } ii++; } } }}void linhex::inicipval(long eid, long ri, long ci, matrix &nodval, inictype *ictn){ long i, j, k, l, m, ipp; long ii, jj, nv = nodval.n; long nstra; double xi, eta, zeta, 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]; for (m = 0; m < intordsm[ii][jj]; m++) { zeta=gp[m]; // value in integration point ipval = approx (xi,eta,zeta,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++; }}/** function computes volume appropriate to integration point 2.3.2004, JK*/void linhex::ipvolume (long eid,long ri,long ci){ long i,j,k,ii,jj,ipp; double xi,eta,zeta,jac; vector x(nne),y(nne),z(nne),w,gp; Mt->give_node_coord3d (x,y,z,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); 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++){ xi=gp[i]; for (j=0;j<intordsm[ii][jj];j++){ eta=gp[j]; for (k=0;k<intordsm[ii][jj];k++){ zeta=gp[k]; jac_3d (jac,x,y,z,xi,eta,zeta); jac=fabs(jac); jac*=w[i]*w[j]*w[k]; Mm->storeipvol (ipp,jac); ipp++; } } } destrv (gp); destrv (w); } } }/** function computes nodal forces caused by presure on surface @param eid - element id @param ri,ci - row and column indices @param nfor - vector of presure @param eis - surface id 27.1.2006*/void linhex::node_forces_surf (long lcid,long eid,long *is,double *nv,vector &nf){ long i,j; double xi,eta,zeta,jac; double *tnv; vector x(nne),y(nne),z(nne),gp,w,av(ndofe),v(ndofe); matrix n(napfun,ndofe),an(napfun,ndofe),am(ndofe,ndofe),tran(3,3); tnv = new double [12]; // coordinates of element nodes Mt->give_node_coord3d (x,y,z,eid); allocv (intordb,w); allocv (intordb,gp); gauss_points (gp.a,w.a,intordb); // surface number 1 if (is[0]>0 ){ xi=1.0; for (i=0;i<intordb;i++){ eta=gp[i]; for (j=0;j<intordb;j++){ zeta=gp[j]; jac2d_3d (jac,x,y,z,eta,zeta,0); bf_matrix (n,xi,eta,zeta); jac = jac*w[i]*w[j]; nnj (am.a,n.a,jac,n.m,n.n); } } if (is[0]==1){ av[0] = nv[0*3+0]; av[1] = nv[0*3+1]; av[2] = nv[0*3+2]; av[9] = nv[1*3+0]; av[10] = nv[1*3+1]; av[11] = nv[1*3+2]; av[21] = nv[2*3+0]; av[22] = nv[2*3+1]; av[23] = nv[2*3+2]; av[12] = nv[3*3+0]; av[13] = nv[3*3+1]; av[14] = nv[3*3+2]; } if (is[0]==2){ av[0] = nv[0*3+0]; av[1] = nv[0*3+1]; av[2] = nv[0*3+2]; av[3] = nv[1*3+0]; av[4] = nv[1*3+1]; av[5] = nv[1*3+2]; av[6] = nv[2*3+0]; av[7] = nv[2*3+1]; av[8] = nv[2*3+2]; av[9] = nv[3*3+0]; av[10] = nv[3*3+1]; av[11] = nv[3*3+2]; locglob_nodeval (0,av,tnv,x,y,z); av[0] = tnv[0*3+0]; av[1] = tnv[0*3+1]; av[2] = tnv[0*3+2]; av[9] = tnv[1*3+0]; av[10] = tnv[1*3+1]; av[11] = tnv[1*3+2]; av[21] = tnv[2*3+0]; av[22] = tnv[2*3+1]; av[23] = tnv[2*3+2]; av[12] = tnv[3*3+0]; av[13] = tnv[3*3+1]; av[14] = tnv[3*3+2]; } mxv (am,av,v); addv (v,nf,nf); } // surface number 2 if (is[1]>0 ){ eta=1.0; for (i=0;i<intordb;i++){ xi=gp[i]; for (j=0;j<intordb;j++){ zeta=gp[j]; jac2d_3d (jac,x,y,z,xi,zeta,1); bf_matrix (n,xi,eta,zeta); jac = jac*w[i]*w[j]; nnj (am.a,n.a,jac,n.m,n.n); } } if (is[1]==1){ av[3] = nv[12+0*3+0]; av[4] = nv[12+0*3+1]; av[5] = nv[12+0*3+2]; av[0] = nv[12+1*3+0]; av[1] = nv[12+1*3+1]; av[2] = nv[12+1*3+2]; av[12] = nv[12+2*3+0]; av[13] = nv[12+2*3+1]; av[14] = nv[12+2*3+2]; av[15] = nv[12+3*3+0]; av[16] = nv[12+3*3+1]; av[17] = nv[12+3*3+2]; } if (is[1]==2){ av[0] = nv[12+0*3+0]; av[1] = nv[12+0*3+1]; av[2] = nv[12+0*3+2]; av[3] = nv[12+1*3+0]; av[4] = nv[12+1*3+1]; av[5] = nv[12+1*3+2]; av[6] = nv[12+2*3+0]; av[7] = nv[12+2*3+1]; av[8] = nv[12+2*3+2]; av[9] = nv[12+3*3+0]; av[10] = nv[12+3*3+1]; av[11] = nv[12+3*3+2]; locglob_nodeval (1,av,tnv,x,y,z); av[3] = tnv[0*3+0]; av[4] = tnv[0*3+1]; av[5] = tnv[0*3+2]; av[0] = tnv[1*3+0]; av[1] = tnv[1*3+1]; av[2] = tnv[1*3+2]; av[12] = tnv[2*3+0]; av[13] = tnv[2*3+1]; av[14] = tnv[2*3+2]; av[15] = tnv[3*3+0]; av[16] = tnv[3*3+1]; av[17] = tnv[3*3+2]; } mxv (am,av,v); addv (v,nf,nf); } // surface number 3 if (is[2]>0 ){ xi=-1.0; for (i=0;i<intordb;i++){ eta=gp[i]; for (j=0;j<intordb;j++){ zeta=gp[j]; jac2d_3d (jac,x,y,z,eta,zeta,2); bf_matrix (n,xi,eta,zeta); jac = jac*w[i]*w[j]; nnj (am.a,n.a,jac,n.m,n.n); } } if (is[2]==1){ av[6] = nv[24+0*3+0]; av[7] = nv[24+0*3+1]; av[8] = nv[24+0*3+2]; av[3] = nv[24+1*3+0]; av[4] = nv[24+1*3+1]; av[5] = nv[24+1*3+2]; av[15] = nv[24+2*3+0]; av[16] = nv[24+2*3+1]; av[17] = nv[24+2*3+2]; av[18] = nv[24+3*3+0]; av[19] = nv[24+3*3+1]; av[20] = nv[24+3*3+2]; } if (is[2]==2){ av[0] = nv[24+0*3+0]; av[1] = nv[24+0*3+1]; av[2] = nv[24+0*3+2]; av[3] = nv[24+1*3+0]; av[4] = nv[24+1*3+1]; av[5] = nv[24+1*3+2]; av[6] = nv[24+2*3+0]; av[7] = nv[24+2*3+1]; av[8] = nv[24+2*3+2]; av[9] = nv[24+3*3+0]; av[10] = nv[24+3*3+1]; av[11] = nv[24+3*3+2]; locglob_nodeval (2,av,tnv,x,y,z); av[6] = tnv[0*3+0]; av[7] = tnv[0*3+1]; av[8] = tnv[0*3+2]; av[3] = tnv[1*3+0]; av[4] = tnv[1*3+1]; av[5] = tnv[1*3+2]; av[15] = tnv[2*3+0]; av[16] = tnv[2*3+1]; av[17] = tnv[2*3+2]; av[18] = tnv[3*3+0]; av[19] = tnv[3*3+1]; av[20] = tnv[3*3+2]; } mxv (am,av,v); addv (v,nf,nf); } // surface number 4 if (is[3]>0 ){ eta=-1.0; for (i=0;i<intordb;i++){ xi=gp[i]; for (j=0;j<intordb;j++){ zeta=gp[j]; jac2d_3d (jac,x,y,z,xi,zeta,3); bf_matrix (n,xi,eta,zeta); jac = jac*w[i]*w[j]; nnj (am.a,n.a,jac,n.m,n.n); } } if (is[3]==1){ av[9] = nv[36+0*3+0]; av[10] = nv[36+0*3+1]; av[11] = nv[36+0*3+2]; av[6] = nv[36+1*3+0]; av[7] = nv[36+1*3+1]; av[8] = nv[36+1*3+2]; av[18] = nv[36+2*3+0]; av[19] = nv[36+2*3+1]; av[20] = nv[36+2*3+2]; av[21] = nv[36+3*3+0]; av[22] = nv[36+3*3+1]; av[23] = nv[36+3*3+2]; } if (is[3]==2){ av[0] = nv[36+0*3+0]; av[1] = nv[36+0*3+1]; av[2] = nv[36+0*3+2]; av[3] = nv[36+1*3+0]; av[4] = nv[36+1*3+1]; av[5] = nv[36+1*3+2]; av[6] = nv[36+2*3+0]; av[7] = nv[36+2*3+1]; av[8] = nv[36+2*3+2]; av[9] = nv[36+3*3+0]; av[10] = nv[36+3*3+1]; av[11] = nv[36+3*3+2]; locglob_nodeval (3,av,tnv,x,y,z); av[9] = tnv[0*3+0]; av[10]= tnv[0*3+1]; av[11]= tnv[0*3+2]; av[6] = tnv[1*3+0]; av[7] = tnv[1*3+1]; av[8] = tnv[1*3+2]; av[18] = tnv[2*3+0]; av[19] = tnv[2*3+1]; av[20] = tnv[2*3+2]; av[21] = tnv[3*3+0]; av[22] = tnv[3*3+1]; av[23] = tnv[3*3+2]; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -