deal.ii教程中关于弹性方程双线性形式的困惑

计算科学 有限元 张量 交易.ii 弹性
2021-12-03 14:35:44

我正在学习如何使用 deal.II 库解决向量值问题。特别是我从官网看下面的介绍https://www.dealii.org/current/doxygen/deal.II/group__vector__valued.html#VVALalternative

在这里,他们将双线性形式写为

a(u,v)=(λu,v)Ω+2i,j(μ12[iuj+jui],12[ivj+jvi])Ω

然后他们说

=(λu,v)Ω+2i,j(με(u),ε(v))Ω

但我不明白为什么指数加倍i,j在最后的平等!我认为它不应该在那里,也是因为没有依赖i,j.


编辑: 所以最后一个总和是

i,j(με(u)ij,ε(v)ij)Ω

我现在想知道这个双数是如何在片段中准确翻译的

for (unsigned int q_point=0; q_point<n_q_points; ++q_point)
  for (unsigned int i=0; i<dofs_per_cell; ++i)
    {
      const SymmetricTensor<2,dim> phi_i_symmgrad
        = fe_values[displacements].symmetric_gradient (i,q_point);
      const double phi_i_div
        = fe_values[displacements].divergence (i,q_point);
      for (unsigned int j=0; j<dofs_per_cell; ++j)
        {
          const SymmetricTensor<2,dim> phi_j_symmgrad
            = fe_values[displacements].symmetric_gradient (j,q_point);
          const double phi_j_div
            = fe_values[displacements].divergence (j,q_point);
          cell_matrix(i,j)
            +=  (phi_i_div * phi_j_div *
                 lambda_values[q_point]
                 +
                 2 *
                 (phi_i_symmgrad * phi_j_symmgrad) *
                 mu_values[q_point]) *
                fe_values.JxW(q_point);
        }
    }

这是我的尝试:

应用正交公式:

qμ(xq)i,jε(u(xq))ijε(v(xq))ij

现在我认识到术语正是

ε(u):ε(v)

因此,我怀疑这phi_i_symmgrad * phi_j_symmgrad正是两个对称梯度之间的标量积,其中 * 运算符已被适当地重载,因为这两个项都是 2 阶张量。

那是正确的吗?

1个回答

错误的不是总和,而是其中缺少索引。在他们网站上的这个表达式下方,他们定义:

ϵ(u)=12([u]+[u]T)

所以ϵ(u)是由对称梯度形成的矩阵u. 但是为了从前面的表达式中得到和,我们想要对这个矩阵的元素求和。所以它真的应该是ϵ(u)ij.

对于从公式到代码的翻译,我认为您的想法是正确的。我最初误认为ijfor 循环作为公式的总和,但这些似乎是系统不同自由度的贡献。我错过了phi_i_symm明确定义为 a 的内容SymmetricTensor,因此*必须将其覆盖为这种类型的标量积,以便代码在维度上有意义。