Fluent UDF【16】:通用宏[1]【轉(zhuǎn)發(fā)】

2017-07-05  by:CAE仿真在線  來(lái)源:互聯(lián)網(wǎng)

有人留言說(shuō)UDF專題好多內(nèi)容是翻譯自幫助文檔,事實(shí)的確是這樣的。UDF本沒(méi)有太多需要介紹的內(nèi)容,各位學(xué)習(xí)UDF的朋友們要養(yǎng)成查UDF文檔的好習(xí)慣,沒(méi)事兒多看看C語(yǔ)言,多動(dòng)手練習(xí)。編程技能還是要靠不斷地練習(xí)和總結(jié),程序代碼也要靠不斷地修改和優(yōu)化。

從本期開始,UDF專題進(jìn)入攻堅(jiān)階段。本期介紹UDF中的通用宏。

Fluent UDF提供了一些通用宏,用于控制Fluent在使用過(guò)程中的一些行為,一些比較常用的通用宏包括:

  • 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文件

1

DEFINE_ADJUST

可以利用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

  • 返回值:無(wú)返回值

  • 調(diào)用形式:解釋或編譯

下面是一個(gè)簡(jiǎn)單的案例,其利用DEFINE_ADJUST宏在每一步迭代過(guò)程中計(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宏編譯或解釋后,可以通過(guò)User Defined標(biāo)簽頁(yè)下的Function Hooks…工具按鈕來(lái)加載。如下圖所示。

Fluent UDF【16】:通用宏[1]【轉(zhuǎn)發(fā)】fluent培訓(xùn)的效果圖片1

選擇此工具按鈕后彈出UDF加載對(duì)話框,如下圖所示。

Fluent UDF【16】:通用宏[1]【轉(zhuǎn)發(fā)】fluent培訓(xùn)的效果圖片2

選擇Adjust后的Edit…按鈕,彈出Adjust Functions對(duì)話框,如下圖所示,選擇列表框中的宏,選擇Add按鈕將其從左側(cè)列表框中加載至右側(cè)列表框,點(diǎn)擊OK按鈕確認(rèn)操作并關(guān)閉對(duì)話框。

Fluent UDF【16】:通用宏[1]【轉(zhuǎn)發(fā)】fluent培訓(xùn)的效果圖片3

這樣,DEFINE_ADJUST宏就被被掛載到Fluent中,在每一次迭代時(shí)都會(huì)調(diào)用。

2

DEFINE_DELTAT

DEFINE_DELTAT宏主要用于在瞬態(tài)求解過(guò)程中控制時(shí)間步長(zhǎng)。需要注意的是:此宏只能用于Time Stepping Method為Adaptive時(shí)。若為默認(rèn)的Fixed,則會(huì)出錯(cuò)。如下圖所示。

Fluent UDF【16】:通用宏[1]【轉(zhuǎn)發(fā)】fluent培訓(xùn)的效果圖片4

  • 宏形式: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 MethodAdaptive。

  • 點(diǎn)選按鈕Settings…,如下圖所示。

Fluent UDF【16】:通用宏[1]【轉(zhuǎn)發(fā)】fluent培訓(xùn)課程圖片5

  • 在彈出的設(shè)置對(duì)話框中,設(shè)置User-Defined Time Step為所編譯的UDF,如下圖所示。點(diǎn)擊OK按鈕掛載宏。

Fluent UDF【16】:通用宏[1]【轉(zhuǎn)發(fā)】fluent培訓(xùn)課程圖片6

3

DEFINE_ON_DEMAND

此宏由用戶手動(dòng)調(diào)用執(zhí)行,而非Fluent自動(dòng)調(diào)用。

  • 宏形式:DEFINE_ON_DEMAND(name )

  • 宏參數(shù):symbol name

  • 返回值:沒(méi)有任何返回值

  • 調(diào)用形式:解釋或編譯

此宏的參數(shù)中并無(wú)任何Fluent傳入的數(shù)據(jù),因此如果是獲取計(jì)算域中的數(shù)據(jù),則需要利用Get_Domain先獲取對(duì)應(yīng)區(qū)域的Domain結(jié)構(gòu)。

例如下面的實(shí)例計(jì)算了一個(gè)溫度函數(shù):

Fluent UDF【16】:通用宏[1]【轉(zhuǎn)發(fā)】fluent培訓(xùn)課程圖片7

并將值賦給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) } }

此宏編譯或解釋后,可通過(guò)User Defined標(biāo)簽頁(yè)下按鈕Execute on Demand…加載,如下圖所示。

Fluent UDF【16】:通用宏[1]【轉(zhuǎn)發(fā)】fluent分析案例圖片8

加載UDF后如下圖所示。

Fluent UDF【16】:通用宏[1]【轉(zhuǎn)發(fā)】fluent分析案例圖片9

4

DEFINE_RW_FILE

利用DEFINE_RW_FILE宏可以向case或data文件寫入信息,或者從case和data文件中讀取信息。

  • 宏形式:DEFINE_RW_FILE(name,fp )

  • 宏參數(shù):symbol name, FILE fp

  • 返回值:沒(méi)有任何返回值

  • 調(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ì)話框中。

Fluent UDF【16】:通用宏[1]【轉(zhuǎn)發(fā)】fluent分析案例圖片10

下期結(jié)合案例具體講這四個(gè)宏的用法。

Fluent UDF【16】:通用宏[1]【轉(zhuǎn)發(fā)】fluent分析案例圖片11

Fluent UDF【16】:通用宏[1]【轉(zhuǎn)發(fā)】fluent圖片12

困了~


轉(zhuǎn)自公眾號(hào):胡坤 CFD仿真之道

開放分享:優(yōu)質(zhì)有限元技術(shù)文章,助你自學(xué)成才

相關(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電磁分析 

編輯
在線報(bào)名:
  • 客服在線請(qǐng)直接聯(lián)系我們的客服,您也可以通過(guò)下面的方式進(jìn)行在線報(bào)名,我們會(huì)及時(shí)給您回復(fù)電話,謝謝!
驗(yàn)證碼

全國(guó)服務(wù)熱線

1358-032-9919

廣州公司:
廣州市環(huán)市中路306號(hào)金鷹大廈3800
電話:13580329919
          135-8032-9919
培訓(xùn)QQ咨詢:點(diǎn)擊咨詢 點(diǎn)擊咨詢
項(xiàng)目QQ咨詢:點(diǎn)擊咨詢
email:kf@1cae.com