您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 信息化管理 > FLUENT计算变量的梯度:VOF的梯度-pancard
1FLUENT变量梯度宏C_R_GC_P_GC_U_GC_V_GC_W_GC_T_GC_H_GC_YI_GC_R_RGC_P_RGC_U_RGC_V_RGC_W_RGC_T_RGC_H_RGC_YI_RGFLUENT计算中单元变量有两种梯度:非限制梯度(后缀_G)和重建梯度(后缀_RG),帮助文档建议如果需要通过单元变量重建计算单元面上的变量则使用重建梯度计算更精确。说明:(1)只有当求解器正在求解某一变量时才能读取该变量的梯度。例如,定义一个能量源项时,可以读取温度梯度(C_T_G),但是不能读取速度梯度(如C_U_G)。这是因为求解器不断释放它不需要的变量存储。如果你要保留这些变量梯度,可以使用TUI命令:solve/set/expert设置“Keeptemporarysolvermemoryfrombeingfreed?”[Yes]。当然这样做,计算需要更多内存。(2)C_R_G只有density-basedsolver中才能使用;C_P_G只有pressure-basedsolver中才能使用。(3)C_YI_G只有density-basedsolver中可用,如果pressure-basedsolver要使用C_YI_G,则需要设置species/save-gradients?#t.(4)变量的梯度是否存在与求解器、模型、离散方式以及是否设置保留这些变量梯度有关。(5)C_VOF_G是否存在?质量源项中是否可以读取?设置保留对其无效?上述问题未知(6)UDS变量的梯度可以通过C_UDSI_G(C,0)访问,求解中始终存储,即使设置“Keeptemporarysolvermemoryfrombeingfreed?”[No],UDS的梯度仍存在;而且在方程求解控制中设置不求解UDS,仍可以读取UDS梯度。2FLUENT不计算和保存VOF的梯度一般情况下,FLUENT计算过程中会计算VOF及其梯度(因为表面张力的计算需要用到VOF梯度),会保存VOF值,但是不保存VOF梯度。因此,如果UDF中利用宏C_VOF_G读取VOF梯度则会报读取错误,如下例:UDF定义一个与VOF梯度成正比的动量源项:DEFINE_SOURCE(xmomentum,c,t,dS,eqn){Thread*w;realvof_gx,source;w=THREAD_SUB_THREAD(t,1);vof_gx=C_VOF_G(c,w)[0];source=-200*C_R(c,t)*vof_gx;dS[eqn]=0;returnsource;}运行后报错:Error:FLUENTreceivedfatalsignal(ACCESS_VIOLATION)1.Noteexacteventsleadingtoerror.2.Savecase/dataundernewname.3.Exitprogramandrestarttocontinue.4.Reporterrortoyourdistributor.有些人修改读取VOF梯度的语句后,运行成功,但是实际上未读取到梯度值。if(NNULLP(THREAD_STORAGE(t,SV_VOF_G)))vof_gx=C_VOF_G(c,w)[0];elsevof_gx=0;由于FLUENT未存储VOF梯度,THREAD_STORAGE(t,SV_VOF_G)返回的都是NULL。还有些人利用TUI打开中间量的保存:Solve-set-expertkeeptemporarysolvermemoryfrombeingfreed?[yes]保存求解临时存储而不释放?[yes]这一设置对C_T_G,C_P_G等梯度是有效的,但是对VOF的梯度似乎无效。3读取VOF梯度方法1#includeudf.h#includesg.h#includesg_mphase.h#includeflow.h#includemem.h#includemetric.hDEFINE_ADJUST(store_VOF_gradient,domain){Thread*t;Thread*ppt;Thread**pt;cell_tc;intphase_domain_index=1;Domain*pDomain=DOMAIN_SUB_DOMAIN(domain,phase_domain_index);Alloc_Storage_Vars(pDomain,SV_VOF_RG,SV_VOF_G,SV_NULL);Scalar_Reconstruction(pDomain,SV_VOF,-1,SV_VOF_RG,NULL);Scalar_Derivatives(pDomain,SV_VOF,-1,SV_VOF_G,SV_VOF_RG,Vof_Deriv_Accumulate);mp_thread_loop_c(t,domain,pt){if(FLUID_THREAD_P(t)){ppt=pt[phase_domain_index];begin_c_loop(c,t){C_UDMI(c,t,0)=C_VOF_G(c,ppt)[0];C_UDMI(c,t,1)=C_VOF_G(c,ppt)[1];C_UDMI(c,t,2)=C_VOF_G(c,ppt)[2];}end_c_loop(c,t)}}Free_Storage_Vars(pDomain,SV_VOF_RG,SV_VOF_G,SV_NULL);}上例利用了一些帮助上无法查到的FLUENT函数手动设置VOF梯度计算,Alloc_Storage_Vars,Scalar_Reconstruction,Scalar_Derivatives这些函数的大概功能可以猜到,但是没有详细说明。4读取VOF梯度方法2将VOF赋值给UDS变量,然后通过C_UDSI_G间接求得梯度。下例是FLUENT帮助文档中给出的一个例子:将VOF赋值给UDS;进行一次迭代计算,但不计算UDS方程;尽管未计算UDS方程,仍可以得到梯度值,并将其赋值给UDM用于显示。#includeudf.h#definedomain_ID2DEFINE_ADJUST(adjust_gradient,domain){Thread*t;cell_tc;face_tf;domain=Get_Domain(domain_ID);/*FillUDSwiththevariable.*/thread_loop_c(t,domain){begin_c_loop(c,t){C_UDSI(c,t,0)=C_VOF(c,t);}end_c_loop(c,t)}thread_loop_f(t,domain){if(THREAD_STORAGE(t,SV_UDS_I(0))!=NULL)begin_f_loop(f,t){F_UDSI(f,t,0)=F_VOF(f,t);}end_f_loop(f,t)}}DEFINE_ON_DEMAND(store_gradient){Domain*domain;cell_tc;Thread*t;domain=Get_Domain(1);/*FilltheUDMwithmagnitudeofgradient.*/thread_loop_c(t,domain){begin_c_loop(c,t){C_UDMI(c,t,0)=NV_MAG(C_UDSI_G(c,t,0));}end_c_loop(c,t)}}5在质量源项上读取VOF模型计算中,在某一相的质量源中读取C_VOF_G(C,ts)并将其传递给UDMI,方法未验证。
本文标题:FLUENT计算变量的梯度:VOF的梯度-pancard
链接地址:https://www.777doc.com/doc-7257357 .html