openfoam新版本湍流模型编译



  • openfoam湍流模型的架构貌似和老版本很不一样?最近需要对openFOAM中的湍流模型做一些修改,于是先拿网上的一个修改kEpsilon模型的例子来练手。。将openFOAM4.1版本中的kEpsilon文件夹拷出,目前只对kEpsilon.H和kEpsilon.C文件的文件名和类名进行了修改,得到了DurbinV2F.H和DurbinV2F.C文件。编译的files文件和options文件如下:
    files

    V2F/DurbinV2F.C 
    
    LIB = $(FOAM_USER_LIBBIN)/libaddedRASModels 
    

    options

    EXE_INC = \
        -I$(LIB_SRC)/TurbulenceModels/turbulenceModels/lnInclude \
        -I$(LIB_SRC)/transportModels \
        -I$(LIB_SRC)/finiteVolume/lnInclude \
        -I$(LIB_SRC)/meshTools/lnInclude \
    
    LIB_LIBS = \
        -lfiniteVolume \
        -lmeshTools
    

    但是,编译器却返回:

    g++ -std=c++0x -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 -I/opt/openfoam4/src/TurbulenceModels/turbulenceModels/lnInclude -I/opt/openfoam4/src/finiteVolume/lnInclude -I/opt/openfoam4/src/meshTools/lnInclude  -IlnInclude -I. -I/opt/openfoam4/src/OpenFOAM/lnInclude -I/opt/openfoam4/src/OSspecific/POSIX/lnInclude   -fPIC -c V2F/DurbinV2F.C -o Make/linux64GccDPInt32Opt/V2F/DurbinV2F.o
    V2F/DurbinV2F.C:40:6: error: redefinition of ‘void Foam::RASModels::DurbinV2F<BasicTurbulenceModel>::correctNut()’
     void DurbinV2F<BasicTurbulenceModel>::correctNut()
          ^
    In file included from V2F/DurbinV2F.H:212:0,
                     from V2F/DurbinV2F.C:26:
    V2F/DurbinV2F.C:40:6: error: ‘virtual void Foam::RASModels::DurbinV2F<BasicTurbulenceModel>::correctNut()’ previously declared here
     void DurbinV2F<BasicTurbulenceModel>::correctNut()
    

    等等 告诉我 redefinition 了。
    失败后我想看看kEpsilon原本对应的Make文件夹。。但是奇怪的是发现turbulenceModels这个文件夹下面的files文件里并没有kEpsilon.C,包括常见的RNG、SSTkOmega等也没有,翻了其他文件夹下的files也没发现,老版本的openfoam里turbulenceModels文件夹下面的files是指定了kEpsilon.C的。

    这就非常疑惑了,新版本openfoam究竟是在哪里编译了这些湍流模型:zoule:
    另外,新版本openfoam中添加湍流模型应该怎么做呢:zoule:
    求各位大神解惑。。



  • 已解决。。在GitHub上找到了例子,照着做就ok…GitHub大法好

    https://github.com/BjarkeEltardLarsen/RANS_stableOF50



  • 继续求救:zoule: 最近试图对SST k-w模型做一些修改。。其中有几行代码是试图读入场中的一些变量以及transportProperties文件中设置的一些常量。这几行代码如下:

    const volScalarField& alpha1= this->mesh_.lookupObject<volScalarField>("alpha.water");
    const volScalarField& alpha2= this->mesh_.lookupObject<volScalarField>("alpha.vapour");
    
    const dictionary& transportProperties= this->mesh_.lookupObject<IOdictionary>("transportProperties");
    const dictionary& phase1= transportProperties.subDict("water");
    const dictionary& phase2= transportProperties.subDict("vapour");
    const dimensionedScalar& rho1 = phase1.lookup("rho");
    const dimensionedScalar& rho2 = phase2.lookup("rho");
    

    但是编译的时候却报了这个错误:

    lnInclude/modkOmegaSSTBase.C:42:69: error: expected primary-expression before ‘>’ token
     const volScalarField alpha1= this->mesh_.lookupObject<volScalarField>("alpha.water");
                                                                         ^
    lnInclude/modkOmegaSSTBase.C:43:69: error: expected primary-expression before ‘>’ token
     const volScalarField alpha2= this->mesh_.lookupObject<volScalarField>("alpha.vapour");
                                                                         ^
    lnInclude/modkOmegaSSTBase.C:59:78: error: expected primary-expression before ‘>’ token
      const dictionary& transportProperties= this->mesh_.lookupObject<IOdictionary>("transportProperties");
                                                                                  ^
    make: *** [Make/linux64GccDPInt32Opt/makeTurbModel.o] 错误 1
    
    

    error: expected primary-expression before ‘>’ token
    这些错误都发生在lookupObject函数上,是否是我这个函数的写法有问题?在网上搜也未得到解释方法,请问各位有碰到类似情况的吗?望各位大神不吝赐教:zoule:


  • 网格教授 OpenFOAM教授 管理员

    const volScalarField& alpha2= this->mesh_.lookupObject<volScalarField>("alpha.vapour");

    看了几遍,确实没问题啊


  • OpenFOAM教授

    const volScalarField& alpha1 = 
    (
        this->mesh_.objectRegistry::template
        lookupObject<volScalarField>("alpha.water")
    );
    const volScalarField& alpha2 = 
    (
        this->mesh_.objectRegistry::template
        lookupObject<volScalarField>("alpha.vapour")
    );
    

  • 网格教授 OpenFOAM教授 管理员

    嗯,第一次见楼上这么用 :zoule:


  • 网格教授 OpenFOAM教授 管理员

    我试了一下,确实可行。 @lllwonderliquid 你试试?
    研究研究,还没这么用过。


  • OpenFOAM教授

    @东岳

    C++编译器在编译类模板时采用的是 two-phase lookup 的策略, 对于 lookupObject 这种带模板参数的函数,调用时必须在前面加 templatetypename

    参考:
    https://stackoverflow.com/questions/610245/where-and-why-do-i-have-to-put-the-template-and-typename-keywords


  • 网格教授 OpenFOAM教授 管理员

    我一直都是这么用的:?const volScalarField& alpha2= mesh_.lookupObject<volScalarField>("alpha.vapour");



  • 参照@wwzhao 前辈的做法·,果然编译通过了,目前正在测试中,开心^-^。非常感谢!
    其实还有问题想问两位前辈,对于一个刚接触openfoam代码改写的人,应该如何去慢慢掌握of中的代码结构、风格,以及各种类的用法?目前的我一打开Of中的某.C文件就有些懵逼。。



  • @东岳 前辈,貌似我改写的那几行在3.0之前的版本这么用可以编译成功T-T,看到别人在2.4.0这么用过
    const volScalarField& alpha2= mesh_.lookupObject<volScalarField>("alpha.vapour");


  • OpenFOAM教授

    @lllwonderliquid

    改写的那几行在3.0之前的版本这么用可以编译成功

    3.0版本之前没有这个问题。3.0版本的湍流模型框架重写了,所有的湍流模型都变成了类模板,所以在类中调用函数模板时需要加 templatetypename


  • 网格教授 OpenFOAM教授 管理员

    我在OpenFOAM-5.x中也是这么写的 const volScalarField& alpha2= mesh_.lookupObject<volScalarField>("alpha.vapour");


  • OpenFOAM教授

    @东岳

    我在OpenFOAM-5.x中也是这么写的

    你是在类模板中这么用的么?


  • 网格教授 OpenFOAM教授 管理员

    我测试了下。原来类模板中都要写成这种形式:

    const volScalarField& alpha1 = 
    (
        this->mesh_.objectRegistry::template
        lookupObject<volScalarField>("alpha.water")
    );
    

  • OpenFOAM教授

    对于一个刚接触openfoam代码改写的人,应该如何去慢慢掌握of中的代码结构、风格,以及各种类的用法?

    OpenFOAM 用了大量的 OO 和 GP 编程思想,如果没有这方面的基础,代码阅读起来会比较吃力。并且读代码之前也需要一定的 CFD 理论基础。

    • 代码结构:Google “Five Basic Classes in OpenFOAM”,这个是比较入门的,理解了这个文档中提及到的几个类就可以算的上是入门了。

    • 代码风格:OpenFOAM Foundation 推出过一个编码风格,见这里

    • 类的用法:多读源码,cpp-guide



  • @wwzhao 非常感谢前辈的指点^-^


  • 网格教授 OpenFOAM教授 管理员

    确实是个新知识!
    const volScalarField& alpha2= mesh_.objectRegistry::template lookupObject<volScalarField>("alpha.vapour");