如何在OF6中添加新的湍流模型?

我尝试了网上现有的几个教程,一直在编译湍流模型时出现了大量的问题,有没有大侠有经验可分享?
尝试的教程如下:
1、 http://www.cfluid.com/thread-57757-1-1.html
2、https://pingpong.chalmers.se/public/pp/public_courses/course07056/published/1483976028698/resourceId/3473555/content/41433022-b456-4cd1-b467-4f7ef688841e/41433022-b456-4cd1-b467-4f7ef688841e.html?language=sv

总的来说,步骤是:
一、复制现存的一个湍流模型到自己的工作文件夹下;
二、把这个老的湍流模型名字改为新模型名字,并作修改使之成为新模型(包括文件名,文件内容里对应的都要修改)
三、编译

我现在的问题主要出现在编译这一步.还望各位大侠多予指点

再补充一些关于我个人的必要的信息:
我目前学习的知识似乎是这样的:编译一个文件必须有一个Make文件夹,文件夹里存有file和option文件用于给编译器提供必要的信息.但是湍流模型里似乎不是每个模型都有一个对应的Make文件夹.因此,我不能根据现在所学弄明白哪里出了问题

我觉得出问题可能有以下两个方面 (如果你有具体的问题可以具体分析,这里只是一个笼统的分析,不一定完全解决你的问题):

  1. 涉及到 Run-Time Selection 相关的宏。
  2. Make 文件夹里的 files 和 options 两个文件。

Run-Time Selection 相关的宏

这个涉及到的问题是:

对于相关湍流模型,是由定义在 src/TurbulenceModels/incompressible/turbulentTransportModels/turbulentTransportModels.C 文件里面的宏确定的,比如:

#include "Stokes.H"
makeLaminarModel(Stokes); // 这个宏函数对模板类进行实例化,调用
                 // addToRunTimeSelectionTable 函数,将实例模型加到 hashTable
...

#include "RNGkEpsilon.H"
makeRASModel(RNGkEpsilon);

每个新的湍流模型,都需要相应的两行类似的语句,因此没有单独的 Make 文件夹。你也在其他的 Make/files 文件里找不到相应的如 RNGkEpsilon.C 的行。

你会注意到 src/TurbulenceModels/incompressible/Make/files

incompressibleTurbulenceModel.C

turbulentTransportModels/turbulentTransportModels.C 

这个文件的第三行就包括上一个宏的列表,因此,在这里进行编译就包含了 incompressible 的所有湍流模型,而不必另外单独对每个模型进行编译了。

旧的版本还没有采用 RTS 的时候,进行的是硬编程,相应的
src/turbulenceModels/incompressible/RAS/Make/files (foam-extend-3.1) 里的情况是

/* RAS turbulence models */
RASModel/RASModel.C

laminar/laminar.C
kEpsilon/kEpsilon.C
...

Make/files and Make/options

Make/options 文件包含了所需头文件的目录,其语法是

    EXE_INC = \\ 
        -I<directoryPath1> \\ 
        -I<directoryPath2> \\ 
        …                \\ 
        -I<directoryPathN>

编译器链接到库文件所在的文件夹,使用 wmake 时,在 Make/options 文件中以 -L 来表示,

  1. $FOAM_LIBBIN;
  2. 跟平台相关的路径在 $WM_DIR/rules/$WM_ARCH/ 文件夹, 例如 /usr/X11/lib$(MPICH_ARCH_PATH)/lib;
  3. 其他文件夹需要在 Make/options 指定.

实际链接所需的库文件以 -l 开头,并以库文件名去掉前缀 lib.so 扩展名,如 libnew.so-lnew 的形式包含进来。缺省情况下,wmake 会包含以下库:

  1. 来自 $FOAM_LIBBINlibOpenFOAM.so
  2. $WM_DIR/rules/$WM_ARCH/ 文件夹里文件指定的系统相关的库,如在 /usr/X11/lib 中的 libm.so$(LAM_ARCH_PATH)/lib 中的 liblam.so
  3. Make/options 中指定的其他库。

Make/options 文件包含了库的路径和名字,如果是执行文件,其编写规则是:

    EXE_LIBS = \\ 
        -L<libraryPath> \\ 
        -l<library1>     \\ 
        -l<library2>     \\ 
        …               \\ 
        -l<libraryN>

即库的路径是以 -L 开头的,库的名称是以 -l 开头的。

如果编译的是库文件 (.so 结尾),则为

    LIB_LIBS = \\ 
        -L<libraryPath> \\ 
        -l<library1>     \\ 

编译器需要提供 .C 源文件列表。列表必须包括主 .C 文件,还有其他并未包括在类库的源文件。例如,用户创建的新类或现有类的一些新的功能。.C 文件必须全部包括在 Make/files 文件中。大多数情况下列表仅须列出 .C 文件的文件名。

Make/files 文件也包括编译的可执行文件的名称和路径,由 EXE = syntax 指定。标准求解器一般存于 $FOAM_APPBIN,用户自行创建的一般存于 $FOAM_USER_APPBIN
推荐用户在 $WM_PROJECT_USER_DIR 创建个人的求解器。标准做法是每一个求解器一个文件夹。 如果用户自创求解器,推荐其在 Make/files 中指定的可执行文件路径为 $FOAM_USER_APPBINMake/files 文件示例如下:

newApp.C

EXE = $FOAM_USER_APPBIN/newApp

如果是编译的是库,一般格式为

newLib.C

LIB = $FOAM_USER_APPBIN/libnewLib

编译的时候,如果是编译库的话,在库源文件夹下运行

wmake libso

如果是编译求解器的话,在求解器源文件夹下运行

wmake
2 Likes

如果是这样,我是不是把这个文件复制过来,保留里面所有内容,然后加上我要新建的湍流模型就好了,比如:

#include "myRNGkEpsilon.H"
makeRASModel(myRNGkEpsilon);

如果你需要在自己的用户文件夹下创建湍流模型的话,具体做起来还是要复杂一些:

  1. 需要把 src/TurbulenceModels 这个文件夹 copy 到你指定的目录,在这里面的 turbulenceModels/RAS 里添加你的湍流模型,用 ln -s 做个链接到 lnInclude 文件夹下,在 incompressible/turbulentTransportModels/turbulentTransportModels.C 添加你的模型,把 turbulenceModels/Make/files 最后一行修改为
LIB = $(FOAM_USER_LIBBIN)/libturbulenceModels

incompressible/Make/options 文件修改一下,把

    -lturbulenceModels \

换成

    -L$(FOAM_USER_LIBBIN)/libturbulenceModels \

相应的,incompressible/Make/files 也做一下修改,

LIB = $(FOAM_USER_LIBBIN)/libincompressibleTurbulenceModels

TurbulenceModels/ 文件夹下做 ./Allwmake 就可以了。

  1. 在你的计算模型里,还需要把原来的 turbulenceModels 换成新的路径,比如
EXE_LIBS = ... \
        -L$(FOAM_USER_LIBBIN)/libturbulenceModels \
        -L$(FOAM_USER_LIBBIN)/libincompressibleTurbulenceModels

重新 wmake 一次。

如果你是在 OpenFOAM src 下添加你的模型的话,只需要把你的模型添加到 turbulentTransportModels.C 里面,用 ln -s 做个链接到 lnInclude 文件夹下。在 TurbulenceModels 文件夹下运行 Allwmake

2 Likes

我这里有一个例子:
GitHub

1 Like

过了两年…我深入学习了C++的模板编程,才搞明白你说的每一个字…

这是一件多么值得庆贺的事! :joy: