多数的 UDF 任务需要在一个线的所有单元和面上重复执行。比如,定义一个自定义轮
廓函数(a custom profile function)则会对一个面线上(in a face thread)的所有单元和面进
行循环。 为了用户方便, Fluent Inc.向用户提供了一些循环宏工具(looping macro utilities)
来执行对单元,面,节点(nodes)和线(threads)的重复操作。例如,单元循环宏(Cell-looping
macros )可以对给定单元线上的所有单元进行循环操作(loop over cells in a given cell thread
allowing access to all of the cells)。 而面循环宏(Face-looping macros)则可调用所有给定
面线(a given face thread)的面。Fluent 提供的循环工具请见 Chapter 6。
在某些情况下,UDF 需要对某个变量操作,而这个变量恰恰又不能直接被当作变量来
传递调用。比如,如果用户使用 DEFINE_ADJUST 宏来定义 UDF,求解器将不会向它传递
thread 指针。这种情况下,用户函数需要用 Fluent 提供的宏来调用线指针(thread pointer)。
见 Chapter 6。
1.5.4 求解器数据
通过 FLUENT 用户界面将 C 函数(它已被编译和连接)连接到求解器上可实现调用求
解器变量。一旦 UDF 和求解器正确连接,无论何时,函数都可调用求解器数据。这些数据
将会被作为用户变量自动地传递给 UDF。注意,所有的求解器变量,不管是求解器传递给
UDF 的,还是 UDF 传递给求解器的,都使用 SI 单位。
1.5.5 运行
UDF 将会在预定时刻被 FLUENT 调用 。但是,也可对它们进行异步执行,使用
DEFINE_ON_DEMAND 宏,还可在需要时(
on demand)执行。详情请见 4.2.3
1.6 解释和编译 UDF 的比较
编译 UDF 和 FLUENT 的构建方式一样。脚本 Makefile 被用来调用 C 编译器来构建一
个当地目标代码库(a native object code library)。目标代码库包含高级 C 语言源代码的机器
语言翻译。代码库在 FLUENT 运行时由“动态加载”(``dynamic loading'')过程连接到
FLUENT 上。连接后,与共享库的联系(the association with the shared library)将会被保存
在用户的 case 文件中,这样,当 FLUENT 以后再读入 case 文件时,此编译库将会与 FLUENT
自动连接。这些库是针对计算机的体系结构和一定版本的 FLUENT 使用的。所以,当
FLUENT 更新,或计算机操作系统改变,或是在不同类型的机器上运行时,这些库必须重
新构建。
而解释 UDF 则是在运行时,直接从 C 语言源代码编译和装载(compiled and loaded
directly from the C source code)。在 FLUENT 运行中,源代码被编译为中介的独立于物理
结构的使用 C 预处理程序的机器代码(an intermediate, architecture-independent machine
code)。当 UDF 被调用时,机器代码由内部仿真器(an internal emulator),或注释器
(interpreter)执行。注释器不具备标准 C 编译器的所有功能;它不支持 C 语言的某些原理
(elements)。所以,在使用 interpreted UDF 时,有语言限制(见 3.2)。例如,interpreted
UDF 不能够通过废弃结构(dereferencing structures)来获得 FLUENT 数据。要获得数据结
构,必须使用由 FLUENT 提供的预定义宏。另一个例子是 FLUENT interpreter
不能识别指
针数组。这些功能必须由 compiled UDF 来执行。
评论30
最新资源