测试和可视化大型索引数组

计算科学 软件 测试 不连续-galerkin
2021-12-19 11:07:31

我将很快实现节点不连续 Galerkin 方法,并且在我知道我需要计算的基本索引数组之前完成此操作,给定网格和多项式数据。

我在之前的代码中遇到的问题是我在计算内部/外部跟踪索引等内容时犯的一些细微错误。在更简单的测试用例中没有出现的问题会在更大的网格上出现,并且通常这会产生一个不稳定的方案,因为边界条件没有被正确施加(所以没有机会每 10 步左右只观察一次模拟并看到局部问题) .

我希望这里有一些更有经验的人知道在索引数组上运行的良好测试,以确信他们是正确的。求积、导数等很容易测试,但其他的东西我想不通。

我过去做过的一些测试是将内部法线添加到外部法线,这应该会产生 0 或 +-2。能够快速查看某些代码更改的结果是有帮助的,但我想不出一种有意义的方法来通过索引来做到这一点。

我还应该提到,这些是用于四边形和六边形的,具有曲线元素的潜力。没有多少现有代码可以与工作库进行比较。

如果我可以编写不依赖现有正确答案进行比较的良好单元测试,则可以加分。我会接受很多好的启发式方法。

1个回答

显而易见的答案当然是不要自己实现它,而是使用其他人以前做过的东西。例如,deal.II(http://www.dealii.org -- 免责声明:我是这个库的作者之一)已经有关于四边形、六边形和曲线元素的 DG 元素,以及展示如何使用的教程程序它们等等。所有这些都已经测试了十年,并且在每次更改存储库后都通过 2,700 次回归测试进行了测试。有很多工作要为您节省。

但回到最初的问题:在为deal.II编写测试用例时,我经常为这类事情做些什么,就是做一些我知道确切解决方案的事情,并验证我确实得到了它。示例:如果您有一个插值(节点)元素,则在一个单元格上K,为每个自由度分配一个函数的值f(x)在节点xi. 使用您对自由度排序方式的了解,手动执行此操作。这产生了一个函数uh(x)=iUiφi(x)在哪里Ui=f(xi). 然后使用求积公式来计算类似uhf2=K|uh(x)f(x)|2dx. 如果是与您的 ansatz 空间相同阶的多项式,则结果应该为零。如果您混淆了索引,无论是在手动为自由度分配值时,还是在程序中在正交点处评估时,您都会得到非零值。fuh

所有这一切的重点是,在您的测试中,您使用两种独立的方法来处理索引(您的知识,手动为 DoF 分配值时,以及您的代码在评估时认为是正确的)并且它们需要达成一致。如果他们不这样做,那么至少其中一个是不正确的。uh

当然,一旦你运行了这个,你需要保存测试用例并定期运行它,以确保你不会再次意外破坏这种功能。