📄 dst.cpp
字号:
#include "dst.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>dstelem::dstelem (void){ long i,j; nne=3; ndofe=9; tncomp=5; napfun=3; ned=3; nned=2; intordmm=3; intordb=2; ssst=plate; nb=3; ncomp = new long [nb]; ncomp[0]=3; ncomp[1]=3; ncomp[2]=2; cncomp = new long [nb]; cncomp[0]=0; cncomp[1]=0; cncomp[2]=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]=1; nip[0][1]=0; nip[0][2]=0; nip[1][0]=0; nip[1][1]=3; nip[1][2]=0; nip[2][0]=0; nip[2][1]=0; nip[2][2]=1; tnip=0; for (i=0;i<nb;i++){ for (j=0;j<nb;j++){ tnip+=nip[i][j]; } } intordsm[0][0]=1; intordsm[0][1]=0; intordsm[0][2]=0; intordsm[1][0]=0; intordsm[1][1]=3; intordsm[1][2]=0; intordsm[2][0]=0; intordsm[2][1]=0; intordsm[2][2]=1;}dstelem::~dstelem (void){ long i; for (i=0;i<nb;i++){ delete [] nip[i]; delete [] intordsm[i]; } delete [] nip; delete [] intordsm; delete [] cncomp; delete [] ncomp;}void dstelem::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 dstelem::tran_matrix (matrix &a,matrix &ct,long eid){ double det,dj,gg,thick; long i,ipp; ivector nodes(nne); vector x(3),y(3),ax(3),ay(3),dl(3),t(nne); matrix dbx(3,3),dby(3,3),b(2,3),ba(3,3),dd(3,3),d(tncomp,tncomp); // det is equal to double area of the element Mt->give_elemnodes (eid,nodes); Mt->give_node_coord2d (x,y,eid); ipp=Mt->elements[eid].ipp[0][0]; Mm->matstiff (d,ipp); Mc->give_thickness (eid,nodes,t); thick = (t[0]+t[1]+t[2])/3.0; det = ((x[1]-x[0])*(y[2]-y[0])-(x[2]-x[0])*(y[1]-y[0]))/2.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])); // 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[0]-x[2])/dl[2]; ct[2][1]=(y[0]-y[2])/dl[2]; // der dL(1)/dy ax[0]=(x[2]-x[1])/2./det; ax[1]=(x[0]-x[2])/2./det; ax[2]=(x[1]-x[0])/2./det; // der dL(1)/dx ay[0]=(y[1]-y[2])/2./det; ay[1]=(y[2]-y[0])/2./det; ay[2]=(y[0]-y[1])/2./det; // dl0= betwen node 1,2 dj=ay[1]*ax[0]+ay[0]*ax[1]; dbx[0][0]= 8.*ct[0][0]*ay[0]*ay[1]; dbx[1][0]= 4.*ct[0][1]*dj; dbx[2][0]= 4.*ct[0][0]*dj +8.*ct[0][1]*ay[0]*ay[1]; dby[0][0]= 4.*ct[0][0]*dj; dby[1][0]= 8.*ct[0][1]*ax[0]*ax[1]; dby[2][0]= 8.*ct[0][0]*ax[0]*ax[1] +4.*ct[0][1]*dj; dj=ay[2]*ax[1]+ay[1]*ax[2]; dbx[0][1]= 8.*ct[1][0]*ay[1]*ay[2]; dbx[1][1]= 4.*ct[1][1]*dj; dbx[2][1]= 4.*ct[1][0]*dj +8.*ct[1][1]*ay[1]*ay[2]; dby[0][1]= 4.*ct[1][0]*dj; dby[1][1]= 8.*ct[1][1]*ax[1]*ax[2]; dby[2][1]= 8.*ct[1][0]*ax[1]*ax[2] +4.*ct[1][1]*dj; dj=ay[0]*ax[2]+ay[2]*ax[0]; dbx[0][2]= 8.*ct[2][0]*ay[2]*ay[0]; dbx[1][2]= 4.*ct[2][1]*dj; dbx[2][2]= 4.*ct[2][0]*dj +8.*ct[2][1]*ay[2]*ay[0]; dby[0][2]= 4.*ct[2][0]*dj; dby[1][2]= 8.*ct[2][1]*ax[2]*ax[0]; dby[2][2]= 8.*ct[2][0]*ax[2]*ax[0] +4.*ct[2][1]*dj; dmatblock (dd, d,0,0,thick);// dd[0][0]=0.45733E+06; dd[0][1]=0.11433E+06; dd[1][0]=0.11433E+06;// dd[1][1]=0.45733E+06; dd[2][2]=0.28583E+06;// dd[0][2]=0.0; dd[2][0]=0.0;dd[1][2]=0.0; dd[2][1]=0.0; gg=dd[2][2]/thick/thick*10.; for (i=0;i<3;i++){ b[0][i]=(dd[0][0]*dbx[0][i]+dd[2][0]*dby[0][i] +dd[0][1]*dbx[1][i]+dd[2][1]*dby[1][i] +dd[0][2]*dbx[2][i]+dd[2][2]*dby[2][i])/gg; b[1][i]=(dd[1][0]*dby[0][i]+dd[2][0]*dbx[0][i] +dd[1][1]*dby[1][i]+dd[2][1]*dbx[1][i] +dd[1][2]*dby[2][i]+dd[2][2]*dbx[2][i])/gg; }// vypocet matice transformace alfa-parametru do koncovych posunu dbx[0][0]=-.5*dl[0]; dbx[1][0]=-dl[1]*(ct[0][0]*ct[1][0]+ct[0][1]*ct[1][1])/6.; dbx[2][0]=-dl[2]*(ct[0][0]*ct[2][0]+ct[0][1]*ct[2][1])/6.; dbx[0][1]=-dl[0]*(ct[1][0]*ct[0][0]+ct[1][1]*ct[0][1])/6.; dbx[1][1]=-.5*dl[1]; dbx[2][1]=-dl[2]*(ct[1][0]*ct[2][0]+ct[1][1]*ct[2][1])/6.; dbx[0][2]=-dl[0]*(ct[2][0]*ct[0][0]+ct[2][1]*ct[0][1])/6.; dbx[1][2]=-dl[1]*(ct[2][0]*ct[1][0]+ct[2][1]*ct[1][1])/6.; dbx[2][2]=-.5*dl[2]; for (i=0;i<3;i++){ dbx[i][0]=dbx[i][0]+dl[i]*(ct[i][0]*b[0][0]+ct[i][1]*b[1][0]); dbx[i][1]=dbx[i][1]+dl[i]*(ct[i][0]*b[0][1]+ct[i][1]*b[1][1]); dbx[i][2]=dbx[i][2]+dl[i]*(ct[i][0]*b[0][2]+ct[i][1]*b[1][2]); } det= dbx[0][0]*dbx[1][1]*dbx[2][2]+dbx[0][1]*dbx[1][2]*dbx[2][0]+dbx[0][2]*dbx[1][0]*dbx[2][1] -dbx[0][1]*dbx[1][0]*dbx[2][2]-dbx[0][0]*dbx[1][2]*dbx[2][1]-dbx[0][2]*dbx[1][1]*dbx[2][0]; ba[0][0]=(dbx[1][1]*dbx[2][2]-dbx[1][2]*dbx[2][1])/det; ba[0][1]=(dbx[0][2]*dbx[2][1]-dbx[0][1]*dbx[2][2])/det; ba[0][2]=(dbx[0][1]*dbx[1][2]-dbx[0][2]*dbx[1][1])/det; ba[1][0]=(dbx[1][2]*dbx[2][0]-dbx[1][0]*dbx[2][2])/det; ba[1][1]=(dbx[0][0]*dbx[2][2]-dbx[0][2]*dbx[2][0])/det; ba[1][2]=(dbx[0][2]*dbx[1][0]-dbx[0][0]*dbx[1][2])/det; ba[2][0]=(dbx[1][0]*dbx[2][1]-dbx[1][1]*dbx[2][0])/det; ba[2][1]=(dbx[0][1]*dbx[2][0]-dbx[0][0]*dbx[2][1])/det; ba[2][2]=(dbx[0][0]*dbx[1][1]-dbx[0][1]*dbx[1][0])/det; for (i=0;i<3;i++){ a[i][0]=(-ba[i][0]+ba[i][2]); a[i][1]=-(ba[i][0]*ct[0][1]*dl[0]+ba[i][2]*ct[2][1]*dl[2])/2.; a[i][2]= (ba[i][0]*ct[0][0]*dl[0]+ba[i][2]*ct[2][0]*dl[2])/2.; a[i][3]=( ba[i][0]-ba[i][1]); a[i][4]=-(ba[i][0]*ct[0][1]*dl[0]+ba[i][1]*ct[1][1]*dl[1])/2.; a[i][5]= (ba[i][0]*ct[0][0]*dl[0]+ba[i][1]*ct[1][0]*dl[1])/2.; a[i][6]=( ba[i][1]-ba[i][2]); a[i][7]=-(ba[i][1]*ct[1][1]*dl[1]+ba[i][2]*ct[2][1]*dl[2])/2.; a[i][8]= (ba[i][1]*ct[1][0]*dl[1]+ba[i][2]*ct[2][0]*dl[2])/2.; }/* fprintf (Out,"\n\n prvek cislo %ld",eid); for (j=0;j<3;j++){ fprintf (Out,"\n"); for (i=0;i<ndofe;i++){ fprintf (Out," %20.10le",a[j][i]); } }*/}void dstelem::geom_matrix_bconst (matrix &gm,vector &x,vector &y){ double det; long i,i1,i2; vector ax(3),ay(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]))/2.; // der dL(1)/dy ax[0]=(x[2]-x[1])/2./det; ax[1]=(x[0]-x[2])/2./det; ax[2]=(x[1]-x[0])/2./det; // der dL(1)/dx ay[0]=(y[1]-y[2])/2./det; ay[1]=(y[2]-y[0])/2./det; ay[2]=(y[0]-y[1])/2./det; for (i=0;i<3;i++){ i2=3*i+2; i1=i2-1; gm[0][i2]+=ay[i]; gm[1][i1]+=-ax[i]; gm[2][i2]+=ax[i]; gm[2][i1]+=-ay[i]; } }void dstelem::geom_matrix_b (matrix &gm,matrix &a,matrix &ct,vector &x,vector &y,vector &l){ double det; long i,i2,i3; vector ax(3),ay(3); matrix ba(3,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]))/2.; // der dL(1)/dy ax[0]=(x[2]-x[1])/2./det; ax[1]=(x[0]-x[2])/2./det; ax[2]=(x[1]-x[0])/2./det; // der dL(1)/dx ay[0]=(y[1]-y[2])/2./det; ay[1]=(y[2]-y[0])/2./det; ay[2]=(y[0]-y[1])/2./det; for (i=0;i<3;i++){ i2=i+1; if (i2>2){i2=i2-3;} i3=i+2; if (i3>2){i3=i3-3;} ba[0][i]= 4.*ct[i][0]*( l[i2]*ay[i]+l[i]*ay[i2]+ay[i3]/3.); ba[1][i]= 4.*ct[i][1]*( l[i2]*ax[i]+l[i]*ax[i2]+ax[i3]/3.); ba[2][i]= 4.*ct[i][0]*( l[i2]*ax[i]+l[i]*ax[i2]+ax[i3]/3.)+4.*ct[i][1]*( l[i2]*ay[i]+l[i]*ay[i2]+ay[i3]/3.); } for (i=0;i<9;i++){ gm[0][i]=ba[0][0]*a[0][i]+ba[0][1]*a[1][i]+ba[0][2]*a[2][i]; gm[1][i]=ba[1][0]*a[0][i]+ba[1][1]*a[1][i]+ba[1][2]*a[2][i]; gm[2][i]=ba[2][0]*a[0][i]+ba[2][1]*a[1][i]+ba[2][2]*a[2][i]; } }void dstelem::geom_matrix_shear (matrix &gs,matrix &a,matrix &ct,long eid){ double det,dj,gg,thick; long i,ipp; ivector nodes(nne); vector x(3),y(3),ax(3),ay(3),dl(3),t(nne); matrix dbx(3,3),dby(3,3),dd(3,3),b(2,3),d(tncomp,tncomp); Mt->give_elemnodes (eid,nodes); Mt->give_node_coord2d (x,y,eid); ipp=Mt->elements[eid].ipp[0][0]; Mm->matstiff (d,ipp); Mc->give_thickness (eid,nodes,t); thick = (t[0]+t[1]+t[2])/3.;// thick=0.7; // 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]))/2.; 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 ax[0]=(x[2]-x[1])/2./det; ax[1]=(x[0]-x[2])/2./det; ax[2]=(x[1]-x[0])/2./det; // der dL(1)/dx ay[0]=(y[1]-y[2])/2./det; ay[1]=(y[2]-y[0])/2./det; ay[2]=(y[0]-y[1])/2./det; // dl0= betwen node 1,2 dj=ay[1]*ax[0]+ay[0]*ax[1]; dbx[0][0]= 8.*ct[0][0]*ay[0]*ay[1]; dbx[1][0]= 4.*ct[0][1]*dj; dbx[2][0]= 4.*ct[0][0]*dj +8.*ct[0][1]*ay[0]*ay[1]; dby[0][0]= 4.*ct[0][0]*dj; dby[1][0]= 8.*ct[0][1]*ax[0]*ax[1]; dby[2][0]= 8.*ct[0][0]*ax[0]*ax[1] +4.*ct[0][1]*dj; dj=ay[2]*ax[1]+ay[1]*ax[2]; dbx[0][1]= 8.*ct[1][0]*ay[1]*ay[2]; dbx[1][1]= 4.*ct[1][1]*dj; dbx[2][1]= 4.*ct[1][0]*dj +8.*ct[1][1]*ay[1]*ay[2]; dby[0][1]= 4.*ct[1][0]*dj; dby[1][1]= 8.*ct[1][1]*ax[1]*ax[2]; dby[2][1]= 8.*ct[1][0]*ax[1]*ax[2] +4.*ct[1][1]*dj; dj=ay[0]*ax[2]+ay[2]*ax[0]; dbx[0][2]= 8.*ct[2][0]*ay[2]*ay[0]; dbx[1][2]= 4.*ct[2][1]*dj; dbx[2][2]= 4.*ct[2][0]*dj +8.*ct[2][1]*ay[2]*ay[0]; dby[0][2]= 4.*ct[2][0]*dj; dby[1][2]= 8.*ct[2][1]*ax[2]*ax[0]; dby[2][2]= 8.*ct[2][0]*ax[2]*ax[0] +4.*ct[2][1]*dj; dmatblock (dd, d,0,0,thick);// dd[0][0]=0.45733E+06; dd[0][1]=0.11433E+06; dd[1][0]=0.11433E+06;// dd[1][1]=0.45733E+06; dd[2][2]=0.28583E+06;// dd[0][2]=0.0; dd[2][0]=0.0;dd[1][2]=0.0; dd[2][1]=0.0; gg=dd[2][2]/thick/thick*10.; for (i=0;i<3;i++){ b[0][i]=(dd[0][0]*dbx[0][i]+dd[2][0]*dby[0][i] +dd[0][1]*dbx[1][i]+dd[2][1]*dby[1][i] +dd[0][2]*dbx[2][i]+dd[2][2]*dby[2][i])/gg; b[1][i]=(dd[1][0]*dby[0][i]+dd[2][0]*dbx[0][i] +dd[1][1]*dby[1][i]+dd[2][1]*dbx[1][i] +dd[1][2]*dby[2][i]+dd[2][2]*dbx[2][i])/gg; } for (i=0;i<9;i++){ gs[0][i]=b[0][0]*a[0][i]+b[0][1]*a[1][i]+b[0][2]*a[2][i]; gs[1][i]=b[1][0]*a[0][i]+b[1][1]*a[1][i]+b[1][2]*a[2][i]; }} void dstelem::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 dstelem::dmatblock (matrix &dd,matrix &d,long ri, long ci, double t){ double c; c=t*t*t; fillm (0.0,dd); if ((ri==0 && ci==0)||(ri==1 && ci==1)){ dd[0][0] = c*d[0][0]; dd[0][1] = c*d[0][1]; dd[0][2] = c*d[0][2]; dd[1][0] = c*d[1][0]; dd[1][1] = c*d[1][1]; dd[1][2] = c*d[1][2]; dd[2][0] = c*d[2][0]; dd[2][1] = c*d[2][1]; dd[2][2] = c*d[2][2]; } if (ri==2 && ci==2){ dd[0][0] = t*d[3][3]*5.0/6.0; dd[0][1] = 0.0; dd[1][0] = 0.0; dd[1][1] = t*d[4][4]*5.0/6.0; }}/** function computes stiffness matrix of dst element @param eid - element id @param sm - stiffness matrix 15.3.2002*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -