【原创】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可以实现比较复杂的内部场初始化,而对于复杂的边界场,你要自定义边界条件了。
(版权所有 侵权必究)
推荐阅读: