⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 soilplateq.cpp

📁 Finite element program for mechanical problem. It can solve various problem in solid problem
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#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 + -