本案例演示利用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
的子文件夹,而且子文件夹中包含名为files
与options
的文件。利用下面的命令创建文件结构:
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之道
评论前必须登录!
注册