Fluent中用户自定义函数应用举例Word文件下载.docx
《Fluent中用户自定义函数应用举例Word文件下载.docx》由会员分享,可在线阅读,更多相关《Fluent中用户自定义函数应用举例Word文件下载.docx(35页珍藏版)》请在冰豆网上搜索。
这样
速度在入口中心为20m/sec,在边缘为0。
UDF用于传入入口上的这个抛物线分布。
C源代码(vprofile.c)显示如下。
函数使用了Section5.3中描述的Fluent提供的求解器函数。
/***********************************************************************/
/*vprofile.c*/
/*UDFforspecifyingsteady-statevelocityprofileboundarycondition*/
/***********************************************************************/
#include"
udf.h"
DEFINE_PROFILE(inlet_x_velocity,thread,position)
{
realx[ND_ND];
/*thiswillholdthepositionvector*/
realy;
face_tf;
begin_f_loop(f,thread)
{
F_CENTROID(x,f,thread);
y=x[1];
F_PROFILE(f,thread,position)=20.-y*y/(.0745*.0745)*20.;
}
end_f_loop(f,thread)
}
函数,被命名为inlet_x_velocity,使用了DEFINE_PROFILE定义并且有两个自变量:
thread和position。
Thread是一个指向面的thread的指针,position是一个整数,它是每个循环(loop)内为变量设置的数值标签。
函数通过声名变量f作为face_t的数据类型。
一维数组x和变量y被定义为real数据类型。
循环宏用于循环区域内每个面来创建型线,或数据数组。
每个循环内,F_CENTROIDS为带指标f的面输出面质心(数组x)的值,指标f在被thread指向的线(thread)上。
存储在x[1]中的y坐标用于为变量y赋值,然后用于计算x速度。
这个值接着被分配到F_PROFILE,使用整数position(在你从VelocityInlet面板中选择的UDF作为x速度的边界条件的基础上通过求解器传递给它)来设置内存中x速度面值。
为了在FLUENT中使用这个解释式UDF,你必须首先编译它。
Define
User-Defined
Functions
Interpreted...
在InterpretedUDFs面板中,在SourceFileName区域命名你的函数。
如果必要,在CPPCommandName区域输入你的C预处理程序类型和在StackSize下输入堆栈大小。
打开DisplayAssemblyListing在你的控制台窗口中能看到汇编列表,当函数编译时。
点击Compile然后Close面板。
为了选择这个用户定义函数作为所选区域的速度边界条件,打开VelocityInlet面板。
在X-Velocity下拉列表下,选择udfinlet_x_velocity,这个名字在上面已经命名给函数。
这个函数将被使用,而不是出现在X-Velocity区域的0值(在这个例子中)。
点OK接受这个新边界条件并关闭面板。
在求解运行到收敛之后,获得了一个修正的速度场如Figure10.1.4and10.1.5所示。
速度场在入口中心显示了最大值,到边缘上降为0。
Figure10.1.4:
VelocityMagnitudeContoursforaParabolicInletxVelocity
Figure10.1.5:
VelocityVectorsforaParabolicInletxVelocity
10.1.2管内流动的瞬态速度入口分布
这个例子中,瞬时的周期性的速度边界条件使用UDF应用于管子的入口。
速度形式为:
(10.1.1)
管子长1m,半径为0.2m。
假设充满密度为1kg/m3和粘度为
kg/m-s的空气。
空气速度关于平衡值
的波动振幅为5m/s,频率为10rad/s。
速度分布UDF(unsteady.c)的源代码显示如下。
/**********************************************************************/
/*unsteady.c*/
/*UDFforspecifyingatransientvelocityprofileboundarycondition*/
/**********************************************************************/
DEFINE_PROFILE(unsteady_velocity,thread,position)
realt=RP_Get_Real("
flow-time"
);
F_PROFILE(f,thread,position)=20.+5.0*sin(10.*t);
函数,被命名为unsteady_velocity,使用DEFINE_PROFILEmacro定义。
TheutilityRP_Get_Real("
)用于访问real流动时间,它被分配给变量t。
(RP_Get_Real的详细内容见Section6.9)。
在你编译这个UDF之前,你必须在Solver面板中指定为非稳态流动计算。
Models
Solver...
接下来你将打开InterpretedUDFs面板。
在SourceFileName下面的文本框内输入函数的名字,如果必要,还有你的C预处理程序的名字。
打开DisplayAssemblyListing。
点击Compile然后关闭面板。
由UDF定义的正弦速度边界条件现在可选为入口区域的X-Velocity。
在X-Velocity面板中,在X-Velocity区域右边的下拉列表中选择udfunsteady_velocity,并点击OK。
时间步参数在Iterate面板中设置。
Solve
Iterate...
在这个例子中,使用了0.0314的TimeStepSize,因此在入口速度一个完整的震荡周期内将完成20个时间步。
在每个时间步内执行的迭代次数被限制为20。
在求解的早期阶段这个迭代次数不足以获得收敛的流场,但是在通过几个时间步之后,很可能导致收敛的时间步。
UDFProfileUpdateInterval被设置为1因此每次迭代速度都被更新。
在完成了60个时间步之后(或3个周期),你可以检查跨越压力出口由振荡入口条件引起速度数量级。
为了在计算阶段收集这个信息,在开始迭代之前打开SurfaceMonitors面板。
Monitors
Surface...
增加SurfaceMonitors的指标到1。
这将使你定义monitor-1(如果需要,你可重命名,在Name下的文本输入框内)的参数。
选择Plot,所以所选的数量将作为计算的收益被画出来。
选择Print在控制台窗口来看所选数的变化值。
选择Write,因而信息将被写入文件,它将被给一个名字为monitor-1.out。
(如果你改变了monitor的名字,这个名字将用作输出文件的前缀)。
在Every下面,你可选择Iteration,TimeStep,orFlowTime。
为了监视每个时间步的结果,你应选择TimeStep选项。
通过点击Define...你可在DefineSurfaceMonitor面板中指定被监视的数量。
在这个例子中,在ReportOf下的下拉列表中选择Velocity...andVelocityMagnitude。
报告的区域是pressure-outlet-5,,在Surfaces列表中选择它。
Area-WeightedAverage在ReportType的下拉列表中选择,FlowTime在XAxis的下拉列表中选择。
一旦完成了你要求的迭代次数,监视器应出现在所选绘图窗口中。
作为选择,你可通过打开FileXYPlot面板读入文件。
Plot
File...
你可通过在Files下面的文本框中输入它的名字来读取输出文件和选择这个文件并点击Add....,然后点击Plot,你可获得Figure10.1.6的图形显示。
Figure10.1.6:
AverageVelocityMagnitudeatthePressureOutlet
这个图精细地显示了速度以期望的振幅值5m/s围绕平衡值20m/s上下振荡。
10.2源项
这部分包含了源项UDF的应用。
在FLUENT中它是作为解释式UDF被执行的。
10.2.1给管道流动添加动量源项(AddingaMomentumSourcetoaDuctFlow)
当使用UDF模拟源项时,理解函数调用的内容是很重要的。
当你增加了一个源项,它在单元上执行全局的循环时,FLUENT将调用你的函数。
你的函数应只计算源项并返回它到求解器。
在这个例子中,动量源项将被添加到2D笛卡儿管道流动中。
管道长4m,宽2m,使用通过中心线的对称边界条件来模拟。
液体金属(其属性列举在表10.2.1中)在290K温度下从左边以1mm/s的速度进入管道。
在金属沿着管道前进了0.5m之后,它受到了冷壁面的冷却,壁面温度保持在280K。
为了模拟金属的凝固,只要它的温度一降到288K以下,动量源项就应用于金属。
动量源项是与速度的
分量
成比例的,并有相反的符号:
Sx=-Cvx(10.2.1)
这里C是常数。
当液体凝固时,它的运动将减小到0,模拟的是固体的形成。
(在这个例子中,能量方程不能用来解决凝固潜热。
速度场只能作为凝固区域指示来使用)。
为了提高求解的稳定性和收敛性,求解器应线性化源项。
为了能使求解器做到这点,你必须在你的UDF中以导数的形式指定源项和求解变量之间的依赖关系。
源项
只依赖于求解变量
它关于
的导数为:
(10.2.2)
下面的UDF指定了源项和它的导数:
Table10.2.1:
PropertiesoftheLiquidMetal
Property
Value
Density
8000kg/m3
Viscosity
5.5
kg/m-s
SpecificHeat
680J/kg-K
ThermalConductivity
30W/m-K
/******************************************************************/
/*UDFthataddsmomentumsourcetermandderivativetoductflow*/
#defineCON20.0
DEFINE_SOURCE(cell_x_source,cell,thread,dS,eqn)
realsource;
if(C_T(cell,thread)<
=288.)
/*sourceterm*/
source=-CON*C_U(cell,thread);
/*derivativeofsourcetermw.r.t.x-velocity.*/
dS[eqn]=-CON;
else
source=dS[eqn]=0.;
returnsource;
这个函数,被命名为cell_x_source,使用了DEFINE_SOURCE被定义在单元上。
方程10.2.1中常数C就是函数中的CON,它被赋值为20kg/m3-s,它导致了需要的源项的单位N/m3。
单元的温度由C_T(cell,thread)返回。
这个函数检测温度是否小于(或等于)288K。
如果是,源项根据方程10.2.1计算(C_U返回单元的
速度值)。
如果不是,源项设置为0.0。
在函数的结尾,适当的源项值返回到FLUENT求解器。
UDF以解释(见Section7.2)的方式执行。
为了在计算中包含源项,你首先得激活Fluid面板中的SourceTerms。
然后你可以为Mass,Momentum,andEnergy(可通过移动滑动条看到)添加源项。
(注,在其它应用中,其它问题变量的源项这时也变的有效)。
为了给XMomentum选择用户定义源项,在下拉列表中选择udfcell_x_source并点OK。
一旦求解收敛,你可观察静态温度等值线来看当液态金属沿着管道运动时,壁面对它的冷却效应(Figure10.2.1)。
Figure10.2.1:
TemperatureContoursIllustratingLiquidMetalCooling
速度数量级等值线(Figure10.2.2)显示了壁面附近冷却区域的液体逐渐静止到模拟凝固的发生。
Figure10.2.2:
VelocityMagnitudeContoursSuggestingSolidification
通过流函数的线型等值线(Figure102.3)凝固得到更进一步的显示。
Figure10.2.3:
StreamFunctionContoursSuggestingSolidification
在这种方式下为了更精确地预测液体的凝固,则需要能量源项,给出现在方程10.2.1中的常数C赋以更精确的值。
10.3物理属性(PhysicalProperties)
这部分包含了物理属性UDF的应用。
它在FLUENT中以解释的UDF方式被执行。
10.3.1通过温度依赖粘度的凝固(SolidificationviaaTemperature-DependentViscosity)
属性(和源项一样)的UDF是从单元的内部循环中调用的。
由于这个原因,指定属性的函数只需要计算单个单元的属性,然后返回值给FLUENT求解器。
这个例子中的UDF产生变粘度型线来模拟凝固,它应用于Section10.2.1中给出的同样的问题。
温暖(T>
288K)流体的的粘度对液体有一个分子值(
),而更冷区域(
)的粘度有更大的值(1.0kg/m-s)。
在中等温度范围内(
),粘度在上面给出的两个值之间按线性分布:
(10.3.1)
这个模型的基础是假设液体冷却时很快地变为高粘性,它的速度降低,所以模拟的是凝固。
这里,没有为能量场做修正以包含凝结潜热。
UDF的C源代码显示如下。
/*********************************************************************/
/*UDFforspecifyingatemperature-dependentviscosityproperty*/
DEFINE_PROPERTY(cell_viscosity,cell,thread)
realmu_lam;
realtemp=C_T(cell,thread);
if(temp>
288.)
mu_lam=5.5e-3;
elseif(temp>
286.)
mu_lam=143.2135-0.49725*temp;
mu_lam=1.;
returnmu_lam;
函数,被命名为cell_viscosity,使用了DEFINE_PROPERT定义在单元上。
引入了两个real变量:
temp,C_T(cell,thread)的值,和mu_lam,由函数计算的层流粘度。
温度值被检测了,在它的下降范围的基础上计算了适当的mu_lam值。
在函数的结尾,mu_lam的计算值返回到求解器。
为了使用用户定义的属性,你将使用Materials面板。
在Viscosity的下拉列表下,选择user-defined选项。
一旦你选了这个选项,User-DefinedFunctions面板将打开,在其中你可选择合适的函数名字。
这个例子中,只有一个是有效的,但在别的例子中,你可从中选择几个函数。
(如果你需要编译多于一个的解释式UDF,这些函数应在编译前连接。
详细内容见Section7.2.1)。
这个模拟的结果相似于Section10.2.1中得到的。
Figure10.3.1显示由于应用用户定义函数而导致的粘度场。
粘度在很窄的范围内很快地从常数值0.0055变化到1.0kg/m-s。
速度场(Figure10.3.2)证明响应于粘度的增加,液体流动减慢,这在预料之中。
在这个模拟中,有一个大的“mushy”区域,在其中液体的运动逐渐减小。
这是与第一个模拟的对比,在第一个模拟中应用了动量源项,在流体运动中观察到一个急剧的变化。
Figure10.3.1:
LaminarViscosityGeneratedbyaUser-DefinedFunction
Figure10.3.2:
ContoursofVelocityMagnitudeResultingfromaUser-DefinedViscosity
Figure10.3.3:
10.4反应速率(ReactionRates)
这部分包含了一个反应速率UDF的应用。
它在FLUENT中以编译式的方式执行。
10.4.1自定义体积反应速率(ACustomVolumeRecationRate)
作为一个编译式UDF的例子,考虑为一个两种气态物质的简单系统自定义体积反应速率。
两种物质分别被命名为species-a和spexies-b。
反应速率是一个由下面的表达式给出的从pecies-a转变species-b的速率:
(10.4.1)
这里
是species-a的质量分数,
和
是常数。
2D(平面)区域由90度的弯管组成。
管子宽16inches,约114inches长。
一个6inches厚的多孔区域覆盖在底部和右壁面,反应仅发生在多孔区域。
管子内的物质有相同的属性。
密度是1.0kg/m3,粘度为
区域的轮廓显示在Figure10.4.1中。
多孔介质是从左边入口延伸到区域顶部压力出口的线的下方和右方的区域。
Figure10.4.1:
TheOutlineofthe2DDuct
通过左边入口,气态纯物质species-a以0.1m/s的速度进入。
气体进入多孔介质顶部的开区域和多孔介质本身,这里在两个坐标方向中的每一个上都有5m-1的惯性阻力。
层流流场(Figure10.4.2)显示了大部分气体是从多孔区域转向开区域。
Figure10.4.2:
Streamlinesforthe2DDuctwithaPorousRegion
流动方式通过显示在Figure10.4.3中的矢量图得到进一步证实。
多孔区域的流动比开区域的流动慢的多。
Figure10.4.3:
VelocityVectorsforthe2DDuctwithaPorousRegion
用于模拟发生在多孔区域反应的包含UDF的C源代码(rate.c)显示如下:
/**************************************************************/
/*rate.c*/
/*UDFforspecifyingareactionrateinaporousmedium*/
#defineK12.0e-2
#defineK25.
DEFINE_VR_RATE(user_rate,c,t,r,mole_weight,species_mf,rate,rr_t)
reals1=species_mf[0];
realmw1=mole_weight[0];
if(FLUID_THREAD_P(t)&
&
THREAD_VAR(t).fluid.porous)
*rate=K1*s1/pow((1.+K2*s1),2.0)/mw1;
e