易于使用特征函数的自适应网格细化 - 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
一些单元测试可能会替代缺少的文档。
我有一个从 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
一些单元测试可能会替代缺少的文档。