组织一个用python编写的CFD程序

计算科学 流体动力学 Python 哎呀
2021-12-10 17:44:05

我花了一些时间编写一个谱元求解器,旨在解决有关自推进体运动的流体流动问题。我已经到了代码已经足够长的地步,以至于我无法以简单易懂的方式组织事物。

目前,我已经用 python 编写了它(使用 numpy/scipy 等),我正在尝试利用模块和 OOP 概念来更好地分解事情。不幸的是,由于我的背景主要是工程,所以我对 OOP 概念还是有点陌生​​。我组织的事情如下:

  1. 一个“预处理”模块,包含两个类:“MasterElement”、“Element”和“Mesh”。基本上,Mesh 类包含一个节点数组和一个 Element 对象列表,每个对象都链接到一个 MasterElement 对象。从 MasterElement 实例化的对象包含用于每个元素内的插值、微分和集成的属性。

  2. 一个“gmsh”模块,用于解析由 Gmsh 自动网格划分程序生成的文件。

现在是我对继续进行的最佳方式感到有点困惑的地方。基本上,我需要发生 4 件事:

  1. 一个“初始化”步骤,所有必要的数组都被初始化到内存中(很多some_array = np.zeros(...))。

  2. 一个“处理”步骤,其中网格中的每个元素都被循环。计算雅可比矩阵并随后为每个元素计算算子(弱拉普拉斯矩阵、质量矩阵等)。与全局系统的“右手边”相关的边界积分也被计算并排列成全局“轮廓积分”向量。

  3. 在 Newton-Raphson 迭代循环中组装和求解(目前直接)全局系统的求解步骤。

  4. 绘制解决方案的后处理等。

目前,我将第 1 步、第 2 步和第 3 步混合在一个长 python 脚本中。我应该把部分脚本分解成函数吗?这是直截了当的,但我会在函数之间传递大量参数,这可能同样令人困惑。或者有没有我没有考虑过的更好的方法?

即使你可以让我参考一些关于这方面的文献,那也很棒。我的大多数 CFD 书籍都专注于算法,而不一定是如何编写好的、可重用的代码。

谢谢!

1个回答

我建议您将步骤 1、2、3 放在不同的文件中。由于每个步骤在概念上都是不同的,并且可以被外部例程/软件替换,因此最好采用模块化架构。

将整个代码拆分为函数很有用。关于参数的传递,Python 有不同的方法:可选参数kwargs您可以查看SfePy 代码,它是用 Python 编写的 FEM 代码,它可以作为示例有用。