#updating

大多数新人会觉得 OpenFOAM 很难入门,特别是自学的勇士们。

本文对一些可能的问题和选择,试图给出明确的答案,而不是类似于“如果你有时间有能力,学习这个会对你有帮助。。。”“有时间的话你应该看一下,会帮助你更好的理解。。。”这种模棱两可让人犹豫的建议。

总的来说,本文试图指出一条“连续”“渐进”“清晰”“明确”“没有间断”“没有跳跃”的 OpenFOAM 入门学习路线。

关于系列

本相关系列参考了大量的开源资料,有些进行了修改,有些补充了个人理解和实践。

如果读者发现错误,又或是觉得哪里衔接不够连贯,欢迎在每篇下留言建议或者讨论。也欢迎来 https://aerosand.cn/Cafe/ 留言讨论。


前置知识

对于新人而言,微积分、线性代数、科学计算一般都是至少通过本科期末考试的水平,现阶段也够了,不需要系统复习,以后遇到不明白的地方针对性补充即可。

很多人在大学里修的 C/C++ 课程都停留在勉强能用的程度,C++ 更是很少用到面向对象特性。

但 OpenFOAM 却是 C++ 编写的。

建议提前完整过一遍 C++ 基础知识。面向对象特性就算看完其实很难有深入的理解和使用心得。只能持续学习,遇到问题再解决问题。

至于专业内容,比如湍流、反应、燃烧等等,每个人专业不同,不在此讨论内,没什么好说的。

OpenFOAM 第 0 步

环境准备

OpenFOAM环境准备 | 𝓐𝓮𝓻𝓸𝓼𝓪𝓷𝓭 (aerosand.cn)

常用指令

OpenFOAM常用指令 | 𝓐𝓮𝓻𝓸𝓼𝓪𝓷𝓭 (aerosand.cn)

OpenFOAM 第 1 步

OpenFOAM 第 1 步必不可少,特别是对于第一次接触 OpenFOAM 的新人来说。请不要忽略它,请耐心走完。

User Guide

官方用户指南 User Guide (openfoam.com)

  • 官方用户指南无论如何都应该是最先被阅读的材料
  • 官方指南也许不是基于最新版本,但是并不影响阅读和学习
  • 通过官方手册,可以对 OpenFOAM 有一个最初的了解

Tutorial Guide

阅读完官方手册就应该立即阅读教程指南。链接如下

官方教程指南 Tutorial Guide (openfoam.com)

  • 官方教程指南是第二最先被阅读的材料
  • 通过官方教程指南,可以对 OpenFOAM 仿真计算的各个环节有清晰的认识

学习建议

  • 学习过程中,如果遇到问题请在 obsidian、typora 之类的任意笔记软件上详细记录下自己的困惑,有些问题其实并不需要马上彻底搞清楚
  • 重点是达成阅读的完整性,形成对 OpenFOAM 使用的整体理解
  • 英语阅读可能确实是一个障碍,但必须要克服
  • 请一页一页一行一行阅读,需要的时候在 OpenFOAM 动手尝试
  • 必要的话,以上两个材料,请阅读第二遍

完成第 1 步后,case 类型的教程基本上就不需要继续拓展了,需要进入第 2 步补足理论。

OpenFOAM 第 2 步

计算流体力学基础

搞懂计算流体力学基本方程

CFD理论基础00 基本方程 | 𝓐𝓮𝓻𝓸𝓼𝓪𝓷𝓭 (aerosand.cn)

  • 现阶段不需要面面俱到特别深入,随着学习推进再逐渐深入

有限体积法基础

基础入门只需要紧盯四大项的一般离散,旨在获得一个对有限体积法思想的整体理解。

如果有人一点都不了解有限差分法,那应该先简单了解有限差分思想

CFD理论基础01 有限差分法初步 | 𝓐𝓮𝓻𝓸𝓼𝓪𝓷𝓭 (aerosand.cn)

然后看有限体积法初步

CFD理论基础02 有限体积法初步 | 𝓐𝓮𝓻𝓸𝓼𝓪𝓷𝓭 (aerosand.cn)

有限体积法四大项离散

强烈推荐相关博士论文介绍理论的章节,简洁直接,脉络清晰

Jasak1996

学习建议

  • 所有的公式都需要新人自己手推 2 遍以上
  • 最好的学习是输出,强烈建议新人独立的梳理一份自己的笔记

强烈推荐同时阅读书籍

The Finite Volume Method in Computational Fluid Dynamics: An Advanced Introduction with OpenFOAM® and Matlab | SpringerLink

新人可能会感觉书中陌生的知识点有点多,英语文本加上符号系统,读起来很容易烦躁,这些都非常正常。本书的阅读可以贯穿整个学习过程,所以不要着急,请耐心阅读,慢慢阅读,不要求所有部分都读懂,可以暂时先跳过一些部分,或者在网上找一些视频或者文章辅助阅读,慢慢啃,会大有帮助。请做好阅读两遍以上的觉悟。

再次强调,不要强求马上看完本书,完成有限体积法初步之后,即可开始第 3 步。

OpenFOAM 第 3 步

迭代

后期的学习很多时候确实无法做到线性推进。很多时候,学习了后面的知识才能补足对前面知识的理解,迭代是必不可少的。

在有了一定的理论基础之后,强烈建议重新跟一个 case 类教程。不仅能够复习补充官方手册的内容,而且能结合有限体积法基础对操作有更深入的理解。推荐 Wolf Dynamics 系列基础教程,完全免费,配套完整,讲解细致,材料翔实。

OpenFOAM Introductory Course Training Material (wolfdynamics.com)

深入

之后推荐下面的博士系列课程,有几点需要注意

PhD course in CFD with OpenSource software (chalmers.se)

  • 请耐心的一步一步跟着做
  • 在 High-level programming 之后,因为涉及 C++ 和算法实现,可能会感觉困难,不理解的地方可以跳过,请不用担心
  • 就算有些地方跳过也要完整跟完,有些地方读不懂也要粗略扫一遍。

OpenFOAM 第 4 步

开发编程基础

旨在补充有限体积法的数值原理和 OpenFOAM 求解器代码实现之间的“跳跃”,补全学习过程中可能有困惑的点,让学习更加顺畅。至于自定义边界条件、utility 等内容均在求解器主框架之后,以后会逐渐涉及,不用担心。

跟完这个系列,对 OpenFOAM 开发编程大概有了一个认识,包含代码架构、编程语法、SIMPLE 算法等内容。

实际开发大多还是基于 OpenFOAM 标准求解器进行修改。

学习建议

C++ 最晚也要从这一步开始学习,至少该断断续续的查询了解。

完成这个系列后,下一步从数学公式出发,一点一点的啃 OpenFOAM 标准求解器。

OpenFOAM 第 5 步

基本求解器

开始 OpenFOAM 的求解器学习。

OpenFOAM 求解器学习系列 | 𝓐𝓮𝓻𝓸𝓼𝓪𝓷𝓭 (aerosand.cn)

这里的求解器学习并不是说要细挖每行代码的实现。我们仍然保持在应用实现层面,重点学习如何利用 OpenFOAM 框架,学习 OpenFOAM 是如何实现从物理方程到数值计算的。在理解原生求解器的过程中,会慢慢发现自己好像可以修改自己的求解器了。

学习建议

动手实践是最好的学习方式。理论推导和编程实现,两方面都要耐心去做。

OpenFOAM 最终步

大部分人的目的应该就是这里,通过前面艰苦的学习,终于要开发能够解决自己专业问题的求解器。

OpenFOAM求解器开发系列 | 𝓐𝓮𝓻𝓸𝓼𝓪𝓷𝓭 (aerosand.cn) #todo


避免绕路

很大可能,新人在知道 OpenFOAM 后,第一步就是试图安装 OpenFOAM,想亲眼看看 OpenFOAM 到底是什么。

开始

除去现在 windows 系统安装 Linux 内核的方案,新人很大可能还是通过虚拟机或者直接安装 Linux 系统。

鉴于网络环境,经过折腾,新人终于安装成功了 ubuntu 系统以及 OpenFOAM。新人也许此时会犹豫要不要找个教程系统学习一下 Linux 系统,要不要学习 Bash,要不要学习 shell,要不要学习命令行,要不要学习 vim?

不需要!现阶段统统不需要!

对于新手,仅会安装 Linux 系统和安装 OpenFOAM 即可!

本相关系列会在讨论中逐渐补充必要的脚本知识、命令行操作等,无需担心。遇到特定的问题再特定的解决,不要投入时间系统学习。

起步

安装 ubuntu 系统 OK!安装 OpenFOAM OK!正式的学习从哪里开始呢?新人大概会很犹豫。

跟着网上的基础教程,新人可能会急切的想把一个仿真完整的运行起来。于是开始一步一步的跟学 cavity 算例, elbow 算例,damBreak 算例等。

也许只需要经过几个标准算例,新人那种顺利运行算例的喜悦就会逐渐消失,取而代之的是越来越多的困惑。比如,网格是怎么关联计算的?指定的离散格式到底什么意思?方程是怎么求解的?那些 Foam 到底有什么区别?并行计算是怎么回事?paraview 其他功能怎么用?怎么查看收敛曲线?等等大小不同的问题。

有的教程没有给出解释,有的教程给出了简明的解释。新人也许会自己上网查询相关解释。要不要上网一个一个查询这些问题的答案?

不需要!起步阶段完全不需要!

新手在这个阶段只需要熟悉 OpenFOAM 是什么,case 计算的流程应该是什么样子。

没有更深层次的理论基础,即使查到这些问题的解答,其实也无法真正理解。

探索

新人在跟过几个标准算例之后,理所当然会想找到更深入的教程。比如官方文档,比如网上的一些视频教程等等。也许有些教程完整看完了,有些教程“跳着”也算是看完了。这类教程可以统称为 case 类教程。

如果没有自定义求解器的需求,其实没有必要用 OpenFOAM,可以直接使用商业软件,快速得到结果。

经过一段时间的磕磕绊绊的模仿学习,新人把每个教程都还算是学习了多遍。新人也许会总结感叹一句,看起来本质上也是修改参数,这样和 Fluent 商软那种点击鼠标有什么本质区别呢?。要不要继续 case 类教程的学习?

不需要!

这里是第一个感受比较“间断”的地方,深入的知识点看不懂,算例看多了感觉流程都很相似。

完整跟过几个 case 其实就可以了,例如 blockMesh 的使用技巧之类的,暂时不用深究太多。我们需要投入时间快速建立对 OpenFOAM 数值求解的整体架构和思路的理解。

这里也是第一个可能会占用大量时间的地方。没有前辈指点的话,新人不得不投入海量时间去阅读遇到的教程、文档、视频,不得不经历这些教程中重复的部分,会觉得坚持看完找到的教程就能更加理解 OpenFOAM。实际上,没有对原理的学习是无法深入理解的。

徘徊

如果经历了上面这些探索的过程,也许几个月甚至半年已经过去了。新人会觉得自己了解 OpenFOAM 但是又不够了解 OpenFOAM。新人反复学习后也许会意识到重点在求解器上。

和 case 教程类似的求解器教程太少了,在看完类似 icoFoam代码解析 教程,icoFoam植入温度方程 教程,interFoam植入温度方法 教程,laplacianFoam求解器 教程,wolf dynamics 教程等内容之后,新人会有短暂的恍然大悟的激动。但是之后会感觉线索又断了,发现网上很难再找到其他的求解器教程。要么是求解器代码语句的直白注释,读起来有种 是这样子,但是我不知道为什么这样写 的感觉。要么是晦涩的求解数值算法,并不能完全看懂。甚至于,大家都在说要多查阅 Doxygen,新人连 Doxygen 具体怎么用其实也是不知道的。

这个阶段出现一个非常浪费时间的问题,当新人找个一个系列教程,如果不从头看,会担心漏掉什么知识点而影响自己的理解;如果从头看,发现它要么完全是 case 类型的教程,要么它是过于晦涩,无法衔接自己的学习流程。

也许有幸,新人能了解并学习到 chalmers cfd 系列教程,感慨自己终于找对了教程。即使有很多问题,反复学习多遍后试图复现它的课后学生作业,发现学生作业太难了,文档和源文件不同,版本不同,说明又不够细致。这些种种困惑,甚至足以让人停下脚步陷入自我怀疑,我漏了哪一步,我该怎么到这一步?。要不要重复看这些教程,继续找教程?

不需要!

这里是第二个会占用大量时间的阶段。

我们还缺点东西。缺少的就是代码背后的数学物理原理。

补足

在意识到 OpenFOAM 本质上是求解偏微分方程组后,新人也许会听从一些建议,转头去搞原理的“复习”和“补足”。

计算流体力学?数学物理方程?有限体积法?有限差分法?有限元法?数值计算方法?线性代数?

说实话,这些话题里,随便拿出一个都可以是一本教科书,没有月余难以看完理解,要做到熟练运用,没有时间和练习的沉淀,更是难上加难。这时我们就可以理解,为什么大学里一门课要延续那么久,我们为什么在日后还是会辜负那些在期末突击通过的课程。

既然涉及到大量的矩阵运算,新人也许会担心自己的线性代数不够好。要不要系统地复习一下线性代数呢?

不需要!

初期学习,很少涉及到矩阵微妙的数学性质。以后遇到困难了再针对性学习。

既然是数值计算,要不要复习一下数值计算方法呢?而且,要不要使用计算机语言去实现一下数值计算方法呢?

不需要!

线性代数方程的求解在 OpenFOAM 使用现成的求解器,初始阶段并不需要顾虑。

大学里的数值方法课程很大一部分可能都是数学系老师授课,并不会紧密联系代码实现。新手如果执意去补,将会面临很多的“间断”感和困惑,也会耽误大量的时间。而且,本科阶段很多专业的数值方法课程大部分到常微分方程就戛然而止,反而物理中更常见的偏微分方程的数值方法极少提及。说到底,以后的线性方程组求解可以使用现成的高效率的线代求解器,不用管。

如果是要自己从零手码程序跑计算,那么另当别论,就不在这里讨论的范围之内。

需不需要复习数学物理方程的教材?

不需要!

偏微分方程最后都是落在数值方法求解上,解析方法以及偏微分方程的数学性质个人觉得暂时没有必要深入。相反会扰乱主线推进。

既然原理上是数值方法求偏微分方程组?要不要系统地看偏微分方程数值求解的教科书?

不需要!而是需要直接看有限体积法。

这里也很容易耽误大量的时间。

举个例子,比如 Sandip 的偏微分方程数值解法写得非常好。但它不是基于 CFD 背景的,很多表述和实现对于新手很难去对应到 OpenFOAM 中。线性代数方程求解和误差分析等等内容也不是现阶段必须的。以后可以慢慢看,但是不需要现阶段看,或者不需要现阶段马上看完。对英文材料阅读所花费的时间也是实实在在的肉眼可见。

同样,如果要自己码程序跑计算,另当别论。

有一些新人在了解知道 OpenFOAM 是 C++ 编写求解偏微分方程的程序,十分想找到相关教材。虽然不多,其实有那么几本基于 C++ 面向对象的科学计算书籍和求解偏微分方程组的书籍,要不要看? 甚至想着要对数据后处理,找着找着,看到了一些涉及计算机图形学的 C++ 编程书籍,要不要看?

不需要!

要确定自己是要用 C++ 完全从零写求解器,还是使用 OpenFOAM 框架。如果准备使用 C++ 面向对象特性完全从零写大型求解器,无师兄师姐指导,自己课题组又没有流传下来的代码参考,那真的要十分努力,且自求多福。 如果是使用 OpenFOAM 框架,至少暂时完全不需要。时间很宝贵,先把时间用在主要任务上。如果长时间不能入门 OpenFOAM 求解器,真的很难向自己或者老师解释。

小结

原谅我啰里啰唆的写了这么多,上面说的那些可能也只是小部分人遇到的问题,描述可能也有所偏颇。诚然,如果新人思路清晰,对上面的一部分选择做了肯定,选择性的做自我强化,而且自身基础好,执行力强,领悟快,只花费了一个暑假多的空余时间,那肯定是极好的。

对于普通人来说,看不懂、理解模糊,甚至看的昏昏欲睡都是再正常不过得学习状态,特别是对于那些独自前进的自学勇士们来说,更是如此。上述的任一个选择作了展开,这个也投入几天看看,那个也投入几个星期试试,再来几个小项目练习一下,都可能是月余以上的时间花销。再遇到别的什么事情耽搁一下,也许兜兜转转走走停停花费了超过一年的时间,新人仍然只会使用现成的求解器跑一下简单算例,还是没能够进行针对自己专业的问题进行求解器修改和开发,对 OpenFOAM 仍然很难有整体的概念,海量困惑仍然有待解决。这时既没法对自己交代,也没法对自己的老师解释。这是极其沉重的时间成本,也是经受不起的沉没成本。

结语

不管生活还是学术,时间都是最宝贵的财富。

亲爱的朋友,希望你能在有限的时间和有限的空间内尽可能地丰富。无论哪一条路,都能走的稳,走的快,走的远,拿到自己人生的解。