用户自定义函数教程

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

用户自定义函数UDF用户自定义函数•用户自定义函数或UDF是用户自编的程序它可以被动态的连接到Fluent求解器上来提高求解器性能用户自定义函数用C语言编写使用DEFINE宏来定义UDFs中可使用标准C语言的库函数也可使用预定义宏FluentInc.提供通过这些预定义宏可以获得Fluent求解器得到的数据UDF分类与区别•UDFs使用时可以被当作解释函数或编译函数•解释函数在运行时读入并解释•编译UDFs则在编译时被嵌入共享库中并与Fluent连接•解释UDFs用起来简单但是有源代码和速度方面的限制不足。编译型UDFs执行起来较快也没有源代码限制但设置和使用较为麻烦UDF的用途-满足用户个性化需求•边界条件•材料性质•表面与体积反应速率•输运方程源项•用户标量输运方程(UDS)•调节每次迭代值•初始化流场•异步执行•后处理改善•模型改进(离散项模型,多相混合物模型,辐射模型等)UDF举例上壁面温度300K绝热壁面绝热壁面温度:315K温度分布Profile处理((Temppoint26)(x0.00E-032.00E-034.00E-036.00E-038.00E-031.00E-021.20E-021.40E-021.60E-021.80E-022.00E-022.20E-022.40E-022.60E-022.80E-023.00E-023.20E-023.40E-023.60E-023.80E-024.00E-024.20E-024.40E-024.60E-024.80E-025.00E-02)(y0.00E+000.00E+000.00E+000.00E+000.00E+000.00E+000.00E+000.00E+000.00E+000.00E+000.00E+000.00E+000.00E+000.00E+000.00E+000.00E+000.00E+000.00E+000.00E+000.00E+000.00E+000.00E+000.00E+000.00E+000.00E+000.00E+00)(t3.49E+023.50E+023.50E+023.47E+023.46E+023.44E+023.41E+023.39E+023.36E+023.33E+023.31E+023.28E+023.26E+023.24E+023.22E+023.20E+023.19E+023.18E+023.17E+023.16E+023.16E+023.16E+023.15E+023.15E+023.15E+023.15E+02))Profile处理要点•(和一般计算一样设置求解器,模型等)•Define-Profile-Read(数据)•Define-BoundaryCondition-所需设置的面-Thermal-Temperature-Tempt•(和一般计算一样,设置其它边值条件、初值条件及求解与结果检查等)UDF处理温度#includeudf.hDEFINE_PROFILE(bottom_temperature,thread,position){realx[ND_ND];/*thiswillholdthepositionvector*/realy;face_tf;begin_f_loop(f,thread){F_CENTROID(x,f,thread);y=x[0];F_PROFILE(f,thread,position)=315.+(y-.044)*(y-.044)/.044/.044*35.;}end_f_loop(f,thread)}UDF设置边界温度处理要点•(和一般计算一样设置求解器,模型等)•Define-Userdefined-Functions-(InterpretedOrCompiled)-编译•Define-BoundaryCondition-所需设置的面-Thermal-Temperature-BottomTemperature•(和一般计算一样,设置其它边值条件、初值条件及求解与结果检查等)侧面与地面两处UDF定义一个以上UDF上壁面温度300K温度抛物线分布绝热壁面温度:315K温度分布UDF编写#includeudf.hDEFINE_PROFILE(bottom_temperature,thread,position){程序1}DEFINE_PROFILE(side_temperature,thread,position){程序2}DEFINE_PROFILE(inlet_velocity,thread,position){程序3。。。。。。}边界温度分布左侧温度分布下面温度分布场温度分布UDF编写-用C语言•注释/*这是刘某人讲课示范用的程序*/•数据类型Int:整型Long:长整型Real:实数Float:浮点型Double:双精度Char:字符型UDF解释函数在单精度算法中定义real类型为float型,在双精度算法宏定义real为double型。因为解释函数自动作如此分配,所以使用在UDF中声明所有的float和double数据变量时使用real数据类型是很好的编程习惯。局部变量•局部变量只用于单一的函数中。当函数调用时,就被创建了,函数返回之后,这个变量就不存在了,局部变量在函数内部(大括号内)声明。在下面的例子中,mu_lam和temp是局部变量。DEFINE_PROPERTY(cell_viscosity,cell,thread){realmu_lam;realtemp=C_T(cell,thread);if(temp288.)mu_lam=5.5e-3;elseif(temp286.)mu_lam=143.2135-0.49725*temp;elsemu_lam=1.;returnmu_lam;}FLUENT求解过程中UDFs的先后顺序非耦合求解器耦合求解器FLUENT网格拓扑•单元(cell)区域被分割成的控制容积•单元中心(cellcenter)FLUENT中场数据存储的地方•面(face)单元(2Dor3D)的边界•边(edge)面(3D)的边界•节点(node)网格点•单元线索(cellthread)在其中分配了材料数据和源项的单元组•面线索(facethread)在其中分配了边界数据的面组•节点线索(nodethread)节点组•区域(domain)由网格定义的所有节点、面和单元线索的组合Fluent数据类型•cell_t•face_t•Thread•Node•Domaincell_t是线索(thread)内单元标识符的数据类型。它是一个识别给定线索内单元的整数索引。face_t是线索内面标识符的数据类型。它是一个识别给定线索内面的整数索引。Thread数据类型是FLUENT中的数据结构。它充当了一个与它描述的单元或面的组合相关的数据容器。Node数据类型也是FLUENT中的数据结构。它充当了一个与单元或面的拐角相关的数据容器。Domain数据类型代表了FLUENT中最高水平的数据结构。它充当了一个与网格中所有节点、面和单元线索组合相关的数据容器。使用DEFINEMacros定义UDF•DEFINE_MACRONAME(udf_name,passed-invariables)•这里括号内第一个自变量是你的UDF的名称。名称自变量是情形敏感的必须用小写字母指定。•一旦函数被编译(和连接),你为你的UDF选择的名字在FLUENT下拉列表中将变成可见的和可选的。第二套输入到DEFINE宏的自变量是从FLUENT求解器传递到你的函数的变量。•DEFINE_PROFILE(inlet_x_velocity,thread,index)•用两个从FLUENT传递到函数的变量thread和index定义了名字为inlet_x_velocity的分布函数。这些passed-in变量是边界条件区域的ID(作为指向thread的指针)而index确定了被存储的变量。一旦UDF被编译,它的名字(例如,inlet_x_velocity)将在FLUENT适当的边界条件面板(例如,VelocityInlet面板)的下拉列表中变为可见的和可选的。UDF源文件中包含udf.h文件•#includeudf.h•通过在你的UDF源文件中包含udf.h,编译过程中所有的DEFINE宏的定义与源代码一起被包含进来。udf.h文件也为所有的C库函数头文件包含#include指示,与大部分头文件是针对Fluent提供的宏和函数是一样的(例如,mem.h)。除非有另外的指示,没必要在你的UDF中个别地包含这些头文件。DEFINE_PROFILE(inlet_x_velocity,thread,index)定义在udf.h文件中为#defineDEFINE_PROFILE(name,t,i)voidname(Thread*t,inti)在编译过程中延伸为voidinlet_x_velocity(Thread*thread,intindex)名字为inlet_x_velocity的函数不返回值由于它被声明为空的数据类型。UDF任务•返回值•修改自变量•返回值和修改自变量•修改FLUENT变量(不能作为自变量传递)•写信息到(或读取信息从)case或data文件返回值•DEFINE_PROPERTY返回一个udf.h中指定的real数据类型。两个real变量传入函数:通过函数计算层流粘度mu_lam的值,其是温度C_T(cell,thread)的函数。根据单元体温度,计算出mu_lam,在函数结尾,mu_lam值被返回。DEFINE_PROPERTY(cell_viscosity,cell,thread){realmu_lam;realtemp=C_T(cell,thread);if(temp288.)mu_lam=5.5e-3;elseif(temp286.)mu_lam=143.2135-0.49725*temp;elsemu_lam=1.;returnmu_lam;}FunctionthatModifyanArgument•判断单元是否在多孔区域,给多孔介质区域定义反应速率;•real指针变量rr是一个传递给函数的自变量。UDF使用废弃操作符*分配反应速率值给废弃指针*rr。指针rr指向的目标是设置反应速率。通过这个操作,存储在内存中这个指针上的字符的地址被改变了,不再是指针地址本身#includeudf.h#defineK12.0e-2#defineK25.DEFINE_VR_RATE(user_rate,c,t,r,mole_weight,species_mf,rr,rr_t){reals1=species_mf[0];realmw1=mole_weight[0];if(FLUID_THREAD_P(t)&&THREAD_VAR(t).fluid.porous)*rr=K1*s1/pow((1.+K2*s1),2.0)/mw1;else*rr=0.;}返回一个值和修改一个自变量的函数•DEFINE_SOURCE返回一个在udf.h中指定的数据类型。函数采用自变量ds(它是数组的名字)并设置由eqn指定的元素为关于速度(w_vel)导数的值。(这是z动量方程源项)。这个函数也计算了旋转速度源项的值source,并返回这个值到求解器。#includeudf.h#defineOMEGA50./*rotationalspeedofswirler*/#defineWEIGHT1.e20/*weightingcoefficientsinlinearizedequation*/DEFINE_SOURCE(user_swirl,cell,thread,dS,eqn){realw_vel,x[ND_ND],y,source;C_CENTROID(x,cell,thread);y=x[1];w_vel=y*OMEGA;/*linearw-velocityatthecell*/source=WEIGHT*

1 / 65
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功