本文讲解如何使用使用广义α方法求解时变动力学问题,附带
FEniCS
代码
控制方程及其变分形式
首先我们定义我们需要求解的弹性力学方程
∇ ⋅ σ + ρ b = ρ u ¨ (1) \nabla\cdot\textcolor{red}{\sigma}+\rho b = \rho \ddot{u} \tag{1} ∇⋅σ+ρb=ρu¨(1)
其中 σ \sigma σ是应力张量, b b b是体元外力, ρ \rho ρ是密度, u ¨ \ddot{u} u¨表示位移 u u u对时间的 t t t的二阶导数,即加速度。在这个问题中,我们需要求解的是位移 u u u。应力张量 σ \sigma σ的表达式如下
σ = λ t r ( ϵ ) I + 2 μ ϵ ϵ = ∇ u + ( ∇ u ) T 2 λ = E ν ( 1 + ν ) ( 1 − 2 ν ) , μ = E 2 ( 1 + ν ) (2) \sigma = \lambda\mathrm{tr}(\epsilon)I+2\mu\epsilon \\ \epsilon=\frac{\nabla u+(\nabla u)^T}{2} \\ \lambda=\frac{E\nu}{(1+\nu)(1-2\nu)},\mu=\frac{E}{2(1+\nu)} \tag{2} σ=λtr(ϵ)I+2μϵϵ=2∇u+(∇u)Tλ=(1+ν)(1−2ν)Eν,μ=2(1+ν)E(2)
对于式(2)中的参数,杨氏模量 E = 1000 E=1000 E=1000,泊松比 ν = 0.3 \nu=0.3 ν=0.3,密度 ρ = 1 \rho=1 ρ=1, I I I是单位矩阵
上述的过程使用FEniCS
实现如下
# 弹性参数
E = 1000.0
nu = 0.3
mu = Constant(E / (2.0*(1.0 + nu)))
lmbda = Constant(E*nu / ((1.0 + nu)*(1.0 - 2.0*nu)))
# 质量密度
rho = Constant(1.0)
# ε
def epsilon(u_):
return sym(grad(u_))
# 应力张量σ
def sigma(u_):
return 2.0*mu*epsilon(u_) + lmbda*tr(epsilon(u_))*Identity(len(u_))
对于式(1)我们写出其变分形式
∫ Ω ρ u ¨ ⋅ v d x − ∫ Ω ( ∇ ⋅ σ ) ⋅ v d x = ∫ Ω ρ b ⋅ v d x (3) \int_\Omega\rho\ddot{u}\cdot v dx-\int_\Omega\textcolor{red}{(\nabla\cdot\sigma)\cdot v} dx=\int_\Omega\rho b\cdot v dx \tag{3} ∫Ωρu¨⋅vdx−∫Ω(∇⋅σ)⋅vdx=∫Ωρb⋅vdx(3)
这里我们把待求量 u u u放左边,已知量放右边。对于式(3)中的部分我们进一步展开
( ∇ ⋅ σ ) ⋅ v = ∂ σ i j ∂ x i v j = ∂ ∂ x i ( σ i j v j ) − σ i j ∂ v j ∂ x i = ∇ ⋅ ( σ ⋅ v ) − σ ⋅ ∇ v (4) \begin{aligned} (\nabla\cdot\sigma)\cdot v&=\frac{\partial \sigma_{ij}}{\partial x_i}v_j\\ &=\frac{\partial}{\partial x_i}(\sigma_{ij}v_j)-\textcolor{red}{\sigma_{ij}\frac{\partial v_j}{\partial x_i}}\\ &=\nabla \cdot(\sigma\cdot v)-\sigma \cdot \nabla v \end{aligned} \tag{4} (∇⋅σ)⋅v=∂xi∂σijvj=∂xi∂(σijvj)−σij∂xi∂vj=∇⋅(σ⋅v)−σ⋅∇v(4)
式(4)中,最后一步的第二项可以写成
σ ⋅ ∇ v = σ ⋅ ( ∇ v ) T =