1.问题引出
有同学在我们公众 号的交流群里面问:如何将部分区域设置为没有重力?
群里面的大佬给了很好的思路,下面我们就沿着这个思路,通过UDF来实现自定义添加重力
2.常规重力设置
Fluent本身的重力是在 Operating Conditions 面板或者Genreal界面里设置的
这里设置的重力是作用于整个计算域的,没办法只对一部分区域加、另一部分区域不加。
如果想实现“局部区域有重力,其他区域没有重力”,就需要通过UDF给动量方程添加源项;同时不勾选这里的重力选项。
3. UDF重力源项
3.1 UDF代码
从动量方程可以看出,用密度乘以重力加速度就是重力的动量源项,下式中的ρ*g就是动量源项
UDF代码如下:
DEFINE_SOURCE(local_gravity, c, t, dS, eqn)
{
real source = 0.0;
real rho = C_R(c,t); /* 密度 */
source = rho * g; /* 重力源项 */
dS[eqn] = 0.0;
return source;
}
简单的进行解释一下:
#include "udf.h" 是头文件,可以理解为固定格式,UDF都需要这行代码
#define g -9.81 定义一个常量 g,值是 -9.81,
DEFINE_SOURCE 是一个DEFINE宏。UDF想要对Fluent的计算域网格进行操作,就需要各种功能的DEFINE宏。其中SOURCE是源项宏;(local_gravity, c, t, dS, eqn)里面的各个参数这里不多说明。
real source = 0.0; 定义并初始化源项。
real rho = C_R(c,t); 通过 C_R(c,t) 宏获取该单元内的流体密度。
source = rho * g; 源项计算公式:体力项 = 密度 × 加速度。这就是重力体力源项。
dS[eqn] = 0.0; 源项对解变量的导数。算是比较难理解的一个参数。
return source; 把源项返回给 Fluent,让它加到对应的方程里。
把上面的代码复 制到编译器中,或者记事本中,将后缀改成.c即可
3.2 加载UDF
想要实现局部有重力,需要先不勾选重力,然后将UDF源项加载到需要设置重力的计算域即可
如果没有将计算域分割开,也可以在UDF中通过坐标判断哪些区域需要设置重力。
需要确定重力在哪个方向上,比如Y方向上重力加速度为-9.81,那就需要将动量源项加载到Y Momentum上
UDF代码虽然比较简单,但是如果不熟悉UDF的同学,看上面的操作过程可能还是比较疑惑。
4.验证正确性
这种方式是不是正确的呢?我们需要验证正确性,可以使用自然对流来进行验证。
首先勾选Fluent重力,计算自然对流,将其结果作为标准结果;
然后关闭重力,使用UDF的方式来定义动量源项。
4.1自然对流设置
对于自然对流,如果是Boussinesq model,除动量方程中的浮力项外,其他方程都将密度作为常数求解,这样会大大加快收敛。
那么浮力项中的密度如何改变呢??通过以下方程
其中,ρ0为流体密度(常数),T0为操作温度operating temperature,β体积变化系数,对于理想气体即等于绝对温度的倒数。ρ和T即为变化的密度和温度。
如果不是如果密度没有设置为boussinesq,那么这里的设置才有意义。此时动量方程中的体积力为
这里的ρ0才是operating density,这里之所以会有这个操作密度,主要是考虑到收敛性,设置这个值,会加强收敛性。即操作密度
注:这部分内容还是操作密度的问题,可以参考文章:六十四、Fluent操作温度及操作密度设置
4.2UDF验证
对于chapter 129的例子,没有设置boussinesq,因此动量源项应该是
UDF代码为:其中的1.111即为操作密度。
"udf.h"
g -9.81 /* m/s^2*/
DEFINE_SOURCE(local_gravity, c, t, dS, eqn)
{
real source = 0.0;
real rho = C_R(c, t); /* 密度 */
source = (rho-1.111) * g; /* 重力源项 */
dS[eqn] = 0.0;
return source;
}
将上面的代码导入cas中,并将其hook到y方向的动量源项上。
进行计算,可以发现,UDF计算结果和勾选重力的计算结果完全相同。说明通过这种方式定义重力是可行的
至此,说明通过UDF自定义重力的方式是可行的,其他要实现的功能都可以在这个基础上进行更改,包括最开始的问题--“实现部分区域有重力”。
大家可以自行尝试,感觉可以玩出一些花样出来。