很多朋友在開發Fluent模型中需要用UDF獲取組分傳輸模型中的某氣體組分的摩爾分數(或體積分數)或者分壓力,但是UDF自帶的只有獲取質量分數的宏C_YI(c,t),需要自己寫額外的代碼去轉換,有一定難度。已經不止一次看到論壇或者我們UDF編譯調試插件群里的朋友問起這個問題,這里做個標准教程記錄下來,希望對大家有用。
總體來說,有兩種方法,一種是利用內置的函數來轉換,另外一種就是自己寫代碼轉換,這里逐一介紹。
1. 利用內置函數轉換
內置轉換方法參考了Fluent官方解決方案,稍微作了一些修改,並加了一些注釋(利用VC++ UDF Studio插件編譯通過 (https://vcudfstudio.github.io))。
//利用VC++ UDF Studio插件編譯通過 #include "udf.h" #define CO2_INDEX 2 //假設你想獲取CO2的摩爾分數,且CO2的序號為2,case不同可能有所不同 #define ZONE_ID 4 // 4是要匯報的區域ID,case不同可能有所不同 DEFINE_EXECUTE_AT_END(report_CO2_Pressure) { cell_t c; Domain*domain= Get_Domain(1); //獲取計算域指針 Material *mix_mat = mixture_material(domain); //獲取氣體混合物材料屬性 Thread*tc=Lookup_Thread(domain, ZONE_ID); begin_c_loop(c,tc) { int i = -1; //循環的組分序號 Material *spe_mat = NULL; //定義組分材料屬性 real all_mass_fracts[MAX_SPE_EQNS]; //需要用戶自己填充的各氣體組分質量分數的數組 real all_mole_fracts[MAX_SPE_EQNS]; //內置函數轉換得到各氣體組分摩爾分數的數組,待填充 mixture_species_loop(mix_mat, spe_mat, i) //對混合物內所有組分循環 { all_mass_fracts[i] = C_YI(c,tc,i); //將各個組分的質量分數填充進數組 } Mole_Fraction(mix_mat, all_mass_fracts, all_mole_fracts); //調用自帶函數由質量分數轉為摩爾分數 //填充到all_mole_fracts數組 real co2_mole_fract= all_mole_fracts[CO2_INDEX]; //根據CO2序號獲取摩爾分數 real Pressure_CO2=C_P(c,tc)*co2_mole_fract; //獲取CO2分壓力 Message0("c=%d, CO2 partial pressure=%g\n", c, Pressure_CO2); } end_c_loop(c,tc); }
有的朋友可能會問,那組分的序號該怎么確定呢?這需要打開組分面板,然后查看各個組分的排列,排第一個的序號是0,后面依次加1,CO2數下來就是2。當然高級一些,也可以用UDF程序自動實現,但這屬於另外的話題,這里不啰嗦了。做學術研究,大家手動數一下,編譯之前在源代碼改一下也不麻煩。
2. 自己寫代碼轉換
第一種方法雖然方便,但會分配兩個元素個數為MAX_SPE_EQNS(fluent中大小為50)的數組,而實際組分數量一般也就十個以下,多少會浪費一些內存空間,對於我這種有強迫症的人還是覺得不爽,於是就自己動手寫代碼轉換。
//利用VC++ UDF Studio插件編譯通過 #include "udf.h" #define CO2_INDEX 2 //假設你想獲取CO2的摩爾分數,且CO2的序號為2,case不同可能有所不同 #define ZONE_ID 4 // 4是要匯報的區域ID,case不同可能有所不同 DEFINE_EXECUTE_AT_END(report_CO2_Pressure) { cell_t c; Domain*domain= Get_Domain(1); //獲取計算域指針 Material *mix_mat = mixture_material(domain); //獲取氣體混合物材料屬性 Thread*tc=Lookup_Thread(domain, ZONE_ID); begin_c_loop(c,tc) { int i; real Mw_CO2; //CO2的分子量 real total_mole=0; Material *spe_mat = NULL; //定義組分材料屬性 mixture_species_loop(mix_mat, spe_mat,i) //對混合物內所有組分循環 { real Mwi=MATERIAL_PROP(spe_mat,PROP_mwi); //混合物中組分的分子量,循環中可變 if(i==CO2_INDEX) Mw_CO2=Mwi; // 獲取CO2的分子量 total_mole += C_YI(c,tc,i)/Mwi; // 所有組分求和 } real co2_mole_fract=(C_YI(c,tc,CO2_INDEX)/Mw_CO2)/total_mole; //直接用質量分數轉摩爾分數公式轉換 real Pressure_CO2=C_P(c,tc)*co2_mole_fract; //獲取CO2分壓力 Message0("c=%d, CO2 partial pressure=%g\n", c, Pressure_CO2); } end_c_loop(c,tc); }
好了,這下世界終於清凈了。哈哈,開個玩笑!
上述就是獲取氣體摩爾分數(體積分數)或分壓力的兩種方法。
附上我的case中的運行結果