有限元笔记7-应力平衡方程张量形式的推导

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/walkandthink/article/details/78641113

最近的工作开始考虑对应力场的耦合了,打算写一下张量形式下的应力平衡方程的弱形式推到,免得时间久了会忘。

应力平衡方程的张量形式为:

σij,j+bi=0

其中应力张量与其对应的应变又满足如下本构关系:
σij=Cijklεkl

针对小应变问题,应变与位移又满足如下几何关系:
εij=12(ui,j+uj,i)

写成矩阵形式,则为:
ε=12(u+uT)

如果需要考虑其他场的耦合,比如热膨胀问题和扩散问题,由于eigen strain的存在,对应的本构方程需要写为如下形式:

σij=Cijkl(εkl[ccref]Ω3δkl)

其中 δij 为Kronecker delta符号。

该问题对应的边界条件为:

ui=u¯iΓD

σijnj=t⃗ iΓN

其中 ΓDΓN=0 , ΓDΓN=S .

进而利用虚位移 δui 可以得到系统的虚功的变分形式为:

δΠ=Ω(σij,j+bi)δuidΩ

让其为0,并带入对应的边界条件就可以得到对应的弱形式为:
Ωσijn⃗ jδuidΓΩσijδuidΩ+ΩbiδuidΩ=0

将其写为有限元的离散形式就可以得到residual为:
RIu=Ω(BI)TσdΩ+ΩbNIdΩ

其中 B 为位移对应的梯度算符,定义如下:
B=NIx00NIy0NIz0NIy0NIxNIz000NIz0NIyNIx

其中 NI 为当前单元上第 I 个点的形函数。

其对应的刚度矩阵就可以推得:

KIJuu=RIuuJ=Ω(BI)TCBJdΩ

而应力 σ 和应变 ε 可以有如下公式得到:

σ6×1=B6×3NU3N×1

ε6×1=C6×6B6×3NU3N×1

对应的代码实现为:
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);
        }
    }
}

结果如下:
这里写图片描述

猜你喜欢

转载自blog.csdn.net/walkandthink/article/details/78641113
今日推荐