本文原創作者:清華大學 劉德天 博士


1.SetFields的使用

使用setFields只需要將system文件夾中建立setFieldsDict,然後在其中設置相應的參數,設置完後,在case根目錄下利用終端輸入setFields就可以了。

下面介紹一下interFoam算例中的setFieldsDict。該字典位置在OpenFOAM-1.6/tutorials/multiphase/interFoam/laminar/damBreak/system/setFieldsDict,文件中的內容為:

FoamFile //文件頭

{

version 2.0;

format ascii;

class dictionary;

location "system";

object setFieldsDict;

}

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

defaultFieldValues //用來設定場的默認值

(volScalarFieldValue alpha1 0 //設置場alpha1的默認值為0,因為0的值比較多,因此選擇先全部設成0,然後對小區域的特殊值的再特殊設置

);

regions //設置特殊區域alpha1不為0的區域

(

boxToCell //方形區域內的cell

{box (0 0 -1) (0.1461 0.292 1); //方形區域的邊界,兩點xyz 最小點和xyz最大點

fieldValues //用來指定特殊區域的特殊值

(volScalarFieldValue alpha1 1 //用來alpha1場在上面box區域內的值的大小

);

}

);

setFields對於規則區域定值使用比較方便,但是很難實現比較複雜內部場的設置,比如滿足某種關係式的內部場設置,如我們使用的波形牀面。

2.funkySetFields的使用

用來設定比較複雜的內部場。可以指定滿足一定條件的關係式的初始場。

2.1 軟體的安裝

該軟體安裝比較簡單,直接進入該文件夾,並運行Allwmake

./Allwmake

如果在安裝過程中出現如下報錯:

make:*** [Make/linux64GccDPOpt/meshesRepository.o]錯誤1

Parserlibrary did not compile OK. No sense continuing as everything else depends onit

Requirementsfor Library not satisfied. I see no sense in going on

則採用如下方式解決該問題:(OpenFOAM2.2.0搭配Swak4Foam_2.x_release_0.2.3時會出現這個問題)

進入文件夾Swak4Foam_2.x_release_0.2.3/Libraries/swak4FoamParsers/include

編輯文件swak.H

將如下語句注釋掉:

#defineFOAM_LOOKUPCLASS_NO_CONST

即變為://#defineFOAM_LOOKUPCLASS_NO_CONST

然後重新編譯即可;

2.2 使用

2.2.1 常用關鍵字

field //用來指定要修改的場

expressions //用來指定表達式

condition //用來指定上述表達式應當滿足的條件

keepPatches //用來說明是否保持原來邊界條件,最好加上,不加的話,funkySetField會給所

有邊界為0 梯度

create //用來說明是否是新建場

valuePatches //用來指定那些定值邊界由臨近內部節點值給定

dimension //用來指定新建立場的單位

time //用來指定funkySetField 所指定的時間點

應當指出,上述關鍵字可以直接在控制檯上輸,也可以寫在名字為funkySetFieldsDict(類似

於setFieldsDict)中。

2.2.2 使用方法

方法1 直接在控制檯輸入

直接進入你要初始話的case中,輸入類似於下面的命令。 如上面的setField也可以通過下面的funkySetFields -latestTime命令來實現:

funkySetFields -time 0 -keepPatches -field alpha1-expression_r "1" -condition "pos().x <= 0.1461 &&pos().y <= 0.292"

注意比較長的式子用單引號或者雙引號隔開。上述關鍵字沒有次序要求。

方法2 使用funkySetFieldsDict字典

方法和上面setFields差不多,在system 文件夾中建funkySetFieldsDict字典文件,對於上面表達式可以通過下面字典文件實現。

expressions //設置複雜內部邊界入口

(

waterdepth // 設置alpha1,名字任意,相當於注釋

{

field alpha1; //要進行操作的場

expression "1"; //表達式,即給這個場在特殊區域所賦的值

condition "pos().y<=0.007+0.005*cos(1/8*pi*100*pos().x)" ;//執行上述表達式的條件,即在x、y滿足什麼條件的區域內給alpha1賦值為1

keepPatches true; //是否保持以前邊界

}

pressure1 //設置壓力,名字任意

{

field p; //指定操作場

expression "10.*(0.1-pos().y)"; //執行的不僅可以是值,也可以使表達式,無條件

}

pressure2

{

field p; 指定表達式

expression_r "p+U&U"; //表達式

condition "pos().x >(max(pos().x)-min(pos().x))/2"; //條件

}

);

從上面可以看出,使用funkySetFieldsDict可以實現更為複雜內部場,且可以同時對多個場進行操作。

2.2.3 表達式中的常用支持

也許你已經注意到,上面例子中condition和expression使用了表達式,funkySetFields中你可以使用下列常用的操作符或者函數:

1)C++基本操作符

+,-,*,/,%, <,>,<=,>=,!=,==, &&,||,? :

2)OpenFOAM定義的向量操作符

&,^

3)圓周率常量

pi

4)標量函數

pow,log,exp,sqr,sqrt,sin,cos,tan

5)OpenFOAM 中的一些函數

mag:求模

grad :求標量梯度

curl :求向量旋度

snGrad:表面法向剃度

div :向量場散度

laplaction :求一個場的laplacian 項目

min,max :標量場的最值

pos :網格中心位置矢量

fpos :面中心位置矢量

face :表面法向量場

area:表面面積場

vol :網格單元體積場

deltaT :時間步長

time :當前時間

setFields和funkySetField可以實現比較複雜的內部場初始化,而對於複雜的邊界場,你要自定義邊界條件了。

(版權所有 侵權必究)



推薦閱讀:
相關文章