首页/文章/ 详情

五十七、Fluent UDF自定义材料物性参数

9月前浏览1018

1. 材料属性的设置

   

有两种方式可以自定义材料的属性参数,第一种材料下拉框选择,第二种UDF自定义函数。

 


我们这次主要介绍第二种方式,通过UDF的方式自定义材料属性。之前有两篇文章介绍过UDF的基础UDF DEFINE _PROFILE宏


自定义材料属性的define宏主要是DEFINE_PROPERTY,除此之外如果需要定义扩散系数,还需要使用DEFINE_DIFFUSIVITY宏。


扩散系数一般是打开组分输运方程,或者使用UDS才需要定义。

 



2. DEFINE_PROPERTY宏的用法

   

我们详细说说DEFINE_PROPERTY宏的使用,同时给出几个例子


2.1 物性参数

DEFINE_PROPERTY宏可以定义的物性参数如下:

• density (as a function of temperature):密度

• viscosity:粘度

• thermal conductivity:导热系数

• absorption and scattering coefficients:吸收系数和散射系数

• laminar flame speed:层流火焰速度

• rate of strain:应变率

• frictional modulus (Eulerian model):摩擦模量

• elasticity modulus (Eulerian model):弹性模量

• heat transfer coefficient (Mixture model):传热系数

• particle or droplet diameter (Mixture model):液滴直径

······················


注:

a. DEFINE_PROPERTY宏可定义大多数的物性参数,上面只是列举出一部分。当需要定义物性参数时,首选DEFINE_PROPERTY宏

b. 扩散系数需要使用DEFINE_DIFFUSIVITY宏定义

c. 比热容需要使用DEFINE_SPECIFIC_HEAT宏定义


2.2 DEFINE_PROPERTY的用法


DEFINE_PROPERTY (name, c, t)

name:udf的名字,随便起,只要符合c语言变量命名规则即可。比如Ergouzi,xiaoerhua。建议取表示物性的单词作为名字density、viscosity等


c:网格变量cell,返回网格的编号值。其实就是一个整数,看过Fluent UDF为所欲为的后门这篇文章的应该印象深刻些


t:线程thread,是一个结构体,包含一些列cell、face等。


返回值return:real类型,返回物性参数值


注:

a. c和t都是这个宏从fluent中取出来给用户使用的,不需要任何的定义,直接可以使用c和t


b. 由于DEFINE_PROPERTY 宏已经给用户传递了c和t,因此使用这个宏不需要遍历thread,也不需要遍历网格。也就是说不需要使用loop宏,直接对c进行操作即可。


c. 与之相对的,如DEFINE_ADJUST宏,没有传递c和t,因此必须要先遍历thread或者查找thread,然后再遍历网格。



3. DEFINE_PROPERTY示例

   

3.1 粘度定义

定义粘度viscosity,当温度大于288K,粘度等于5.5e-3;当温度小于286K,粘度等于1.0;否则粘度等于温度T的函数。

 


UDF代码如下:

#include "udf.h"

DEFINE_PROPERTY(cell_viscosity,c,t)

{

    real mu_lam;

    real temp = C_T(c,t);

    if (temp > 288.)

        mu_lam = 5.5e-3;

    else if (temp > 286.)

        mu_lam = 143.2135 - 0.49725 * temp;

    else

        mu_lam = 1.;

    return mu_lam;

}

解释一下:

real mu_lam;

//声明了一个real变量,其实就是c语言的float类型,只不过real可以自动改变单精度还是双精度。mu_lam是变量名称,可随意命名。


real temp = C_T(c,t);

//声明了一个real变量,并且赋值。temp即变量名,使用C_T宏给其赋值。

//C_T宏用于获取网格温度,括号中的c和t即是DEFINE_PROPERTY(cell_viscosity,c,t)中的c和t。两者必须一致,要改都改。


if (temp > 288.)

     mu_lam = 5.5e-3;

else if (temp > 286.)

     mu_lam = 143.2135 - 0.49725 * temp;

else

     mu_lam = 1.;

//if else语句,根据温度值来确定粘度值。288.为什么要加一个点,如果不加点则表示整型,加点表示浮点型,其实就是288.0。如果不是整型,即使是整数最好也要写成小数形式,否则会出现一些很难察觉到的错误。


return mu_lam;

//返回mu_lam值,这个值会自动传递给Fluent的物性参数,对于DEFINE_PROPERTY宏,必须要有返回值,返回就是自己设置的物性参数。



3.2 表面张力系数定义

表面张力系数定义为温度的函数,sur_ten=1.35 - 0.004*T + 5.0e-6*T*T


UDF代码如下:

#include "udf.h"

DEFINE_PROPERTY(sfc,c,t)

{

    real T = C_T(c,t);

    return 1.35 - 0.004*T + 5.0e-6*T*T;

}

直接以表达式的形式返回物性参数



3.3 密度和时间相关

这里仅仅是演示,实际上我们的物性更多是和压力温度有关,和时间没有关系。这里为了说明UDF的灵活性,简单演示。


假设当流动时间小于1s,密度为1000kg/m3;流动时间大于等于1s,密度为1kg/m3。


UDF代码如下:


#include "udf.h"

DEFINE_PROPERTY(den_time,c,t)

{

    real density;

    real current_time;

    current_time = CURRENT_TIME; 

    if(current_time<1.0)

    {

        density=1000.0;

    }

    else

    {

        density=1.;

    }

    return density;

}

逻辑很简单,这里只说明一点。

current_time = CURRENT_TIME; 

//CURRENT_TIME是fluent中的一个宏,也可以认为是一个变量,返回当前的流动时间。



4. UDF的编译与加载

   


两种UDF编译的方式,参考文章四十九、Fluent UDF编译正确的流程。可分为Interpreted和Compiled。

 


对于解释型Interpreted,优点是简单、方便,缺点是很多高级宏不适用。因此建议大家不要使用解释型编译UDF。


这里还是简单说一下,下图为解释型界面,直接点击Browse,选中写好的UDF,然后点击Interpret即可。如果UDF没问题,则不会出现报错信息。

 



编译型UDF界面如下图,上面有两个框Source Files和Header Files,Source Files表示源文件,就是编写好的UDF文件;

 


Header Files表示头文件,只有当UDF很复杂,为了使UDF模块化才需要从这里导入头文件。UDF自带了很多头文件如udf.h,但是这些头文件不需要从这里导入。



首先点击Add,选中编写好的UDF后导入,然后点击Build,如果UDF没有问题,则不会出现任何报错信息(只要控制界面有error,则说明有问题)。


在没有报错的前提下,点击Load,则UDF加载成功。关于UDF报错问题,建议大家看看文章四十九五十五十一。如果没有报错,控制台应该会显示下面的信息,其中就有各种DEFINE宏的name


 



5. UDF的使用

   

不同的DEFINE宏,UDF的使用方式不同。对于DEFINE_PROPERTY宏,定义材料的物性参数。因此使用时,直接在材料物性界面选中即可


Materials--Fluid--air

比如需要修改air的粘度,在Viscosity处选择user-defined,会弹出右图,然后选中DEFINE的name就行,点击OK。

 
来源:Fluent学习笔记
Fluent组分输运UDF材料控制
著作权归作者所有,欢迎分享,未经许可,不得转载
首次发布时间:2023-07-19
最近编辑:9月前
Fluent学习笔记
博士 签名征集中
获赞 94粉丝 197文章 105课程 2
点赞
收藏
未登录
还没有评论

课程
培训
服务
行家

VIP会员 学习 福利任务 兑换礼品
下载APP
联系我们
帮助与反馈