有限体积代码的数据结构:数组与类

计算科学 Python 有限体积 数据结构
2021-11-25 03:32:33

我必须为磁流体动力学(MHD)编写有限体积代码。我以前写过数字代码,但不是这个规模。我只是想问一下哪个是一个不错的选择,使用带有类的数据结构(面向对象的方法),或者只是使用多个数组来处理不同的属性,在速度、可伸缩性等方面。我打算用 python 编写代码,并且对数字密集部分使用 fortran。

python中类的一个例子是

class Cell:
   def __init__(self, x, y, z, U):

数组可以简单地定义为

x[nx][ny][nz]
y[nx][ny][nz]
z[nx][ny][nz]
U[nx][ny][nz]

等等。

2个回答

几天前我在思考这个问题(也在 Python 中)。我个人认为面向对象编程并不总是适合数值编程。您可能会因设计课程而分心,而不仅仅是求解方程式。我更喜欢使用简单的函数,并且使用numpy你可以将你的方程向量化,所以你需要的行数很少。Numpy 非常快,因为实际计算是使用 C(或 FORTRAN?)后端完成的。

我会建议你做什么,

  1. 编写一个 Python 脚本,使用 numpy 的函数式方法解决问题的最简单版本。例如,将所有内容置于任意单位并仅尝试 1D(或 2D)。如果代码乱七八糟,在这个阶段完全没问题。重要的是你正在推进你的项目。
  2. 一旦你有了一些有用的东西。确定代码在哪里冗长和折射。在这个阶段,你可以尝试不同的想法来简化你的代码。也许在你注意到你重复自己的地方引入功能。您可以与原始版本进行比较,这样您就知道您没有引入错误。
  3. 确定面向对象的方法是否会进一步降低代码的复杂性。

主要信息是在您以最简单的方式解决问题之前不要开始编写类。只有通过获得解决问题的经验,您才会知道如何定义面向对象的接口。如果你事先这样做,很可能会妨碍你。

简单的回答:在现代 python 中,每种数据类型都是一个类,所以在形式上,您提出的两种解决方案没有区别。(请记住使用新式类:经典类已过时!参见http://docs.python.org/2/reference/datamodel.html#new-style-and-classic-classes

现在的问题应该是:如何在 python 中组织一个高效的数据结构?毫无疑问,将单元组织为class Cell实例数组的想法太低效了。你最终会得到一堆乱七八糟的指针和不连续的数据,这些数据组织得像一个复杂的链表。您当然可以轻松地在列表中插入新单元格:但是您需要此功能吗?相反,您将拥有不连续的数据存储,并且您必须通过不同级别的间接访问每个单元格。

如果您将数据组织为 anumpy.ndarray那么数据是内存连续的,并且访问不同的单元格只需跨过您的内存块即可完成:空间高效(没有为指针浪费内存)和快速

正如 Ethan 所指出的,应该使用 OO 概念,但在更高级别,一旦实现了有效的低级数据结构,通常通过numpy.ndarray's.

OO 编程意味着将数据绑定到在更高抽象级别上对数据本身进行操作的方法。(一个例子:我实现了一个 FEM 代码,其中刚度矩阵被定义为一个具有稀疏超节点 Cholesky 分解方法的类。第一个实现是内核:当需要内核外实现时,这个是通过继承和对下划线数据存储的最小调整获得的。几乎 100% 的超节点 Cholesky 代码被重用。)

最后一点,但至关重要:高效的数值过程是将算法和数据结构智能映射到目标计算架构的结果。如果从错误的数据结构开始,没有完全重写,就无法恢复效率。