吾生有涯 学海无涯
析模有界 知识无界

OpenFOAM编程系列|0B 开端

本案例演示利用OpenFOAM中的Foam::Info函数输出信息,以及在Linux系统中配置OpenFOAM编译环境。

1 文件准备

启动终端,采用下面的命令创建文件:

cd $FOAM_RUN
mkdir demo0
touch demo0/demo0.C

文件结构如下图所示。

这里创建了一个名为demo0的文件夹,并在其内创建了一个源文件demo0.C。

利用任意文本编辑器(如vim、vscode等)打开源文件demo0.C。本案例以vim作为编辑器,输入下面的命令:

cd demo0 # 进入demo0目录
vim demo0.C # 用vim打开并编辑demo0.C文件

输入下面的代码:

#include "fvCFD.H"
int main(int argc, char * argv[])
{
std::cout << "Hello,OpenFOAM!" << std::endl;
Info << "Hello,OpenFOAM!" << nl;
return 0;
}

3 编译源文件

Linux系统中可以使用g++编译C++代码。可以使用下面的命令测试本机上是否安装了g++:

g++ --version

若输出如下图所示,则表示已经安装完毕。

若提示g++找不到,则需要安装GCC,具体安装方法可以搜索网络。

若g++安装完毕,可以利用下面的命令编译源文件demo0.C:

g++ demo0.C -o demo0

然而出现下面的错误提示:

提示找不到头文件fvCFD.H。

可以利用下面的命令在OpenFOAM安装路径下搜索头文件fvCFD.H:

find $FOAM_SRC -name fvCFD.H

搜索结果如下图所示:

搜到了两条记录,这两个路径都可以使用。

将编译命令改写为:

g++ -std=c++14 -m64 -pthread -DOPENFOAM=2112 -DWM_DP -DWM_LABEL_SIZE=32 -Wall -Wextra -Wold-style-cast -Wnon-virtual-dtor -Wno-unused-parameter -Wno-invalid-offsetof -Wno-attributes -Wno-unknown-pragmas  -O3  -DNoRepository -ftemplate-depth-100 -I/usr/lib/openfoam/openfoam2112/src/finiteVolume/lnInclude -I/usr/lib/openfoam/openfoam2112/src/meshTools/lnInclude -iquote. -IlnInclude -I/usr/lib/openfoam/openfoam2112/src/OpenFOAM/lnInclude -I/usr/lib/openfoam/openfoam2112/src/OSspecific/POSIX/lnInclude   -fPIC -c demo0.C -o demo0.o
g++ -std=c++14 -m64 -pthread -DOPENFOAM=2112 -DWM_DP -DWM_LABEL_SIZE=32 -Wall -Wextra -Wold-style-cast -Wnon-virtual-dtor -Wno-unused-parameter -Wno-invalid-offsetof -Wno-attributes -Wno-unknown-pragmas -O3 -DNoRepository -ftemplate-depth-100 -I/usr/lib/openfoam/openfoam2112/src/finiteVolume/lnInclude -I/usr/lib/openfoam/openfoam2112/src/meshTools/lnInclude -iquote. -IlnInclude -I/usr/lib/openfoam/openfoam2112/src/OpenFOAM/lnInclude -I/usr/lib/openfoam/openfoam2112/src/OSspecific/POSIX/lnInclude -fPIC -Xlinker --add-needed -Xlinker --no-as-needed demo0.o -L/usr/lib/openfoam/openfoam2112/platforms/linux64GccDPInt32Opt/lib
-lOpenFOAM -ldl
-lm -o demo0

注:由于头文件相互包含极其混乱,所以上面的编译命令是使用wmake自动生成的。

执行完毕后如下图所示。

在当前路径下生成了可执行文件demo0,可以利用命令./demo0执行程序,如下图所示,可以看到程序顺利执行。

3 指定编译选项

利用g++直接编译OpenFOAM程序显然不是普通人能干的事情,因为需要指定一大堆的开关选项、头文件与库文件位置,稍不留神就出错。好在OpenFOAM提供了wmake工具,此工具衍生于大名鼎鼎的Make程序。

wmake程序需要在当前文件夹中包含一个名为Make的子文件夹,而且子文件夹中包含名为filesoptions的文件。利用下面的命令创建文件结构:

mkdir Make
touch Make/files
touch Make/options

创建完毕后的文件结构如下图所示。

我们已经准备了Make文件夹及其内部的files与options文件。

  • Make/files:指定要编译的源文件以及目标文件
  • Make/options:编译选项,主要包括头文件位置以及外部库的位置

现在需要往files文件与options文件中写内容。

  • files文件。指定被编译的源文件及目标文件。
  • options文件。指定包含的头文件与库文件及其路径

下面对这两个文件进行修改。

  • 修改files文件的内容
demo0.C
EXE = demo0

文件第一行指定需要被编译的源文件名demo.C;文件第二行指定编译完成后生成的可执行文件为demo0,其位于当前路径下。

  • 修改options文件的内容
EXE_INC = 
-I$(LIB_SRC)/finiteVolume/lnInclude
-I$(LIB_SRC)/meshTools/lnInclude

EXE_LIBS =
-lfiniteVolume
-lmeshTools

文件中,EXE_INC中列出所有需要包含的头文件,以开关-I作为标识。符号为换行符,其实也可以不用换行符将所有的内容写在一行。$(LIB_SRC)是一个环境变量,其等同于$FOAM_SRC,表示OpenFOAM的安装路径,因此也可以写成:

EXE_INC = 
-I$(FOAM_SRC)/finiteVolume/lnInclude
-I$(FOAM_SRC)/meshTools/lnInclude

或者直接写成绝对地址:

EXE_INC = 
-I/usr/lib/openfoam/openfoam2112/src/finiteVolume/lnInclude
-I/usr/lib/openfoam/openfoam2112/src/meshTools/lnInclude

EXE_LIBS表示文件编译过程中需要加载的库。在本案例中实际上可以不用加载。库的加载可以使用开关-l-L,若使用小写的-l则后面跟库的名字,若使用大写的-L则后面跟库的路径。

files与options文件修改完毕并保存后,可以回到源文件所在路径,输入命令:

wmake

编译及程序执行如下图所示。

可以看到程序编译及执行都没有问题。

此时文件夹中的内容如下图所示。

wmake文件自动创建了一个名为linux64GccDPInt32Opt的文件夹,内部存放了编译过程中生成的中间文件,如果不想要这些文件,可以使用命令wclean进行清除。


(完)

本篇文章来源于微信公众号: CFD之道

赞(2) 打赏
版权声明:未经允许,请勿随意用于商业用途。
文章名称:《OpenFOAM编程系列|0B 开端》
文章链接:https://www.topcfd.cn/18717/
本站资源仅供个人学习交流,请于下载后24小时内删除,不允许用于商业用途,否则法律问题自行承担。
分享到

说两句 抢沙发

评论前必须登录!

 

觉得文章有用就打赏一下文章作者吧

非常感谢你的打赏,我们将继续给力更多优质内容,让我们一起创建更加美好的网络世界!

支付宝扫一扫

微信扫一扫

登录

找回密码

注册