1、第 10 章 应用举例本章包含了 FLUENT 中 UDFs 的应用例子。10.1 边界条件10.2 源项10.3 物理属性10.4 反应速率(Reacting Rates)10.5 用户定义标量(User_Defined Scalars)10.1 边界条件这部分包含了边界条件 UDFs 的两个应用。两个在 FLUENT 中都是作为解释式UDFs 被执行的。10.1.1 涡轮叶片的抛物线速度入口分布要考虑的涡轮叶片显示在 Figure 10.1.1 中。非结构化网格用于模拟叶片周围的流场。区域从底部周期性边界延伸到顶部周期性边界,左边是速度入口,右边是压力出口。Figure 10.1.1: T
2、he Grid for the Turbine Vane Example常数 速度应用于入口的流场与抛物线 速度应用于入口的流场作了比较。当采用分x x段线性分布的型线的应用是有效的对边界型线选择,多项式的详细说明只能通过用户定义函数来完成。常数速度应用于流场入口的结果显示在 Figure 10.1.2 和 Figure 10.1.3 中。当流动移动到涡轮叶片周围时初始常速度场被扭曲。Figure 10.1.2: Velocity Magnitude Contours for a Constant Inlet x VelocityFigure 10.1.3: Velocity Vectors
3、for a Constant Inlet x Velocity现在入口 速度将用以下型线描述:x这里变量 在人口中心是 0.0,在顶部和底部其值分别延伸到 。这样 速度在y 0745.x入口中心为 20m/sec,在边缘为 0。UDF 用于传入入口上的这个抛物线分布。C 源代码(vprofile.c )显示如下。函数使用了 Section 5.3 中描述的 Fluent 提供的求解器函数。 /*/* vprofile.c */* UDF for specifying steady-state velocity profile boundary condition */*/#include “u
4、df.h“DEFINE_PROFILE(inlet_x_velocity, thread, position) real xND_ND; /* this will hold the position vector */real y;face_t f;begin_f_loop(f, thread)F_CENTROID(x,f,thread);y = x1;F_PROFILE(f, thread, position) = 20. - y*y/(.0745*.0745)*20.;end_f_loop(f, thread)函数,被命名为 inlet_x_velocity,使用了 DEFINE_PROF
5、ILE 定义并且有两个自变量:thread 和 position。Thread 是一个指向面的 thread 的指针,position 是一个整数,它是每个循环(loop)内为变量设置的数值标签。函数通过声名变量 f 作为 face_t 的数据类型。一维数组 x 和变量 y 被定义为 real 数据类型。循环宏用于循环区域内每个面来创建型线,或数据数组。每个循环内,F_CENTROIDS 为带指标 f 的面输出面质心(数组 x)的值,指标 f 在被 thread 指向的线(thread )上。存储在 x1中的 y 坐标用于为变量 y 赋值,然后用于计算 x 速度。这个值接着被分配到 F_PRO
6、FILE,使用整数 position(在你从 Velocity Inlet 面板中选择的UDF 作为 x 速度的边界条件的基础上通过求解器传递给它)来设置内存中 x 速度面值。为了在 FLUENT 中使用这个解释式 UDF,你必须首先编译它。Define User-Defined Functions Interpreted.在 Interpreted UDFs 面板中,在 Source File Name 区域命名你的函数。如果必要,在CPP Command Name 区域输入你的 C 预处理程序类型和在 Stack Size 下输入堆栈大小。打开 Display Assembly Listi
7、ng 在你的控制台窗口中能看到汇编列表,当函数编译时。点击 Compile 然后 Close 面板。为了选择这个用户定义函数作为所选区域的速度边界条件,打开 Velocity Inlet 面板。在 X-Velocity 下拉列表下,选择 udf inlet_x_velocity,这个名字在上面已经命名给函数。这个函数将被使用,而不是出现在 X-Velocity 区域的 0 值(在这个例子中) 。点 OK 接受这个新边界条件并关闭面板。在求解运行到收敛之后,获得了一个修正的速度场如 Figure 10.1.4 and 10.1.5 所示。速度场在入口中心显示了最大值,到边缘上降为 0。Figur
8、e 10.1.4: Velocity Magnitude Contours for a Parabolic Inlet x VelocityFigure 10.1.5: Velocity Vectors for a Parabolic Inlet x Velocity10.1.2 管内流动的瞬态速度入口分布 这个例子中,瞬时的周期性的速度边界条件使用 UDF 应用于管子的入口。速度形式为:(10.1.1)管子长 1m,半径为 0.2m。假设充满密度为 1kg/m3 和粘度为 kg/m-s 的空气。空5102气速度关于平衡值 的波动振幅为 5m/s,频率为 10rad/s。smv/20速度分布
9、UDF(unsteady.c )的源代码显示如下。 /*/* unsteady.c */* UDF for specifying a transient velocity profile boundary condition */*/#include “udf.h“DEFINE_PROFILE(unsteady_velocity, thread, position) face_t f;begin_f_loop(f, thread)real t = RP_Get_Real(“flow-time“);F_PROFILE(f, thread, position) = 20. + 5.0*sin(10
10、.*t);end_f_loop(f, thread)函数,被命名为 unsteady_velocity,使用 DEFINE_PROFILE macro 定义。The utility RP_Get_Real(“flow-time“)用于访问 real 流动时间,它被分配给变量t。 (RP_Get_Real 的详细内容见 Section 6.9) 。在你编译这个 UDF 之前,你必须在 Solver 面板中指定为非稳态流动计算。Define Models Solver.接下来你将打开 Interpreted UDFs 面板。在 Source File Name 下面的文本框内输入函数的名字,如果必
11、要,还有你的 C 预处理程序的名字。打开 Display Assembly Listing。点击 Compile 然后关闭面板。Define User-Defined Functions Interpreted.由 UDF 定义的正弦速度边界条件现在可选为入口区域的 X-Velocity。在 X-Velocity 面板中,在 X-Velocity 区域右边的下拉列表中选择 udf unsteady_velocity,并点击 OK。时间步参数在 Iterate 面板中设置。Solve Iterate. 在这个例子中,使用了 0.0314 的 Time Step Size,因此在入口速度一个完整的
12、震荡周期内将完成 20 个时间步。在每个时间步内执行的迭代次数被限制为20。在求解的早期阶段这个迭代次数不足以获得收敛的流场,但是在通过几个时间步之后,很可能导致收敛的时间步。UDF Profile Update Interval 被设置为1 因此每次迭代速度都被更新。在完成了 60 个时间步之后(或 3 个周期) ,你可以检查跨越压力出口由振荡入口条件引起速度数量级。为了在计算阶段收集这个信息,在开始迭代之前打开 Surface Monitors 面板。Solve Monitors Surface.增加 Surface Monitors 的指标到 1。这将使你定义 monitor-1(如果需
13、要,你可重命名,在 Name 下的文本输入框内)的参数。选择 Plot,所以所选的数量将作为计算的收益被画出来。选择 Print 在控制台窗口来看所选数的变化值。选择 Write,因而信息将被写入文件,它将被给一个名字为 monitor-1.out。 (如果你改变了 monitor 的名字,这个名字将用作输出文件的前缀) 。在 Every 下面,你可选择 Iteration, Time Step, or Flow Time。为了监视每个时间步的结果,你应选择 Time Step 选项。通过点击 Define.你可在 Define Surface Monitor 面板中指定被监视的数量。在这个例
14、子中,在 Report Of 下的下拉列表中选择 Velocity. and Velocity Magnitude。报告的区域是 pressure-outlet-5,,在 Surfaces 列表中选择它。Area-Weighted Average 在 Report Type 的下拉列表中选择,Flow Time 在 X Axis 的下拉列表中选择。一旦完成了你要求的迭代次数,监视器应出现在所选绘图窗口中。作为选择,你可通过打开 File XY Plot 面板读入文件。Plot File.你可通过在 Files 下面的文本框中输入它的名字来读取输出文件和选择这个文件并点击 Add,然后点击 Pl
15、ot,你可获得 Figure10.1.6 的图形显示。Figure 10.1.6: Average Velocity Magnitude at the Pressure Outlet这个图精细地显示了速度以期望的振幅值 5m/s 围绕平衡值 20m/s 上下振荡。10.2 源项这部分包含了源项 UDF 的应用。在 FLUENT 中它是作为解释式 UDF 被执行的。10.2.1 给管道流动添加动量源项(Adding a Momentum Source to a Duct Flow)当使用 UDF 模拟源项时,理解函数调用的内容是很重要的。当你增加了一个源项,它在单元上执行全局的循环时,FLUEN
16、T 将调用你的函数。你的函数应只计算源项并返回它到求解器。在这个例子中,动量源项将被添加到 2D 笛卡儿管道流动中。管道长 4m, 宽 2m,使用通过中心线的对称边界条件来模拟。液体金属(其属性列举在表 10.2.1 中)在 290K 温度下从左边以 1mm/s 的速度进入管道。在金属沿着管道前进了 0.5m之后,它受到了冷壁面的冷却,壁面温度保持在 280K。为了模拟金属的凝固,只要它的温度一降到 288K 以下,动量源项就应用于金属。动量源项是与速度的 分量 成比例的,并有相反的符号:xxvS x = - C v x (10.2.1) 这里 C 是常数。当液体凝固时,它的运动将减小到 0,
17、模拟的是固体的形成。(在这个例子中,能量方程不能用来解决凝固潜热。速度场只能作为凝固区域指示来使用) 。为了提高求解的稳定性和收敛性,求解器应线性化源项。为了能使求解器做到这点,你必须在你的 UDF 中以导数的形式指定源项和求解变量之间的依赖关系。源项 只依赖于求解变量 。它关于 的导数为:xSxvxv(10.2.2)下面的 UDF 指定了源项和它的导数:Table 10.2.1: Properties of the Liquid MetalProperty ValueDensity 8000 kg/m 3Viscosity5.5 kg/m-sSpecific Heat 680 J/kg-KT
18、hermal Conductivity 30 W/m-K/*/* UDF that adds momentum source term and derivative to duct flow */ /*/#include “udf.h“#define CON 20.0DEFINE_SOURCE(cell_x_source, cell, thread, dS, eqn)real source;if (C_T(cell,thread) 288K)流体的的粘度对液体有一个分子值() ,而更冷区域( )的粘度有更大的值(1.0kg/m-s ) 。smkg/105.3 KT286在中等温度范围内( )
19、,粘度在上面给出的两个值之间按线性K286分布:(10.3.1)这个模型的基础是假设液体冷却时很快地变为高粘性,它的速度降低,所以模拟的是凝固。这里,没有为能量场做修正以包含凝结潜热。UDF 的 C 源代码显示如下。/*/* UDF for specifying a temperature-dependent viscosity property */*/#include “udf.h“DEFINE_PROPERTY(cell_viscosity, cell, thread)real mu_lam;real temp = C_T(cell, thread);if (temp 288.)mu_l
20、am = 5.5e-3;else if (temp 286.)mu_lam = 143.2135 - 0.49725 * temp;elsemu_lam = 1.;return mu_lam;函数,被命名为 cell_viscosity,使用了 DEFINE_PROPERT 定义在单元上。引入了两个 real 变量:temp,C_T(cell,thread) 的值,和 mu_lam, 由函数计算的层流粘度。温度值被检测了,在它的下降范围的基础上计算了适当的 mu_lam 值。在函数的结尾,mu_lam 的计算值返回到求解器。为了使用用户定义的属性,你将使用 Materials 面板。在 Vis
21、cosity 的下拉列表下,选择 user-defined 选项。一旦你选了这个选项,User-Defined Functions 面板将打开,在其中你可选择合适的函数名字。这个例子中,只有一个是有效的,但在别的例子中,你可从中选择几个函数。 (如果你需要编译多于一个的解释式 UDF,这些函数应在编译前连接。详细内容见 Section 7.2.1) 。这个模拟的结果相似于 Section 10.2.1 中得到的。Figure 10.3.1 显示由于应用用户定义函数而导致的粘度场。粘度在很窄的范围内很快地从常数值 0.0055 变化到 1.0kg/m-s。速度场(Figure 10.3.2)证明
22、响应于粘度的增加,液体流动减慢,这在预料之中。在这个模拟中,有一个大的“mushy”区域,在其中液体的运动逐渐减小。这是与第一个模拟的对比,在第一个模拟中应用了动量源项,在流体运动中观察到一个急剧的变化。Figure 10.3.1: Laminar Viscosity Generated by a User-Defined FunctionFigure 10.3.2: Contours of Velocity Magnitude Resulting from a User-Defined ViscosityFigure 10.3.3: Stream Function Contours Sugg
23、esting Solidification10.4 反应速率(Reaction Rates)这部分包含了一个反应速率 UDF 的应用。它在 FLUENT 中以编译式的方式执行。10.4.1 自定义体积反应速率(A Custom Volume Recation Rate)作为一个编译式 UDF 的例子,考虑为一个两种气态物质的简单系统自定义体积反应速率。两种物质分别被命名为 species-a 和 spexies-b。反应速率是一个由下面的表达式给出的从 pecies-a 转变 species-b 的速率:(10.4.1)这里 是 species-a 的质量分数, 和 是常数。aX1K22D(平
24、面)区域由 90 度的弯管组成。管子宽 16 inches,约 114 inches 长。一个 6 inches 厚的多孔区域覆盖在底部和右壁面,反应仅发生在多孔区域。管子内的物质有相同的属性。密度是 1.0kg/m3, 粘度为 。smkg/107.5区域的轮廓显示在 Figure 10.4.1 中。多孔介质是从左边入口延伸到区域顶部压力出口的线的下方和右方的区域。Figure 10.4.1: The Outline of the 2D Duct通过左边入口,气态纯物质 species-a 以 0.1m/s 的速度进入。气体进入多孔介质顶部的开区域和多孔介质本身,这里在两个坐标方向中的每一个上
25、都有5m-1 的惯性阻力。层流流场(Figure 10.4.2)显示了大部分气体是从多孔区域转向开区域。Figure 10.4.2: Streamlines for the 2D Duct with a Porous Region流动方式通过显示在 Figure 10.4.3 中的矢量图得到进一步证实。多孔区域的流动比开区域的流动慢的多。Figure 10.4.3: Velocity Vectors for the 2D Duct with a Porous Region用于模拟发生在多孔区域反应的包含 UDF 的 C 源代码(rate.c)显示如下:/*/* rate.c */* UDF f
26、or specifying a reaction rate in a porous medium */*/#include “udf.h“#define K1 2.0e-2#define K2 5.DEFINE_VR_RATE(user_rate, c, t, r, mole_weight, species_mf, rate, rr_t)real s1 = species_mf0;real mw1 = mole_weight0;if (FLUID_THREAD_P(t) else*rate = 0.;函数,被命名为 user_rate, 用 DEFINE_VR_RATE 为给定物质的质量分数定
27、义在单元上。UDF 执行测试来检查多孔区域,仅应用反应速率方程于多孔区域。宏 FLUID_THREAD_P(t)用于确定一个单元 thread 是否是流体(而不是固体)thread。变量 THREAD_VAR(t).fluid.porous 用于检测流体单元 thread 是否是多孔区域。为了使用这个 UDF,设置名字为 librate 的目录来控制库目录结构。然后,建立一个如 Section 7.3.3 描述的共享库。接着,启动 FLUENT,或者在你的 case 文件读入或者 set it up。打开在 Makefile过程建立的库,通过在 Compiled UDFs 面板中指定 libr
28、ate 为 Library Name 和点击 Open 连接这个库到 FLUENT 执行。Define User-Defined Functions Compiled.现在你可通过在 User-Defined Function Hooks 面板的 Volume Reaction Rate Function 的下拉列表中选择它来指定 user_rate 作为反应速率。Define User-Defined Function Hooks.初始化和运行计算。Species-a 的质量分数收敛解显示在 Figure 10.4.4 中。穿过多孔区域的运动的气体在管子的水平部分逐渐转化成 species-
29、b。尽管多孔区域之外 species-b 的某些扩散被 100% and 0% species-a 区域之间的宽阔的过度层所暗示,但在流体区域没有反应发生。Figure 10.4.4: Mass Fraction for species-a Governed by a Reaction in a Porous Region10.5 用户定义标量(User-Defined Scalars)这部分包含了用于联合用户定义标量输运方程的 UDF 的例子。关于在 FLUENT中模化用户定义标量输运方程的信息见第 9 章。10.5.1 使用用户定义标量的后处理(Postprocessing Using U
30、ser-Defined Scalars)下面是一个编译式 UDF 例子,该 UDF 计算温度四次幂的梯度,并存储其数量于拥护定义标量中。例如,被计算的温度梯度可随后用于绘制等值线图。尽管这个 UDF 的实际应用是可疑的,这里它的目的在于显示用于后处理的任意数量梯度的计算方法。/*/* UDF for computing the magnitude of the gradient of T4 */*/#include “udf.h“/* Define which user-defined scalars to use. */enumT4,MAG_GRAD_T4,N_REQUIRED_UDS;DE
31、FINE_ADJUST(adjust_fcn, domain)Thread *t;cell_t c;face_t f;/* Make sure there are enough user-defined scalars. */if (n_uds t0,SV_T)T = C_T(F_C0(f,t),t-t0);F_UDSI(f,t,T4) = pow(T,4.);end_f_loop (f,t)/* Fill second UDS with magnitude of gradient. */thread_loop_c (t,domain)if (NULL != THREAD_STORAGE(t,
32、SV_UDS_I(T4) end_c_loop (c,t)thread_loop_f (t,domain)if (NULL != THREAD_STORAGE(t,SV_UDS_I(T4) end_f_loop (f,t)条件语言 if (NULL != THREAD_STORAGE(t,SV_UDS_I(T4)用于检测用户定义标量 T4 的存储是否被分配,而 NULL != T_STORAGE_R_NV(t,SV_UDSI_G(T4)检测用户定义标量 T4 的梯度的存储是否被分配。除了编译和连接这个 UDF,如在第 7 章描述的,你还必须在 FLUENT 中求解用户定义标量输运方程。Defi
33、ne User-Defined Scalars.更详细的内容见 Section 9.3。10.5.2 实现 FLUENT 的 P-1 辐射模型(Implementing FLUENTs P-1 Radiation Model)这部分给出了一个例子示范了 P1 辐射模型是如何使用 UDFs 和用户定义标量输运方程来实现的。在 P1 模型中,入射辐射变量 G,在区域内通过由扩散(diffusion)和源项组成的方程描述。入射变量 G 的输运方程由方程 10.5.1 给出。扩散系数 ,由方程 10.5.2 给出,源项由方程 10.5.3 给出。这些方程更详细的讨论在用户指南的 Section 11.
34、3.4 中。(10.5.1)(10.5.2)(10.5.3)如用户指南中所显示的,壁面上 G 的边界条件等于辐射壁面热流 的负数wrq,(方程 10.5.4) ,在这个方程中, 是外法向量。辐射壁面热流由方程 10.5.5 给n出。(10.5.4)(10.5.5)根据壁面入射辐射 指定的边界条件的这种形式是不适宜的。这种混合边界条wG件可通过先使用方程 10.5.4 和 10.5.5 求解 ,导致方程 10.5.6 来避免。那么,wG的表达式由方程 10.5.7 给出的辐射壁面热流 来取代方程 10.5.5 给出的。wGrq,(10.5.6)(10.5.7)出现在方程 10.5.6 和 10.
35、5.7 中的附加项 和 是估计方程 10.5.4 中入射辐射0G梯度的结果。在 FLUENT 中,被控制标量的梯度的分量垂直于单元边界(面) , 是主nG要和次要分量总和的估计。主要分量代表由单元质心定义方向上的梯度,次要分量是沿着分隔两个单元的面的方向。从这个信息中,面法向量可确定。梯度的次要分量可使用 FLUENT 宏BOUNDARY_SECONDARY_GRADIENT_SOURCE 来建立。这个宏的使用首先要求定义单元几何信息,它可使用第二个宏BOUNDARY_FACE_GEOMETRY(见 Section 5.4.5)容易的获得。你将在定义G 的壁面边界条件的 UDF 中看到这些宏的
36、调用。为了完成 P1 模型的实现,辐射能量方程必须与热能方程耦合。这可通过修改源项和能量方程的壁面边界条件来完成。首先应考虑如何修改能量方程的源项。入射辐射梯度与辐射热流是成比例的。辐射热流局部的增加(或减小)可归结于能量方程通过吸收和散射机理的局部减小(或增加) 。所以,辐射热流梯度是能量方程的(负的)源项。如用户指南中显示的,入射辐射能量方程 10.5.3 的源项等于辐射热流的梯度,因此,它的负值指定了需要修改的能量方程的源项。现在,考虑如何修改壁面上能量的边界条件。局部地,能量从壁面传递默认的计算流体的唯一模式是传导。在包含辐射影响时,必须计算流体与壁面之间的辐射传热。 (如果你使用了
37、FLUENT 的内建的 P1 模型,这项将被自动地计算) 。宏 DEFINE_HEAT_FLUX 允许通过指定 Section4.3.3 中讨论的 方程的系数来qir修改壁面边界条件以适应第二种传热模式。对壁面的净辐射热流已经由方程10.5.5 给出。比较这个方程与 Section 4.3.3 中 方程将为 得出合适的系数。qirci在这个例子中,P1 模型的实现通过六个分离的 UDFs 来完成。它们都被包含在一个源文件中,它作为编译式 UDF 来执行。入射辐射 G 的单独的用户定义标量输运方程,使用 DEFINE_DIFFUSIVITY UDF 来定义方程 10.5.2 中的 和DEFINE
38、_SOURECE UDF 来定义方程 10.5.3 中的源项。壁面上 G 的边界条件通过在 DEFINE_PROFILE 中指定方程 10.5.7 的负值作为指定热流。 DEFINE_ADJUST UDF 用于通知 FLUENT 检查已定义的(在求解器中)合适的用户定义标量数。最后,能量方程必须指定源项等于入射辐射方程中使用的源项的负值,而 DEFING_HEAT_FLUX UDF 用于改变能量方程壁面上的边界条件。在求解器中,必须至少激活一个用户定义标量输运方程。标量扩散率在Materials 面板中为标量方程指定。标量源项和能量源项在边界条件面板中为流体区域指定。壁面上标量方程的边界条件在
39、边界条件面板中为壁面区域指定。DEFINE_ADJUST and DEFINE_HEAT_FLUX 函数在 User-Defined Function Hooks 面板中指定。/*/* Implementation of the P1 model using user-defined scalars */*/#include “udf.h“/* Define which user-defined scalars to use. */enumP1,N_REQUIRED_UDS;static real abs_coeff = 1.0; /* absorption coefficient */sta
40、tic real scat_coeff = 0.0; /* scattering coefficient */static real las_coeff = 0.0; /* linear-anisotropic */* scattering coefficient */static real epsilon_w = 1.0; /* wall emissivity */DEFINE_ADJUST(p1_adjust, domain)/* Make sure there are enough user defined-scalars. */if (n_uds t0;/* Do nothing if
41、 areas arent computed yet or not next to fluid. */if (!Data_Valid_P() | !FLUID_THREAD_P(t0) return;begin_f_loop (f,thread)cell_t c0 = F_C0(f,thread);BOUNDARY_FACE_GEOMETRY(f,thread,A,ds,es,A_by_es,dr0);At = NV_MAG(A);if (NULLP(T_STORAGE_R_NV(t0,SV_UDSI_G(P1)Gsource = 0.; /* if gradient not stored ye
42、t */elseBOUNDARY_SECONDARY_GRADIENT_SOURCE(Gsource,SV_UDSI_G(P1),dG,es,A_by_es,1.);gamma0 = C_UDSI_DIFF(c0,t0,P1);alpha0 = A_by_es/ds;beta0 = Gsource/alpha0;aterm = alpha0*gamma0/At;Ibw = SIGMA_SBC*pow(WALL_TEMP_OUTER(f,thread),4.)/M_PI;/* Specify the radiative heat flux. */F_PROFILE(f,thread,positi
43、on) =aterm*Ew/(Ew + aterm)*(4.*M_PI*Ibw - C_UDSI(c0,t0,P1) + beta0);end_f_loop (f,thread)DEFINE_HEAT_FLUX(heat_flux, f, t, c0, t0, cid, cir)real Ew = epsilon_w/(2.*(2. - epsilon_w);cid0 = Ew * F_UDSI(f,t,P1);cid3 = 4.0 * Ew * SIGMA_SBC;A .DEFINE Macro DefinitionsA1.通用求解器定义宏(General Solver DEFINE Mac
44、ros)下面的通用求解器定义宏(见 Section 4.2)的定义来自 udf.h 头文件。#define DEFINE_ADJUST(name, domain) void name(Domain *domain)#define DEFINE_INIT(name, domain) void name(Domain *domain)#define DEFINE_ON_DEMAND(name) void name(void)#define DEFINE_RW_FILE(name, fp) void name(FILE *fp)A2 .Model-Specific DEFINE Macros下面的
45、model-specific DEFINE macros(见 Section 4.3)的定义来自 udf.h 头文件。#define DEFINE_CG_MOTION(name, dt, vel, omega, time, dtime) void name(void *dt, real vel, real omega, real time, real dtime)#define DEFINE_DIFFUSIVITY(name, c, t, i) real name(cell_t c, Thread *t, int i)#define DEFINE_GEOM(name, d, dt, posit
46、ion) void name(Domain *d, void *dt, real *position)#define DEFINE_GRID_MOTION(name, d, dt, time, dtime) void name(Domain *d, void *dt, real time, real dtime)#define DEFINE_HEAT_FLUX(name, f, t, c0, t0, cid, cir) void name(face_t f, Thread *t, cell_t c0, Thread *t0, real cid, real cir)#define DEFINE_NOX_RATE(name, c, t,