Fluent UDF 獲取組分傳輸模型中的摩爾分數或分壓力


很多朋友在開發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中的運行結果

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM