【实用工具】自定义 functionObject

只谈情不闲聊 提交于 2021-02-09 11:02:23
戳蓝字“ OpenFOAM ”关注我们哦!


functionObject 是 OpenFOAM 里在计算过程中或计算完成后用于后处理的工具,例如:用 wallShearStress 输出壁面剪力,用 yPlus 输出壁面 y+ 的值。但是有时候会遇到一些 OpenFOAM 自带工具无法解决的情况,这时咱们就需要使用 O 自定义 functionObject 的功能了。因此笔者这期就主要介绍一下如何实现自定义 functionObject 。

最主要的一个关键词是 codedFunctionObject ,这里笔者给出一个自用的输出壁面面单元中心坐标的一个模板,大家可以举一反三进行改写。
P.S:

1. 该模板文件是放置于 system 文件里的,文件名为 writeCenters ,如果需要使用可以输入:

postProcess -dict system/writeCenters


2. 该模板基于的是 OpenFOAM-v1912 ,输出壁面面单元中心坐标的功能可以通过 writeCellCentres 直接实现。
3. 其实任何后处理功能完全可以在 solver 里面加入正确的代码就行,但是笔者渐渐发现这样经常需要重新编译 solver ,很麻烦,也不利于别人移植使用。而如果用 codedFunctionObject 就相当于自己写了一个外载程序,其他人如果想使用的话,直接外载就行,完全不需要重新编译求解器, 很是方便。好了,咱们进入正题,直接给模板:
functions
{
    writeCenters
    {
        type            coded;
        libs            (utilityFunctionObjects);
        name            writeCenters;
        enabled         yes;

        codeWrite
        #{ 
            word myRoofPatch="down";
            const label patchID = mesh().boundary().findPatchID(myRoofPatch); 
            IOField<vector> centers
            (
                IOobject
                (
                    "centers",
                    mesh().time().constant(),
                    "../postProcessing",
                    mesh(),
                    IOobject::NO_READ,
                    IOobject::NO_WRITE
                ),
                mesh().boundary()[patchID].Cf()
            );
            centers.write();
        #};
    }
}

手机阅读请点击代码左右滑动显示完整内容

  • 首先是固定格式

functions
{
    writeCenters
    {
        type            coded;
        libs            (utilityFunctionObjects);
        name            writeCenters;
        enabled         yes;

其中 writeCenters 是随便取得名字,读者可以任意取名,另外一个值得注意的是:

libs            (utilityFunctionObjects);

这是比较新的版本的写法,比较简化,如果在 OF1806 版本,应该是:

libs            ("libutilityFunctionObjects.so");
  • 其次是 codewrite ,也是固定格式

        codeWrite
        #{
        
        #};

如果是在计算过程中调用,codeWrite 的执行是对每一个时间步都会执行,还有一 个codeEnd 是对计算结束之后执行,这一点略有不同。但是值得注意的是,如果都是 postProcess 后处理调用的话,那么直接用 codeWrite 就行。

  • 看详细代码的含义:

            word myRoofPatch="down";
            const label patchID = mesh().boundary().findPatchID(myRoofPatch); 

其含义是在 mesh 里找到一个名为 down 的边界,并返回边界的编号。

            IOField<vector> centers
            (
                IOobject
                (
                    "centers",
                    mesh().time().constant(),
                    "../postProcessing",
                    mesh(),
                    IOobject::NO_READ,
                    IOobject::NO_WRITE
                ),

IOField <vector>  是构造了一个可以输入输出的场,该场是一个向量场,场名字为 centers 。而且我们还可以发现,这个场输出的位置实际是 contant 文件夹外面的一个叫做 postProcessing 的文件夹里,注意一定是 constant 外面,因为..表示向外一个文件夹。

                mesh().boundary()[patchID].Cf()

对 centers 场赋值,赋值的内容就是 patchID 这个编号对应的边界的各个面单元的中心
最后再输出 centers:

            centers.write();





原创文案 |  涂涂   &&    校对排版 | 浮生若梦

技术交流(微信号):poplee_openfoam
广告洽谈(微信号):shirleymanson



  1. 回复“安装包”获得最新 OpenFOAM 软件包下载地址

  2. 回复“算例 1 ”-“算例 6 ”获得算例分享下载地址

  3. 回复“资料 1 ”-“资料 18 ”获得分享的学习资料和论文下载地址

  4. 查看如何在后台发送指令获得资料下载地址



爱我请给我“点赞” ”在看“ “分享”哦

本文分享自微信公众号 - OpenFOAM(OpenFOAM_CN)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!