OpenFOAM教程 初级入门建议
-
玩OpenFOAM有一阵子了,并且一直坚持
搞CFD算法
以及在OpenFOAM中的植入
,但CFD博大精深,牛人也大有人在,和这些老师比起来我也是一个高级菜鸟,依然任重道远,也一直在通过各种途径学习。但我这个人喜欢写,不管英文的还是中文的,并且比较能折腾,那么我就仅有的点点经验,希望能和大家在CFD中国共同讨论OpenFOAM的一些学习心得,希望切磋交流,共同进步。学OpenFOAM第一个坎:安装
当年我在学OpenFOAM的时候,我非常清楚的记得我用了大约一个星期才装上。主要原因在于
- 对Linux不熟悉,
- 对开源软件的思维不熟悉。
玩OpenFOAM,大体表示着你半只脚踏入了开源的殿堂。从今以后,你就是开源的斗士。拥抱开源,windows sucks!
OpenFOAM具体的安装方法在这里有非常详细的描述 http://dyfluid.com/install.html 在此仅仅概括。OpenFOAM安装有俩种方法:
- 直接从linux源获取;
- 采用源代码进行编译;
直接安装有个问题是国内经常会连接不上网
。所有直接就装不上了。编译安装就是把源代码下载下来直接编译。另外,你还要有一个Linux系统,因为国人平时基本都是用的windows,有几种方式:
- windows系统+Linux虚拟机(推荐新手用)
- Linux系统+windows虚拟机(推荐老手用)
- 两台电脑:一个windows,一个linux(推荐土豪用)
在国内抛弃windows不现实,建议初学OpenFOAM采用第一种方式,非常方便。
学OpenFOAM第二个坎:如何运行
OpenFOAM与其他软件最大的区别就是:
命令行运行
,Windows下,我们各种软件都有个图标,可以点点点,但是OpenFOAM没有!并且,大部分人连Linux都没用过,我当时也没有用过linux,可能会有冲动去学学linux,但是时间宝贵,我不建议,建议:-
看自带的教程走一遍第二章的所有算例。大体知道怎么个计算流程。如何使用,适合前处理后处理。
-
知道OpenFOAM怎么用了之后,你会发现OpenFOAM自带了很多的算例,接下来就是对你喜欢的算例自行模拟一遍。在这一步,我们可以对自带的算例进行适当调节,比如把初始条件改一下,库朗数增大一些。看看会有什么反应。这一个阶段也持续不了多久。大体还是
培养CFD感觉
。经过这个阶段你会发现一些经验,对以后的理论学习很有帮助。对了,
CFD是存在感觉的!
比如给你一张结果,搭眼就能看出来是LES还是RANS,是欧拉欧拉还是欧拉拉格朗日,是2D还是3D,网格是六面体还是四面体,是动网格还是MRF等。看的不一定准,但这些不同的算法算出来的结果都存在一定的规律。这种感觉需要长期的摸索才能有。这就是CFD经验
。 -
在对算例进行了一番修改模拟之后,你需要定制自己的算例,例如OpenFOAM用户指南第一个算例就是一个顶盖驱动流,那么这一个阶段我们需要自己生成一个几何、自己定义一个便捷条件来计算。这一步我们迎来了CFD的重头戏:网格生成 。大部分工程应用50%的时间用在了网格生成上,这时,你需要选择一款你喜欢的网格生成软件。
-
假定你花费了大量时间生成了网格,我们就需要采用自己的网格计算了。这时你需要对你的求解器进行选择。商业软件中中是一步一步来选,添加能量方程?添加多相?添加粒子?OpenFOAM由于编程问题,把不同的工况适用的问题,编写称为不同的求解器,比如:
icoFoam
只适用于不可压缩牛顿流体瞬态求解;
interFoam
只适用于不可压缩俩相不互溶界面跟踪;这意味着你用
icoFoam
求解可压缩流是不合适的,因此你需要再次翻开OpenFOAM用户指南,后面有一个列表说了每个求解器适用的工况。 -
在选好了自己的求解器之后,就是运行计算了。有了网格、有了求解器、计算开始。这时,可能会发现经常会发散。我们也就进入了下一步
学OpenFOAM第三个坎:CFD算法
OpenFOAM这一条路跟商软不一样。OpenFOAM在这一阶段,需要大量的补充算法内容,否则你是玩不明白的。
这也就是为什么OpenFOAM相比商软学起来太费劲的原因。主要是CFD算法学起来太费劲。
这一步需要大量的接触OpenFOAM源代码。这一步最常见的问题就是:
无从下手!
。我们顺利的生成了网格,选择了求解器,计算发散。WHY?比如我们使用的是rhoSimpleFoam
求解器,有一段声明为:
其中的Description里面表明,本求解器适用于可压缩的RANS流体,接下来看到了这么多
#include "fvCFD.H" #include "xxxx.H"
不知所措,需要把所有的头文件都看个遍么?
不建议,否则你会迷失自己。大体知道即可,如下:
当然我知道,好奇心比较强的人是打算每个头文件都了解了解的。你可以翻翻,不过繁多了,你一定会迷失自己,所以该忽略就忽略吧。即使忽略了这么多,我们依然对
rhoSimpleFoam
这个求解器不懂。完全不懂。这时该怎么办呢?比如这个玩意干嘛的:bound(epsilon); antiDiff(alpha);
越到后期,OpenFOAM的可玩性才崭露头角。抛开你需要玩的求解器,回归CFD本源。想一下
CFD到底是如何求解的?
这时候你需要系统的、透彻的、详细的、充分的学习CFD基本理论,注意
是计算流体力学而不是流体力学
。比如上面的antiDiff(alpha)
你绝对不会在流体力学教科书中找到答案。在这之后,我们回归OpenFOAM,从最简单的求解器开始学习,NS方程是如何求解的。那么这几个最简单的求解器无非:laplacianFoam
potentialFoam
scalarTransportFoam
icoFoam
这4个求解器,具体怎么学习,在我的网站上都有解释。其中前三个还好说,最后一个
icoFoam
是真正考验CFD理论素质的时候,这是一个真实的瞬态NS方程求解器,也是一个可以quasi-DNS模拟的求解器。如何学习icoFoam的代码,在此不赘述。这绝对是一个门槛。
假定通过大量的大量的时间搞清楚了
搞清楚了速度、压力如何离散,
源项如何处理,
为什么要显性和隐性
为什么时间步要附加自循环
为什么拉格朗日粒子跟踪要做tet分解
如何泊松方程离散后的矩阵是对称的以及,重中之重的PISO和SIMPLE算法的本质,你就可以回归到
rhoSimpleFoam
,当然这是一个非常漫长的时期,这也是CFD功底积累的时期,为什么?因为你不懂CFD算法你是看不懂OpenFOAM代码的
,如果你不看OpenFOAM代码,那OpenFOAM哪一点吸引了你?直到有一天你豁然开朗会发现CFD求解器的思路都是一样的。
这时候你已经了解了
rhoSimpleFoam
的代码,但是发现,rhoSimpleFoam
不能进行粒子跟踪怎么办?我们进入了到了下一步。OpenFOAM中高级内容:代码开发
这也是OpenFOAMer的终极阶段,不仅仅是玩OpenFOAM,对于其他CFD大厂的全职员工,也是他们所处的阶段。糅合数学方程推导以及方程离散、C++或其他编程语言于一体的过程。这一部分变幻无穷,诸多博士为之奋斗终生。
进入了这个阶段,完全可以抛开所有的OpenFOAM资料,自行学习。
或许也不能用学习
二字了,自行研究
比较合适。这时候你看的应该不是CFD教材,而是期刊。
以下是比较常见的流程:
-
这一阶段我们需要从SCI文章中推导大量的数学模型,下载大量的SCI,看看数学模型是怎样推导的,怎样计算的;依据数学模型的复杂程度,可能几天,可能几星期,可能几个月;
-
在知道怎么计算模型之后,下一步需要编程。OpenFOAM运行了高超的C++编程技术来实现求解,如类,类继承,类嵌套,类模板,宏定义,各种泛型套泛型。这个时候如果没有中级的C++技能的话写面向对象的代码非常耗费时间。如果这样的话,初期可以用简单的C风格来植入。等C++用熟了,可重新封装一遍。
如果你不能理解过程编程和对象编程的区别的话,基本上你只能面向过程了...不过这个确实不是特别重要,除非你玩的是架构。我见过很多nasty的代码同样能发高档次的paper。包括我自己的代码也不漂亮。代码可以慢慢优化。毕竟存在架构师这个职位。
如果你不能理解架构师重要性的话,一方面说明你写的代码还不够多,在CFD中,这表示你还未对算法左右逢源有个宏观的概念。
-
最后,实际上也没有最后,我目前也停留在上面这一段话的最后一段中,“研究模型并编程植入,数据对比然后写文章”。即使完成了,你会进入下一个“研究模型并编程植入,数据对比然后写文章”的阶段。
前面的已经非常主观了,最后补充几句更加主观的思想:
-
OpenFOAM是CFD求解程序,CFDer应该注重CFD本身而不是编程,这点要在学习中分清主次;
比如我在国外,有人喜欢把自己当成programmer,也就是国内的码农,但是我更喜欢称呼我自己是Mathematician。Programmer偏向写代码,算法可以是别人提供的技术文档,也可以是别的软件现成的代码。Programmer的强项在于天花乱坠的代码水平近乎无低端bug的编程风格,可能30%用于算法,70%用于编程。但是我,往往70%的时间耗费在研究CFD的算法上,30%的时间用来编程就可以完成植入。
-
OpenFOAM和商软我没有对比过,不过我非常感兴趣,如果你真的要玩好OpenFOAM,而不是设置个工况模拟一下,没有一定的CFD功力是完全行不通的。正所谓:
商软普及CFD,OpenFOAM定义CFD
-
当然有人不太懂CFD理论就直接进入到了OpenFOAM代码开发阶段,并且发了文章。恭喜你,我不清楚你是如何在半年内就做到的,就像我不明白为什么本科时候很多人考试看一天书就能拿90分一样。作为一个本科GPA不到2.5的人,我做不到这么酷炫的玩法。我不是高智商,只是极为
persist
,但凡遇到不懂的算法,必须扣到底。哈哈。也许我手比较笨,但我愿不停探寻。 -
学习CFD理论要趁早。因为越往后,你会发现你需要计算越来越多的模型,调节各种各样的参数。后期在写文章的时候,可能会发现理论跟上不来。比如在审稿人提出有关算法方面的问题时(
比如问你湍流动能耗散率方程离散的时候为什么有的项需要显性离散?
),你可能并不知道显性离散和隐性离散是个什么鬼,这句话你只是抄别的文章的。这个时候你再补CFD理论就来不及了。当然最好的办法是,不懂得东西,别写!
,不过,如果你CFD懂得太少,文章内容分配会不会有点不妥?
还得感谢2011年T博士跟我的谈话,当时我活跃在某著名OpenFOAM群(群聊天比较浪费时间现在我早已退出),问题非常多,在某一天我又提了很多OpenFOAM问题之后,T博士问我:
你都会点啥?
T博士对我的问题我无法回答,因为我当时什么都不会。也正因为我之前是个CFD问题少年,我创立CFD中文网,欢迎大家来此提问。我不会问你都会点啥,或许我会给你一点SCI参考文献供参考
点击跳转OpenFOAM编程建议
-
不能,mac没有玩过,不知道mac那面怎么搞,不过好像 @random_ran 他是mac系统
-
@李东岳 mac可以用虚拟机搞。我在win下就是虚拟机玩的。还可以用putty模拟远程登录,为后面玩远程做准备。
官方上面有mac的安装方法,直接按照教程来就行。我自己ubuntu下安装也没啥问题,有问题google就行。
https://openfoam.org/download/5-0-macos/
这个网页就是的。当然如果是我用mac可能还是选择虚拟机。
-
@李东岳 我有个观点不知道对不对。
直接用C++意义并不大。不如先用python或者matlab将一些基本算法都自己编一遍,再深入openfoam。
我的学习方式就是先看完user's guide,然后用python或者matlab走一遍算法,结合叙利亚某个大学出的书。手动推导公式到程序实现。然后再深入C++编程,啃openfoam的内涵。
这也符合离散的原则,先简单,再复杂。一上来就是C++和算法,两头打老虎。还是算了,起码我不这么学。而且C++也非一日之功。等算法都摸得七七八八,再啃C++我个人觉得要见到一些。
我现在编程都是Python,效率这东西对于我这种水平低的完全没意义。对于高手能感受到!
-
@hungryandfool 赞,语言层级越抽象,越容易搞清楚逻辑。也越容易把“概念一致性”搞明白。
而且Python并不一定低效,实际的工作都调用线代库或者Kernel其实也挺快的。
-
@hungryandfool 您好,您说的书能说一下书名吗?
-
东岳老师您好,在您的“东岳流体”官网上面有很多求解器的解析,但是为什么没有simpleFoam的解析呀?,simpleFoam是稳态求解很重要一个求解器,做稳态计算的学生也很多,而且稳态是瞬态分析的基础,因此对于该求解器的学习有很大的必要,所以,恳请老师在空闲之余上传simpleFoam的解析,期待您的更新,谢谢!!