【原創】OpenFOAM中非均勻初始場的設定
本文原創作者:清華大學 劉德天 博士
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可以實現比較複雜的內部場初始化,而對於複雜的邊界場,你要自定義邊界條件了。
(版權所有 侵權必究)