有限元代码的健全性检查雅可比

计算科学 有限元 雅可比
2021-11-26 15:57:14

我有一个遗留的 DG 有限元代码,我想为其编写一些单元测试。正如它所写的,对于二维问题,每个自由度都与一个雅可比矩阵相关联(用于稍后转换为主元素)。所有元素都是直边的。

有没有一种很好的方法来检查这些雅可比人是否正确?前一位作者使用了一些讨厌的元编程来生成一个数千行长的文件,该文件由 python 解析并用于计算雅可比行列式。因此,我更喜欢将其视为黑盒并测试输出。

2个回答

与您想要测试的任何其他事物一样,您需要列出您知道某事是真实的情况的列表,然后检查它。在许多情况下,知道某事是真的并不需要能够实际计算出数字上正确的答案,这可以简化事情。

例如:

  • 正如@BlaisB 建议的那样,如果您旋转参考单元格,则雅可比行列式必须是一个。您不需要知道确切的雅可比矩阵。
  • 如果您翻译单元格,情况也是如此。
  • 如果按一个因子缩放单元格,雅可比矩阵需要是单位矩阵的倍数。乘法因子只是比例因子。
  • 如果您随机生成 (i) 凸的和 (ii) 其顶点以正确方式定向的单元格,则行列式需要具有正行列式。
  • 如果您在仿射三角形的多个点处评估行列式,则它需要在任何地方都相同。
  • 如果你计算T1dx通过求积,则求积的结果需要等于单元的面积/体积。因为面积很容易计算,所以很容易评估你得到的答案在四舍五入之前是正确的。
  • ...

所有这些都构成了编写起来相对简单的好、单独的测试用例。一个小时内,我可能会想出十几个或更多这样的测试用例。

嗯,第一个明显的测试是检查雅可比矩阵的行列式是否为正。如果不是,则意味着您的元素已反转,您的答案将无效。

否则,我不确定是否有任何其他测试会很好...对于单元测试,您可以将三角形旋转 360 度,增量为 1 度,并测量雅可比始终为行列式 1...