📄 soilplateq.cpp
字号:
#include "soilplateq.h"#include "q4plate.h"#include "global.h"#include "globmat.h"#include "genfile.h"#include "node.h"#include "element.h"#include <stdlib.h>#include <math.h>soilplateq::soilplateq (void){ long i,j; nne=4; ndofe=12; tncomp=5; napfun=2; ned=4; nned=2; intordmm=3; intordb=2; ssst=plate; nb=2; ncomp = new long [nb]; ncomp[0]=3; ncomp[1]=2; cncomp = new long [nb]; cncomp[0]=0; cncomp[1]=3; 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]=9; nip[0][1]=0; nip[1][0]=0; nip[1][1]=4; tnip=0; for (i=0;i<nb;i++){ for (j=0;j<nb;j++){ tnip+=nip[i][j]; } } intordsm[0][0]=3; intordsm[0][1]=0; intordsm[1][0]=0; intordsm[1][1]=2;}soilplateq::~soilplateq (void){ long i; for (i=0;i<nb;i++){ delete [] nip[i]; delete [] intordsm[i]; } delete [] nip; delete [] intordsm; delete [] cncomp; delete [] ncomp;}void soilplateq::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 xi,eta - coordinates on element @param nodval - nodal values*/double soilplateq::approx (double xi,double eta,vector &nodval){ double f; vector bf(nne); bf_lin_4_2d (bf.a,xi,eta); scprd (bf,nodval,f); return f;}/** function assembles matrix of transformation for Q4plate 20.3.2002*/void soilplateq::atd_matrix (matrix &atd,vector &x,vector &y){ double sx,sy; matrix p(16,16),p1(16,16),ct(4,2); vector dl(4); long i,j,i1,i2,i3,i4,ii; 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[3]-x[2])*(x[3]-x[2])+(y[3]-y[2])*(y[3]-y[2])); dl[3]=sqrt((x[0]-x[3])*(x[0]-x[3])+(y[0]-y[3])*(y[0]-y[3])); // matrix vector of sides {cos,sin} ct[0][0]=(x[1]-x[0])/dl[0]; ct[0][1]=(y[1]-y[0])/dl[0]; ct[1][0]=(x[2]-x[1])/dl[1]; ct[1][1]=(y[2]-y[1])/dl[1]; ct[2][0]=(x[3]-x[2])/dl[2]; ct[2][1]=(y[3]-y[2])/dl[2]; ct[3][0]=(x[0]-x[3])/dl[3]; ct[3][1]=(y[0]-y[3])/dl[3]; fillm (0.0,p); fillm (0.0,atd); for (i=0;i<nne;i++){ i1=3*i; i2=i1+1; i3=i1+2; i4=12+i; p[i1][0]=1.; p[i1][1]=x[i]; p[i1][2]=y[i]; p[i1][3]=x[i]*y[i]; p[i1][4]=x[i]*x[i]; p[i1][5]=y[i]*y[i]; p[i1][6]=x[i]*x[i]*y[i]; p[i1][7]=y[i]*y[i]*x[i]; p[i1][8]=x[i]*x[i]*x[i]; p[i1][9]=y[i]*y[i]*y[i]; p[i1][10]=x[i]*x[i]*x[i]*y[i]; p[i1][11]=y[i]*y[i]*y[i]*x[i]; p[i2][5]=y[i]*2.; p[i2][6]=x[i]*x[i]; p[i2][7]=y[i]*x[i]*2.; p[i2][9]=y[i]*y[i]*3.; p[i2][10]=x[i]*x[i]*x[i]; p[i2][11]=y[i]*y[i]*x[i]*3.; p[i2][14]=1.; p[i2][15]=x[i]; p[i3][4]=-x[i]*2.; p[i3][6]=-x[i]*y[i]*2.; p[i3][7]=-y[i]*y[i]; p[i3][8]=-x[i]*x[i]*3.; p[i3][10]=-x[i]*x[i]*y[i]*3.; p[i3][11]=-y[i]*y[i]*y[i]; p[i3][12]=-1.; p[i3][13]=-y[i]; ii=i+1; if (ii > 3) ii=ii-4; sy=(y[i]+y[ii])/2.; sx=(x[i]+x[ii])/2.; p[i4][1]= ct[i][0]; p[i4][2]= ct[i][1]; p[i4][3]= sy*ct[i][0]+sx*ct[i][1]; p[i4][12]=-ct[i][0]; p[i4][13]=-sy*ct[i][0]; p[i4][14]=-ct[i][1]; p[i4][15]=-sx*ct[i][1]; } double *ee; ee = new double [16*16]; for (i=0;i<16;i++){ for (j=0;j<16;j++){ ee[i*16+j]=0.0; } ee[i*16+i]=1.0; } gemp (p.a,p1.a,ee,16,16,Mp->zero,1); delete [] ee; for (i=0;i<p1.n;i++){ atd[i][0] =p1[i][0] -p1[i][12]/dl[0]+p1[i][15]/dl[3]; atd[i][1] =p1[i][1] -p1[i][12]*ct[0][1]/2.-p1[i][15]*ct[3][1]/2.; atd[i][2] =p1[i][2] +p1[i][12]*ct[0][0]/2.+p1[i][15]*ct[3][0]/2.; atd[i][3] =p1[i][3] -p1[i][13]/dl[1]+p1[i][12]/dl[0]; atd[i][4] =p1[i][4] -p1[i][13]*ct[1][1]/2.-p1[i][12]*ct[0][1]/2.; atd[i][5] =p1[i][5] +p1[i][13]*ct[1][0]/2.+p1[i][12]*ct[0][0]/2.; atd[i][6] =p1[i][6] -p1[i][14]/dl[2]+p1[i][13]/dl[1]; atd[i][7] =p1[i][7] -p1[i][14]*ct[2][1]/2.-p1[i][13]*ct[1][1]/2.; atd[i][8] =p1[i][8] +p1[i][14]*ct[2][0]/2.+p1[i][13]*ct[1][0]/2.; atd[i][9] =p1[i][9] -p1[i][15]/dl[3]+p1[i][14]/dl[2]; atd[i][10]=p1[i][10] -p1[i][15]*ct[3][1]/2.-p1[i][14]*ct[2][1]/2.; atd[i][11]=p1[i][11] +p1[i][15]*ct[3][0]/2.+p1[i][14]*ct[2][0]/2.; } }/** function extracts components of the soil part of stiffness matrix of the material to the matrix ds 20.3.2002*/void soilplateq::dbmat (matrix &db,double c1, double c2, long ri, long ci){ if (ri==0 && ci==0){ db[0][0] = c1; db[0][1] = 0.0; db[0][2] = 0.0; db[1][0] = 0.0; db[1][1] = c2; db[1][2] = 0.0; db[2][0] = 0.0; db[2][1] = 0.0; db[2][2] = c2; } if (ri==1 && ci==1){ db[0][0] = c2*5.0/6.0; db[0][1] = 0.0; db[1][0] = 0.0; db[1][1] = c2*5.0/6.0; }}void soilplateq::transfmat (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]; } }}void soilplateq::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);} void soilplateq::nodecoord (vector &xi,vector &eta){ xi[0] = 1.0; eta[0] = 1.0; xi[1] =-1.0; eta[1] = 1.0; xi[2] =-1.0; eta[2] =-1.0; xi[3] = 1.0; eta[3] =-1.0;}void soilplateq::geom_matrix (matrix &gm,matrix &atd,vector &x,vector &y, vector &l){ int i; double sx,sy;// quadrilateral w, dw/dx. dw/dy sx=(x[0]*(1+l[0])*(1+l[1])+x[1]*(1-l[0])*(1+l[1])+x[2]*(1-l[0])*(1-l[1])+x[3]*(1+l[0])*(1-l[1]))/4.; sy=(y[0]*(1+l[0])*(1+l[1])+y[1]*(1-l[0])*(1+l[1])+y[2]*(1-l[0])*(1-l[1])+y[3]*(1+l[0])*(1-l[1]))/4.; for (i=0;i<gm.n;i++){ gm[0][i]=atd[0][i]+sx*atd[1][i]+sy*atd[2][i]+sx*sy*atd[3][i]+sx*sx*atd[4][i]+sy*sy*atd[5][i]+ sx*sx*sy*atd[6][i]+sy*sy*sx*atd[7][i]+sx*sx*sx*atd[8][i]+sy*sy*sy*atd[9][i]+sx*sx*sx*sy*atd[10][i]+sx*sy*sy*sy*atd[11][i]; gm[1][i]=atd[1][i]+sy*atd[3][i]+2.*sx*atd[4][i]+2.*sx*sy*atd[6][i]+sy*sy*atd[7][i]+3.*sx*sx*atd[8][i]+3.*sx*sx*sy*atd[10][i]+sy*sy*sy*atd[11][i];// gm[1][i]=0.0; gm[2][i]=atd[2][i]+sx*atd[3][i]+2.*sy*atd[5][i]+sx*sx*atd[6][i]+2.*sy*sx*atd[7][i]+3.*sy*sy*atd[9][i]+sx*sx*sx*atd[10][i]+3.*sx*sy*sy*atd[11][i];// gm[2][i]=0.0; }}void soilplateq::geom_matrix_shear (matrix &gm,matrix &atd,vector &x,vector &y,vector &l){ long i; double sx,sy; // first point is in I Q sx=(x[0]*(1+l[0])*(1+l[1])+x[1]*(1-l[0])*(1+l[1])+x[2]*(1-l[0])*(1-l[1])+x[3]*(1+l[0])*(1-l[1]))/4.; sy=(y[0]*(1+l[0])*(1+l[1])+y[1]*(1-l[0])*(1+l[1])+y[2]*(1-l[0])*(1-l[1])+y[3]*(1+l[0])*(1-l[1]))/4.; for (i=0;i<atd.n;i++){ gm[0][i]=atd[1][i]+sy*atd[3][i]-atd[12][i]-sy*atd[13][i]; gm[1][i]=atd[2][i]+sx*atd[3][i]-atd[14][i]-sx*atd[15][i]; }}void soilplateq::res_stiffness_matrix (long eid,matrix &sm){ vector x(nne),y(nne); Mt->give_node_coord2d (x,y,eid); stiffness_matrix (eid,0,0,sm,x,y);} void soilplateq::stiffness_matrix (long eid,long ri, long ci, matrix &sm,vector &x, vector &y){ long ii,jj,i,j,ipp; double jac,a,a0,a1; ivector nodes(nne); vector w,gp,l(2); matrix gm,cc,atd(16,12),d(3,3);// jakobian Mt->give_elemnodes (eid,nodes); // 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); fillm (0.0,sm); ipp=Mt->elements[eid].ipp[ri][ci]; Mm->matstiff (d,ipp); 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); allocm (ncomp[ii],ncomp[jj],cc); ipp=Mt->elements[eid].ipp[ri+ii][ci+jj]; gauss_points (gp.a,w.a,intordsm[ii][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]; jac=(a+a0*l[0]+a1*l[1])/8.*w[i]*w[j]; if(ii==0) geom_matrix (gm,atd,x,y,l); else if(ii==1) geom_matrix_shear (gm,atd,x,y,l); dbmat (cc, d[0][0],d[1][1],ii,jj); bdbjac (sm,gm,cc,gm,jac); ipp++; } } destrm (cc); destrm (gm); destrv (gp); destrv (w); } }/* for (i=0;i<intordsm[0][0];i++){ for (j=0;j<intordsm[0][0];j++){ l[0]=gp[i]; l[1]=gp[j]; jac=(a+a0*l[0]+a1*l[1])/8.*w[i]*w[j]; geom_matrix (gm,atd,x,y,l); Mm->matstiff (cc,ipp);// imat=Mm->ip[ipp].idm[Mm->ip[ipp].gemid()]; bdbjac (sm,gm,cc,gm,jac); ipp++; } } destrm (cc); destrm (gm); destrv (gp); destrv (w);*/// fprintf (Out,"\n\n kontrola matice tuhosti");// for (i=0;i<ndofe;i++){fprintf (Out,"\n");// for (j=0;j<ndofe;j++){fprintf (Out," %le",sm[i][j]);}// }// fprintf (Out,"\n\n diagonalni prvky, %ld,\n",eid);// for (i=0;i<ndofe;i++){fprintf (Out," %le",sm[i][i]);}}void soilplateq::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){
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -