📄 lintet.cpp
字号:
#include <stdlib.h>#include <math.h>#include "lintet.h"#include "gadaptivity.h"#include "global.h"#include "globmat.h"#include "genfile.h"#include "intpoints.h"#include "node.h"#include "element.h"#include "loadcase.h"lintet::lintet (void){ long i,j; // number nodes on element nne=4; // number of DOFs on element ndofe=12; // number of strain/stress components tncomp=6; // number of functions approximated napfun=3; // order of numerical integration of mass matrix intordmm=1; // number of edges on element ned=6; // number of nodes on one edge nned=2; nsurf=4; nnsurf=3; // order of numerical integration on element edges (boundaries) intordb=3; ssst=spacestress; // number of blocks (parts of geometric matrix) nb=1; ncomp = new long [nb]; ncomp[0]=6; cncomp = new long [nb]; cncomp[0]=0; nip = new long* [nb]; intordsm = new long* [nb]; for (i=0;i<nb;i++){ nip[i] = new long [nb]; intordsm[i] = new long [nb]; } nip[0][0]=1; tnip=0; for (i=0;i<nb;i++){ for (j=0;j<nb;j++){ tnip+=nip[i][j]; } } intordsm[0][0]=1;}lintet::~lintet (void){ long i; for (i=0;i<nb;i++){ delete [] nip[i]; delete [] intordsm[i]; } delete [] nip; delete [] intordsm; delete [] cncomp; delete [] ncomp;}void lintet::eleminit (long eid){ long ii,jj; Mt->elements[eid].nb=nb; Mt->elements[eid].intordsm = new long* [nb]; Mt->elements[eid].nip = new long* [nb]; for (ii=0;ii<nb;ii++){ Mt->elements[eid].intordsm[ii] = new long [nb]; Mt->elements[eid].nip[ii] = new long [nb]; for (jj=0;jj<nb;jj++){ Mt->elements[eid].intordsm[ii][jj]=intordsm[ii][jj]; Mt->elements[eid].nip[ii][jj]=nip[ii][jj]; } }}/** function approximates function defined by nodal values @param volcoord - volume coordinates @param nodval - nodal values 20.8.2001*/double lintet::approx (vector &volcoord,vector &nodval){ double f; scprd (volcoord,nodval,f); return f;}/** function approximates function defined by nodal values @param volcoord - volume coordinates @param nodval - nodal values 20.8.2001*/double lintet::approx_nat (double xi,double eta,double zeta,vector &nodval){ double f; vector volcoord(4); volcoord[0]=xi; volcoord[1]=eta; volcoord[2]=zeta; volcoord[3]=1.0-volcoord[0]-volcoord[1]-volcoord[2]; scprd (volcoord,nodval,f); return f;}/** function assembles matrix of base functions @param n - matrix of base functions @param volcoord - volume coordinates 24.8.2001*/void lintet::bf_matrix (matrix &n,vector &volcoord){ fillm (0.0,n); n[0][0]=volcoord[0]; n[0][3]=volcoord[1]; n[0][6]=volcoord[2]; n[0][9] =volcoord[3]; n[1][1]=volcoord[0]; n[1][4]=volcoord[1]; n[1][7]=volcoord[2]; n[1][10]=volcoord[3]; n[2][2]=volcoord[0]; n[2][5]=volcoord[1]; n[2][8]=volcoord[2]; n[2][11]=volcoord[3];}void lintet::bf_matrix (matrix &n,double xi,double eta,double zeta){ fillm (0.0,n); n[0][0]=xi; n[0][3]=eta; n[0][6]=zeta; n[0][9] =1.0-xi-eta-zeta; n[1][1]=xi; n[1][4]=eta; n[1][7]=zeta; n[1][10]=1.0-xi-eta-zeta; n[2][2]=xi; n[2][5]=eta; n[2][8]=zeta; n[2][11]=1.0-xi-eta-zeta;}/** function assembles geometric matrix vector of strains has following ordering eps=(e_xx, e_yy, e_zz, e_yz, e_zx, e_xy) @param gm - geometric matrix @param x,y,z - vectors of node coordinates 24.8.2001*/void lintet::geom_matrix (matrix &gm,vector &x,vector &y,vector &z){ long i,i1,i2,i3,i4,i5,i6,i7,i8,i9; double det; vector b(4),c(4),d(4); det = det3d (x.a,y.a,z.a); volb_3d (b.a,y.a,z.a,det); volc_3d (c.a,x.a,z.a,det); vold_3d (d.a,x.a,y.a,det); i1=0; i2=1; i3=2; i4=1; i5=2; i6=0; i7=2; i8=0; i9=1; for (i=0;i<4;i++){ gm[0][i1]=b[i]; i1+=3; gm[1][i2]=c[i]; i2+=3; gm[2][i3]=d[i]; i3+=3; gm[3][i4]=d[i]; i4+=3; gm[3][i5]=c[i]; i5+=3; gm[4][i6]=d[i]; i6+=3; gm[4][i7]=b[i]; i7+=3; gm[5][i8]=c[i]; i8+=3; gm[5][i9]=b[i]; i9+=3; } }/** function assembles transformation matrix @param nodes - nodes of element @param tmat - transformation matrix */void lintet::transf_matrix (ivector &nodes,matrix &tmat){ long i,n,m; fillm (0.0,tmat); n=nodes.n; m=tmat.m; for (i=0;i<m;i++){ tmat[i][i]=1.0; } for (i=0;i<n;i++){ if (Mt->nodes[nodes[i]].transf>0){ tmat[i*3+0][i*3]=Mt->nodes[nodes[i]].e1[0]; tmat[i*3+1][i*3]=Mt->nodes[nodes[i]].e1[1]; tmat[i*3+2][i*3]=Mt->nodes[nodes[i]].e1[2]; tmat[i*3+0][i*3+1]=Mt->nodes[nodes[i]].e2[0]; tmat[i*3+1][i*3+1]=Mt->nodes[nodes[i]].e2[1]; tmat[i*3+2][i*3+1]=Mt->nodes[nodes[i]].e2[2]; tmat[i*3+0][i*3+2]=Mt->nodes[nodes[i]].e3[0]; tmat[i*3+1][i*3+2]=Mt->nodes[nodes[i]].e3[1]; tmat[i*3+2][i*3+2]=Mt->nodes[nodes[i]].e3[2]; } }}/** function computes stiffness matrix of one element @param eid - number of element @param ri,ci - row and column indices @param sm - stiffness matrix 19.7.2001*/void lintet::stiffness_matrix (long eid,long ri,long ci,matrix &sm){ long ipp; double det,jac; vector x(nne),y(nne),z(nne); matrix gm(tncomp,ndofe),d(tncomp,tncomp); Mt->give_node_coord3d (x,y,z,eid); fillm (0.0,sm); det = det3d (x.a,y.a,z.a); ipp=Mt->elements[eid].ipp[ri][ci]; geom_matrix (gm,x,y,z); Mm->matstiff (d,ipp); jac=fabs(det)/6.0; //jac=det/6.0; if (jac<0.0) fprintf (stdout,"\n zaporny jakobian"); //jac=det/6.0; bdbjac (sm,gm,d,gm,jac);}/** function assembles resulting stiffness matrix of the element @param eid - element id @param sm - stiffness matrix JK, 9.5.2002*/void lintet::res_stiffness_matrix (long eid,matrix &sm){ stiffness_matrix (eid,0,0,sm);}/** function computes mass matrix @param eid - number of element @param mm - mass matrix 26.8.2001*/void lintet::mass_matrix (long eid,matrix &mm){ long i; double det,jac,rho; ivector nodes (nne); vector x(nne),y(nne),z(nne),w(intordmm),gp1(intordmm),gp2(intordmm),gp3(intordmm),volcoord(4),dens(nne); matrix n(napfun,ndofe); Mt->give_elemnodes (eid,nodes); Mc->give_density (eid,nodes,dens); Mt->give_node_coord3d (x,y,z,eid); gauss_points_tet (gp1.a,gp2.a,gp3.a,w.a,intordmm); det = det3d (x.a,y.a,z.a); fillm (0.0,mm); for (i=0;i<intordmm;i++){ volcoord[0]=gp1[i]; volcoord[1]=gp2[i]; volcoord[2]=gp3[i]; volcoord[3]=1.0-gp1[i]-gp2[i]-gp3[i]; bf_matrix (n,volcoord); rho = approx (volcoord,dens); jac=det*w[i]*rho; nnj (mm.a,n.a,jac,n.m,n.n); } }/** function computes load matrix @param eid - number of element @param lm - load matrix 26.8.2001*/void lintet::load_matrix (long eid,matrix &lm){ long i; double det,jac; ivector nodes (nne); vector x(nne),y(nne),z(nne),w(intordmm),gp1(intordmm),gp2(intordmm),gp3(intordmm),volcoord(4); matrix n(napfun,ndofe); Mt->give_elemnodes (eid,nodes); Mt->give_node_coord3d (x,y,z,eid); gauss_points_tet (gp1.a,gp2.a,gp3.a,w.a,intordmm); det = det3d (x.a,y.a,z.a); fillm (0.0,lm); for (i=0;i<intordmm;i++){ volcoord[0]=gp1[i]; volcoord[1]=gp2[i]; volcoord[2]=gp3[i]; volcoord[3]=1.0-gp1[i]-gp2[i]-gp3[i]; bf_matrix (n,volcoord); jac=det*w[i]; nnj (lm.a,n.a,jac,n.m,n.n); }}void lintet::res_mainip_strains (long lcid,long eid){ mainip_strains (lcid,eid,0,0);}/** function computes strains in main integration points of element @param lcid - load case id @param eid - element id @param ri - row index @param ci - column index 10.5.2002*/void lintet::mainip_strains (long lcid,long eid,long ri,long ci){ long ipp; vector x(nne),y(nne),z(nne),r(ndofe),eps(tncomp),aux; ivector nodes(nne),cn(ndofe); matrix gm(tncomp,ndofe),tmat; Mt->give_elemnodes (eid,nodes); Mt->give_node_coord3d (x,y,z,eid); Mt->give_code_numbers (eid,cn.a); eldispl (lcid,eid,r.a,cn.a,ndofe); // transformation of displacement vector long transf = Mt->locsystems (nodes); if (transf>0){ allocv (ndofe,aux); allocm (ndofe,ndofe,tmat); transf_matrix (nodes,tmat); //locglobtransf (aux,r,tmat); lgvectortransf (aux,r,tmat); copyv (aux,r); destrv (aux); destrm (tmat); } ipp=Mt->elements[eid].ipp[ri][ci]; geom_matrix (gm,x,y,z); mxv (gm,r,eps); Mm->storestrain (lcid,ipp,eps); }/** function computes strains in nodes of element @param lcid - load case id @param eid - element id 10.5.2002*/void lintet::nod_strains (long lcid,long eid,long ri,long ci){ long ipp; double *lsm,*lhs,*rhs; vector nxi(nne),neta(nne),nzeta(nne),eps(tncomp),natcoord(3); ivector nodes(nne); lsm = new double [16]; nodecoord (nxi,neta,nzeta); Mt->give_elemnodes (eid,nodes); lhs = new double [ncomp[0]*4]; rhs = new double [ncomp[0]*4]; nullv (lsm,16); nullv (lhs,ncomp[0]*4); nullv (rhs,ncomp[0]*4); ipp=Mt->elements[eid].ipp[ri][ci]; Mm->givestrain (lcid,ipp,cncomp[0],ncomp[0],eps); natcoord[0]=0.25; natcoord[1]=0.25; natcoord[2]=0.25; matassem_lsm (lsm,natcoord); rhsassem_lsm (rhs,natcoord,eps); solve_lsm (lsm,lhs,rhs,Mp->zero,4,ncomp[0]); Mt->strain_nodal_values (nodes,nxi,neta,nzeta,lhs,3,cncomp[0],ncomp[0],lcid); /* lhs[0]=eps[0]; lhs[2]=eps[1]; lhs[4]=eps[2]; lhs[6]=eps[3]; lhs[8]=eps[4]; lhs[10]=eps[5]; Mt->strain_nodal_values (nodes,nxi,neta,nzeta,lhs,3,ncomp[0],ncomp[0],lcid); */ delete [] lsm; delete [] lhs; delete [] rhs;}/** function computes strains on element @param val - array containing strains on element @param lcid - load case id @param eid - element id 15.7.2002*/void lintet::elem_strains (double **stra,long lcid,long eid,long ri,long ci){ long i,ii,ipp; double xi,eta,zeta,*lsm,*lhs,*rhs; vector nxi(nne),neta(nne),nzeta(nne),gp1,gp2,gp3,w,eps,natcoord(3); lsm = new double [16]; nodecoord (nxi,neta,nzeta); for (ii=0;ii<nb;ii++){ allocv (intordsm[ii][ii],gp1); allocv (intordsm[ii][ii],gp2); allocv (intordsm[ii][ii],gp3); allocv (intordsm[ii][ii],w); allocv (ncomp[ii],eps); lhs = new double [ncomp[ii]*4]; rhs = new double [ncomp[ii]*4]; gauss_points_tet (gp1.a,gp2.a,gp3.a,w.a,intordsm[ii][ii]); nullv (lsm,16); nullv (rhs,ncomp[ii]*4); ipp=Mt->elements[eid].ipp[ri+ii][ci+ii]; for (i=0;i<intordsm[ii][ii];i++){ xi=gp1[i]; eta=gp2[i]; zeta=gp3[i]; Mm->givestrain (lcid,ipp,cncomp[ii],ncomp[ii],eps); natcoord[0]=xi; natcoord[1]=eta; natcoord[2]=zeta; matassem_lsm (lsm,natcoord); rhsassem_lsm (rhs,natcoord,eps); ipp++; } solve_lsm (lsm,lhs,rhs,Mp->zero,4,ncomp[ii]); nodal_values (stra,nxi,neta,nzeta,lhs,3,cncomp[ii],ncomp[ii]); delete [] lhs; delete [] rhs; destrv (eps); destrv (w); destrv (gp1); destrv (gp2); destrv (gp3); } delete [] lsm;}/** function computes strains in arbitrary point on element @param lcid - load case id @param eid - element id @param volcoord - area coordinates of the point @param fi,li - first and last indices @param eps - array containing strains 11.5.2002*/void lintet::appstrain (long lcid,long eid,double xi,double eta,double zeta,long fi,long ncomp,vector &eps){ long i,j,k; ivector nodes(nne); vector nodval(nne),volcoord(4); if (ncomp != eps.n){ fprintf (stderr,"\n\n wrong interval of indices in function strain (%s, line %d).\n",__FILE__,__LINE__); abort (); } volcoord[0]=xi; volcoord[1]=eta; volcoord[2]=zeta; volcoord[3]=1.0-volcoord[0]-volcoord[1]-volcoord[2]; Mt->give_elemnodes (eid,nodes); k=0; for (i=fi;i<fi+ncomp;i++){ for (j=0;j<nne;j++){ nodval[j]=Mt->nodes[nodes[j]].strain[lcid*tncomp+i]; } eps[k]=approx (volcoord,nodval); k++; }}/** function computes strains in all integration points @param lcid - load case id @param eid - element id @param ri,ci - row and column indices 10.5.2002*/void lintet::allip_strains (double **stra,long lcid,long eid,long ri,long ci){ long ipp; double xi,eta,zeta; vector eps(tncomp); xi=0.25; eta=0.25; zeta=0.25; ipp=Mt->elements[eid].ipp[ri][ci]; if (Mp->strainaver==0) appval (xi,eta,zeta,0,tncomp,eps,stra); if (Mp->strainaver==1) appstrain (lcid,eid,xi,eta,zeta,0,tncomp,eps); Mm->storestrain (lcid,ipp,eps);}void lintet::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 (3,coord); for (i=0;i<naep;i++){ Mm->stra.give_aepcoord (sid,i,coord); if (Mp->strainaver==0) appval (coord[0],coord[1],coord[2],0,ncp,eps,stra); if (Mp->strainaver==1) appstrain (lcid,eid,coord[0],coord[1],coord[2],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 planeelemlt::strains (%s, line %d).\n",__FILE__,__LINE__); } }}/** function assembles natural coordinates of nodes of element @param xi - array containing natural coordinates xi
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -