五十七、Fluent UDF自定義材料物性參數(shù)
1. 材料屬性的設置
有兩種方式可以自定義材料的屬性參數(shù),第一種材料下拉框選擇,第二種UDF自定義函數(shù)。
我們這次主要介紹第二種方式,通過UDF的方式自定義材料屬性。之前有兩篇文章介紹過UDF的基礎和UDF DEFINE _PROFILE宏
自定義材料屬性的define宏主要是DEFINE_PROPERTY,除此之外如果需要定義擴散系數(shù),還需要使用DEFINE_DIFFUSIVITY宏。
擴散系數(shù)一般是打開組分輸運方程,或者使用UDS才需要定義。
2. DEFINE_PROPERTY宏的用法
我們詳細說說DEFINE_PROPERTY宏的使用,同時給出幾個例子
2.1 物性參數(shù)
DEFINE_PROPERTY宏可以定義的物性參數(shù)如下:
? density (as a function of temperature):密度
? viscosity:粘度
? thermal conductivity:導熱系數(shù)
? absorption and scattering coefficients:吸收系數(shù)和散射系數(shù)
? laminar flame speed:層流火焰速度
? rate of strain:應變率
? frictional modulus (Eulerian model):摩擦模量
? elasticity modulus (Eulerian model):彈性模量
? heat transfer coefficient (Mixture model):傳熱系數(shù)
? particle or droplet diameter (Mixture model):液滴直徑
······················
注:
a. DEFINE_PROPERTY宏可定義大多數(shù)的物性參數(shù),上面只是列舉出一部分。當需要定義物性參數(shù)時,首選DEFINE_PROPERTY宏
b. 擴散系數(shù)需要使用DEFINE_DIFFUSIVITY宏定義
c. 比熱容需要使用DEFINE_SPECIFIC_HEAT宏定義
2.2 DEFINE_PROPERTY的用法
DEFINE_PROPERTY (name, c, t)
name:udf的名字,隨便起,只要符合c語言變量命名規(guī)則即可。比如Ergouzi,xiaoerhua。建議取表示物性的單詞作為名字density、viscosity等
c:網格變量cell,返回網格的編號值。其實就是一個整數(shù),看過Fluent UDF為所欲為的后門這篇文章的應該印象深刻些
t:線程thread,是一個結構體,包含一些列cell、face等。
返回值return:real類型,返回物性參數(shù)值
注:
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的函數(shù)。
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。如果不是整型,即使是整數(shù)最好也要寫成小數(shù)形式,否則會出現(xiàn)一些很難察覺到的錯誤。
return mu_lam;
//返回mu_lam值,這個值會自動傳遞給Fluent的物性參數(shù),對于DEFINE_PROPERTY宏,必須要有返回值,返回就是自己設置的物性參數(shù)。
3.2 表面張力系數(shù)定義
表面張力系數(shù)定義為溫度的函數(shù),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;
}
直接以表達式的形式返回物性參數(shù)
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編譯正確的流程??煞譃镮nterpreted和Compiled。
對于解釋型Interpreted,優(yōu)點是簡單、方便,缺點是很多高級宏不適用。因此建議大家不要使用解釋型編譯UDF。
這里還是簡單說一下,下圖為解釋型界面,直接點擊Browse,選中寫好的UDF,然后點擊Interpret即可。如果UDF沒問題,則不會出現(xiàn)報錯信息。
編譯型UDF界面如下圖,上面有兩個框Source Files和Header Files,Source Files表示源文件,就是編寫好的UDF文件;
Header Files表示頭文件,只有當UDF很復雜,為了使UDF模塊化才需要從這里導入頭文件。UDF自帶了很多頭文件如udf.h,但是這些頭文件不需要從這里導入。
首先點擊Add,選中編寫好的UDF后導入,然后點擊Build,如果UDF沒有問題,則不會出現(xiàn)任何報錯信息(只要控制界面有error,則說明有問題)。
在沒有報錯的前提下,點擊Load,則UDF加載成功。關于UDF報錯問題,建議大家看看文章四十九、五十和五十一。如果沒有報錯,控制臺應該會顯示下面的信息,其中就有各種DEFINE宏的name
5. UDF的使用
不同的DEFINE宏,UDF的使用方式不同。對于DEFINE_PROPERTY宏,定義材料的物性參數(shù)。因此使用時,直接在材料物性界面選中即可
比如需要修改air的粘度,在Viscosity處選擇user-defined,會彈出右圖,然后選中DEFINE的name就行,點擊OK。
公眾號:Fluent學習筆記。為了方便大家學習交流,我創(chuàng)建了QQ群:466988009,大家可以在其中討論相關的問題,同時我會將所有文章的源文件都放到QQ群中,還會放一些其它的學習文件。歡迎大家加入。