首页/文章/ 详情

133、Fluent如何自定义重力场?

8小时前浏览2

1.问题引出

有同学在我们公众 号的交流群里面问:如何将部分区域设置为没有重力?


群里面的大佬给了很好的思路,下面我们就沿着这个思路,通过UDF来实现自定义添加重力

 


2.常规重力设置

Fluent本身的重力是在 Operating Conditions 面板或者Genreal界面里设置的

 



这里设置的重力是作用于整个计算域的,没办法只对一部分区域加、另一部分区域不加。


如果想实现“局部区域有重力,其他区域没有重力”,就需要通过UDF给动量方程添加源项;同时不勾选这里的重力选项。



3. UDF重力源项

3.1 UDF代码

从动量方程可以看出,用密度乘以重力加速度就是重力的动量源项,下式中的ρ*g就是动量源项

 



UDF代码如下:











#include "udf.h"#define 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 * 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即为操作密度。













#include "udf.h"#define 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自定义重力的方式是可行的,其他要实现的功能都可以在这个基础上进行更改,包括最开始的问题--“实现部分区域有重力”。


大家可以自行尝试,感觉可以玩出一些花样出来。



来源:Fluent学习笔记
FluentUDFUM
著作权归作者所有,欢迎分享,未经许可,不得转载
首次发布时间:2025-10-01
最近编辑:8小时前
Fluent学习笔记
博士 签名征集中
获赞 167粉丝 491文章 179课程 5
点赞
收藏
作者推荐
未登录
还没有评论
课程
培训
服务
行家
VIP会员 学习计划 福利任务
下载APP
联系我们
帮助与反馈