Fluent UDF【16】:通用宏[1]【轉(zhuǎn)發(fā)】
2017-07-05 by:CAE仿真在線 來源:互聯(lián)網(wǎng)
有人留言說UDF專題好多內(nèi)容是翻譯自幫助文檔,事實(shí)的確是這樣的。UDF本沒有太多需要介紹的內(nèi)容,各位學(xué)習(xí)UDF的朋友們要養(yǎng)成查UDF文檔的好習(xí)慣,沒事兒多看看C語(yǔ)言,多動(dòng)手練習(xí)。編程技能還是要靠不斷地練習(xí)和總結(jié),程序代碼也要靠不斷地修改和優(yōu)化。
從本期開始,UDF專題進(jìn)入攻堅(jiān)階段。本期介紹UDF中的通用宏。
Fluent UDF提供了一些通用宏,用于控制Fluent在使用過程中的一些行為,一些比較常用的通用宏包括:
-
DEFINE_ADJUST:用于操縱變量
-
DEFINE_DELTAT:用于調(diào)整時(shí)間步長(zhǎng)
-
DEFINE_EXECUTE_AT_END:在迭代完成后執(zhí)行操作
-
DEFINE_EXECUTE_AT_EXIT:在Fluent關(guān)閉時(shí)執(zhí)行操作
-
DEFINE_EXECUTE_FROM_GUI:實(shí)現(xiàn)在用戶自定義界面中執(zhí)行操作
-
DEFINE_EXECUTE_ON_LOADING:加載UDF時(shí)執(zhí)行一些操作
-
DEFINE_EXECUTE_AFTER_CASE/DATA:讀取Case文件后執(zhí)行操作
-
DEFINE_INIT:初始化
-
DEFINE_ON_DEMAND:異步執(zhí)行一些操作
-
DEFINE_REPORT_DEFINITION_FN:為用戶定義的報(bào)告返回值
-
DEFINE_RW_FILE:讀寫文件
-
DEFINE_RW_HDF_FILE:讀寫HDF文件
可以利用DEFINE_ADJUST宏調(diào)整或控制一些不作為調(diào)用參數(shù)的變量。例如用戶可以使用DEFINE_ADJUST修改流動(dòng)參數(shù)(如速度、壓力等),也可以計(jì)算某些標(biāo)量在全域的積分量,甚至可以基于計(jì)算結(jié)果調(diào)整邊界條件。DEFINE_ADJUST宏在每一個(gè)迭代步被執(zhí)行,并且在每一個(gè)迭代中傳輸方程求解之前被調(diào)用。
-
宏形式:DEFINE_ADJUST(name , d)
-
宏參數(shù):symbol name, Domain *d
-
返回值:無返回值
-
調(diào)用形式:解釋或編譯
下面是一個(gè)簡(jiǎn)單的案例,其利用DEFINE_ADJUST宏在每一步迭代過程中計(jì)算區(qū)域內(nèi)的湍流耗散率,計(jì)算結(jié)果顯示在console中。
#include "udf.h" DEFINE_ADJUST(my_adjust,d) { Thread *t; /* Integrate dissipation. */ real sum_diss=0.; cell_t c; thread_loop_c(t,d) { begin_c_loop(c,t) { sum_diss += C_D(c,t)* C_VOLUME(c,t); } end_c_loop(c,t) } printf("總耗散率: %g\n", sum_diss); }DEFINE_ADJUST宏編譯或解釋后,可以通過User Defined標(biāo)簽頁(yè)下的Function Hooks…工具按鈕來加載。如下圖所示。
選擇此工具按鈕后彈出UDF加載對(duì)話框,如下圖所示。
選擇Adjust后的Edit…按鈕,彈出Adjust Functions對(duì)話框,如下圖所示,選擇列表框中的宏,選擇Add按鈕將其從左側(cè)列表框中加載至右側(cè)列表框,點(diǎn)擊OK按鈕確認(rèn)操作并關(guān)閉對(duì)話框。
這樣,DEFINE_ADJUST宏就被被掛載到Fluent中,在每一次迭代時(shí)都會(huì)調(diào)用。
DEFINE_DELTAT宏主要用于在瞬態(tài)求解過程中控制時(shí)間步長(zhǎng)。需要注意的是:此宏只能用于Time Stepping Method為Adaptive時(shí)。若為默認(rèn)的Fixed,則會(huì)出錯(cuò)。如下圖所示。
-
宏形式:DEFINE_DELTAT(name , d)
-
宏參數(shù):symbol name, Domain *d
-
返回值:real
-
調(diào)用形式:解釋或編譯
如下例程為調(diào)整時(shí)間步長(zhǎng),當(dāng)計(jì)算時(shí)間小于0.5s時(shí),采用時(shí)間步長(zhǎng)0.1s,其他時(shí)刻時(shí)間步長(zhǎng)采用0.2。
#include "udf.h" DEFINE_DELTAT(mydeltat,d) { real time_step; real flow_time = CURRENT_TIME; if (flow_time < 0.5) time_step = 0.1; else time_step = 0.2; return time_step; }解釋或編譯UDF后,此宏的加載方式為:
-
選擇Run Calculation樹形節(jié)點(diǎn)后,選擇Time Stepping Method為Adaptive。
-
點(diǎn)選按鈕Settings…,如下圖所示。
-
在彈出的設(shè)置對(duì)話框中,設(shè)置User-Defined Time Step為所編譯的UDF,如下圖所示。點(diǎn)擊OK按鈕掛載宏。
此宏由用戶手動(dòng)調(diào)用執(zhí)行,而非Fluent自動(dòng)調(diào)用。
-
宏形式:DEFINE_ON_DEMAND(name )
-
宏參數(shù):symbol name
-
返回值:沒有任何返回值
-
調(diào)用形式:解釋或編譯
此宏的參數(shù)中并無任何Fluent傳入的數(shù)據(jù),因此如果是獲取計(jì)算域中的數(shù)據(jù),則需要利用Get_Domain先獲取對(duì)應(yīng)區(qū)域的Domain結(jié)構(gòu)。
例如下面的實(shí)例計(jì)算了一個(gè)溫度函數(shù):
并將值賦給UDM。
#include "udf.h" DEFINE_ON_DEMAND(on_demand_calc) { Domain *d; real tavg = 0.; real tmax = 0.; real tmin = 0.; real temp,volume,vol_tot; Thread *t; cell_t c; d = Get_Domain(1); thread_loop_c(t,d) { begin_c_loop(c,t) { volume = C_VOLUME(c,t); temp = C_T(c,t); if (temp < tmin || tmin == 0.) tmin = temp; if (temp > tmax || tmax == 0.) tmax = temp; vol_tot += volume; tavg += temp*volume; } end_c_loop(c,t) tavg /= vol_tot; begin_c_loop(c,t) { temp = C_T(c,t); C_UDMI(c,t,0) = (temp-tmin)/(tmax-tmin); } end_c_loop(c,t) } }此宏編譯或解釋后,可通過User Defined標(biāo)簽頁(yè)下按鈕Execute on Demand…加載,如下圖所示。
加載UDF后如下圖所示。
利用DEFINE_RW_FILE宏可以向case或data文件寫入信息,或者從case和data文件中讀取信息。
-
宏形式:DEFINE_RW_FILE(name,fp )
-
宏參數(shù):symbol name, FILE fp
-
返回值:沒有任何返回值
-
調(diào)用形式:解釋或編譯
在宏中可以利用fscanf函數(shù)讀取文件中的信息,也可以利用fprintf函數(shù)向文件寫入信息。如下例程可以向data文件中寫入DEFINE_ADJUST宏調(diào)用的次數(shù),同時(shí)從data文件中讀取調(diào)用的次數(shù)。
#include "udf.h" int kount = 0; /* define global variable kount */ DEFINE_ADJUST(demo_calc,d) { kount++; printf("kount = %d\n",kount); } DEFINE_RW_FILE(writer,fp) { printf("Writing UDF data to data file...\n"); fprintf(fp,"%d",kount); /* write out kount to data file */ } DEFINE_RW_FILE(reader,fp) { printf("Reading UDF data from data file...\n"); fscanf(fp,"%d",&kount); /* read kount from data file */ }此宏的加載與DEFINE_ADJUST宏相同,也在User-Defined Function Hooks對(duì)話框中。
下期結(jié)合案例具體講這四個(gè)宏的用法。
困了~
轉(zhuǎn)自公眾號(hào):胡坤 CFD仿真之道
相關(guān)標(biāo)簽搜索:Fluent UDF【16】:通用宏[1]【轉(zhuǎn)發(fā)】 Fluent培訓(xùn) Fluent流體培訓(xùn) Fluent軟件培訓(xùn) fluent技術(shù)教程 fluent在線視頻教程 fluent資料下載 fluent分析理論 fluent化學(xué)反應(yīng) fluent軟件下載 UDF編程代做 Fluent、CFX流體分析 HFSS電磁分析