📄 dkt.cpp
字号:
#include "dkt.h"#include "gadaptivity.h"#include "global.h"#include "globmat.h"#include "genfile.h"#include "node.h"#include "element.h"#include "intpoints.h"#include <stdlib.h>#include <math.h>dktelem::dktelem (void){ long i,j; nne=3; ndofe=9; tncomp=3; napfun=3; ned=3; nned=2; intordmm=3; ssst=plate; nb=1; ncomp = new long [nb]; ncomp[0]=3; 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]=3; tnip=0; for (i=0;i<nb;i++){ for (j=0;j<nb;j++){ tnip+=nip[i][j]; } } intordsm[0][0]=3;}dktelem::~dktelem (void){ long i; for (i=0;i<nb;i++){ delete [] nip[i]; delete [] intordsm[i]; } delete [] nip; delete [] intordsm; delete [] ncomp; delete [] cncomp;}void dktelem::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 assembles matrix of base functions @param gm - geometric matrix @param x,y - array containing node coordinates @param l - areacoordinates 15.3.2002*/void dktelem::geom_matrix (matrix &gm,vector &x,vector &y,vector &l){ double det,dx1,dy1,dx12,dy12,dx31,dy31; vector sx(3),sy(3),q(3),pb(3),pc(3),dl(3); // det is equal to double area of the element det = ((x[1]-x[0])*(y[2]-y[0])-(x[2]-x[0])*(y[1]-y[0])); dl[0] = sqrt((x[1]-x[0])*(x[1]-x[0])+(y[1]-y[0])*(y[1]-y[0])); dl[1] = sqrt((x[2]-x[1])*(x[2]-x[1])+(y[2]-y[1])*(y[2]-y[1])); dl[2] = sqrt((x[0]-x[2])*(x[0]-x[2])+(y[0]-y[2])*(y[0]-y[2])); // der dL(1)/dy . det sx[0]=x[2]-x[1]; sx[1]=x[0]-x[2]; sx[2]=x[1]-x[0]; // der dL(1)/dx . det sy[0]=y[1]-y[2]; sy[1]=y[2]-y[0]; sy[2]=y[0]-y[1]; // dl0= betwen node 1,2 q[0]=dl[0]*dl[0]; q[1]=dl[1]*dl[1]; q[2]=dl[2]*dl[2]; pb[0]=(sy[0]*sy[0]/4.-sx[0]*sx[0]/2.)/q[1]; pb[1]=(sy[1]*sy[1]/4.-sx[1]*sx[1]/2.)/q[2]; pb[2]=(sy[2]*sy[2]/4.-sx[2]*sx[2]/2.)/q[0]; pc[0]=(sx[0]*sx[0]/4.-sy[0]*sy[0]/2.)/q[1]; pc[1]=(sx[1]*sx[1]/4.-sy[1]*sy[1]/2.)/q[2]; pc[2]=(sx[2]*sx[2]/4.-sy[2]*sy[2]/2.)/q[0]; dx1= sy[0]*(l[0]-1./4.)/det; dy1= sx[0]*(l[0]-1./4.)/det; dx12=(sy[0]*l[1]+sy[1]*l[0])/det; dy12=(sx[0]*l[1]+sx[1]*l[0])/det; dx31=(sy[2]*l[0]+sy[0]*l[2])/det; dy31=(sx[2]*l[0]+sx[0]*l[2])/det; gm[0][0]= 6.*(sx[2]/q[0]*dx12-sx[1]/q[2]*dx31); gm[0][1]=-3.*(sx[1]*sy[1]/q[2]*dx31+sx[2]*sy[2]/q[0]*dx12); gm[0][2]= 4.*(dx1-pc[1]*dx31-pc[2]*dx12); gm[1][0]=-6.*(sy[2]/q[0]*dy12-sy[1]/q[2]*dy31); gm[1][1]=-4.*(dy1-pb[1]*dy31-pb[2]*dy12); gm[1][2]= 3.*(sx[1]*sy[1]/q[2]*dy31+sx[2]*sy[2]/q[0]*dy12); gm[2][0]= 6.*(sx[2]/q[0]*dy12-sx[1]/q[2]*dy31 -sy[2]/q[0]*dx12+sy[1]/q[2]*dx31); gm[2][1]=-3.*(sx[1]*sy[1]/q[2]*dy31+sx[2]*sy[2]/q[0]*dy12) -4.*(dx1-pb[1]*dx31-pb[2]*dx12); gm[2][2]= 4.*(dy1-pc[1]*dy31-pc[2]*dy12) +3.*(sx[1]*sy[1]/q[2]*dx31+sx[2]*sy[2]/q[0]*dx12); dx1= sy[1]*(l[1]-1./4.)/det; dy1= sx[1]*(l[1]-1./4.)/det; dx12=(sy[1]*l[2]+sy[2]*l[1])/det; dy12=(sx[1]*l[2]+sx[2]*l[1])/det; dx31=(sy[0]*l[1]+sy[1]*l[0])/det; dy31=(sx[0]*l[1]+sx[1]*l[0])/det; gm[0][3]= 6.*(sx[0]/q[1]*dx12-sx[2]/q[0]*dx31); gm[0][4]=-3.*(sx[2]*sy[2]/q[0]*dx31+sx[0]*sy[0]/q[1]*dx12); gm[0][5]= 4.*(dx1-pc[2]*dx31-pc[0]*dx12); gm[1][3]=-6.*(sy[0]/q[1]*dy12-sy[2]/q[0]*dy31); gm[1][4]=-4.*(dy1-pb[2]*dy31-pb[0]*dy12); gm[1][5]= 3.*(sx[2]*sy[2]/q[0]*dy31+sx[0]*sy[0]/q[1]*dy12); gm[2][3]= 6.*(sx[0]/q[1]*dy12-sx[2]/q[0]*dy31 -sy[0]/q[1]*dx12+sy[2]/q[0]*dx31); gm[2][4]=-3.*(sx[2]*sy[2]/q[0]*dy31+sx[0]*sy[0]/q[1]*dy12) -4.*(dx1-pb[2]*dx31-pb[0]*dx12); gm[2][5]= 4.*(dy1-pc[2]*dy31-pc[0]*dy12) +3.*(sx[2]*sy[2]/q[0]*dx31+sx[0]*sy[0]/q[1]*dx12); dx1= sy[2]*(l[2]-1./4.)/det; dy1= sx[2]*(l[2]-1./4.)/det; dx12=(sy[2]*l[0]+sy[0]*l[2])/det; dy12=(sx[2]*l[0]+sx[0]*l[2])/det; dx31=(sy[1]*l[2]+sy[2]*l[1])/det; dy31=(sx[1]*l[2]+sx[2]*l[1])/det; gm[0][6]= 6.*(sx[1]/q[2]*dx12-sx[0]/q[1]*dx31); gm[0][7]=-3.*(sx[0]*sy[0]/q[1]*dx31+sx[1]*sy[1]/q[2]*dx12); gm[0][8]= 4.*(dx1-pc[0]*dx31-pc[1]*dx12); gm[1][6]=-6.*(sy[1]/q[2]*dy12-sy[0]/q[1]*dy31); gm[1][7]=-4.*(dy1-pb[0]*dy31-pb[1]*dy12); gm[1][8]= 3.*(sx[0]*sy[0]/q[1]*dy31+sx[1]*sy[1]/q[2]*dy12); gm[2][6]= 6.*(sx[1]/q[2]*dy12-sx[0]/q[1]*dy31 -sy[1]/q[2]*dx12+sy[0]/q[1]*dx31); gm[2][7]=-3.*(sx[0]*sy[0]/q[1]*dy31+sx[1]*sy[1]/q[2]*dy12) -4.*(dx1-pb[0]*dx31-pb[1]*dx12); gm[2][8]= 4.*(dy1-pc[0]*dy31-pc[1]*dy12) +3.*(sx[0]*sy[0]/q[1]*dx31+sx[1]*sy[1]/q[2]*dx12); }void dktelem::transf_matrix (ivector &nodes,matrix &tmat){ long i,n,m; 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+1][i*3+1]=Mt->nodes[nodes[i]].e1[0]; tmat[i*3+1][i*3+2]=Mt->nodes[nodes[i]].e2[0]; tmat[i*3+2][i*3+1]=Mt->nodes[nodes[i]].e1[1]; tmat[i*3+2][i*3+2]=Mt->nodes[nodes[i]].e2[1]; } }}/** function extracts components of the shear part of stiffness matrix of the material to the matrix ds 20.3.2002*/void dktelem::dbmat (matrix &d,matrix &db,double t){ double c; c=t*t*t; db[0][0] = c*d[0][0]; db[0][1] = c*d[0][1]; db[0][2] = c*d[0][2]; db[1][0] = c*d[1][0]; db[1][1] = c*d[1][1]; db[1][2] = c*d[1][2]; db[2][0] = c*d[2][0]; db[2][1] = c*d[2][1]; db[2][2] = c*d[2][2];}/** function computes stiffness matrix of dkt element @param eid - element id @param ri,ci - row and column indices @param sm - stiffness matrix 15.3.2002*/void dktelem::stiffness_matrix (long eid,long ri,long ci,matrix &sm,vector &x,vector &y){ long i,ii; double jac,det,thick; ivector nodes(nne); vector gp1(intordsm[0][0]),gp2(intordsm[0][0]),w(intordsm[0][0]),l(3),t(nne); matrix gm(3,ndofe),d(5,5),db(3,3); Mt->give_elemnodes (eid,nodes); Mc->give_thickness (eid,nodes,t); // det is equal to double area of the element det = (x[1]-x[0])*(y[2]-y[0])-(x[2]-x[0])*(y[1]-y[0]); fillm (0.0,sm); ii=Mt->elements[eid].ipp[ri][ci]; gauss_points_tr (gp1.a,gp2.a,w.a,intordsm[0][0]); for (i=0;i<intordsm[0][0];i++){ l[0]=gp1[i]; l[1]=gp2[i]; l[2]=1.0-l[0]-l[1]; geom_matrix (gm,x,y,l); Mm->matstiff (d,ii); ii++; thick = t[0]*l[0]+t[1]*l[1]+t[2]*l[2]; dbmat (d,db,thick); jac=det*w[i]; bdbj (sm.a,gm.a,db.a,jac,gm.m,gm.n); }// fprintf (Out,"\n\n prvek cislo %ld",eid);// for (i=0;i<ndofe;i++){// fprintf (Out,"\n %4ld %20.10e",i,sm[i][i]);// }}void dktelem::res_stiffness_matrix (long eid,matrix &sm){ long transf; vector x(nne),y(nne); ivector nodes(nne); Mt->give_elemnodes (eid,nodes); Mt->give_node_coord2d (x,y,eid); stiffness_matrix (eid,0,0,sm,x,y); // transformation of stiffness matrix transf = Mt->locsystems (nodes); if (transf>0){ matrix tmat (ndofe,ndofe); transf_matrix (nodes,tmat); glmatrixtransf (sm,tmat); }}void dktelem::nodecoord (vector &xi,vector &eta){ xi[0] = 0.0; eta[0] = 0.0; xi[1] = 1.0; eta[1] = 0.0; xi[2] = 0.0; eta[2] = 1.0;}void dktelem::appval (vector &l, 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] = nodval[0]*l[0]+nodval[1]*l[1]+nodval[2]*l[2]; k++; } destrv (nodval);}/** function computes strains in arbitrary point on element @param xi, eta - natural coordinates of the point @param eps - array containing strains @param val - array containing values on element 11.5.2002*/void dktelem::res_mainip_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 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); } mainip_strains (lcid,eid,0,0,x,y,r);}/** function computes strains in 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 dktelem::mainip_strains (long lcid,long eid,long ri,long ci,vector &x,vector &y,vector &r){ long i,ipp,ij; vector l(3),eps(ncomp[0]),gp1(intordsm[0][0]),gp2(intordsm[0][0]),w(intordsm[0][0]); matrix gm(ncomp[0],ndofe); gauss_points_tr (gp1.a,gp2.a,w.a,intordsm[0][0]); fprintf (Out,"\n\n eps"); fprintf (Out,"\n\n prvek cislo %ld",eid); ipp=Mt->elements[eid].ipp[ri][ci]; for (i=0;i<intordsm[0][0];i++){ l[0]=gp1[i]; l[1]=gp2[i]; l[2]=1.0-l[0]-l[1]; geom_matrix (gm,x,y,l); mxv (gm,r,eps); Mm->storestrain (lcid,ipp,cncomp[0],ncomp[0],eps); fprintf (Out,"\n"); for (ij=0;ij<ncomp[0];ij++){ fprintf (Out,"%20.10e",eps[ij]); } ipp++; } }void dktelem::nod_strains (long lcid,long eid,long ri,long ci){ long i,ipp; double *lsm,*lhs,*rhs; vector nxi(nne),neta(nne),natcoord(2),l(3); vector eps(ncomp[0]),gp1(intordsm[0][0]),gp2(intordsm[0][0]),w(intordsm[0][0]); ivector nodes; lsm = new double [9]; allocv (nne,nodes); Mt->give_elemnodes (eid,nodes); nodecoord (nxi,neta); lhs = new double [ncomp[0]*3]; rhs = new double [ncomp[0]*3]; gauss_points_tr (gp1.a,gp2.a,w.a,intordsm[0][0]); nullv (lsm,9); nullv (rhs,ncomp[0]*3); ipp=Mt->elements[eid].ipp[ri][ci]; for (i=0;i<intordsm[0][0];i++){ l[0]=gp1[i]; l[1]=gp2[i]; l[2]=1.0-l[0]-l[1]; Mm->givestrain (lcid,ipp,cncomp[0],ncomp[0],eps); natcoord[0]=l[0]; natcoord[1]=l[1]; matassem_lsm (lsm,natcoord); rhsassem_lsm (rhs,natcoord,eps); ipp++; } solve_lsm (lsm,lhs,rhs,Mp->zero,3,ncomp[0]); Mt->strain_nodal_values (nodes,nxi,neta,nxi,lhs,2,cncomp[0],ncomp[0],lcid); delete [] lhs; delete [] rhs; destrv (nodes); delete [] lsm;}/** 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 dktelem::elem_strains (double **stra,long lcid,long eid,long ri,long ci){ long i,ipp; double *lsm,*lhs,*rhs; vector nxi(nne),neta(nne),natcoord(2),l(3); vector eps(ncomp[0]),gp1(intordsm[0][0]),gp2(intordsm[0][0]),w(intordsm[0][0]); ivector nodes; lsm = new double [9]; nodecoord (nxi,neta); lsm = new double [9]; allocv (nne,nodes); Mt->give_elemnodes (eid,nodes); nodecoord (nxi,neta); lhs = new double [ncomp[0]*3]; rhs = new double [ncomp[0]*3]; gauss_points_tr (gp1.a,gp2.a,w.a,intordsm[0][0]); nullv (lsm,9); nullv (rhs,ncomp[0]*3); ipp=Mt->elements[eid].ipp[ri][ci]; for (i=0;i<intordsm[0][0];i++){ l[0]=gp1[i]; l[1]=gp2[i]; l[2]=1.0-l[0]-l[1]; Mm->givestrain (lcid,ipp,cncomp[0],ncomp[0],eps); natcoord[0]=l[0]; natcoord[1]=l[1]; matassem_lsm (lsm,natcoord); rhsassem_lsm (rhs,natcoord,eps); ipp++; } solve_lsm (lsm,lhs,rhs,Mp->zero,3,ncomp[0]); nodal_values (stra,nxi,neta,nxi,lhs,2,cncomp[0],ncomp[0]); delete [] lhs; delete [] rhs; destrv (nodes); delete [] lsm;}/** function computes strains DKT*//** function computes strains in arbitrary point on element @param lcid - load case id @param eid - element id @param areacoord - area coordinates of the point @param fi,li - first and last indices @param eps - array containing strains 11.5.2002*/void dktelem::appstrain (long lcid,long eid,vector &l,long fi,long ncomp,vector &eps){ long i,j,k; ivector nodes; vector nodval; if (ncomp != eps.n){ fprintf (stderr,"\n\n wrong interval of indices in function strain (%s, line %d).\n",__FILE__,__LINE__); abort (); } allocv (nne,nodes); allocv (nne,nodval); 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] = nodval[0]*l[0]+nodval[1]*l[1]+nodval[2]*l[2];// eps[k]=approx (areacoord,nodval); k++; } destrv (nodes); destrv (nodval);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -