首页/文章/ 详情

OpenFOAM-v1706中重叠网格的网格操作流程

1年前浏览4183
CFD在船舶与海洋工程中的发展一直受困于动网格技术。在实际工程问题中,船体上会有螺旋桨、舵等活动附体。这些附体对船的运动具有很大的影响。传统的动网格方法很难同时处理船、桨、舵三者间的耦合运动。重叠网格方法可以有效的解决这类问题。重叠网格能够有效解决船、桨、舵相互配合等复杂问题的计算。它可以打破物体与网格之间的约束关系,使船体在自由面上拥有六自由度运动的同时,让各类附体相对于船体自由地转动。

1

关于重叠网格的网格操作流程

以overInterDyMFoam 中的floatingBody Case为例简单介绍重叠网格的网格操作流程。

算例所在目录为tutorials/multiphase/overInterDyMFoam/floatingBody

因为overmesh的原理是使用两套网格,并通过overset区域进行插值传递信息。因此算例目录中有background 和 floatingBody 两个文件夹。首先我们通过两个文件夹下的Allrun.pre文件可以看到其在每个文件夹中的操作流程。简单说floatingBody只进行了浮体网格的设置和边界名称的设置。通过`mergemeshes`命令可以将floatingBody 中生成的网格文件merge到background的网格中,剩下的操作都在background文件夹中进行。

Allrun 脚本实例和注释如下,注释中详细解释了每个命令的操作意义:

Allrun.pre IN floatingOject

#!/bin/sh

cd ${0%/*} || exit 1    # run from this directory


# Source tutorial run functions

. $WM_PROJECT_DIR/bin/tools/RunFunctions


# Set application name

application=`getApplication`


runApplication blockMesh #blockMesh定义了重叠区域

runApplication topoSet #topoSet定义了浮体的形状和位置的Cell 重叠域为除去浮体内部的所有Cell

runApplication subsetMesh -overwrite c0 -patch floatingObject #对c0域添加边界名字为floatingOject


# ----------------------------------------------------------------- end-of-file

Allrun.pre IN background


#!/bin/sh

cd ${0%/*} || exit 1    # Run from this directory

. $WM_PROJECT_DIR/bin/tools/RunFunctions


# Create background mesh

runApplication blockMesh


# Add the cylinder mesh

runApplication mergeMeshes . ../floatingBody –overwrite #关节的一步是将floatingBody的网格融合进了背景网格中。此处需要注意一个问题,overset mesh 和 background mesh 的坐标范围一定要统一,这样才可以重叠在一起。因此两套网格的坐标点设置统一很重要。


# Select cellSets for the different zones

runApplication topoSet #下面详述:对计算域Cell进行了定义,便于更新域和setFields.


restore0Dir


# Use cellSets to write zoneID

runApplication setFields #设置初始场值,以及用(0,1)标记floatingbody的区域zoneID.


runApplication decomposePar

#------------------------------------------------------------------------------


2

TopoSetDict 的介绍和使用

上述 background 中的 Allrun.pre 文件中的操作命令可以看到,融合网格后,需要设置zoneID来标记不同的网格区域,此处需要首先用toposet 工具来标记网格区域。

控制字典如下:

FoamFile          

{

    version     2.0;

    format      ascii;

    class       dictionary;

    object      topoSetDict;

}

// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //


actions

(

    //首先标记 C0网格区域为整个背景网格,采用 insidepoints 的方式来进行设置。会自动寻找到整个边界区域,然后标记整个网格区域为c0

    {

        name    c0;

        type    cellSet;

        action  new;

        source  regionToCell;

        sourceInfo

        {

            insidePoints ((12.0 0.05 1.0));//此处该点一定要设置在扣出浮体的内部,否则会出现重叠网格和背景网格之间的不耦合现象。

        }

    }


    //然后通过c0区域来标记c1区域


    {

        name    c1;

        type    cellSet;

        action  new;

        source  cellToCell;

        sourceInfo

        {

            set c0;

        }

    }


    //最后通过反选实现 标记除去c0区域外的网格区域为c1


    {

        name    c1;

        type    cellSet;

        action  invert;

    }

);


// ************************************************************************* //


3

setField 对流体域进行定义

上述的在background中的topoSetDict 已经设置了 C0(背景网格区域) 和C1(重叠网格区域)。 然后,通过setField进行alphawater的设置和zoneID的设置。alphawater的设置同传统算例,在此不详述。这里主要讲一下关于zoneID的初始场值的设置(其中c0 zone 被定义为0,C1 zone 设置为1)。


FoamFile          

{

    version     2.0;

    format      ascii;

    class       dictionary;

    object      setFieldsDict;

}

// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //


defaultFieldValues

(

    volScalarFieldValue alpha.water 0

    volScalarFieldValue zoneID 123

);


regions

(

    boxToCell

    {

        box ( -100 -100 -100 ) ( 100 100 1.0 );

        fieldValues ( volScalarFieldValue alpha.water 1 );

    }


 /*   boxToCell

    {

        box ( 0.7 0.8 -100 ) ( 100 100 0.75 );

        fieldValues ( volScalarFieldValue alpha.water 1 );

    }*/

    cellToCell

    {

        set c0;


        fieldValues

        (

            volScalarFieldValue zoneID 0

        );

    }

    cellToCell

    {

        set c1;


        fieldValues

        (

            volScalarFieldValue zoneID 1

        );

    }


);


// ************************************************************************* //


 

上述设置结果如图所示分别标记的 c0区域和c1区域


4    
重叠网格边界中的特殊边界    

重叠网格中设置了两个不同区域的网格,而两套网格之间需要通过 `overset`边界来进行定义插值单元网格的。插值原理见沈志荣《船桨舵相互作用的重叠网格技术数值方法研究》。因此下面介绍一下重叠网格算例中的几个重要边界。

重叠网格示意图

图中的overset Boundary 便是floatingbody中定义的sides,如下边界条件文件所示,其边界类型为 `overset`。图中的wall boundaries 则是floatingObject 边界。

  sides

    {

        type            overset;

        inGroups        1(overset);

        nFaces          300;

        startFace       227915;

    }

此边界是定义在 floatingBody 中,最后merge到 background 网格上,是进行重叠域标记和信息传递的重要边界条件,具体实现待补充。

    oversetPatch

    {

        type            overset;

        inGroups        1(overset);

        nFaces          0;

        startFace       116951;

    }

    atmosphere

    {

        type            patch;

        inGroups        1(patch);

        nFaces          713;

        startFace       116951;

    }

一个特殊的边界,做什么用的暂时不知道,边界面设置为0个。startFace 为整个边界编号中的起始编号。如上面所示参照atmosphere边界。如果没有此边界,log 文件中会出现 warning 大概是 oversetPatch 不是计算域中的第一个起始编号。

最后关于topoSet, setFields, refinemesh,等网格和前处理工具,可在代码中application/utilities/中看到详细的Dict设置指导以及实现的源代码。

来源:多相流在线
OpenFOAM碰撞多相流动网格湍流船舶核能电力海洋材料控制
著作权归作者所有,欢迎分享,未经许可,不得转载
首次发布时间:2023-06-22
最近编辑:1年前
积鼎科技
联系我们13162025768
获赞 108粉丝 104文章 296课程 0
点赞
收藏
未登录
还没有评论
课程
培训
服务
行家
VIP会员 学习 福利任务 兑换礼品
下载APP
联系我们
帮助与反馈