C++ 或 Python 用于开发 CFD 库

计算科学 图书馆 编程范式
2021-12-16 01:20:14

您会说两种为计算连续体力学编写通用(有限体积、fem、dg)库的方法的优缺点是什么?这就是我现在的看法,所以请提供你自己的经验,不要因为我的事而抨击我:):

1)C++:

  • 泛型编程、虚函数、重载、速度……:所有可用于构建您想要的任何类型的 OOP 工具

  • 大部分可用的低级库(没有广泛的科学和工程库开发,例如用于 Python 的库)

2) 用于并行计算的 Python + 包装器(pyOpenCL 等)

  • 大量的各种支持库

  • 编写您的想法:实现速度非常快

  • 较慢的执行时间

如果你想编写一个支持各种方法、处理复杂几何和问题的框架,你会选择什么,为什么?

4个回答

我的目标是两全其美,并在 Python 中编写“用户界面”(即库的用户将调用以描述问题的几何和其他属性的函数框架)以快速获得周转时间,然后用 C++ 编写仿真运行时间。

事实上,我可能会先在 Python 中模拟模拟运行时间,然后用 C++ 代码一块一块地替换它。最终,您可以考虑让您的 Python 代码生成 C++ 源代码,以便在线编译并链接到您的运行时,这样实际模拟根本不需要调用 Python - 只在最后返回结果。这种设置的好处在于它本质上是敏捷的:您从最快和最简单的工作解决方案开始,您会很快发现什么有效,什么无效,一旦您有了喜欢的东西,您就可以开始加快速度。

(这就是Maple 的 ODE/DAE 求解器的工作方式,除了使用 Maple 而不是 Python。完全披露:我为他们工作。)

您还可以将Cython用于您的算法。它本质上是 Python,为一些需要“快速”的变量添加了类型信息。它将 Python 代码转换为 C 代码,随后可以由您喜欢的 C 编译器编译。仔细添加这种类型的信息可以使你的代码比简单的 Python 代码快 150 倍。

我认为这个问题还有更多。首先,开发人员通常会更喜欢他/她熟悉的东西,除非有显着优势(例如在生产力、开发时间和工具方面)。就个人而言,我优先考虑提高生产力(时间通常是最稀缺的资源!),这有利于接近我的经验基础的选择。

也许还需要考虑的是

3) 开发时间

  • 为开发预留了多少时间
  • 工作成果何时交付?如何?
  • 是否已经存在可以完成这项工作的代码?(唯一性?)

4) 维护

  • 有多少(人)资源用于维护?
  • 有多少人在编写代码?
  • 代码会在某个时候发布吗?(标准?)
  • 代码会依赖第三方库吗?

5) 许可问题

  • 是研究代码吗?
  • 是商业应用的代码吗?

6)生产力和乐趣因素(经常被忽视!)

  • 哪里可以最有生产力?
  • 哪里可以玩得最开心?
  • 有机会成为(社交)网络的一部分吗?

这取决于您的代码是否可以写成:

some_library_specific_type grid;

for t=0 to T do
    library_function_1(grid,...);
    library_function_2(grid,...);
end

或者更确切地说必须写成这样:

some_home_made_mixture_of_native_types grid;

for t=0 to T do
    for all grid elements as g do
        some_function(g,...);
        library_function(g,...);
    end
end

在第一种情况下,选择你最喜欢的代码;在第二种情况下,不要使用任何脚本语言或准备忍受执行时间。