hello CFD(OpenFOAM)
现在使用OpenFOAM的类型来改写myFirstFoam.C输出hello CFD了。在上一节,编译环境的设置已经完毕。在这里用户只需要改写主程序(.C文件)即可。打开myFirstFoam.C文件,输入:
#include "fvCFD.H"
int main()
{
Info<< "hello CFD" << nl;
return 0;
}
上面即通过OpenFOAM编写的输出hello CFD的程序。下面来分析一下具体的语句,第一行#include "fvCFD.H"
表示对fvCFD.H文件进行包含。OpenFOAM中fvCFD.H文件是一个非常大的框架,它把OpenFOAM中大部分的基本的类型都包含了,在初学不知道应该调用OpenFOAM具体的什么类型的时候,建议直接把fvCFD.H文件进行包含省去寻找具体头文件的过程。
好奇的用户可能会想打开fvCFD.H文件来看看里面是什么。在这里不建议初学者刨根问底。不信的话用户可以试试搜索fvCFD.H并打开,看看里面是什么。绝对看不懂并且更加迷惑。
输出语句中的cout
被Info
替代,Info
是OpenFOAM中用来输出的语句。不仅仅可以输出字符串,也可以输出其他各种的场(比如体向量场等)。后面的nl
在OpenFOAM中用来表示换行,等同于C++中的endl
。
那现在,myFirstFoam.C就已经编写好了。用户需要对他进行编译。在对他编译之前,用户可以尝试直接运行:
$ wmake
在这里程序会报错:
dyfluid@dyfluid:~/Solvers_DYFLUID/OpenFOAM_tut/helloCFDOpenFOAM$ wmake
Making dependency list for source file myFirstFoam.C
could not open file fvCFD.H for source file myFirstFoam.C due to No such file or directory
g++ -std=c++11 -m64 -Dlinux64 -DWM_ARCH_OPTION=64 -DWM_DP -DWM_LABEL_SIZE=32 -Wall -Wextra -Wold-style-cast -Wnon-virtual-dtor -Wno-unused-parameter -Wno-invalid-offsetof -O3 -DNoRepository -ftemplate-depth-100 -IlnInclude -I. -I/home/dyfluid/OpenFOAM/OpenFOAM-5.x/src/OpenFOAM/lnInclude -I/home/dyfluid/OpenFOAM/OpenFOAM-5.x/src/OSspecific/POSIX/lnInclude -fPIC -c myFirstFoam.C -o Make/linux64GccDPInt32Opt/myFirstFoam.o
myFirstFoam.C:1:19: fatal error: fvCFD.H: 没有那个文件或目录
compilation terminated.
/home/dyfluid/OpenFOAM/OpenFOAM-5.x/wmake/rules/General/transform:25: recipe for target 'Make/linux64GccDPInt32Opt/myFirstFoam.o' failed
make: *** [Make/linux64GccDPInt32Opt/myFirstFoam.o] Error 1
dyfluid@dyfluid:~/Solvers_DYFLUID/OpenFOAM_tut/helloCFDOpenFOAM$
用户需要注意这个错误!以后你们会经常遇到这个错误。注意,错误提示(重要的代码写三遍!)
myFirstFoam.C:1:19: fatal error: fvCFD.H: 没有那个文件或目录
myFirstFoam.C:1:19: fatal error: fvCFD.H: 没有那个文件或目录
myFirstFoam.C:1:19: fatal error: fvCFD.H: 没有那个文件或目录
这个意思是说编译器找不到fvCFD.H这个文件。原因在于我们在myFirstFoam.C中,对fvCFD.H进行了包含,但没有指定编译器去哪找fvCFD.H这个文件。因此提示没有那个文件或目录
。
Make/options文件内容指定
在这里,用户需要回想一下,在上一些,已经提起
- options用来指定OpenFOAM需要调用的外挂库的路径以及名称;
那么在这里,用户应该改写options文件,将下面的内容添加进去:
EXE_INC = \
-I$(LIB_SRC)/finiteVolume/lnInclude \
-I$(LIB_SRC)/meshTools/lnInclude
其中的
EXE_INC
下面的这几行表示程序中头文件(本例中fvCFD.H)的路径。-I$(LIB_SRC)/finiteVolume/lnInclude
表示fvCFD.H文件存在于$(LIB_SRC)/finiteVolume/lnInclude下。$(LIB_SRC)
是一个环境变量,在OpenFOAM中等同于$(FOAM_SRC)
,其真实的位置可以通过键入echo $FOAM_SRC来查看,其会输出:dyfluid@dyfluid:~/Solvers_DYFLUID/OpenFOAM_tut/helloCFDOpenFOAM$ /home/dyfluid/OpenFOAM/OpenFOAM-5.x/src
即$(LIB_SRC)文件夹等同于/home/dyfluid/OpenFOAM/OpenFOAM-5.x/src文件夹。因此用户这样写也是可以的:
EXE_INC = \ -I/home/dyfluid/OpenFOAM/OpenFOAM-5.x/src/finiteVolume/lnInclude \ -I$(LIB_SRC)/meshTools/lnInclude
前面的
-I
没有解释,OpenFOAM必须要这样写。后面的
\
,如果有换行的话,OpenFOAM必须要添加。如果没有换行,可以不添加,比如这样写都是可以的:EXE_INC = -I$(LIB_SRC)/finiteVolume/lnInclude \ -I$(LIB_SRC)/meshTools/lnInclude
EXE_INC = -I$(LIB_SRC)/finiteVolume/lnInclude -I$(LIB_SRC)/meshTools/lnInclude
如果丢失
\
会报错:Make/linux64GccDPInt32Opt/options:54: *** missing separator。 停止
同时注意,在提示
missing separator
错误之后,即使添加好\
也依然会报错。这时候需要用wclean命令清空一下,再运行wmake。提醒:某些情况下如果Gcc编译器不匹配你的OpenFOAM版本号,也会出现类似问题。这也解释了,为什么比较高版本的OpenFOAM需要比较高版本的Gcc编译器。
在进行设置之后,用户可以运行wmake来对其进行编译随后用myFirstFoam尝试运行。