当前位置:文档之家› udf中文帮助第3章 编写UDF

udf中文帮助第3章 编写UDF

udf中文帮助第3章 编写UDF
udf中文帮助第3章 编写UDF

第 3 章 编写 UDF
第 3 章 编写 UDF
本章包含了 FLUENT 中如何写 UDFs 的概述。
3.1 概述 3.2 写解释式 UDFs 的限制 3.3 FLUENT 中 UDFs 求解过程的顺序 3.4 FLUENT 网格拓扑 3.5 FLUENT 数据类型 3.6 使用 DEFINE Macros 定义你的 UDF 3.7 在你的 UDF 源文件中包含 udf.h 文件 3.8 定义你的函数中的变量 3.9 函数体 3.10 UDF 任务 3.11 为多相流应用写 UDFs 3.12 在并行中使用你的 UDF 3.1 概述(Introduction) 在你开始编写将挂到 FLUENT 代码以增强其标准特征的 UDF 之前,你必须 知道几个基本的要求。首先,UDFs 必须用 C 语言编写。它们必须使用 FLUENT 提供的 DEFINE macros 来定义。UDFs 必须含有包含于源代码开始指示的 udf.h 文件;它允许为 DEFINE macros 和包含在编译过程的其它 FLUENT 提供的函数 定义。 UDFs 只使用预先确定的宏和函数从 FLUENT 求解器访问数据。 通过 UDF 传递到求解器的任何值或从求解器返回到 UDF 的,都指定为国际(SI)单位。 总之,当写 UDF 时,你必须记住下面的 FLUENT 要求。 UDFs: 1. 采用 C 语言编写。 2. 必须为 udf.h 文件有一个包含声明。 3. 使用 Fluent.Inc 提供的 DEFINE macros 来定义。 4. 使用 Fluent.Inc 提供的预定义宏和函数来访问 FLUENT 求解器数据。 5. 必须使返回到 FLUENT 求解器的所有值指定为国际单位。 3.2 写解释式 UDFs 的限制(Restriction on Writing Interpreted UDFs)

第 3 章 编写 UDF
无论 UDFs 在 FLUENT 中以解释还是编译方式执行,用户定义 C 函数(说明在 Section 3.1 中)的基本要求是相同的,但还是有一些影响解释式 UDFs 的重大编 程限制。FLUENT 解释程序不支持所有的 C 语言编程原理。解释式 UDFs 不能 包含以下 C 语言编程原理的任何一个: 1. goto 语句。 2. 非 ANSI-C 原型语法 3. 直接的数据结构查询(direct data structure references) 4. 局部结构的声明 5. 联合(unions) 6. 指向函数的指针(pointers to functions) 7. 函数数组。 在访问 FLUENT 求解器数据的方式上解释式 UDFs 也有限制。 解释式 UDFs 不能 直接访问存储在 FLUENT 结构中的数据。它们只能通过使用 Fluent 提供的宏间 接地访问这些数据。 另一方面, 编译式 UDFs 没有任何 C 编程语言或其它注意的 求解器数据结构的限制。 3.3 FLUENT 求解过程中 UDFs 的先后顺序 (Sequencing of UDFs in the FLUENT Solution Process) 当你开始写 UDF 代码的过程时(依赖于你写的 UDF 的类型) ,理解 FLUENT 求 解过程中 UDFs 调用的内容或许是重要的。 求解器中包含连接你写的用户定义函 数的 call-outs。 知道 FLUENT 求解过程中迭代之内函数调用的先后顺序能帮助你 在给定的任意时间内确定那些数据是当前的和有效的。 分离式求解器 在分离式求解器求解过程中(Figure 3.3.1) ,用户定义的初始化函数(使用 DEFINE_INIT 定义的)在迭代循环开始之前执行。然后迭代循环开始执行用户 定义的调整函数(使用 DEFINE_ADJUST 定义的) 。接着,求解守恒方程,顺序 是从动量方程和后来的压力修正方程到与特定计算相关的附加标量方程。 守恒方 程之后,属性被更新(包含用户定义属性) 。这样,如果你的模型涉及到气体定 律,这时,密度将随更新的温度(和压力 and/or 物质质量分数)而被更新。进 行收敛或者附加要求的迭代的检查,循环或者继续或停止。

第 3 章 编写 UDF
Figure 3.3.1: Solution Procedure for the Segregated Solver
耦合求解器 在耦合求解器求解过程中(Figure 3.3.2),用户定义的初始化函数(使用 DEFINE_INIT 定义的)在迭代循环开始之前执行。然后,迭代循环开始执行用 户定义的调整函数 (使用 DEFINE_ADJUST 定义的) 接着, 。 FLUENT 求解连续、 动量和(适合的地方)能量的控制方程和同时地一套物质输运或矢量方程。其余 的求解步骤与分离式求解器相同(Figure 3.3.1) 。 Figure 3.3.2: Solution Procedure for the Coupled Solver

第 3 章 编写 UDF
3.4 FLUENT 网格拓扑 在我们开始讨论 FLUENT 特殊的数据类型之前,你必须理解网格拓扑学的术语 因为 FLUENT 数据类型是为这些实体定义的。下面是显示在 Figure 3.4.1 中的网 格实体的定义。 单元(cell) 单元中心(cell center) 面(face) 边(edge) 节点(node) 单元线索(cell thread) 区域被分割成的控制容积 FLUENT 中场数据存储的地方 单元(2D or 3D)的边界 面(3D)的边界 网格点 在其中分配了材料数据和源项的单元组

第 3 章 编写 UDF
面线索(face thread) 节点线索(node thread) 区域(domain)
在其中分配了边界数据的面组 节点组 由网格定义的所有节点、面和单元线索的组合
Figure 3.4.1: Grid Terminology
3.5 FLUENT 数据类型(FLUENT Data Types) 除了标准的 C 语言数据类型如 real, int 等可用于在你的 UDF 中定义数据外,还 有几个 FLUENT 指定的与求解器数据相关的数据类型。这些数据类型描述了 FLUENT 中定义的网格的计算单位(见 Figure 3.4.1) 。使用这些数据类型定义的 变量既有代表性地补充了 DEFINE macros 的自变量,也补充了其它专门的访问 FLUENT 求解器数据的函数。 一些更为经常使用的 FLUENT 数据类型如下: cell_t face_t

第 3 章 编写 UDF
Thread Domain Node cell_t 是线索(thread)内单元标识符的数据类型。它是一个识别给定线索内单 元的整数索引。face_t 是线索内面标识符的数据类型。它是一个识别给定线索内 面的整数索引。 Thread 数据类型是 FLUENT 中的数据结构。它充当了一个与它描述的单元或面 的组合相关的数据容器。 Node 数据类型也是 FLUENT 中的数据结构。它充当了一个与单元或面的拐角相 关的数据容器。 Domain 数据类型代表了 FLUENT 中最高水平的数据结构。它充当了一个与网格 中所有节点、面和单元线索组合相关的数据容器。 ! !注意,FLUENT 中所有数据类型都是 情形敏感的(case-sensitive) 。 3.6 使用 DEFINE Macros 定义你的 UDF(Defining Your UDF Using DEFINE Macros) Fluent.Inc 为你提供了一套你必须使用它来定义你的 UDF 的预定义函数。这些定 义 UDFs 的函数在代码中作为宏执行,可在作为 DEFINE(全部大写)宏的文献中 查阅。对每个 DEFINE 宏的完整描述和它的应用例子,可参考第四章。 DEFINE 宏的通用格式为: DEFINE_MACRONAME(udf_name, passed-in variables) 这里括号内第一个自变量是你的 UDF 的名称。名称自变量是情形敏感的必须用 小写字母指定。 一旦函数被编译 (和连接)你为你的 UDF 选择的名字在 FLUENT , 下拉列表中将变成可见的和可选的。第二套输入到 DEFINE 宏的自变量是从 FLUENT 求解器传递到你的函数的变量。 在下面的例子中,宏 DEFINE_PROFILE(inlet_x_velocity, thread, index) 用 两 个 从 FLUENT 传 递 到 函 数 的 变 量 thread 和 index 定 义 了 名 字 为 inlet_x_velocity 的分布函数。这些 passed-in 变量是边界条件区域的 ID(作为指 向 thread 的指针)而 index 确定了被存储的变量。一旦 UDF 被编译,它的名字

第 3 章 编写 UDF
(例如, inlet_x_velocity) 将在 FLUENT 适当的边界条件面板 (例如, Velocity Inlet 面板)的下拉列表中变为可见的和可选的。 ! !注意,所有用于 DEFINE 宏的自变量必须放在你的源代码的同一行上。分割 DEFINE 的声明为几行可能导致编译错误。 3.7 在你的 UDF 源文件中包含 udf.h 文件(Including the udf.h File in Your UDF Source File) DEFINE 宏的定义位于称为 udf.h(见附录 A 的列表)的头文件中。 为了使 DEFINE 宏延伸到编译过程,你必须在你写的每个 UDF 源文件的开始包含 udf.h 文件。 #include "udf.h"
/* Always include udf.h when writing a UDF. It translates the DEFINE */ /* and other macros into C, which is what the compiler understands. */
通过在你的 UDF 源文件中包含 udf.h, 编译过程中所有的 DEFINE 宏的定义与源 代码一起被包含进来。udf.h 文件也为所有的 C 库函数头文件包含#include 指示, 与大部分头文件是针对 Fluent 提供的宏和函数是一样的(例如,mem.h) 。除非 有另外的指示,没必要在你的 UDF 中个别地包含这些头文件。 还有,当你编译你的 UDF 时,你不必放置 udf.h 的拷贝在你的当地目录下;一旦 你的 UDF 被编译,FLUENT 求解器会自动地从 Fluent.Inc/fluent6.x/src/目录来读 取 udf.h 文件。 举例 从前面部分的宏 DEFINE_PROFILE(inlet_x_velocity, thread, index) 定义在 udf.h 文件中为 #define DEFINE_PROFILE(name, t, i) void name(Thread *t, int i) 在编译过程中延伸为 void inlet_x_velocity(Thread *thread, int index) 名字为 inlet_x_velocity 的函数不返回值由于它被声明为空的数据类型。 3.8 在你的函数中定义变量(Defining Variable in Your Function) 在你的 UDF 源文件中包含了 udf.h 头文件后, 你必须定义真实的变量。 使用把它

第 3 章 编写 UDF
们定义在所有函数之外的全局变量(如果它们被源文件中大部分或所有函数共 享)是非常方便的。关于全局变量的信息见 Section 2.5.3。局部于函数的任何变 量必须在函数内声明。局部变量的信息见 Section 2.5.2。 3.9 函数体(Functin Body) 你的 UDF 源文件中的 C 函数体被包含在 DEFINE 声明之下的一对大括号内,显 示在下面的例子中。 在这个例子中, mu_lan 和 temp 是局部变量。 只有 cell_viscosity 函数认识它们。 例子 DEFINE_PROPERTY(cell_viscosity, cell, thread) { real mu_lam; real temp = C_T(cell, thread);
if (temp > 288.) mu_lam = 5.5e-3; else if (temp > 286.) mu_lam = 143.2135 - 0.49725 * temp; else mu_lam = 1.;
return mu_lam; } 3.10 UDF 任务(UDF Tasks) UDF 可执行的任务有五种不同的类型: 1. 返回值 2. 修改自变量 3. 返回值和修改自变量 4. 修改 FLUENT 变量(不能作为自变量传递) 5. 写信息到(或读取信息从)case 或 data 文件

第 3 章 编写 UDF
函数能返回值,除非它们在 udf.h 文件中被定义为 void。如果它们不返回值,它 们能修改自变量,修改存储在内存中的变量,或与 case 和 data 文件一起执行输 入输出(I/O)任务。 在 Section 3.10.1-3.10.5 中, 提供了描述上面提到的五种不同的函数任务中每一种 的 UDF 源代码例子。 3.10.1 返回值的函数(Function that Return a Value) 下面的 UDF 是一个返回值到 FLUENT 求解器的函数例子。 名为 cell_viscosity 的 函数计算了依赖温度的粘度值(mu_lam)并返回这个值到求解器。 /********************************************************************/ /* UDF that returns a value to the solver /* Specifies 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_lam = 5.5e-3; else if (temp > 286.) mu_lam = 143.2135 - 0.49725 * temp; else mu_lam = 1.;
return mu_lam; } cell_viscosity 使用了 DEFINE_PROPERTY 宏(在 Section 4.3.6 中描述)来定义。

第 3 章 编写 UDF
DEFINE_PROPERTY 返回一个 udf.h 中指定的 real 数据类型。 两个 real 变量传入 函数:通过函数计算的层流粘度 mu_lam; 和 C_T(cell,thread)的值,它是在考虑 中的单元的温度值。温度值在它下降范围的基础上被检测,mu_lam 的适当值被 计算。在函数结尾,mu_lam 的计算值被返回。 3.10.2 修改自变量的函数(Function that Modify an Argument) 下面的 UDF 是一个修改一个自变量的函数的例子。名字为 user_rate 的函数为一 个两种气态物质的的简单系统产生一个自定义的体积反应速率。Real 指针 rr 作 为自变量传递给函数,指针指向的变量在函数内被修改。 /**************************************************************/ /* UDF that modifies one of its arguments /* Specifies 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, rr, rr_t) { real s1 = species_mf[0]; real mw1 = 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.; } user_rate 使用了 DEFINE_VR _RATE 宏(见 Section 4.3.14)来定义。该函数执行

第 3 章 编写 UDF
一个当前考虑的单元是否在多孔区域的测试,这个反应速率只应用于多孔区域。 real 指针变量 rr 是一个传递给函数的自变量。UDF 使用废弃操作符 * 分配反应 速率值给废弃指针 *rr。指针 rr 指向的目标是设置反应速率。通过这个操作,存 储在内存中这个指针上的字符的地址被改变了,不再是指针地址本身。 (关于废 弃指针的详细内容见[3]) 。 3.10.3 返回一个值和修改一个自变量的函数(Functions that Return a Value ans Modify an Argument) 下面的 UDF 是一个修改它的自变量并返回一个值到 FLUENT 求解器的函数例 子。 名字为 user_swirl 的函数修改 ds 自变量, 指定旋转速度源项并返回它到求解 器。 /**************************************************************/ /* UDF that returns a value and modifies an argument /* Specifies a swirl-velocity source term */ */
/**************************************************************/
#include "udf.h"
#define OMEGA 50.
/* rotational speed of swirler */
#define WEIGHT 1.e20 /* weighting coefficients in linearized equation */
DEFINE_SOURCE(user_swirl, cell, thread, dS, eqn) { real w_vel, x[ND_ND], y, source;
C_CENTROID(x, cell, thread); y = x[1];
w_vel = y*OMEGA;
/* linear w-velocity at the cell */
source = WEIGHT*(w_vel - C_WSWIRL(cell,thread));

第 3 章 编写 UDF
dS[eqn] = -WEIGHT;
return source; } user_swirl 使 用 DEFINE_SOURCE 宏 来 定 义 ( 在 Section 4.3.8 中 描 述 ) 。 DEFINE_SOURCE 返回一个在 udf.h 中指定的数据类型。函数采用自变量 ds(它 是数组的名字)并设置由 eqn 指定的元素为关于 w 速度(w_vel)导数的值。 (这 是 z 动量方程源项) 。这个函数也计算了旋转速度源项的值 source,并返回这个 值到求解器。 3.10.4 修改 FLUENT 变量的函数(Functions that Modify a FLUENT Variable) 下面的 UDF 是一个修改存储在内存中 FLUENT 变量的函数例子。名字为 inlet_x_velocity 的函数使用 F_PROFILE(a Fluent Inc. provided utility)来修改存储 在内存中的 x 速度分布边界条件。 /********************************************************************/ /* UDF that modifies a FLUENT solver variable /* Specifies a steady-state velocity profile boundary condition */ */
/********************************************************************/
#include "udf.h"
DEFINE_PROFILE(inlet_x_velocity, thread, index) { real x[ND_ND]; real y; face_t f; /* this will hold the position vector */
begin_f_loop(f, thread) { F_CENTROID(x,f,thread); y = x[1];

第 3 章 编写 UDF
F_PROFILE(f, thread, index) = 20. - y*y/(.0745*.0745)*20.; } end_f_loop(f, thread) } inlet_x_velocity 使用 DEFINE_PROFLIE 宏来定义(在 Section 4.3.5 中描述) 。它 的自变量是 thread 和 index。Thread 是一个指向面线索的指针,而 index 是一个 每个循环内为变量设置数值标签的整数。 DEFINE_PROPERTY 在 udf.h 文件中一 个返回 void 的数据类型。 函数由声明变量 f 作为 face_t 数据类型开始。 一维数组 x 和变量 y 是 real 数据类 型。循环宏用来在区域中每个面上循环以创建型线或数据数组。在每个循环内, F_CENTROID 为含有 index f 的面输出面质心的值(数组 x) ,index f 在由 thread 指向的线索上。存储在 x[1]中的 y 坐标分配给变量 y,它用于计算 x 速度。然后 这个值分配给 F_PROFILE, 它使用整数 index(由求解器传递个它)来设置内存 中面上的 x 速度值。 3.10.5 写入 Case 或 Data 文件或从中读取的函数(Functions that Write to or Read from a Case or Data File) 下面的 C 源代码包含了写信息到 data 文件和读回它的函数例子。这是一个包含 多个连接在一起的 UDFs 的单个 C 文件例子。 /******************************************************************/ /* UDFs that increment a variable, write it to a data file /* and read it back in */ */
/******************************************************************/
#include "udf.h"
int kount = 0;
/* define global variable kount */
DEFINE_ADJUST(demo_calc, domain) { kount++;

第 3 章 编写 UDF
printf("kount = %d\n",kount); }
DEFINE_RW_FILE(writer, fp) { printf("Writing UDF data to data file...\n"); fprintf(fp, "%d",kount); /* write out kount to data file */ }
DEFINE_RW_FILE(reader, fp) { printf("Reading UDF data from data file...\n"); fscanf(fp, "%d",&kount); /* read kount from data file */ } 在顶部的列表中,整数 kount 被定义为全局的(由于它被源代码文件中的所有三 个 函 数 使 用 ) 并 初 始 化 为 0 。 名 字 为 demo_calc 的 第 一 个 函 数 , 使 用 DEFINE_SDJUST 宏来定义。 (关于 DEFINE_ADJUST 的详细信息见 Section 4.2.1 ) 在 demo_calc 中 , kount 的 值 每 次 迭 代 后 增 加 因 为 每 次 迭 代 调 用 。 DEFINE_ADJUST 一次。名字为 writer 的第二个函数,使用 DEFINE_RW_FILE 宏来定义。 (关于 DEFINE_RW_FILE 的详细信息见 Section 4.2.4) 。当保存数据 文件时, 它指示 FLUENT 写当前 kount 值到数据文件。 名字为 reader 的第三个函 数,当读取数据文件时,它指示 FLUENT 从这个数据文件中读取 kount 的值。 这三个函数一起工作如下。如果你运行 10 次迭代计算(kount 将增加到值为 10) 并保存这个数据文件,当前 kount(10)的值被写入你的数据文件。如果你读这个 数据返回到 FLUENT 并继续计算, kount 将以值 10 开始随着每次迭代继续增加。 注意,你可尽你所想的保存静态变量,但是必须保证以与它们被写的相同顺序来 读取它们。

第 3 章 编写 UDF
3.11 为多相流应用写 UDFs(Writing UDFs for Mulutiphase Applications) 当一个多相流模型在 FLUENT 中被激活时,属性和变量的存储和对单相一样应 当为所有相的混合设置它们。这可以通过使用附加线索(thread)和区域数据结 构在代码中得以表明。 3.11.1 多相应用的数据结构(Data Structure for Multiphase Applications) 区域和线程(Domains and Threads) 在多相流应用中,最高级别的区域被用作超级区域。每相占据的区域用作子区域 第三种类型区域是相互作用区,为了定义相间的相互作用才引入它的。当混合属 性和变量必要时(所有相的和) ,超级区域用于这些数量而子区域携带了单相的 信息。在单一相中混合的概念用于描述所有种类(成分)的和而在多相中它描述 了所有相的总和。这个区别是非常重要的因为以后代码将延伸到多相多组分(例 如,这里相是种类的混合) 。 由于求解器的数据存储在线程(thread)数据结构中,线程必须既和超级区域相 联系又和每个子区域相联系。 就是说, 对定义在超级区域上的每个单元或面线程, 有相应的单元或面线程定义在每个子区域上。 定义在超级区域每个线程上的某些 信息与子区域每个相应线程上的共享。与超级区域相关的线程被用作超级线程, 而与子区域相关的线程被用作相级别线程或子线程。区域和线程的层次总结在 Figure 3.11.1 中。 Figure 3.11.1: Domain and Thread Structure Hierarchy

第 3 章 编写 UDF
Figure 3.11.1 也引入了 domain_id 和 phase_domain_indexed 的概念。domain_id 在 UDFs 中用于辨 别超级区域从主要和次要的相级别区域中。超级区域的 domain_id 值总是被指定为 1。相互作用 区域也有相同的 domain_id。 domain_ids 不必要如 Figure3.11.1 显示的顺序排列。 dhase_domain_index 在 UDFs 中用于从次要相级别线程中辨别主要相级别线程。对主要相级别线程, phase_domain_index 总是分配值为 0。 访问数据(Accessing Data) 当你写 UDF 或为多相应用使用宏时,参考与尝试访问其属性的相(subdomain)或混合(super domain)相关的数据结构(thread or domain)是很重要的。作为例子,宏 C_R(c,t)将返回线程 t 的单元 c 上的密度。如果 t 是指向超级线程的指针,那么返回的是混合密度。如果 t 是指向子线程 的指针,那么返回的是相密度。 当传递到你的 UDF 的线程或区域指针不被你的函数需要时, 也有一些例子。 这取决于你使用的多
相模型,你尝试修改的属性或项(例如,你使用的那个 DEFINE 宏) ,还有受到影响的相或混合。 为了更好地理解这点,回想一个混合模型和欧拉多相模型之间区别的例子。在混合模型中,为混 合相求解单一的动量方程,混合相的属性由它的相的总和来决定。在欧拉模型中,动量方程为每 一相求解。当使用混合模型时,FLUENT 允许你直接为混合相指定动量源项(使用 DEFINE_SOURCE) ,但是不能为欧拉模型。对后者,你可以为单个相指定动量源项。因此,多相 模型及被 UDF 修改的项,决定了那哪个区域或线程是需要的。 从求解器传递到你的 UDF 的特定的区域或线程的结构取决于你使用的 DEFINE 宏。例如, DEFINE_INIT 和 DEFINE_ADJUST 函数总是传递与超级区域相关的区域结构。 DEFINE_ON_DEMAND 函数不能传递任何区域结构。如果你的 UDF 不能明确地传递指针到你的
函数定义要求的线程或区域, 那么你可以使用 multiphase-specific utility macro 找会它 (见第 6 章) 。 为了你方便使用,表 3.11.1-3.11.6 总结了每个多相模型和相,在该相上为每个给定变量指定了 UDF。从这些信息,你可推断出那些区域结构是从求解器传递到 UDF 的。 单相和多相模型应用 UDFs 之间的区别(Differences Between UDFs for Single-Phase and Multiphase Applications) 注:在许多例子中,为单相流动写的 UDF 源代码和为多相流动写的是相同的。例如,假设函数只 从它被连接(hooked)到的相级别区域访问数据,为单相边界型线(使用 DEFINE_PROFIEL 定 义的)写的 C 代码为多相边界型线写的代码之间是没有区别的。然而,如果那些函数从除混合级 别区域之外的任何区域访问数据,调整和初始化 UDFs 的代码对单相和多相流动是不同的。

第 3 章 编写 UDF
3.11.2 对多相模型使用 UDFs(Using UDFs for Multiphase Models) 在多相模型中,从求解器传递到你的 UDF 的数据结构(例如区域和线程指针)取决于你使用的 DEFINE 宏。传递哪一个特定的区域或线程取决于函数连接到求解器的什么地方。例如,被连接 到混合模型的函数传递超级区域结构,而连接到特定相的函数传递子区域结构。表 3.11.1-3.11.6 列举了 DEFINE 和对每个多相模型 UDF 被连接到的相。从这些信息你可推断出那些数据结构被 传递。回想 DEFINE_ADJUST 和 DEFINE_INIT UDFs are hardwired to the mixture-level domain,而 DEFINE_ON_DEMAND 函数不能连接到任何区域。 Table 3.11.1: DEFINE Macro Usage for the VOF Model Variable Macro Phase Specified On secondary phase(s) mixture
volume fraction DEFINE_PROFILE velocity boundary pressure boundary boundary temperature turbulent kinetic DEFINE_PROFILE energy turbulent dissipation rate mass source DEFINE_SOURCE DEFINE_PROFILE DEFINE_PROFILE at a DEFINE_PROFILE at a DEFINE_PROFILE
mixture
mixture
mixture
mixture
primary and secondary phase(s)
momentum source energy source
DEFINE_SOURCE
mixture
DEFINE_SOURCE
mixture

第 3 章 编写 UDF
turbulent kinetic DEFINE_SOURCE energy source turbulent dissipation rate source density DEFINE_PROPERTY DEFINE_SOURCE
mixture
mixture
primary and secondary phase(s)
viscosity
DEFINE_PROPERTY
primary and secondary phase(s)
Table 3.11.2: DEFINE Macro Usage for the Mixture Model Variable Macro Phase Specified On secondary phase(s) primary and
volume fraction DEFINE_PROFILE velocity boundary at a DEFINE_PROFILE
secondary phase(s) pressure boundary boundary temperature turbulent kinetic DEFINE_PROFILE energy turbulent dissipation rate mass source DEFINE_SOURCE primary and DEFINE_PROFILE mixture mixture DEFINE_PROFILE mixture at a DEFINE_PROFILE mixture

第 3 章 编写 UDF
secondary phase(s) momentum source energy source DEFINE_SOURCE mixture mixture DEFINE_SOURCE mixture
turbulent kinetic DEFINE_SOURCE energy source turbulent dissipation rate source density DEFINE_PROPERTY DEFINE_SOURCE
mixture
primary and secondary phase(s)
viscosity
DEFINE_PROPERTY
primary and secondary phase(s)
diameter slip velocity
DEFINE_PROPERTY DEFINE_VECTOR_ EXCHANGE_PROPERTY
secondary phase(s) phase interaction
Table 3.11.3: DEFINE Macro Usage for the Eulerian Model (Laminar Flow) Variable Macro Phase On volume fraction DEFINE_PROFILE velocity boundary secondary phase(s) at a DEFINE_PROFILE secondary phase(s) primary and Specified

第 3 章 编写 UDF
pressure at a DEFINE_PROFILE boundary granular temperature mass source DEFINE_SOURCE DEFINE_PROFILE
mixture
secondary phase(s)
primary and secondary phase(s)
momentum source
DEFINE_SOURCE
primary and
secondary phase(s) density DEFINE_PROPERTY primary and secondary phase(s) viscosity DEFINE_PROPERTY primary and secondary phase(s) granular diameter granular viscosity granular viscosity granular frictional viscosity drag coefficient DEFINE_EXCHANGE_PROPERTY phase interaction lift coefficient DEFINE_EXCHANGE_PROPERTY phase interaction DEFINE_PROPERTY secondary phase(s) bulk DEFINE_PROPERTY secondary phase(s) DEFINE_PROPERTY secondary phase(s) DEFINE_PROPERTY secondary phase(s)

Fluent_UDF_第七章_UDF的编译与链接

第七章 UDF的编译与链接 编写好UDF件(详见第三章)后,接下来则准备编译(或链接)它。在7.2或7.3节中指导将用户编写好的UDF如何解释、编译成为共享目标库的UDF。 _ 第 7.1 节: 介绍 _ 第 7.2 节: 解释 UDF _ 第 7.3 节: 编译 UDF 7.1 介绍 解释的UDF和编译的UDF其源码产生途径及编译过程产生的结果代码是不同的。编译后的UDF由C语言系统的编译器编译成本地目标码。这一过程须在FLUENT运行前完成。在FLUENT运行时会执行存放于共享库里的目标码,这一过程称为“动态装载”。 另一方面,解释的UDF被编译成与体系结构无关的中间代码或伪码。这一代码调用时是在内部模拟器或解释器上运行。与体系结构无关的代码牺牲了程序性能,但其UDF可易于共享在不同的结构体系之间,即操作系统和FLUENT版本中。如果执行速度是所关心的,UDF文件可以不用修改直接在编译模式里运行。 为了区别这种不同,在FLUENT中解释UDF和编译UDF的控制面板其形式是不同的。解释UDF的控制面板里有个“Compile按钮”,当点击“Compile按钮”时会实时编译源码。编译UDF的控制面板里有个“Open按钮”,当点击“Open按钮” 时会“打开”或连接目标代码库运行FLUENT(此时在运行FLUENT之前需要编译好目标码)。 当FLUENT程序运行中链接一个已编译好的UDF库时,和该共享库相关的东西都被存放到case文件中。因此,只要读取case文件,这个库会自动地链接到FLUENT 处理过程。同样地,一个已经经过解释的UDF文件在运行时刻被编译,用户自定义的C函数的名称与内容将会被存放到用户的case文件中。只要读取这个case文件,这些函数会被自动编译。 注:已编译的UDF所用到的目标代码库必须适用于当前所使用的计算机体系结构、操作系统以及FLUENT软件的可执行版本。一旦用户的FLUENT升级、操作系统改变了或者运行在不同的类型的计算机,必须重新编译这些库。

UDF 编译疑难问题

UDF 编译疑难问题 作者华南理工大学何奎2016 5月 随着用户求解的问题越来越复杂,使用fluent 软件难免使用编译型的UDF,编译型需要用户安装微软visual stadio C++ 开发软件,并做正确的环境变量配置。否则则会出现如nmake 不是内部命令的错误。除了编译环境的正确设置,还有一些细节上的疑难问题一并给出解决方法。目前这些问题都是网上搜索不到的,希望有缘人能在百度文库里找到这篇文献。 关于环境变量的设置,网络上已经有大量的实例,现介绍一种简单的环境变量配置方法: 在fluent 的安装目录下找到udf.bat, 修改以下内容: set MSVC_DEFAULT=%ProgramFiles(x86)%\Microsoft Visual Studio 14.0 if exist "%MSVC_DEFAULT%\VC\vcvarsall.bat" set MSVC=%MSVC_DEFAULT% if not "%MSVC%" == "" goto msvc_env110 这个文件中还有其他类似的语句,但是都是重复查找不同的编译环境。通过查找vcvarsall.bat,fluent才知道编译器位置。如果不是就要靠运行msvc_env110,那就要手动设置环境变量了。注意你安装了VS2015以后,在program(x86)中有Microsoft Visual Studio 14.0,Microsoft Visual Studio 12.0,Microsoft Visual Studio 11.0,其中只有一个是有效的,这个要仔细确认(一般只有一个文件夹是完整的安装,估计这样做是为了向下兼容性)。 修改完了这个路径以后就OK了。 环境变量配置完全以后,还会出现一些别的问题。如编译UDF时会利用math.h, 注意编译这个文件有可能会出现很多问题。如下: C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\INCLUDE\math.h(483): error C2059: 语法错误:“常量”C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\INCLUDE\math.h(483): error C2143: 语法错误: 缺少“)”(在“/”的前面) C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\INCLUDE\math.h(483): error C2143: 语法错误: 缺少“{”(在“/”的前面) C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\INCLUDE\math.h(483): error C2059: 语法错误:“/” C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\INCLUDE\math.h(483): error C2059: 语法错误:“)” 如果光按fluent提示的查找错误,是不可能完成错误查找的,打开math.h因为你会看见483行是这样 _Check_return_ _ACRTIMP double __cdeclcbrt(_In_ double _X);(求立方根函数) 这个语句本身是没有什么问题的。如果想修改这条语句完成math.h的编译,那就走入了死胡同。那 么换个版本的math.h呢? 于是换了个瑞典公司开发的版本Copyright 2003-2010 IAR Systems AB(瑞典著名软件开发商). 结果编译出现: C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\INCLUDE\math.h(19): fatal error C1083: 无法打开包括文件: “ycheck.h”: No such file or directory 如果你查找ycheck.h,想加入这个头文件来解决这个问题的话,你会发现在中文资料库里根本就查不到 这样的头文件。这可能是该公司内部开发的一个头文件。所以这条路又行不通。那么如果将这条预处理程 序忽略掉呢?结果就会出现以下的编译错误: C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\INCLUDE\math.h(99): error C2061: 语法错误: 标识符“__ATTRIBUTES” C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\INCLUDE\math.h(99): error C2059:

Fluent无法编译UDF文件的常见解决方法

解决Fluent无法编译UDF文件的问题 方法1 对于Fluent加载UDF时出现"The UDF library you are trying to load(libudf)is not complied for parallel use on the current platform (win64)"错误,主要是没有正确设置本机VS安装路径,导致udf编译器无法成功编译c代码。解决方法: 1. 找到Fluent内的UDF.bat编译器。这里以我自己2019R2的64位学生版为例,在D:\Program Files\ANSYS Inc\ANSYS Student\v194\fluent\ntbin\win64下找到udf.bat用记事本打开 2. 将本机Visual Studio的安装路径写入。这里以我自己VS2015为例,将本机visual studio 2015的安装路径赋值给MSVC_DEFAULT,由于VS2015的版本代号是14.0,因此将"%ProgramFiles(x86)%\Microsoft Visual Studio 14.0"替换为"D:\Program Files (x86)\Microsoft Visual Studio 14.0",保存文件即可,如图1~2所示 更改前

更改后 方法2 对于某些低版本的VS,以上操作可能不足以解决问题,需要手动配置环境变量,具体方法如下: 1.找到Fluent安装路径下的setenv.exe,双击运行选择是,路径X:\Program Files\ANSYS Inc\v130\fluent\ntbin\win64\setenv.exe 2.右键“我的电脑”—属性—高级—环境变量,添加用户变量,以VS2013为例INCLUDE=D:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include;C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Include; LIB=D:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\lib\amd64;C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Lib\x64;C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Lib\kernel32.lib Path=D:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin\amd64;D:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE;

64位 ANSYS FLUENT 编译UDF方法

ANSYS FLUENT 12.x 13.x版下使用Visual Studio 2010编译UDF的设置方法 COMSOL出了点问题,只能重装系统搞定。神马软件都要重装啊,今天装好ANSYS后,打开FLUENT界面时,灵感闪现,想出下面的方法设置UDF编译环境。 其实ANSYS版的FLUENT用UDF是不需要到系统环境变量里面设置path,include,lib的,如果您用的是Visual Studio 2010及后续版本,只需要按一定的规则设置udf.bat文件就行了。从udf.bat文件结构看,VS版本在VS2010以前的都可以不用设置,即可使用。 实现方法,以Win7 X64位ANSYS X64位为例: 1.找到fluent安装目录下的udf.bat(C:\Program Files\ANSYS Inc\v121\fluent\ntbin\win64\udf.bat) 用文本编辑器修改udf.bat: 添加 echo trying to find MS C compiler, version 10.0.... set MSVC_DEFAULT=%ProgramFiles(x86)%\Microsoft Visual Studio 10.0 if exist "%MSVC_DEFAULT%\vC\vcvarsall.bat" set MSVC=%MSVC_DEFAULT% if not "%MSVC%" == "" goto msvc_env100 set MSVC_DEFAULT=%ProgramFiles%\Microsoft Visual Studio 10.0 if exist "%MSVC_DEFAULT%\vC\vcvarsall.bat" set MSVC=%MSVC_DEFAULT% if not "%MSVC%" == "" goto msvc_env100 :msvc_env100 set MSVC_VERSION=100 call "%MSVC%\VC\vcvarsall.bat" amd64 goto ms_c_end 注:如果Visual Studio安装到其他盘,(可能)需要修改路径,比如装到D盘Program Files下,便这样添加: set MSVC_DEFAULT=d:\Program Files\Microsoft Visual Studio 10.0 if exist "%MSVC_DEFAULT%\vC\vcvarsall.bat" set MSVC=%MSVC_DEFAULT% if not "%MSVC%" == "" goto msvc_env100 :msvc_env100 set MSVC_VERSION=100 call "%MSVC%\VC\vcvarsall.bat" amd64 goto ms_c_end

udf编译的经验总结

转帖 udf编译的经验总结 关于:"nmake"不是内部命令或外部命令,也不是可运行程序 我在编译UDF时出现如下错误: Error: Floating point error: divide by zero Error Object: () > "nmake"不是内部命令或外部命令,也不是可运行程序 Error Object: () Error: open_udf_library:系统找不到指定目录 Error: Floating point error: divide by zero Error Object: () 我原来装的时turbo c/c++编译器,可能时环境变量没有设好的缘故。换用vc++6.0以后就没有这个问题了,另外,我用的是fluent6.2.16,希望遇到同样问题的同学借鉴一下,呵 呵。 udf编译的经验总结1)安装vc时候,只要选择了“环境变量”这一项,就不需要在“我 的电脑 > 属性 > 高级 > 环境变量”中 更改“include”“lib”“path”变量的值,保持默认状态即可; 2)如果是fluent6.1以上的版本,读入你的case文件,只要在 define->user-defined->functions->complied中, add你的udf源文件(*.c)和“udf.h”头文件,然后确定用户共享库(library name)的 名称,按“build”,就 相当于nmake用户共享库;在这一步中常出现的错误: (a)(system "move user_nt.udf libudf\ntx86\2d")0 (system "copy C:\Fluent.Inc\fluent6.1.22\src\makefile_nt.udf libudf\ntx86\2d\makefile")已复制 1 个文件。 (chdir "libudf")() (chdir "ntx86\2d")() 'nmake' 不是内部或外部命令,也不是可运行的程序 或批处理文件。 'nmake' 不是内部或外部命令,也不是可运行的程序

fluent udf学习总结

fluent udf 阶段性小结 ——Flying_U 因工作需要,最近开始学习fluent二次开发功能。现在,根据工作日志将这一段时间主要的学习过程和总结的经验整理如下。 学习计划:从4月5号开始,计划花上一个月的时间了解和学习fluent udf的基本知识。目标是能够运用udf初步实现物理模型简化、掌握udf的基本用法并能根据工作需要实现相关udf功能。 4.5-4.6:浏览网站尽可能更多了解udf的知识,结合自己的实际情况分析那些知识是自己需要进一步深入学习的。 此阶段总结:1.udf是用户自定义函数的简称,其通过与fluent接口连接实现扩展fluent功能的作用。udf的主要功能有: ●定制边界条件、材料属性、表面和体积反应率、fluent输运方程的源项、用户自定义的 标量方程的源项、扩散函数等 ●调整每次迭代后的计算结果 ●初始化流场的解 ●在需要时进行udf的异步执行 ●强化后处理功能 ●强化现有的udf模型 ●传送返回值、修改fluent变量、操作外部文件案例和data文件 2. 自己现在想要实现的是udf功能是定制边界条件、定制fluent输运方程的源项、初始化流场的解和强化后处理功能;(刚开始自己也不太明确自己到底想用udf来做什么,对应上udf的主要功能是哪一部分,然后对自己不懂没理解的功能一一查询。) 3. 有相关资料的渠道有:百度知道,百度文库和doc88。其中,百度文库各种教程最多,百度知道能够快速定位回答具体的问题,doc88资料觉得更深入一些。(对搜集的资料进行及时的整理和归纳对自己学习有很大助力,很多资料都是不完全的或者自己当时没有完全理解的需要不同版本或者前后不同时间段对照着学习。) 4.6-4.9 根据自己的需求在udf帮组手册中查找实例并尝试按实例进行对照练习,初步了解udf相关知识,打通udf实现的过程(udf编写、编译和连接)。主要目的是了解udf的基本用法,初步了解udf宏命令。 此阶段总结:1.udf帮助手册里的实例对初学者特别有用,例子难度小,侧重流程和用法。 2. 解释型udf使用基本过程:将物理模型简化,确定udf实现的功能;编制c语言源代码;启动fluent并完成相关设置;加载并解释c语言代码;将udf与fluent相关联。初次尝试觉得难度很小,只是对c语言源程序的边界有点模糊,特别是在语言结构方面。 3. 进行编译型udf使用尝试,根据需要需先安装一个c编辑器,因手头有vs2012所以直接安装vs2012。安装vs2012的过程有点艰辛,因为自己电脑上装过其他的VS版本(未完全卸载),以及其他的一些开源c编辑器(一直在用),安装vs2012过程老是不成功(这里推荐使用vs2008,网上教程较多,出现相关的问题都能较容易地找到方法解决)。最后的解决办法是重装系统(各种尝试都未能解决安装问题后,可能与以前安装过的vs卸载不完全有关),并逐步尝试环境变量的设置。vs2012与fluent环境变量成功设置如下(win7 64位系统):

Fluent UDF 第三章 编写UDF

第 3 章 编写 UDF
第 3 章 编写 UDF
本章包含了 FLUENT 中如何写 UDFs 的概述。
3.1 概述 3.2 写解释式 UDFs 的限制 3.3 FLUENT 中 UDFs 求解过程的顺序 3.4 FLUENT 网格拓扑 3.5 FLUENT 数据类型 3.6 使用 DEFINE Macros 定义你的 UDF 3.7 在你的 UDF 源文件中包含 udf.h 文件 3.8 定义你的函数中的变量 3.9 函数体 3.10 UDF 任务 3.11 为多相流应用写 UDFs 3.12 在并行中使用你的 UDF 3.1 概述(Introduction) 在你开始编写将挂到 FLUENT 代码以增强其标准特征的 UDF 之前,你必须 知道几个基本的要求。首先,UDFs 必须用 C 语言编写。它们必须使用 FLUENT 提供的 DEFINE macros 来定义。UDFs 必须含有包含于源代码开始指示的 udf.h 文件;它允许为 DEFINE macros 和包含在编译过程的其它 FLUENT 提供的函数 定义。 UDFs 只使用预先确定的宏和函数从 FLUENT 求解器访问数据。 通过 UDF 传递到求解器的任何值或从求解器返回到 UDF 的,都指定为国际(SI)单位。 总之,当写 UDF 时,你必须记住下面的 FLUENT 要求。 UDFs: 1. 采用 C 语言编写。 2. 必须为 udf.h 文件有一个包含声明。 3. 使用 Fluent.Inc 提供的 DEFINE macros 来定义。 4. 使用 Fluent.Inc 提供的预定义宏和函数来访问 FLUENT 求解器数据。 5. 必须使返回到 FLUENT 求解器的所有值指定为国际单位。 3.2 写解释式 UDFs 的限制(Restriction on Writing Interpreted UDFs)

UDF

1.1什么是UDF? UDF是一种可以被加载到fluent求解器中的函数,以提高源代码的功能。比如,你可以使用UDF定义你的边界条件,材料属性和流型源项,以及自定义模型参数,初始化一种算法或增强后处理进程。 UDF可以在任何文本里用C语言编写,然后源代码保存格式为“e.g., myudf.c”。一个源文件可以包含一个或多个UDF,或者你可以定义多个源文件。关于C语言编程的一些基本资料见附录A。 UDF是被fluent Inc提供的宏定义进行定义。它们使用附加的宏代码,使fluent具有数据访问和执行其他任务的功能。 每一个UDF必须在源代码文件的开头包含“#include "udf.h"”,使得宏定义和fluent的其他宏及功能可以在运行的过程中被包含。 含有UDF的源文件可以在fluent里进行解释或编译。对于解释型UDF,在一个单一的运算进程中,源文件被解释后在运行时直接加载。而对于编译型UDF,这个过程包含2个步骤。需要首先建立一个共享的对象代码库,然后将其加载到fluent中。一旦被解释或编译,UDF将会在fluent界面中可见并可选择,然后通过在相应的控制面板中选择函数名称被连接到求解器中。 1.2为什么使用UDF? UDF可以让你自定义fluent来满足你的特殊模型需要。UDF可以在多个应用中使用,下面列举的就是一些例子。 ●定义边界条件,材料属性,表面和体积反应速率,fluent输运方程的源项, UDS输运方程的源项,扩散系数函数等。 ●一次迭代的计算值的调整。 ●初始化一种算法。 ●UDF的异步执行。 ●在迭代结束后执行,退出fluent或者加载编译UDF库。 ●增强后处理。 ●增强现有的fluent模型。

Fluent UDF 中文教程UDF第7章 编译与链接

第七章UDF的编译与链接 编写好UDF件(详见第三章)后,接下来则准备编译(或链接)它。在7.2或7.3节中指导将用户编写好的UDF如何解释、编译成为共享目标库的UDF。 _ 第 7.1 节: 介绍 _ 第 7.2 节: 解释 UDF _ 第 7.3 节: 编译 UDF 7.1 介绍 解释的UDF和编译的UDF其源码产生途径及编译过程产生的结果代码是不同的。编译后的UDF由C语言系统的编译器编译成本地目标码。这一过程须在FLUENT运行前完成。在FLUENT运行时会执行存放于共享库里的目标码,这一过程称为“动态装载”。 另一方面,解释的UDF被编译成与体系结构无关的中间代码或伪码。这一代码调用时是在内部模拟器或解释器上运行。与体系结构无关的代码牺牲了程序性能,但其UDF可易于共享在不同的结构体系之间,即操作系统和FLUENT版本中。如果执行速度是所关心的,UDF文件可以不用修改直接在编译模式里运行。 为了区别这种不同,在FLUENT中解释UDF和编译UDF的控制面板其形式是不同的。解释UDF的控制面板里有个“Compile按钮”,当点击“Compile按钮”时会实时编译源码。编译UDF的控制面板里有个“Open 按钮”,当点击“Open按钮”时会“打开”或连接目标代码库运行

FLUENT(此时在运行FLUENT之前需要编译好目标码)。 当FLUENT程序运行中链接一个已编译好的UDF库时,和该共享库相关的东西都被存放到case文件中。因此,只要读取case文件,这个库会自动地链接到FLUENT处理过程。同样地,一个已经经过解释的UDF文件在运行时刻被编译,用户自定义的C函数的名称与内容将会被存放到用户的case文件中。只要读取这个case文件,这些函数会被自动编译。 注:已编译的UDF所用到的目标代码库必须适用于当前所使用的计算机体系结构、操作系统以及FLUENT软件的可执行版本。一旦用户的FLUENT升级、操作系统改变了或者运行在不同的类型的计算机,必须重新编译这些库。 UDF必须用DEFINE宏进行定义,DEFINE宏的定义是在udf.h文件中。因此,在用户编译UDF之前,udf.h文件必须被放到一个可被找到的路径,或者放到当前的工作目录中。 udf.h文件放置在: path/Fluent.Inc/fluent6.+x/src/udf.h 其中path是Fluent软件的安装目录,即Fluent.Inc目录。X代表了你所安装的版本号。 通常情况下,用户不应该从安装默认目录中复制udf.h文件。编译器先在当前目录中寻找该文件,如果没找到,编译器会自动到/src目录下寻找。如果你升级了软件的版本,但是没有从你的工作目录中删除旧版本的udf.h文件,你则不能访问到该文件的最新版本。在任何情

在64位操作系统中编译UDF

Fluent:在64位操作系统中编译UDF 2011年09月04日星期日 19:01 编译环境microsoft visual studio2010,fluent版本13.0,操作系统为windows 7 64bit。 测试代码采用UDF手册P394中关于边界条件的实例。 1、解释型 经测试,无需任何配置,甚至不需安装vs2010,也能顺利编译成功。 2、编译型 (1)按照32位系统中相同的编译方式。出现如图2所示的错误提示,这通常是编译器未正确配置的原因。 图2 错误提示 提示找不到 nmake文件,我们需要将其路径放入环境变量的path中,以便于系统搜索。 32位系统中解决办法:搜索nmake文件,将其所在路径添加至环境变量的path 中。 如图3所示,找到了两个nmake文件,我们将其路径全都加入到path中。 图3 两个nmake,其实我们只需要将第一个添加即可,但是为防万一,我们将两个路径全都加入到环境变量中 然而在64位系统中问题依旧,如图4所示。编译时找寻不到nmake文件。原因

在于我们采用的是64位系统。因此还需另寻它法。 图4 依旧的问题,可能是操作系统导致的,因为我们在cmd中可以找到nmake (2)解决方案 打开开始菜单中的visual studio 2010,我们可以看到如图5所示的菜单。找到如图所示的x64 win64命令提示,点击运行它。 图5 visual studio2010的菜单 我们需要找到fluent的真正路径,即fluent.exe所在的路径。可以找到fluent 的快捷方式,点击右键选择属性,可以看到图6所示的对话框。

fluent-udf-经验

[转]菜鸟学UDF的感觉,希望对UDFers有用 光看书,感觉UDF不难。看例子,有些看个四五遍之后才能差不多看懂。原来,得靠UDF 帮助。我主要用的是fluent v6.3自带的html格式的帮助,里面东西很全,当然也包括UDF Manual。里面自带的search功能相当好,只是要注意用好+或-号(逻辑符号),另外,这个功能似乎有些浏览器支持不太好,不过基本上用IE不太容易出问题。 对于从零开始学习UDF,建议还是先看一下UDF中文帮助,我估计大家知道的都是马世虎翻译的那本吧,感觉挺好。(没想到马世虎跟我是校友,去年给安世亚太投过一份简历,他给我打过电话,当时一阵兴奋,呵呵。) 对于只涉及到边界条件或物性等的UDF,一般用interpret就可以的,这些我觉得只需要根据例子改一下就是了。 $$ 对于要添加UDS方程的,相对难一点。我编程用的是三到五个UDS,几十个UDM。一开始编程时,没有头绪,后来看别人编的,才慢慢发现了一些基本思路。比如,可以用枚举定义UDS或UDM,这样用起来方便。 enum{ NP, RHOH2O_Y_UP_X, RHOH2O_Y_UP_Y, RHOH2O_Y_UP_Z, N_REQUIRED_UDS };//枚举UDS变量名 对于UDM,则用N_REQUIRED_UDM代表个数。 然后在INIT与ADJUST函数中,检查变量个数时则比较方便,如: DEFINE_INIT(init_parameter,domain) { if (n_uds < N_REQUIRED_UDS) Error(”Not enough user defined scalars!(init)\n”); if (n_udm

udf-使用经验总结

我接触UDF的时间不算长,2007年7月份开始看UDF的中文帮助,花了一周时间大体看完后,第一感觉:不难啊,至少不像以前别人给我讲的很高深的样子。然后就是UDF编程,直到10月底吧。然后用的时间就不多了。然后就是这两周,我马上就要研究生毕业了,可能这周结束后用UDF编程的可能性会很小了,所以想写点东西,给刚刚学UDF编程的人,希望对大家有用。对于UDF高手,估计是不用向下看了。 UDF框架 光看书,感觉UDF不难。看例子,有些看个四五遍之后才能差不多看懂。原来,得靠UDF帮助。我主要用的是fluent v6.3自带的html格式的帮助,里面东西很全,当然也包括UDF Manual。里面自带的search功能相当好,只是要注意用好+或-号(逻辑符号),另外,这个功能似乎有些浏览器支持不太好,不过基本上用IE不太容易出问题。 对于从零开始学习UDF,建议还是先看一下UDF中文帮助,我估计大家知道的都是马世虎翻译的那本吧,感觉挺好。(没想到马世虎跟我是校友,去年给安世亚太投过一份简历,他给我打过电话,当时一阵兴奋,呵呵。) 1. 对于只涉及到边界条件或物性等的UDF,一般用interpret就可以的,这些我觉得只需要根据例子改一下就是了。 $$ 对于要添加UDS方程的,相对难一点。我编程用的是三到五个UDS,几十个UDM。一开始编程时,没有头绪,后来看别人编的,才慢慢发现了一些基本思路。比如,可以用枚举定义UDS或UDM,这样用起来方便。 enum{ NP, RHOH2O_Y_UP_X, RHOH2O_Y_UP_Y, RHOH2O_Y_UP_Z, N_REQUIRED_UDS };//枚举UDS变量名 对于UDM,则用N_REQUIRED_UDM代表个数。 2. 然后在INIT与ADJUST函数中,检查变量个数时则比较方便,如: DEFINE_INIT(init_parameter,domain) { if (n_uds

Fluent UDF编译出错解决方法总结

Fluent UDF编译出错解决方法总结 Fluent是一款非常成熟的CFD软件,因此得到广泛使用。它提供了C语言接口UDF,用户可以根据自己需要扩展Fluent的不足。然而,UDF编译往往给大家带来了很大的麻烦,因为Fluent编译需要借助VC。同样这个问题困扰我很久,今天终于解决了,顺便总结一下,以便日后方便查询,呵呵。 我就遇到两类问题: 1.'nmake' 不是内部或外部命令,也不是可运行的程序或批处理文件 这个问题大家遇到的最多,网上的解释也很多,我也在重复一遍。出现这个错,我们需要按照如下修改环境变量 变量名include 变量值D:\Program Files\Microsoft Visual Studio 9.0\VC\include 变量名lib 变量值D:\Program Files\Microsoft Visual Studio 9.0\VC\lib 变量名path 变量值D:\Program Files\Microsoft Visual Studio 9.0\Common7\IDE;D:\Program Files\Microsoft Visual Studio 9.0\VC\bin; D:\Program Files\Microsoft Visual Studio 9.0是我安装Microsoft Visual Studio 2008 的文件夹。 2.LINK: fatal erro LNK1104: cannot open file 'kernel132.lib' 这个问题困扰我很久,因为以前按照1修改环境变量就OK了,可这个实在不知道是什么错误,在百度上搜了很长时间没找到解决办法,都想放弃了。今天无意试试google,结果找到了答案!因此以后要养成用google搜问题的习惯! 解决办法还是修改环境变量,提示不能打开'kernel132.lib',我们就想办法找到他并把它添加到环境变量里lib里,我的电脑里'kernel132.lib'在C:\Program files\Microsoft SDKs\Windows\v6.0A\Lib\kernel32.lib,于是把这个路径添加到lib这个环境变量里,问题就解决了。 3.编译文件一定要确保在Fluent默认的路径里,否则也会出错,这个修改Fluent的属性可以解决! 4. UDF并行计算出错(2013.11.1补充) 问题描述:在个人计算机上编写一个简单的udf程序,想要并行使用,没做任何修改单机多核上compiled和load通过,到高性能计算机上一直编译出错。折腾一晚上最终发现并不是并行编译出错!而是高性能计算机编译器是GCC,不支持“//”注释,而我的电脑编译器是vc++ 6.0,支持“//”和”/*……*/",最终修改后就可以正常使用了。

UDF的宏用法及相关算例

7 自定义函数(UDF) 7.1,概述 用户自定义函数(User-Defined Functions,即UDFs)可以提高FLUENT程序的标准计算功能。它是用C语言书写的,有两种执行方式:interpreted型和compiled型。Interpreted型比较容易使用,但是可使用代码(C语言的函数等)和运行速度有限制。Compiled型运行速度快,而且也没有代码使用范围的限制,但使用略为繁琐。 我们可以用UDFs来定义: a)边界条件 b)源项 c)物性定义(除了比热外) d)表面和体积反应速率 e)用户自定义标量输运方程 f)离散相模型(例如体积力,拉力,源项等) g)代数滑流(algebraic slip)混合物模型(滑流速度和微粒尺寸) h)变量初始化 i)壁面热流量 j)使用用户自定义标量后处理 边界条件UDFs能够产生依赖于时间,位移和流场变量相关的边界条件。例如,我们可以定义依赖于流动时间的x方向的速度入口,或定义依赖于位置的温度边界。边界条件剖面UDFs用宏DEFINE_PROFILE定义。有关例子可以在5.1和6.1中找到。源项UDFs可以定义除了DO辐射模型之外的任意输运方程的源项。它用宏DEFINE_SOURCE 定义。有关例子在5.2和6.2中可以找到。物性UDFs可用来定义物质的物理性质,除了比热之外,其它物性参数都可以定义。例如,我们可以定义依赖于温度的粘性系数。它用宏DEFINE_PROPERTY定义,相关例子在6.3中。反应速率UDFs用来定义表面或体积反应的反应速率,分别用宏DEFINE_SR_RA TE和DEFINE_VR_RA TE定义,例子见6.4。离散相模型用宏DEFINE_DPM定义相关参数,见5.4。UDFs还可以对任意用户自定义标量的输运方程进行初始化,定义壁面热流量,或计算存贮变量值(用用户自定义标量或用户自定义内存量)使之用于后处理。相关的应用见于5.3,5.5,5.6和5.7。 UDFs有着广泛的应用,本文并不能一一叙述。如果在使用中遇到问题,可以联系FLUENT技术支部门要求帮助。在此推荐一个网站https://www.doczj.com/doc/1e7563605.html,,上面有FLUENT论坛,可进行相关询问和讨论。 7.1.1 书写UDFs的基本步骤 在使用UDFs处理FLUENT模型的过程中,我们一般按照下面五步进行: 1.概念上函数设计 2.使用C语言书写 3.编译调试C程序 4.执行UDF 5.分析与比较结果 第一步分析我们所处理的模型,目的是得到我们要书写的UDF的数学表达式。第二步将数学表达式转化成C语言源代码。第三步编译调试C语言源代码。第四步在FLUENT中执行UDF。最后一步,将所得到的结果与我们要求的进行比较,如果不满足要求,则需要重复上面的步骤,直到与我们期望的吻合为止。 7.1.2 Interpreted型与Compiled型比较 Compiled UDFs执行的是机器语言,这和FLUENT本身运行的方式是一样 的。一个叫做Makefile的过程能够激活C编辑器,编译我们的C语言代码,从而建立一个目标代码库,目标代码库中包含有高级C语言的低级机器语言诠释。在运行的时候,一个叫做“dynamic loading”的过程将目标代码库与FLUENT 连接。一旦连接之后,连接关系就会在case文件中与目标代码库一起保存,所以读入case文件时,FLUENT就会自动加载与目标代码库的连接。这些库的建立是基于特定计算机和特定FLUENT版本的,所以升级FLUENT版本后,就必须重新建立相应的库。 相反,Interpreted UDFs是在运行的时候直接装载编译C语言代码的。在这种情况下,生成的机器代码不依赖于计算机和FLUENT版本。编译后,函数信息将会保存在case文件中,所以读入case文件时,FLUENT也会自动加载相应的函数。Interpreted UDFs具有较强的可移植性,而且编译比较简单。对于简单的UDFs,如果对运行速度要求不高,一般就采用Interpreted型的。 下面列出的是两种UDFs的一些特性:

UDF总结

UDF使用技巧 1、查找相应的函数的时候,可以现在word里面找到相应的函数名字,然后依次去中文帮助文档、英文帮助文档和网页帮助文档,看看详细解释并找找是否有相应的例子。 2、打个比方来说,thread就是公路,连接的cell和face,cell和face就相当于公路上汽车停靠的站点, cell_t这个面向的是单元,而face_t面向的是边或者面(二维或三维) 在fluent循环过程中,一般是用thread作线程检索,而cell或者face作检索过程中位置(相当于指示位置的参数)参数的指示 3、对于UDF来说,积分就是做加法,把通过面上每个网格的质量流量相加 4、cell和face的区别,什么时候用cell,什么时候用face? 5、1. begin, end_c_loop macro is used for looping over all the cells in particular thread for serial processing. 2. For parallel processing, the cells inside a partition can be categorized as interior and exterior cells. 3. The macros begin, end_c_loop_int; begin, end_c_loop_ext and begin, end_c_loop_all are used for looping over interior, exterior and all the cells (in a partition) respectively. 4. In parallel simulations, both begin, end_c_loop and begin, end_c_loop_all macros will do the same job. 5. For faces the looping macro in parallel are begin, end_f_loop_int; begin, end_f_loop_ext and begin, end_f_loop for looping over interior, boundary and all faces respectively. For all practical purpose, the user need not separate the interior and boundary faces of a partition. Hence, begin, end_f_loop_int and begin, end_f_loop_ext macros are rarely used. 实际问题 1、DEFINE_UDS_UNSTEADY中的apu包括的函数是不是不包括当前时刻的变量,而su包含前一时刻的变量,所以用了C_STORAGE_R存储前一时刻的变量。 2、等于零是因为计算源项的时候温度还没有更新,所以两个温度值是相等的。这个时候其实是需要两个UDM,分别保存上一步和再上一步的温度。而且可以考虑全部在源项里完成,不用Adjust宏: source=(C_UDMI(c,t,1)-C_UDMI(c,t,0))/TIME_STEP; C_UDMI(c,t,0)=C_UDMI(c,t,1); C_UDMI(c,t,1)=C_T(c,t); return source; 当然,在刚开始计算的时候要注意下UDM的初始问题,防止出错。 从第三个时间步开始,就是正常的了。

ansys12.0 udf 编译环境设置

FLUENT UDF中关于动网格的DEFINE宏均要求为编译型。FLUENT的UDF 运行环境有两种:解释型与编译型。虽然两种方式都是采用编译,但是编译方式及编译后获得的结果是不同的。编译型UDF需要通过Complied进行编译,编译后得到相应的dll文件。而解释型UDF则是通过Interprete进行加载,不会生成dll文件。据我的直觉,编译型UDF可能利用了钩子函数的技术。 一、编译型UDF与解释型UDF的差异(翻译自UDF手册) 1、解释型UDF ?一个精简的平台 ?都能被作为编译型UDF使用 ?不需要C编译器(利用FLUENT自身的编译器) ?比编译型UDF反应慢 ?在方法方面受到较多的限制 ?无法被链接到编译系统或其它库 ?只能使用预定义宏访问存储于ansys fluent中的数据 2、编译型UDF ?比解释型UDF反应迅速 ?没有诸多C语法限制 ?能够使用其它语言编写的函数 ?当具有一些解释型UDF不能处理的功能时,无法作为解释型UDF使用

3、选取原则 ?对于小型的、简单的功能,使用解释型UDF ?复杂功能使用编译型UDF。(如具有较大的CPU开销、需要访问公共库) 二、配置UDF编译环境 对于编译型UDF,在fluent中加载时,需要调用C编译器将其编译成DLL 文件。这里的C编译器虽说理论上是没有任何限制的,但是在windows环境下还是推荐使用microsoft visual c++,在linux环境下推荐使用GCC。我们这里只说windows环境下编译环境的配置问题。 visual c++最高版本是6.0,再往后就是microsoft visual studio7.0、8.0、9.0、10.0。其中7.0对应microsoft visual studio2003,8.0对应2005,9.0对应2008,10.0对应2010。在一些老版的fluent中,通常需要配置环境变量。配置环境变量的方法,网络上很多,可以搜索。这里讲的是通过修改udf.bat文件来配置编译环境。 在fluent 12.0之后的版本中,可以通过修改udf.bat文件的方式进行编译环境配置。该文件位于 xx\ANSYS Inc\v140\fluent\ntbin\win64目录下。本人安装的fluent是64bit的,版本为14.0。不同版本的fluent,该文件所处的位置可能不同。大家可以利用windows的文件搜索功能寻找该文件。注意若是安装了icepak,则会有两个udf.bat文件,一定要注意我们只针对fluent目录下的该文件。

相关主题
文本预览
相关文档 最新文档