Openfoam学习记录 - 基本的文件结构

Openfoam学习记录一 - 基本的文件结构

从现在开始学习开源软件Openfoam并记录学习的过程。因为Openfoam的内容非常多非常杂,需要及时梳理方便回顾,并上手做一些小案例。我总觉得之前学习CFD不到位一个点就是太重视输入,不重视输出,不重视结果的讨论与分析,这是一个毛病,也是我在写使用Openfoam博客中想加入的东西来帮助自己改正。

这个学习记录博客素材的主要来源: Wolfdynamics培训资料(http://www.wolfdynamics.com/tutorials.html?layout=edit&id=181)、武汉理工大学博士汪洋的培训课程及其开源的Openfoam入门培训讲义(B站名:大官人学CFD)、红宝书、Openfoam用户指南、以及CFD-ONLINE的论坛内容。因为是入门记录,所以内容上会有一些重合内容,对我来说也相当于是资料的整理和归纳。

Openfoam的文件结构

使用快捷命令foam可以直接进入主文件夹,在终端中输入tree -L 1可以看到:

1
2
3
4
5
6
7
8
9
10
11
12
13
├── Allwmake
├── COPYING
├── README.md
├── README.org
├── applications #求解器,前后处理工具及其他工具源码
├── bin #常用的脚本
├── doc #Openfoam文档,需要使用Doxygen编译本地文档
├── etc #环境文件夹
├── platforms
├── src
├── test
├── tutorials
└── wmake
在Openfoam中的bashrc文件中,定义了Openfoam中的基本设置,包括并行核数、编译平台、并行MPI类型等等,另外还可以在$WM_PROJECT_DIR/etc/config.sh/aliases文件中给出了快捷指令的含义。例如foam是进入Openfoam中主文件夹,tut是进入自带案例文件夹。

常用的三个Linux命令

  1. grep命令:搜索命令,用来在输入文本的中搜索特定的内容,并输出到终端界面上,支持正则表达式匹配。用法是grep [option] 搜索内容 搜索文件,不同的option代表的含义的不同: -i:忽略字符大小写 -r:递归地搜索所有子目录 -w:只匹配整个单词,而不是单词的一部分 -v:反转搜索结果,即输出不包含匹配字符串的所有行 -c:输出匹配到的行数而非匹配行的内容 grep -i "hello" file1.txt 表示忽略大小写,在file1.txt中找到相应包含"hello"

  2. find命令:在指定目录下查找文件和目录,使用不同的选项来过滤和限制查找的结果。用法是find [path] [expression],find . -name "openfoam",表示在当前文件夹下查找文件名中包含openfoam的文件,find /path/to/search -mtime -7找出7天内修改的文件,find /path/to/search -maxdepth 2 -name "*.txt"这个命令会在路径 /path/to/search 及其子目录中查找扩展名为 .txt 的文件,但只会搜索到第二层子目录,不会进一步递归下去。

  3. awk命令:awk命令是一种经典的文本处理工具,主要用于在 Unix/Linux 环境下对文本文件进行数据提取和格式化。可以接受一个或多个文件作为输入,然后按照给定的规则对每行数据进行处理,并输出结果到标准输出或指定的文件。用法awk 'pattern { action }' filename。awk -F ',' '$2>30 { print }' data.csv,输出 data.csv 文件中第二列大于30的行。

Aplications文件夹

OpenFOAM的application文件夹存储了OpenFOAM中可执行程序的源代码和相关文件,主要是C++源代码和Makefile文件,并且使用OpenFOAM库进行编译。App文件内的内容非常重要,在该文件内做的修改会应用到Openfoam全局,所以需要用户自己建立专属于用户自己的App文件夹。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
├── Allwmake
├── solvers #各类求解器的源代码,以下是按照用途进行分类的源码
│   ├── DNS #直接数值模拟求解器
│   ├── acoustic
│   ├── basic
│   ├── combustion #燃烧反应求解器
│   ├── compressible #可压缩求解器
│   ├── discreteMethods
│   ├── doc #文档
│   ├── electromagnetics
│   ├── financial
│   ├── finiteArea
│   ├── heatTransfer
│   ├── incompressible
│   ├── lagrangian
│   ├── multiphase #多相流求解器
│   └── stressAnalysis
├── test #测试文件夹
│   ├── 00-dummy
│   ├── 00-machine-sizes
│   ├── BinSum
│   ├── CircularBuffer
│   ├── Circulator
│   ├── CompactIOList
│   ├── DynamicList
│   ├── DynamicList2
│   ├── Enum
......

├── tools #常用工具源码
│   ├── README.md
│   ├── foamCalc
│   └── foamExprParserInfo
└── utilities #含了一些实用工具,用于处理网格、后处理、转换和可视化数据等任务。
├── doc
├── finiteArea
├── mesh
├── miscellaneous
├── parallelProcessing
├── postProcessing
├── preProcessing
├── surface
└── thermophysical

bin文件夹

bin文件夹中包含了许多实用的shell脚本,每个脚本在激活Openfoam环境时,可以直接当做命令使用。例如foamCleanTutorials脚本,可以将所有的计算结果全部清空。paraFoam脚本可以直接启动paraview进行后处理。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
.
├── foamCheckJobs
├── foamCleanPath
├── foamCleanPolyMesh #清除网格
├── foamCleanTutorials #清除计算结果
├── foamCloneCase
├── foamCopySettings
├── foamCreateVideo
├── foamEndJob
├── foamEtcFile
├── foamGetDict
├── foamInstallationTest
├── foamJob
├── foamLog
├── foamMonitor
├── foamNew
├── foamNewApp #创建自己app
├── foamNewBC
├── foamNewCase
├── foamNewFunctionObject
├── foamNewSource -> ../etc/codeTemplates/source/foamNewSource
├── foamNewTemplate -> ../etc/codeTemplates/template/foamNewTemplate
├── foamPrintJobs
├── foamRunTutorials
├── foamSearch
├── foamSequenceVTKFiles
├── foamSolverSweeps
├── foamSystemCheck
├── foamTestTutorial
├── mpirunDebug
├── paraFoam #启动paraview后处理
└── tools
├── CleanFunctions
├── LogFunctions
├── MakefileDirs
├── README
......
├── doxyFilter.sed
├── findEmptyMake
├── foamConfigurePaths
├── foamCreateCompletionCache
├── foamCreateManpage
├── foamCreateModuleInclude
├── foamExec
├── foamGrepExeTargets
├── foamLog.db
├── foamPackRelease
├── foamUpdateCaseFileHeader
├── git-find-non-ascii
├── git-find-trailingspace
├── help-filter
├── install-dirs
├── install-platform
├── lib-dir
├── openfoam.in
├── pre-commit-hook
├── pre-receive-hook
├── query-detect
├── query-versions
├── source-bashrc
├── update-mpi-links.in
└── vscode-settings

etc文件夹

etc文件夹中包含了许多环境配置文件,包括bashrc、各类模板、以及热物性库等等文件。其中caseDicts中,有许多输入文件的模板。对于自己编写自定义的文件有比较多的参考意义。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
.
├── bashrc
├── bashrc-e
├── caseDicts
├── cellModels
├── codeTemplates
├── colourTables
├── config.csh
├── config.sh
├── controlDict
├── cshrc
├── cshrc-e
├── openfoam
├── prefs.csh
├── prefs.sh
├── templates
└── thermoData

src文件夹

src文件夹中包含了Openfoam最核心、最底层的源代码,其中包括求解器、网格生成器、库函数、物理模型等等。通常情况下,这些源代码需要进行修改,以便用户创建自己的定制应用程序。用户可以通过修改文本文件、头文件或使用C++等编程语言来实现自定义功能。app文件夹中的内容旨在解决流体动力学领域的各种问题。包括求解器和辅助工具,如网格生成器和后处理工具等。这些应用程序大多数都是不需要修改的,用户可以通过控制参数文件(system文件夹中)来设置运行选项。简单地说,src文件夹中的内容更为底层,是app文件夹中内容的基础。

对比src文件和app文件中的差异就是,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
.
├── Allwmake
├── Allwmake-scan
├── ODE
├── OSspecific
├── OpenFOAM
├── Pstream
├── TurbulenceModels
├── atmosphericModels
├── combustionModels
├── conversion
├── dummyThirdParty
├── dynamicFaMesh
├── dynamicFvMesh
├── dynamicMesh
├── engine
├── faOptions
├── fileFormats
├── finiteArea
├── finiteVolume #提供有限体积法离散所需要的底层支持,网格离散、标量、矢量运算等等
├── functionObjects
├── fvAgglomerationMethods
├── fvMotionSolver
├── fvOptions
├── genericPatchFields
├── lagrangian
├── lumpedPointMotion
├── mesh
├── meshTools
├── optimisation
├── overset
├── parallel
├── phaseSystemModels
├── randomProcesses
├── regionFaModels
├── regionModels
├── renumber
├── rigidBodyDynamics
├── rigidBodyMeshMotion
├── sampling
├── sixDoFRigidBodyMotion
├── sixDoFRigidBodyState
├── surfMesh
├── thermoTools
├── thermophysicalModels
├── topoChangerFvMesh
├── transportModels
└── waveModels

platforms文件夹

在编译appOpenfoam源代码和应用程序所生成的二进制文件和库文件都存放在该文件夹中。该文件夹内容十分重要,保存了开发程序所需要的所有库文件。

1
2
3
4
5
6
7
8
. 
├── linux64GccDPInt32Opt
│ ├── applications
│ ├── bin #编译过程中所生成的二进制文件
│ ├── lib #编译过程中所生成的库文件.so文件
│ └── src
└── linux64GccDPInt32OptSYSTEMOPENMPI
└── src #编译所需要的所有源文件,与src文件夹和app文件夹内容对应,但是其中是.o文件和.C.dep文件

小结

认识Openfoam的文件结构对我来说最大的帮助是理解一个大型项目构建的基本逻辑,怎么样去设计框架,例如openfoam将有关网格、前后处理、离散、基础模型放在src中,再将基于这些内容所开发的求解器放在app中,实现分离,将项目构建清晰。然后就是,在日常使用中,哪里出现问题了,可以对照去相应的文件夹找到参考内容。


Openfoam学习记录 - 基本的文件结构
http://example.com/2022/12/03/post03/
作者
Biheng Xie
发布于
2022年12月3日
许可协议