本文原创作者:清华大学 刘德天 博士


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可以实现比较复杂的内部场初始化,而对于复杂的边界场,你要自定义边界条件了。

(版权所有 侵权必究)



推荐阅读:
相关文章