对于利用CFD解决工程问题,使用商用CFD软件无疑是最好的选择。商用CFD软件拥有完善的前后处理、经过高度优化的求解器,以及面向复杂问题时的良好的稳健性。然而商用软件也有其自身的弱点,其最大的弱点来自于软件的封闭性,用户无法随意的为商用软件添加新的功能。当问题无法使用商用软件现有功能解决的时候,用户只能静静的等待软件版本更新了。开源CFD软件解决了封闭性的问题,其源代码是公开的,这意味着用户可以根据自己的需求为软件开发新的功能。
OpenFOAM无疑是通用开源CFD的佼佼者,其拥有最大的开源CFD用户群体,大量的CFD开发人员以OpenFOAM作为算法实验平台,也有不少的工业用户选择OpenFOAM作为其CFD求解器。OpenFOAM与商用CFD软件相比,其更偏于底层,对于使用者素质要求更高。OpenFOAM的文档也远不能与商用CFD软件的文档相比。诸多种种导致OpenFOAM的学习曲线异常陡峭。
个人认为想要达到真正玩转OpenFOAM,至少需要跨越三个台阶。
1
工具应用
这是最基础的层级,将OpenFOAM当做CFD工具来替代商业CFD软件。
OpenFOAM中已经预编译了一些标准求解器,应付一些常规的工程问题并没无障碍。不过要想将这些标准求解器使用起来也并非一件容易的事情。
首先我们需要了解这些求解器使用的一些基本流程、输入文件以及控制参数等。打个简单的比方,OpenFOAM用户文档中提供了最简单的方腔顶盖流,我们要求解这个模型,首先得了解并掌握blockMesh网格生成方法,还得了解0文件夹中的初始条件指定方式,还必须清楚constant文件夹中文件的准备,以及system文件夹中求解控制参数的指定方式。这些文件夹中存放的全都是文本文件,用户需要用文本编辑器打开并编辑其中的相应字段,而整个编辑过程中并没有任何的提示。
对于初学者来讲,选择了某种求解器之后,对于每个文件夹中需要包含哪些文件甚至都不是特别清楚。好在软件提供了大量的案例文件,学习的时候可以案例文件中的内容。不过这需要耗费大量的学习时间。要想将OpenFOAM当做CFD求解器解决工程问题,用户最好是将OpenFOAM自带的案例全部撸几遍。最起码能做到碰到工程问题,能够迅速的明确该选用什么求解器,以及该求解器所需要准备的文件及数据。
若仅仅只是将OpenFOAM作为商用CFD软件的替代品的话,对使用者的要求与商业软件使用者并无太大区别,当然由于OpenFOAM的使用过程中会碰触到更多的CFD细节,这也会给工程应用造成一些麻烦。不过能够接触更多细节,从某种程度上来说也更加灵活,也说不上是坏事儿。
个人觉得OpenFOAM的工程应用,可以抛去blockMesh或snappyHexMesh,首先会增加学习成本,其次网格控制也不好。倒不如用其他专业的网格生成软件做出网格后再进行转换。当然如果买不起专业的商业网格工具,那还是慢慢撸blockMesh或snappyHexMesh吧。
2
算法植入
这部分难度较大,且未必所有人都需要。
当预置的标准求解器无法满足需求,且正好有新的算法或方法可用时,可以考虑将新方法植入到OpenFOAM中,从而获取自己的求解器。这种方式在应对复杂问题时特别有用。
众所周知,通用商用软件为了维持软件的通用性及稳健性,通常选用最成熟的计算模型,最新的模型方法往往很少植入。当然从商业的角度来看无可厚非。作为商业软件公司来讲,谁也不敢冒这风险。因为一旦软件植入了不成熟的模型而造成严重Bug被用户发现的话,这对于软件在用户心中的信任感无疑是灾难性的。因此一些最新的方法或理论,对于某些问题可能非常有效,但未必能迅速地被商业软件吸收使用,而我们想要使用这些模型,也只能静静地等待了。但我们可以将这些文献公开的方法或算法直接植入到OpenFOAM中迅速形成新的求解器。
算法的植入对使用者的程序设计水平要求甚高。OpenFOAM实质上是一个C++类库,想要将其拼凑成可用的求解器并非一件容易的事情,首先得至少对C++语言有基本了解,最起码的诸如基本语法、面向对象、多态、继承等有个基本人手,否则可能会看不懂OpenFOAM的代码。
其次,还得对整个代码库的框架有个系统的认识。对于某个求解器,其数据从输入至输出,整个处理流程必须有深入的理解,想要植入新的算法,也是从这里做文章。
然而并非将新的算法以程序代码的形式放到框架中就算完。我们说评价一个数值算法的优劣,可以从精度、稳定性、收敛性等方面去考虑。但是作为计算程序来说,还必须评价其计算效率以及与其它数据接口之间的兼容性,一个处理不好,整体性能就会降低。
这里还得说到算法植入过程中可能会引入的各种Bug。比如说数值程序中最常见的输入变量在分母上,如果代码中不做处理,后期在使用中一旦出现分母为零,自然会导致程序崩溃。这都是可以预见的问题,还有一大堆不可预见的问题。求解器开发出来是给别人使用的,在开发过程中很难预测到别人会输入什么数据。
老实说,纯粹的算法植入并没CFD多大事儿,这是搞计算机的那帮程序猿该干的事儿。
3
CFD理论研究与算法开发
这部分才是CFD开发的精髓,也是OpenFOAM高级应用的一部分。
有很多人是专注于理论开发,对算法是否集成并不关注。不过一个搞算法开发的,若不能使自己开发的算法跑起来,自然是一件极遗憾的事情。其实CFD理论研究与算法开发并不关OpenFOAM啥事儿,不过OpenFOAM相对于重新造轮子来说友好太多了。如果为了测试自己的算法而去重新造轮子,需要做的底层工作太多了。
这部分我不太熟悉,就不瞎BB了。
4
我与OpenFOAM
第一次接触OpenFOAM,应该追溯到2009年,那时候在读研究生,精力旺盛。不过那时候路走偏了。那时候存于网络上的关于OpenFOAM的教程,无一不是解析这个求解器解析那个求解器,这对于新手来说太难了。当时我甚至都不知道这玩意儿到底怎么个用法,在工程上到底有什么用,我又不开发软件卖钱。现在想着当时要是有个OpenFOAM工程应用类的教程,也许就坚持下去了。最终也没能坚持下去,因为要毕业,没有那么多时间留给我去研究工具怎么使用。
再次接触已经是2012年,那时候做博士论文,利用OpenFOAM植入新算法用来计算可燃气云爆轰,后来发现自己植入的算法计算性能远不如商业软件,无论是从收敛速度、计算精度上都差了很多。毕业在即,没有时间深入了解原因所在,一怒之下用了商业软件。OpenFOAM的算法植入是个系统工程,绝不是简单的把算法代码放进去就行了的。
再后来就到2017年了,那时候是一个朋友要开发一个所谓的CFD求解器糊弄项目结题,让我帮他们弄。钱少得可怜,不过要求也低。当时用QT开发了个简单的参数输入界面,用的是OpenFOAM预置的求解器,整个过程基本是体力活,美工花了绝大多数时间。
个人觉得OpenFOAM更好的学习路径:
撸案例。各种工程问题案例,利用OpenFOAM撸一遍,熟悉其作为CFD工具的使用流程,能做到可以使用OpenFOAM解决大多数工程问题。
学编程。能掌握现有算法的植入方式,了解植入的算法代码的测试方法。
大多数人如果能掌握这两层已经足够用了。至于CFD算法开发,若能力不足,还是给那帮纯搞计算的人留碗饭吧。
胡言:
1、以上内容仅代表个人观点,若有不同意见,欢迎指正。
2、祝各位道友2020年万事大吉,事业线不收敛!
领取专属 10元无门槛券
私享最新 技术干货