版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/walkandthink/article/details/78641113
最近的工作开始考虑对应力场的耦合了,打算写一下张量形式下的应力平衡方程的弱形式推到,免得时间久了会忘。
应力平衡方程的张量形式为:
其中应力张量与其对应的应变又满足如下本构关系:
针对小应变问题,应变与位移又满足如下几何关系:
写成矩阵形式,则为:
如果需要考虑其他场的耦合,比如热膨胀问题和扩散问题,由于eigen strain的存在,对应的本构方程需要写为如下形式:
其中
该问题对应的边界条件为:
其中
进而利用虚位移
让其为0,并带入对应的边界条件就可以得到对应的弱形式为:
将其写为有限元的离散形式就可以得到residual为:
其中
其中
其对应的刚度矩阵就可以推得:
而应力
对应的代码实现为:
AsFem-Solid3D.CPP.
实现如下:
void Solid3D(const int &isw,const int &ne,const int &ndim,const MatrixXd &U,const MatrixXd &Coords,Material materials,const Vector2d &ctan,const Vector2d &TimeInfo,VectorXi &IX,MatrixXd &Proj,MatrixXd &AMATRX,VectorXd &RHS)
{
// AsFem's standard element for 3D elastic problem
const int nNodes=Coords.rows();
int iInd,jInd,gpInd,ngp,Lint;
int i,j,k;
double xi,eta,zeta,xsj;
MatrixXd shp(nNodes,4),gs;
MatrixXd B(6,3*nNodes),BT(3*nNodes,6),S(6,3*nNodes),EK(3*nNodes,3*nNodes);
MatrixXd D(6,6);
VectorXd valp(12);
double E,Mu;
VectorXd stress(6),strain(6);
E=materials.IthParameter(1);
Mu=materials.IthParameter(2);
// Set elastic matrix D
double term=E*(1-Mu)/((1+Mu)*(1-2*Mu));
double term1=Mu/(1-Mu);
double term2=(1-2*Mu)/(2*(1-Mu));
D.fill(0.0);
D(0,0)= 1.0*term;D(0,1)=term1*term;D(0,2)=term1*term;
D(1,0)=term1*term;D(1,1)= 1.0*term;D(1,2)=term1*term;
D(2,0)=term1*term;D(2,1)=term1*term;D(2,2)= 1.0*term;
D(3,3)=term2*term;D(4,4)=term2*term;D(5,5)=term2*term;
ngp=2;
if(nNodes==20||nNodes==27) ngp=3;
if(ndim!=3)
{
cout<<"Error:solid3d is invalid for dim="<<ndim<<endl;
abort();
}
gs=MatrixXd(ngp*ngp*ngp,1+ndim);
Int3D(ngp,Lint,gs);
AMATRX.setZero();
RHS.setZero();
Proj.setZero();
for(gpInd=0;gpInd<Lint;++gpInd)
{
xi=gs(gpInd,1);
eta=gs(gpInd,2);
zeta=gs(gpInd,3);
Shp3D(ndim,xi,eta,zeta,Coords,shp,xsj,false);
xsj*=gs(gpInd,0);
for(i=0;i<nNodes;++i)
{
B(0,3*i )=shp(i,1);
B(0,3*i+1)=0.0;
B(0,3*i+2)=0.0;
B(1,3*i )=0.0;
B(1,3*i+1)=shp(i,2);
B(1,3*i+2)=0.0;
B(2,3*i )=0.0;
B(2,3*i+1)=0.0;
B(2,3*i+2)=shp(i,3);
B(3,3*i )=shp(i,2);
B(3,3*i+1)=shp(i,1);
B(3,3*i+2)=0.0;
B(4,3*i )=0.0;
B(4,3*i+1)=shp(i,3);
B(4,3*i+2)=shp(i,2);
B(5,3*i )=shp(i,3);
B(5,3*i+1)=0.0;
B(5,3*i+2)=shp(i,1);
}
BT=B.transpose();
S=D*B;
EK=BT*S;
for(i=0;i<6;++i)
{
strain(i)=0.0;
stress(i)=0.0;
for(j=0;j<3*nNodes;++j)
{
strain(i)+=B(i,j)*U(j,0);
stress(i)+=S(i,j)*U(j,0);
}
}
if(isw%3==0)
{
// compute residual
for(iInd=0;iInd<3*nNodes;++iInd)
{
for(k=0;k<6;++k)
{
RHS(iInd)+=-BT(iInd,k)*stress(k)*xsj;
}
// compute stiffness matrix
if(isw==6)
{
for(jInd=0;jInd<3*nNodes;++jInd)
{
AMATRX(iInd,jInd)+=EK(iInd,jInd)*xsj*ctan(0);
}
}
}
}
else if(isw==8)
{
// For projection
valp.setZero();
valp( 1-1)=strain(1-1);
valp( 2-1)=strain(2-1);
valp( 3-1)=strain(3-1);
valp( 4-1)=strain(4-1);
valp( 5-1)=strain(5-1);
valp( 6-1)=strain(6-1);
valp( 7-1)=stress(1-1);
valp( 8-1)=stress(2-1);
valp( 9-1)=stress(3-1);
valp(10-1)=stress(4-1);
valp(11-1)=stress(5-1);
valp(12-1)=stress(6-1);
Projection(valp,shp,xsj,Proj);
}
}
}
结果如下: