OpenFOAM-v1706中重疊網格的網格操作流程

CFD在船舶與海洋工程中的發展一直受困于動網格技術。在實際工程問題中,船體上會有螺旋槳、舵等活動附體。這些附體對船的運動具有很大的影響。傳統的動網格方法很難同時處理船、槳、舵三者間的耦合運動。重疊網格方法可以有效的解決這類問題。重疊網格能夠有效解決船、槳、舵相互配合等復雜問題的計算。它可以打破物體與網格之間的約束關系,使船體在自由面上擁有六自由度運動的同時,讓各類附體相對于船體自由地轉動。

關于重疊網格的網格操作流程

以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

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

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;

    }

);

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

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

        );

    }

);

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

OpenFOAM-v1706中重疊網格的網格操作流程的圖1

上述設置結果如圖所示分別標記的 c0區域和c1區域

重疊網格邊界中的特殊邊界

重疊網格中設置了兩個不同區域的網格,而兩套網格之間需要通過 `overset`邊界來進行定義插值單元網格的。插值原理見沈志榮《船槳舵相互作用的重疊網格技術數值方法研究》。因此下面介紹一下重疊網格算例中的幾個重要邊界。

OpenFOAM-v1706中重疊網格的網格操作流程的圖2

重疊網格示意圖

圖中的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設置指導以及實現的源代碼。

來源:多相流在線

作者: 毛艷軍

登錄后免費查看全文
立即登錄
App下載
技術鄰APP
工程師必備
  • 項目客服
  • 培訓客服
  • 平臺客服

TOP

2