当前位置: 首页 > 文档资料 > OpenFOAM 编程入门 >

hello CFD(C++)

优质
小牛编辑
135浏览
2023-12-01

现在在myFirstFoam.C中写代码来输出hello CFD了。首先简单介绍一下上一节创建的这些东西都是做什么的:

  • 目录文件夹下的.C文件是OpenFOAM/C++的主程序(注意大写);

  • Make文件夹是OpenFOAM特有的,里面主要包含两个文件files和options;

  • files用来指定OpenFOAM顺序进行编译的文件名称以及路径

  • options用来指定OpenFOAM需要调用的外挂库的路径以及名称

不管是编译库,还是编译OpenFOAM程序。OpenFOAM均采用上面的结构。下面,用户可选择一个任意的文本编辑器,打开myFirstFoam.C文件,输入下面的代码:

#include <iostream>

using namespace std;

int main()
{
    cout << "hello CFD" << endl;
    return 0;
}

这是一段非常简单的C++代码,下面来具体分析一下。第一行#include <iostream>表示程序将iostream的文件加入到当前程序中。其中的#include学名叫预处理编译指令。目的在于简化代码,否则用户需要把iostream的文件中所有代码拷贝过来。类似的,用户也可以在这里包含其他文件。有人在这里会问:

怎么知道应该写#include 而不是#include ?

很遗憾,对于本例子,这个是死记硬背的。后期编程的时候,则是用户需要自己去OpenFOAM源文件里面找的。需要什么头文件,就写什么头文件。举例,用户可能需要在编程环境中调用volScalarField类型,这样,就需要在程序最开始,将volScalarField这个类型进行包含。在OpenFOAM中,可以通过#include "volFields.H"来处理。其中的volFields.H,只能用户自己去找,没有规律。

下面看using namespace std;。不过,最简单的理解办法是,现在忽略这一行,以后再关心它。

下面就是主函数了,main函数是一个特殊的函数,在可执行的OpenFOAM/C++程序中,它总是最先运行的代码。int main()声明了一个叫做main的函数,它没有参数。如果有参数的话,它们的名称应该出现在小括号()。但具有一个返回值,类型为int,因此在程序的最后,会存在一行代码return 0;。最简单的理解方法是,将所有的主程序函数头都写成int main()(当然你可以写成void main(),它并不需要返回值)。但其中的main是不能变的,大小写也不能变,必须这样写。

同时还须注意,函数体被包裹在花括号中{}。OpenFOAM/C++要求所有函数体都要用花括号{}包裹起来(有些语言,当函数体只有一行时可以省略花括号,但在OpenFOAM/C++中是不行的)。OpenFOAM中一般将第一个{和第二个}单独起行。这是良好的代码风格。

对了,OpenFOAM对代码风格的要求极为苛刻,感兴趣的可以跳转OpenFOAM代码风格规范

然后是cout << "hello CFD" << endl;。在C++中,cout表示向屏幕输出,和C语言中的printf一样。在输出字符的时候,要将字符用""括起来。也就是说""中的hello CFD是字符串。endl表示换行。随后以分号;结尾。这一行是纯C++语言。return 0;表示主函数的返回语句,程序执行到这里就结束了。总结一下:

#include <iostream> //对iostream进行包含,因为程序会用到

using namespace std; //名称空间,暂且不管这一行

int main() //主程序函数头
{
    cout << "hello CFD" << endl; //cout表示输出,endl表示换行
    return 0; //主程序结束
}

那么,现在主程序就写完了。下一步就是通过OpenFOAM进行编译。要注意,程序的运行和编译是两个单独的步骤

在进行编译之前,首先需要告诉OpenFOAM编译哪个文件,编译成程序还是库,这需要在Make文件夹下的files中指定。本范例编译后的结果为程序,那么在files中需要这样填写:

myFirstFoam.C

EXE = $(FOAM_USER_APPBIN)/myFirstFoam
  • 第一行表示编译Make文件夹下的myFirstFoam.C文件。

  • 第二行表示编译成为程序(EXE),存储在$FOAM_USER_APPBIN路径下,程序的名字叫做myFirstFoam。用户可以随意的改写,比如写成:

myFirstFoam.C

EXE = /home/dyfluid/newFolder/myFirstFirstFoam

则相应的程序被命名为myFirstFirstFoam,并且存储在/home/dyfluid/newFolder/文件夹下。在进行这些准备工作之后,就可以开始编译了。OpenFOAM中所有的程序(库)的编译器调用命令为:wmake,用户应该切换到程序目录下,运行wmake:

$ wmake

其会输出:

Making dependency list for source file myFirstFoam.C
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
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 -Xlinker --add-needed -Xlinker --no-as-needed Make/linux64GccDPInt32Opt/myFirstFoam.o -L/home/dyfluid/OpenFOAM/OpenFOAM-5.x/platforms/linux64GccDPInt32Opt/lib \
     -lOpenFOAM -ldl  \
     -lm -o /home/dyfluid/OpenFOAM/dyfluid-5.x/platforms/linux64GccDPInt32Opt/bin/myFirstFoam

这样,OpenFOAM环境下的myFirstFoam程序就编译成功了。用户可以键入myFirstFoam尝试运行,应该会输出hello CFD了。myFirstFoam只是在OpenFOAM环境下编译纯C++语言,那么在下一步,就要对这个程序进行更改,使用OpenFOAM的语句来输出hello CFD。