易于使用特征函数的自适应网格细化 - Python

easy to use adaptive mesh refinement for characteristic function - Python

我有一个从 R^n 到 {0, 1} 的(不连续)函数 f,由用户提供。例如。像这样 "circle inquality":

def charfunc(x):
    # assume x is a numpy array
    return x[0]**2 + x[1]**2  < 1

我想通过在规则网格上对函数值进行采样来找到 f == 1 所在区域的边界,并在值发生变化的区域中(迭代地)细化该网格。我认为这应该不是那么奇特的问题,我敢打赌它已经在 python 宇宙中得到解决。然而,我只发现复杂的 PDE/FEM-Packages 和 NDTAMR. The former seem too much overhead. NDTAMR 看起来很有前途但提供了奇怪的结果(至少使用示例中的默认参数):

有些细化的单元格不靠近边界,有些单元格靠近边界,但没有细化。此示例的代码位于 this repo.

问题:如何使用 NDTAMR 或其他一些 Python 包来获得在边界附近处处细化但其他地方处处细化的网格?

这应该很容易自己完成。

  • 对于四边形的所有角,检查它们是在圆内还是圆外。
  • 优化那些内部和外部都有节点的四边形,并计算新点的状态。

我可能会补充说,这种寻找边界的方法在数值分析中并不常见。通常,您的域由域内为负、域外为正的连续函数指定,即

def f(x):
    return x[0] ** 2 + x[1] ** 2 - 1

随着渐变

def grad(x):
    return 2 * x 

(也可以自动计算梯度。)有了这个信息,可以从任意一点开始,然后向边界迭代。

终于自己实现了。为简单起见,代码位于我已经维护的其他包中,但应该可以独立使用,几乎不需要任何努力:

https://github.com/TUD-RST/symbtools/blob/master/symbtools/meshtools.py

一些单元测试可能会替代缺少的文档。