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。