我采访了 OpenFOAM 创始人:40 年 CFD 经验谈
下面这篇文章是李东岳之前去采访 OpenFOAM 基金会创始人 Henry Weller 的一段描述。
李东岳:编程和 CFD 算法,哪一个更加重要?
算法更加重要。
大多数 CFD 工程师并不需要经常编程,因为 CFD 代码已经非常成熟了,并且包含了非常多的功能。
但是对于一个 CFD 工程师而言,很有必要了解到底什么是“物理”,什么是“边界条件”。这些都和流体动力学有关,而和编程关系不大。
很好地了解 CFD 的概念在选择合适的数值方法、离散格式、时间步、松弛因子的时候非常有必要。这通常可以通过培训来达到目的,因为算法本质上其主要通过积累的经验来获得。
使用 CFD 就像玩乐器,你不能捡起一把小提琴就弹“维尔瓦底”的曲子,这需要很长的练习。
然而,相对于 GUI 的点击型操作,OpenFOAM 中 CFD 算例的自动运行 VERY 有用,因此如果会写脚本的话就更好了。脚本语言不重要,大家可以使用随便一个脚本语言,只要你熟悉就好。
李东岳:网格对 FVM 计算重要性如何?
网格大小对流体结构的求解是一个关键的因素。
网格尤其对 LES/DES 非常重要,因为在 LES/DES 中,网格和湍流尺度有关。网格大小、密度、分布应该小心处理。
并且 FVM 对网格类型非常敏感。
因为 FVM 使用体心或者面心作为高斯积分点。在做局部插值的时候,例如,面心只从相邻网格获取的时候,如果网格比较有序,FVM 只是 2 阶精度。
我在算法中提供了高阶多项式插值方法,这种方法在不规则以及混乱的网格也可以提供 2 阶精度。但是这些方法很耗费计算资源并且不是很稳定。能避免就避免。
总之,网格质量和分布是非常重要的。
另外,规则的六面体网格要比规则的四面体网格更加精准,虽然俩种网格在使用中心差分的时候都具有 2 阶精度。对于混乱的网格,多面体网格要比四面体网格更加精准。
所以基本上说,六面体网格是最好的,并且应该尽量避免不规则和混乱的网格。
对于复杂几何,OpenFOAM 对网格生成有严格的限制。其求解器对大部分网格也可运行收敛。但是网格这个东西,还是尽可能的做成最好吧!
foamyHexMesh 的理念很好,它会生成规则的六面体网格,对于一些复杂的几何区域,它会生成多面体而不是四面体。
然而,foamyHexMesh 并不是一个资助的项目并且目前也没有人资助。目前这个程序是 VERY 脆弱的,因此只是一个演示。
李东岳:从个人经验来讲,如何学习 CFD?
运行算例,从错误中吸取教训,运行更多算例,吸取更多的教训。
Live and breath CFD!这是我学 CFD 的经验。
我从上个世纪 80 年代开始学习 CFD,现在掌握 CFD 经验的人要比 80 年代的时候多得多。
现在有很多的培训课,很多的书,直接从别人的肩膀上吸取经验非常容易。但是当然了,还是从自身经验来学习最好!
李东岳:相对于商业代码,OpenFOAM 的特性是什么?
OpenFOAM 是完全免费并且开源的!
这提供了 HUGE 的方便,不仅仅在费用上,也表现在灵活性、以及从软件本身来学习 CFD 上。
OpenFOAM 不仅仅让 CFD 工程师可以模拟算例,它也允许 CFD 工程师来学习 CFD 方法、开发 CFD 算法并完善,甚至某一天创造一个可以替代 OpenFOAM 的软件。
并且,许多 CFD 问题需要一些特别的功能、算法、方程、边界条件等。在商业软件中植入这些功能可能会失败。
有些情况下可能有必要完全的重新写一个求解器、边界条件等。
OpenFOAM 提供了最大的灵活以及扩展性。
这些对使用 CFD 做研究的人非常重要,因此我觉得 OpenFOAM 可能在某一天会替代闭源软件。
李东岳:您为什么选择 C++ 开发 CFD 代码而不是 FORTRAN?
在 1984 年本科之前,我最开始的时候从 Basic 语言学起,然后转移到 Pascal 和 C。在我的论文里我使用 FORTRAN-77,不得不说,这实在 AWFUL!!!太差劲了!C 和 Pascal 比 FORTRAN-77 会好一点,实际上在 1960 年 ALGOL-60 问世之后,FORTRAN 就差不多废弃了。
当我开始我的 CFD 研究的时候,我拿到的代码是一堆不能编译的令人费解的 FORTRAN-77 代码。
在我学习了几个月之后,我认为我可以玩的更好。
1989 年,我接触到了 C++,并立即看到了对象起源编程的优势。从那时起,我就开始用 C++ 设计 FOAM。
然而,在那个年代,C++ 刚刚问世,并且编译器 VERY 脆弱甚至不能工作。慢慢的我认识到泛型编程(Generic Programming)对操作场、矩阵、方程等是非常有必要的。
在 C++ 模板问世之前,我就使用 C 方法、宏和脚本得方法来实现。在 C++ 模板问世之后,以及 gcc 编译器的发布,我把我之前写的代码用 C++ 模板重写,这就是 OpenFOAM 的前身。
当然了,FORTRAN 不能做这些。不过 FORTRAN-90 有一些面向对象的能力,但是它完全没有泛型编程的功能,据我所知,FORTRAN 以后亦不会添加泛型编程的概念。
基本上,我个人认为 FORTRAN 语言快要废了,在 1960 年那时候就应该埋在土里了。目前使用 FORTRAN 的人大部分是由于历史原因,只为了新代码能和非常久远的代码兼容。
FORTRAN 和 C++ 都因为“向下兼容”而有一些致命的缺点。FORTRAN 为了和 FORTRAN-77 兼容,C++ 为了和 ANSI C 兼容。然而最大的区别是,ANSI C 本身就是一个非常好的语言,FORTRAN 可不是。
在未来,我希望 C++ 被一个更干净、简单、有力的语言代替,这个语言需要支持泛型编程,这对 OpenFOAM 以及其他相类似的代码非常重要。
我一直关注编程语言的发展,我认为 C++ 的可能的代替品有 Nim,Rust 以及 Chapel,然而目前这些语言缺少一些我需要的必要功能,添加这些功能,比如 C++ 中的高度的泛型编程概念,可能需要很多年。
我希望他们在若干年后添加这些特性。同时,C++ 的缺陷需要妥善处理。在 C++17 中,我希望“概念”(concept)和“模块”(module)特性会被加入,所有的 C++ 编程人员都会受益。
额,这个问题我想说的太多了,尤其是关于 C++ 的缺陷以及我对未来编程语言的期望。这越说越远了,就这么遭!