C ++或Python用于开发CFD库


13

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

1)C ++:

  • 通用编程,虚函数,重载,速度...:所有可用的genreic + OOP工具来构建您想要的任何东西

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

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

  • 大量的各种支持库

  • 编码您的想法:实施非常快

  • 执行时间较慢

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


1
我对pyOpenCL不太熟悉,但是通常来说,对于2D或3D中的中等大小的问题,Python都将太慢,除非您的计算“内核”以低级语言(Fortran,C等)实现。 )
David Ketcheson 2011年

Answers:


14

我的目标是兼顾两者,并在Python中编写“用户界面”(即您的库用户将用来描述问题的几何形状和其他属性的函数框架)的代码,周转时间,然后用C ++编写模拟运行时间。

实际上,我可能甚至会先在Python中模拟仿真运行时,然后再用C ++代码逐段替换它。最终,您可以考虑让您的Python代码生成C ++源代码,以进行在线编译并链接到您的运行时,这样,实际的模拟根本不需要调用Python-仅在最后返回结果。这种设置的好处是它固有的敏捷性:从最快,最简单的工作解决方案开始,您将迅速找出有效和无效的解决方案,一旦有了您喜欢的东西,便可以开始加快它的速度。

(除了使用Maple代替Python外,这是Maple的ODE / DAE求解器的工作方式。完全公开:我为他们工作。)


1
+1。Python 的优点之一是可以根据需要脱离“ Pure Python”。
Fomite 2011年

3

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


2

我认为这个问题还有更多。首先,最重要的是,开发人员通常会选择自己熟悉的技术,除非具有明显的优势(例如,在生产率,开发时间和工具方面)。就个人而言,我优先考虑生产力(时间通常是最稀缺的资源!),这有利于选择与我的经验基础相近的选择。

也许也相关的是

3)开发时间

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

4)保养

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

5)许可问题

  • 是研究代码吗?
  • 的商业代码是什么?

6)生产力和娱乐因素(通常被忽略!)

  • 在哪里最有生产力?
  • 在哪里可以找到最有趣的发展?
  • 是否有机会成为(社交)网络的一部分?

2

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

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

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


2

作为艾伦答案的推论(您自己的开发人员时间是最宝贵的资源):使用其他人已经做过的事情。您说您想开发一个用于计算连续性力学的库,但是已经有一些库如此之大,以至于它们几乎总是已经具有所需的一切。看一下Deal.II,举例来说,所有可以写成有限元问题的东西,用于流体动力学的OpenFOAM,或者用于双曲线问题的PyCLAW / CLAWPACK。例如,Deal.II要求您使用C ++进行编程,但实际上,编程水平通常很高,以至于人们可以说这就像使用C ++语法的FEM代码的领域特定语言一样。


2
从未遇到过拥有我所需要的一切的图书馆……
Jack Poulson

好吧,但是你明白我的意思。有些库具有您可能需要的“几乎所有内容”。仅举一个我特别熟悉的示例,一个使用date.II和PETSc 126行代码的在10,000多个处理器上运行的完全自适应3d网格上的有限元求解器。这显然大于零,但是考虑到实际情况的复杂性,实际上这是一个很小的数字。
Wolfgang Bangerth'1

为了扮演魔鬼的拥护者,在10,000个内核上运行代码是微不足道的,但是使其具有可伸缩性则完全不同。用于非椭圆方程的并行并行预处理器甚至不能在300个核上有效运行。
Jack Poulson

当然。但是我引用的示例可扩展的:math.tamu.edu/~bangerth/publications/2010-distributed.pdf
Wolfgang Bangerth,2012年

为了完全公开:我是本文和上面引用的代码以及Deal.II库的作者之一。
Wolfgang Bangerth,2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.