我花了一些时间编写一个谱元求解器,旨在解决有关自推进体运动的流体流动问题。我已经到了代码已经足够长的地步,以至于我无法以简单易懂的方式组织事物。
目前,我已经用 python 编写了它(使用 numpy/scipy 等),我正在尝试利用模块和 OOP 概念来更好地分解事情。不幸的是,由于我的背景主要是工程,所以我对 OOP 概念还是有点陌生。我组织的事情如下:
一个“预处理”模块,包含两个类:“MasterElement”、“Element”和“Mesh”。基本上,Mesh 类包含一个节点数组和一个 Element 对象列表,每个对象都链接到一个 MasterElement 对象。从 MasterElement 实例化的对象包含用于每个元素内的插值、微分和集成的属性。
一个“gmsh”模块,用于解析由 Gmsh 自动网格划分程序生成的文件。
现在是我对继续进行的最佳方式感到有点困惑的地方。基本上,我需要发生 4 件事:
一个“初始化”步骤,所有必要的数组都被初始化到内存中(很多
some_array = np.zeros(...)
)。一个“处理”步骤,其中网格中的每个元素都被循环。计算雅可比矩阵并随后为每个元素计算算子(弱拉普拉斯矩阵、质量矩阵等)。与全局系统的“右手边”相关的边界积分也被计算并排列成全局“轮廓积分”向量。
在 Newton-Raphson 迭代循环中组装和求解(目前直接)全局系统的求解步骤。
绘制解决方案的后处理等。
目前,我将第 1 步、第 2 步和第 3 步混合在一个长 python 脚本中。我应该把部分脚本分解成函数吗?这是直截了当的,但我会在函数之间传递大量参数,这可能同样令人困惑。或者有没有我没有考虑过的更好的方法?
即使你可以让我参考一些关于这方面的文献,那也很棒。我的大多数 CFD 书籍都专注于算法,而不一定是如何编写好的、可重用的代码。
谢谢!