這是一個(gè)自娛自樂的FLUENT udf分享
自制udf分享(以及尋求幫助)
Warning?。。。。。。。。。。。。。。。。。。?!!屎山代碼警告,意義不明的變量定義警告
Udf功能:粘性函數(shù)1,2通過控制流體粘性略微增加了歐拉多相流計(jì)算流體注入容器時(shí)的穩(wěn)定性(出現(xiàn)發(fā)散跡象時(shí)能救回來,但過于離譜的邊界條件該發(fā)散還是會(huì)發(fā)散)
速度邊界函數(shù):根據(jù)第二相流體體積變化率實(shí)時(shí)調(diào)整速度邊界入口速度。
迭代結(jié)束執(zhí)行函數(shù):當(dāng)某一參數(shù)滿足設(shè)定標(biāo)準(zhǔn)時(shí)直接中斷計(jì)算,這里設(shè)置的是當(dāng)出口質(zhì)量流大于0.05kg/s時(shí)停止計(jì)算。
#include?"udf.h"
#include?"math.h"
#include?"sg_udms.h"
#include?"unsteady.h"
#include?"sg_mphase.h"
#define?standard 20
#define?inlet_zone 9049
#define?mass_rate 0.5
#define?acc 0.001
#define?dec 0.0001
#define?outlet_zone1 19
#define?outlet_zone2 20
#define?flux_standard 0.05
?
DEFINE_PROPERTY(pp_viscosity,c,t)
{
real SR=C_STRAIN_RATE_MAG(c,t);
real n=0.511;
real k=1800;
real YSR;
real PV=500;
real YP=300;
real EV;
real MAG=0;
YSR=YP/(k-PV);
EV=1;
MAG=sqrt(pow(C_U(c,t),2)+pow(C_V(c,t),2)+pow(C_W(c,t),2));
YSR=YP/(k-PV);
if?(SR<YSR)
{EV=YP*((2*YSR-SR)/(YSR*YSR))+k*((2-n)+(n-1)*(SR/YSR));}
else
{EV=(YP/SR)+k*(exp((n-1)*log(SR/YSR)));}
if(MAG>standard)
{EV=MAG/standard*mu*EV;}
return?EV;
}
?
Pp材料的粘性系數(shù)函數(shù),本體為非牛頓流體材料的粘性系數(shù),最后增加了一個(gè)判定標(biāo)準(zhǔn),所有速度大于standard變量的pp材料粘性都會(huì)隨速度線性增大,standard變量已在函數(shù)頂部列出可以手動(dòng)修改。
?
DEFINE_PROPERTY(air_viscosity,c,t)
{real EV;
real MAG=0;
EV=0.0017894;
MAG=sqrt(pow(C_U(c,t),2)+pow(C_V(c,t),2)+pow(C_W(c,t),2));
if(MAG>standard)
{EV=MAG/standard*mu*EV*3;}
return?EV;
}
Air材料的粘性系數(shù)函數(shù),同pp材料,對standard變量的修改同樣會(huì)對本函數(shù)生效。
???????????
DEFINE_PROFILE(inlet_v_eular,t,i)
{Domain *d;
Thread *tt;
cell_t c;
face_t f;
real a=0;
real b=0.72;
real v=0.00373;
real h=0;
d=Get_Domain(3);
tt=Lookup_Thread(d,inlet_zone);
begin_c_loop(c,tt)
a+=C_VOLUME(c,tt)*C_VOF(c,tt);
end_c_loop(c,tt)
?
#if?RP_NODE
a=PRF_GRSUM1(a);
#endif
?
begin_c_loop(c,tt)
?
if(C_UDMI(c,tt,0)==0)
{C_UDMI(c,tt,0)=a;}
if(C_UDMI(c,tt,1)==0)
{C_UDMI(c,tt,1)=a;}
?
if(C_UDMI(c,tt,2)<0.72)
{C_UDMI(c,tt,2)=b;}
?
if(N_TIME>3)
{if(N_TIME%2)
{v=2000*(a-C_UDMI(c,tt,0))/PREVIOUS_TIMESTEP;
v=sqrt(pow(v,2));
if(v<mass_rate&v!=0)
{C_UDMI(c,tt,2)=acc+C_UDMI(c,tt,2);}
if(v>mass_rate)
{C_UDMI(c,tt,2)=-dec+C_UDMI(c,tt,2);}
C_UDMI(c,tt,1)=a;}
?
if(N_TIME%2==0)
{v=2000*(a-C_UDMI(c,tt,1))/PREVIOUS_TIMESTEP;
v=sqrt(pow(v,2));
if(v<mass_rate&v!=0)
{C_UDMI(c,tt,2)=acc+C_UDMI(c,tt,2);}
if(v> mass_rate)
{C_UDMI(c,tt,2)=-dec+C_UDMI(c,tt,2);}
C_UDMI(c,tt,0)=a;}}
?
b=C_UDMI(c,tt,2);
?
end_c_loop(c,tt)
?
b=PRF_GRHIGH1(b);
begin_f_loop(f,t)
F_PROFILE(f,t,i)=b;
end_f_loop(f,t)}
?
Inlet_v_eluar函數(shù)主要通過監(jiān)控流場域中pp材料的質(zhì)量實(shí)時(shí)變化率修改進(jìn)出口流速,使質(zhì)量變化率保持恒定,重要的變量為inlet_zone,mass_rate,acc,dec,這些變量均在頂部中列出,其中在更換不同模型的算例時(shí)inlet_zone必須改為對應(yīng)模型的流場域ID,錯(cuò)誤的ID將導(dǎo)致算例崩潰,算例ID可在cell_room_condition選項(xiàng)下,對應(yīng)域名字后面查看。mass_rate變量為目標(biāo)質(zhì)量變化率,如果流場中材料變化率低于mass_rate,則入口速度每次迭代都會(huì)加上acc的值,直至變化率等于mass_rate,相反若高于mass_rate,則每次迭代會(huì)減去dec的值。
?
DEFINE_EXECUTE_AT_END(execute_vof_calculate)
{Domain *d;
Thread *t1;
Thread *t2;
cell_t c;
real a=0;
real flux=0;
real flag=0;
face_t f;
real area=0;
real farea[ND_ND];
int?outlet_zone1=19;
int?zone_ID2=20;
d=Get_Domain(3);
t1=Lookup_Thread(d,outlet_zone1);
t2=Lookup_Thread(d,zone_ID2);
?
begin_f_loop(f,t1)
F_AREA(farea,f,t1);
area+=NV_MAG(farea);
a+=F_FLUX(f,t1);
end_f_loop(f,t1)
?
begin_f_loop(f,t2)
F_AREA(farea,f,t2);
area+=NV_MAG(farea);
a+=F_FLUX(f,t2);
end_f_loop(f,t2)
?
#if?RP_NODE
flux=PRF_GRSUM1(a)*1e9/2000*CURRENT_TIMESTEP;
area=PRF_GRSUM1(area)*1e6;
#endif
node_to_host_real_1(flux);
#if?RP_HOST
if(flux>flux_standard)
{RP_Set_Integer("interruptflag",9);}
#endif
}
?
execute_vof_calculate函數(shù)為vof法的定量停止函數(shù),需要配合Fluent的command指令和TUI命令一同使用,具體指令會(huì)在底部列出。execute_vof_calculate函數(shù)的重要變量是outlet_zone1,outlet_zone2和flux_standard,均在頂部列出。該函數(shù)具體作用是當(dāng)單位時(shí)間內(nèi)流出指定邊界的體積流量高于flux_standard時(shí),會(huì)更改interruptflag變量值將其置為9,然后Fluent內(nèi)部指令檢測到interruptflag變量變化會(huì)立即終止計(jì)算,從而達(dá)到定量停止的目的。當(dāng)更換不同模型時(shí)必須將outlet_zone1和outlet_zone2改為對應(yīng)出口邊界的ID,具體ID可在Fluent中boundary?condition選下下出口邊界名后部查看。
Command指令如下所示:
(if(>(%rpgetvar 'interruptflag) 0)(set! mstop? #t))
TUI命令如下所示:
(rp-var-define 'interruptflag 0 'interger #f)
其中TUI命令每次啟動(dòng)都需要在console指令框中重新輸入。
?
關(guān)于速度入口函數(shù),因?yàn)檎也坏襟w積關(guān)于時(shí)間的導(dǎo)數(shù)宏從而足足定義了三個(gè)udmi位輔助計(jì)算,從而使得計(jì)算效率奇低,如果哪個(gè)大佬有辦法改進(jìn)的話麻煩私我一下,非常感謝,另外如果看的人多的話,或許可能也許。。會(huì)出一個(gè)實(shí)際操作教學(xué)?如果懶病不犯的話(笑)