首页 【2017年整理】FLUENT udf中文资料ch6

【2017年整理】FLUENT udf中文资料ch6

举报
开通vip

【2017年整理】FLUENT udf中文资料ch6【2017年整理】FLUENT udf中文资料ch6 第六章. Utilities ,工具, FLUENT公司提供的针对FLUENT变量性能计算的预处理工具列表 , 6.1 Introduction 简要 , 6.2 General-Purpose Looping Macros , 一般目的的宏 , 6.3 Multiphase-Specific Looping Macros , 多项组分的宏 , 6.4 Setting Face Variables ( F_PROFILE) 设置面变量 , 6....

【2017年整理】FLUENT udf中文资料ch6
【2017年整理】FLUENT udf中文资料ch6 第六章. Utilities ,工具, FLUENT公司提供的针对FLUENT变量性能计算的预处理工具列 关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf , 6.1 Introduction 简要 , 6.2 General-Purpose Looping Macros , 一般目的的宏 , 6.3 Multiphase-Specific Looping Macros , 多项组分的宏 , 6.4 Setting Face Variables ( F_PROFILE) 设置面变量 , 6.5 Accessing Variables That Are Not Passed as Arguments , 访问没有作为Argument传递的变量 , 6.6 Accessing Neighboring Cell and Thread Variables 访问邻近单元(网格点和线)上的变量 , 6.7 User-Defined Memory for Cells ( C_UDMI) 用户为网格定义内存(C,UDMI) , 6.8 Vector Utilities 矢量工具 , 6.9 Macros for Time-Dependent Simulations 与时间相关的数值模拟宏 , 6.10 Miscellaneous Utilities 其他各种工具 6.1简要 Fluent Inc.提供了针对Fluent变量操作的一系列工具。这些工具中大部分可以作为宏直接执行。 1 许多宏可以用于单相和多相模型的UDFs中,但是有些是只针对多相流的。回想一下当你为多相流模型写UDFs时,你将记住FLUENT的结构的层次。(详细参考3.11.1)。 从求解器中导入到你的UDFs中特殊的控制区和线性结构,依赖于你所使用的DEFINE宏和相关的控制区函数。(通过图形用户界面和用户定义的源代码) 它或许也依赖于你所使用的多相流模型。将控制区的结构传递给DEFINE_INIT 和 DEFINE_ADJUST 函数,但是它与多相流模型是相互独立的。这些函数始终被传递给与混合物有关的控制区结构。DEFINE_ON_DEMAND UDFs没有被传递给任何控制区。 如果你的PDF没有显式地传给你的函数所需要的线性的或者控制区的结构,那么你可以利用本章提供的宏工具修复。提供的许多宏使你的函数可以寻找到给定线和区的所有的网格点和面。 6.2一般目的的循环宏 下面这些循环的宏可以用于FLUENT单相和多相模型的UDFs中。这些宏的定义包含再mem.h头文件中。 , 6.2.1 Looping over Cell Threads in a Domain ( thread_loop_c) , 查询控制区的单元线 , 6.2.2 Looping over Face Threads in a Domain ( thread_loop_f) , 查询控制区的面 , 6.2.3 Looping over Cells in a Cell Thread ( begin...end_c_loop) , 查询单元线中的单元 , 6.2.4 Looping over Faces in a Face Thread ( begin...end_f_loop) , 查询面单元中的面 , 6.2.5 Looping over Faces on a Cell ( c_face_loop) , 查询单元面 , 6.2.6 Looping over Nodes of a Cell ( c_node_loop) , 查询单元节点 6(2.1查询控制区的单元线 2 当你想查询给定控制区的单元线时,你可以用thread_loop_c。它包含单独的说明,后面是对控制区的单元线所做操作,正如下面显示的包含在{ }中。注意:thread_loop_c在执行上和thread_loop_f相似,参考6.2.2部分。 Domain *domain; Thread *c_thread; thread_loop_c(c_thread, domain) /*loops over all cell threads in domain*/ { } 6.2.2查询控制区的面 当你想要查询给定控制区的面时,你可以应用thread_loop_f。它包含单独的说明,后面是对控制区的面单元所做操作,正如下面显示的包含在{ }中。注意:thread_loop_f在执行上和thread_loop_c相似,参考6.2.1部分。 Thread *f_thread; Domain *domain; thread_loop_f(f_thread, domain)/* loops over all face threads in a domain*/ { } 6.2.3 查询单元线中的单元 当你想要查询给定单元线c_thread上所有的单元时,你可以应用begin_c_loop和end_c_loop。它包含begin 和 end loop的说明,完成对单元线中单元所做的操作,定义包含在{ }中。当你想查找控制区单元线的单元时,应用的loop全嵌套在thread_loop_c中。 cell_t c; Thread *c_thread; begin_c_loop(c, c_thread) /* loops over cells in a cell thread */ { } end_c_loop(c, c_thread) 例子: /* Loop over cells in a thread to get information stored in cells. */ begin_c_loop(c, c_thread) { /* C_T gets cell temperature. The += will cause all of the cell 3 temperatures to be added together. */ temp += C_T(c, c_thread); } end_c_loop(c, c_thread) } 6.2.4查询面线中的面 当你想要查找给定面线f_thread的所有的面时,你可以用begin_f_loop and end_f_loop。它包含begin 和 end loop的说明,完成对面线中面单元所做的操作,定义包含在{ }中。当你想查找控制区面线的所有面时,应用的loop全嵌套在thread_loop_f中。 face_t f; Thread *f_thread; begin_f_loop(f, f_thread) /* loops over faces in a face thread */ { } end_f_loop(f, f_thread) 例子: /* Loop over faces in a face thread to get the information stored on faces. */ begin_f_loop(f, f_thread) { /* F_T gets face temperature. The += will cause all of the face temperatures to be added together. */ temp += F_T(f, f_thread); } end_f_loop(f, f_thread) 6.2.5 查询单元中的面 下面函数用以查询给定单元中所有面。包含单独的查询说明,后面是所做的操作包含在{}。 face_t f; Thread *tf; 4 int n; c_face_loop(c, t, n) /* loops over all faces on a cell */ { . . . f = C_FACE(c,t,n); tf = C_FACE_THREAD(c,t,n); . . . } 这里,n是当地面的索引号。当地面的索引号用在C_FACE宏中以获得所有面的数量(e.g., f = C_FACE(c,t,n))。 另一个在c_face_loop中有用的宏是C_FACE_THREAD。这个宏用于合并两个面线。 (e.g., tf = C_FACE_THREAD(c,t,n)). 查找与 c_face_loop有关的宏参考 6.10部分。 6.2.6查询单元节点( c_node_loop) 下面函数用以查询给定单元中所有节点。包含单独的查询说明,后面是所做的操作包含在{}。 cell_t c; Thread *t; int n; c_node_loop(c, t, n) { . . . node = C_NODE(c,t,n); . . . } 5 这里,n是当地节点的索引号。当地面的索引号用在C_NODE宏中以获得所有面 的数量((e.g., node = C_NODE(c,t,n) 6.3多相组分查询宏 下面这些宏用于多相模型的UDFs。关于FLUENT里的结构的层次的讨论参考3.11 部分尤其是图3.11.1。 , 6.3.1 Looping over Phase Domains in a Mixture ( sub_domain_loop) , 查询混合物中的相控制区 , 6.3.2 Looping over Phase Threads in a Mixture ( sub_thread_loop) , 查询混合物中的相线 , 6.3.3 Looping over Phase Cell Threads in a Mixture ( mp_thread_loop_c) , 查询混合物中的相单元线 , 6.3.4 Looping over Phase Face Threads in a Mixture ( mp_thread_loop_f) , 查询混合物中的相的面线 6.3.1 Looping over Phase Domains in a Mixture 6.3.1查询混合物中相的控制区( sub_domain_loop) sub_domain_loop 宏用于查询混合物控制区的所有相的子区。这个宏查询并在混 合物控制区给每个相区定义指针以及相关的phase_domain_index。正如3.11部 分所讨论的,控制区需要指针,在每个相中都有权访问部分数据。注意: sub_domain_loop宏在执行中和sub_thread_loop宏是相似的,参考6.3.2部分。 int phase_domain_index; */ index of subdomain pointers */ Domain *mixture_domain; Domain *subdomain; sub_domain_loop(subdomain, mixture_domain, phase_domain_index) sub_domain_loop的变量是subdomain,mixture_domain和phase_domain_index。 Subdomain是phase-level domain的指针, mixture_domain 是 mixture-level domain的指针。当你想用DEFINE宏时,mixture_domain(包含控制区变量e.g., 6 DEFINE_ADJUST)通过FLUENT求解器自动传递给你的UDF,混合物就和你的UDF 相关了。如果 mixture_domain 没有显式地传递给你的UDF,你应用另外一个宏来恢复它 (e.g., Get_Domain(1) before calling sub_domain_loop (参考 6.5.1部分)。 phase_domain_index 是子区指针所引号, phase_domain_index 是初始相地索 引号为0,混合物中其它相依次加1。注意:subdomain 和phase_domain_index 是在 sub_domain_loop 宏定义中初始化的。 例子: 下列被集成在UDF中的语句在求解过程中补充说明一个相的体积分数。它在求解 过程的开始执行。这个函数建立一个中心在0.5, 0.5, 0.5,半径为0.25的球 形体。第二个相的体积分数1被补充说明到球形体内的单元中,但是第二个相在 其他单元中的体积分数为0。 /*****************************************************************/ /* UDF for initializing phase volume fraction */ /*****************************************************************/ #include "udf.h" /* domain pointer that is passed by INIT function is mixture domain */ DEFINE_INIT(my_init_function, mixture_domain) { int phase_domain_index; cell_t cell; Thread *cell_thread; Domain *subdomain; real xc[ND_ND]; /* loop over all subdomains (phases) in the superdomain (mixture) */ sub_domain_loop(subdomain, mixture_domain, phase_domain_index) { /* loop if secondary phase */ if (DOMAIN_ID(subdomain) == 2) /* loop over all cell threads in the secondary phase domain */ thread_loop_c (cell_thread,subdomain) { /* loop over all cells in secondary phase cell threads */ begin_c_loop_all (cell,cell_thread) { 7 C_CENTROID(xc,cell,cell_thread); if (sqrt(ND_SUM(pow(xc[0] - 0.5,2.), pow(xc[1] - 0.5,2.), pow(xc[2] - 0.5,2.))) < 0.25) /* set volume fraction to 1 for centroid */ C_VOF(cell,cell_thread) = 1.; else /* otherwise initialize to zero */ C_VOF(cell,cell_thread) = 0.; } end_c_loop_all (cell,cell_thread) } } } 6.3.2 查询混合物的相线 ( sub_thread_loop) sub_thread_loop宏查询所有与混合物等值线相的等值线。这个宏查找并返回每 个子区和相关phase_domain_index的指针。 3.11部分所讨论的, 如果 subthread 指针 与进口区域相关,那么这个宏如 将提供给进口区域每个相面线指针。 int phase_domain_index; Thread *subthread; Thread *mixture_thread; sub_thread_loop(subthread, mixture_thread, phase_domain_index) sub_thread_loop的自变量是subthread, mixture_thread, 和 phase_domain_index。 subthread 是相线的指针, mixture_thread 是 mixture-level thread的指针。当你用DEFINE宏(包含一个线自变量)时,通 过FLUENT的求解器 mixture_thread自动传递给你的UDF,你的UDF就和混合物 相关了。如果 mixture_thread 没有显式地传递给你的UDF,你需要在调用 sub_thread_loop之前,调用工具宏恢复它。phase_domain_index 是子区指针 索引号,可以用宏PHASE_DOMAIN_INDEX恢复。(详情参考 6.5.9部分) 初始相 的索引号为0,混合物中其它相依次加一。注意: subthread 和 phase_domain_index 在 sub_thread_loop 宏定义中被初始化。 8 6.3.3 查询混合物中所有单元的线( mp_thread_loop_c) mp_thread_loop_c 宏查询混合物控制区所有单元的线,提供了与混合物等值线有关的相等值线的指针。当应用到混合物控制区时这几乎和thread_loop_c 宏是等价的。 ( 6.2.1部分) 区别是:除了查询每个单元线 ,它还返回一个指针数组( pt) 等价与相等值线。单元线第i相的指针是pt[i],这里i是相控制区索引号phase_domain_index。pt[i] 可以用做宏的自变量。需要相等值线的指针。相控制区索引号 phase_domain_index 可以用宏 PHASE_DOMAIN_INDEX 恢复 (详情参考6.5.9部分)。 Thread **pt; Thread *cell_threads; Domain *mixture_domain; mp_thread_loop_c(cell_threads, mixture_domain, pt) mp_thread_loop_c的自变量是cell_threads, mixture_domain , pt. cell_threads 是网格线的指针, mixture_domain 是mixture-level控制区的指针,. pt 是含有phase-level 线的指针数组。 当你要用包含控制区变量(e.g., DEFINE_ADJUST的宏DEFINE时,mixture_domain 通过FLUENT的求解器自动传递给你的UDF文件,你的UDF就和混合物相关了。若mixture_domain 没有显式地传递给你UDF文件,你应用另外一个工具(e.g., Get_Domain(1)来恢复,参考6.5.1部分。注意: pt 和 cell_threads 的值是由查询函数派生出来的。mp_thread_loop_c 是典型的用于begin_c_loop中。 begin_c_loop 查询网格线内的所有网格。当begin_c_loop 嵌套在 mp_thread_loop_c中,你就可以查询混合物中相单元线的所有网格了。 6.3.4查询混合物中所有的相面线( mp_thread_loop_f) 宏mp_thread_loop_f 查询混合物控制区内所有混合物等值线的面线并且给每个与混合物等值线有关的相等值线指针。在混合物控制区内这和宏thread_loop_f几乎是等价的。区别是:除了查找每一个面线,这个宏还返回一个指针数组pt,它与相等值线相互关联。 指向第i相的面线指针是 pt[i], 这里是 phase_domain_index。 当需要相等值线指针时,pt[i] 可以作为宏的自变量。phase_domain_index 可以用宏 PHASE_DOMAIN_INDEX恢复。 (参考 6.5.9) 9 Thread **pt; Thread *face_threads; Domain *mixture_domain; mp_thread_loop_f(face_threads, mixture_domain, pt) mp_thread_loop_f 的自变量是face_threads, mixture_domain, 和 pt。 face_threads 是面线的指针,是混合物等值线控制区的指针。pt 是包含相等值线的指针数组。 当你要用包含控制区变量(e.g., DEFINE_ADJUST的宏DEFINE时,mixture_domain 通过FLUENT的求解器自动传递给你的UDF文件,你的UDF就和混合物相关了。若mixture_domain 没有显式地传递给你UDF文件,你应用另外一个工具(e.g., Get_Domain(1)来恢复,参考6.5.1部分。注意: pt 和 cell_threads 的值是由查询函数派生出来的。mp_thread_loop_f 是典型的用于begin_f_loop中。 begin_f_loop 查询网格线内的所有网格。当begin_f_loop 嵌套在 mp_thread_loop_f中,你就可以查询混合物中相单元线的所有网格了。 6.4 Setting Face Variables ( F_PROFILE) 6.4设置面变量 当你要设置面的变量的值时,应用F_PROFILE宏。当你要生成边界条件的外形或存储新的变量值时,自动调用这一函数。F_PROFILE全部宏定义参考mem.h文件。. 宏: F_PROFILE( f, t, n) 自变量: face_t f Thread *t int n 函数返回值: void F_PROFILE的自变量是f, 面的索引号是face_t; t, 面上线的指针,还有一个整数 n。 这些变量通过FLUENT的求解器自动传递给你的UDF。你不必给他们赋 10 值。 整数n是要在边界上设定的变量标志符。例如:进口边界包含总压和总温,二者都在用户定义函数中定义。 进口边界的变量在FLUENT赋予整数0,其它赋予1。当你在FLUENT的进口边界面板中定义边界条件时,这些整数值由求解器设定。 6.5访问没有赋值的自变量 针对单相和多相的模型(比如定义源项,性质和外形),大多数 标准 excel标准偏差excel标准偏差函数exl标准差函数国标检验抽样标准表免费下载红头文件格式标准下载 的UDF,你的函数所需要的变量(e.g., domain or thread pointers)在求解过程中通过求解器自动做为自变量直接传递给你的UDF。例如,如果你的UDF定义了特殊边界区域(使用 DEFINE_PROFILE)的外形,在FLUENT的边界条件面板中,你的UDF就和相和混合物相关联了,在执行时通过求解器,合适的相和混合物变量传递给你的函数。然而,并非所有的UDF都直接把函数所需要的自变量传递给求解器。回想一下,例如DEFINE_ADJUST 和DEFINE_INIT UDFs 传递给 混合物控制区变量,这里DEFINE_ON_DEMAND UDFs 是没有被传递的自变量。这部分提供了通过DEFINE函数访问没有被直接传递给UDF文件的工具。 , 6.5.1 Get_Domain , 获得控制区 , 6.5.2 Phase Domain Pointer Using the Phase Domain Index ( DOMAIN_SUB_DOMAIN) , 通过相控制区索引号使用相控制区指针 , 6.5.3 Phase-Level Thread Pointer Using the Phase Domain Index ( THREAD_SUB_THREAD) , 通过相控制区索引号使用相等值线指针 , 6.5.4 Phase Thread Pointer Array Using Mixture-Level Thread ( THREAD_SUB_THREADS) , 通过混合物等值线使用相线指针数组 , 6.5.5 Mixture Domain Pointer Using a Phase Domain Pointer ( DOMAIN_SUPER_DOMAIN) , 通过相控制区指针调用混合物控制区指针 , 6.5.6 Mixture Thread Pointer Using a Phase Thread Pointer ( THREAD_SUPER_THREAD) , 通过相线指针使用混合物线指针 , 6.5.7 Thread Pointer Using a Zone ID ( Lookup_Thread) , 通过控制区ID使用线指针 , 6.5.8 domain_id Using a Phase Domain Pointer ( DOMAIN_ID) , 通过相控制区指针使用控制区ID , 6.5.9 Phase Domain Index Using a Phase Domain Pointer ( PHASE_DOMAIN_INDEX) , 通过相控制区指针使用相控制区索引号 11 6.5.1 Get_Domain 若控制区指针没有显式地作为自变量传递给你地UDF,你可以用Get_Domain宏恢复控制区指针。 Get_Domain(domain_id); domain_id 是一个整数,混合物控制区其值为1,在多相混合物模型中其值依次加一。注意: Get_Domain(1) 来代替以前的FLUENT版本中外部变量Domain *domain表达式。 (参见1.4部分) Single-Phase Flows 单相流 在单相流中, domain_id 为 1 , Get_Domain(1) 将返回流体控制区指针。 DEFINE_ON_DEMAND(my_udf) { Domain *domain; /* domain is declared as a variable */ domain = Get_Domain(1); /* returns fluid domain pointer */ ... } Multiphase Flows 多相流 在多相流中,Get_Domain的返回值或者是混合物等值线,或单相等值线,或相等值线或相等值线控制区指针。domain_id的值在混合物控制区始终是一,你可以用FLUENT里的图形用户界面获得domain_id。简单的说,在FLUENT的相面板中,选择所需的相。domain_id 将被显示出来。你需要用硬件代码整数ID作为自变量传递给宏。 DEFINE_ON_DEMAND(my_udf) { Domain *mixture_domain; mixture_domain = Get_Domain(1); /* returns mixture domain pointer */ 12 /* and assigns to variable */ Domain *subdomain; subdomain = Get_Domain(2); /* returns phase with ID=2 domain pointer*/ /* and assigns to variable */ ... } 例子: 下面是一个名为get_coords的UDF打印出了为两个指定的线ID面的线面的质 心。这一函数执行在单相流中用的Get_Domain工具。在这个例子中,函数 Print_Thread_Face_Centroids用了Lookup_Thread函数来决定线的指针,然后 输出了具体文件中线的所有的面的质心。调用Get_Domain(1) 函数返回控制区 的指针 (或在多相流中是混合物控制区)。这一变量没有被传递给 DEFINE_ON_DEMAND。 /*****************************************************************/ /* Example of UDF for single phase that uses Get_Domain utility */ /*****************************************************************/ #include "udf.h" FILE *fout; Print_Thread_Face_Centroids(Domain *domain, int id) { real FC[2]; face_t f; Thread *t = Lookup_Thread(domain, id); fprintf(fout,"thread id %d\n", id); begin_f_loop(f,t) { F_CENTROID(FC,f,t); fprintf(fout, "f%d %g %g %g\n", f, FC[0], FC[1], FC[2]); } end_f_loop(f,t) fprintf(fout, "\n"); } DEFINE_ON_DEMAND(get_coords) 13 { Domain *domain; domain = Get_Domain(1); fout = fopen("faces.out", "w"); Print_Thread_Face_Centroids(domain, 2); Print_Thread_Face_Centroids(domain, 4); fclose(fout); } 6.5.2 Phase Domain Pointer Using the Phase Domain Index ( DOMAIN_SUB_DOMAIN) 6.5.2通过相控制区索引号使用相控制区指针 有两个方法可以获得混合物控制区具体相(或子区)的指针。你或者可以用宏 DOMAIN_SUB_DOMAIN (在下面描述)或 Get_Domain, 在6.5.1部分描述。 DOMAIN_SUB_DOMAIN 有两个自变量: mixture_domain 和 phase_domain_index。 这个函数返回给定phase_domain_index 的相指针。注意:DOMAIN_SUB_DOMAIN 在执行上和THREAD_SUB_THREAD宏相似。 (在6.5.3.部分描述) int phase_domain_index = 0; /* primary phase index is 0 */ Domain *mixture_domain; Domain *subdomain = DOMAIN_SUB_DOMAIN(mixture_domain,phase_domain_index); mixture_domain是 mixture-level domain的指针。 当你用包含控制区自变量(e.g., DEFINE_ADJUST) and的宏DEFINE时,自动通过FLUENT的求解器传递给你的UDF文件,你的UDF文件就和混合物相关联了。否则,如果mixture_domain没有显式地传递给你的UDF,你需要在调用sub_domain_loop之前,用另外一个宏工具来恢复(e.g., Get_Domain(1)) 。参见 6.5.1 部分。 phase_domain_index是子区指针地索引号。 它是一个整数初始相值为0,以后每相依次加1。当你用包含相控制区变量( DEFINE_EXCHANGE_PROPERTY, DEFINE_VECTOR_EXCHANGE_PROPERTY)的 DEFINE宏时,phase_domain_index 是自动通过FLUENT的求解器传递给你的UDF,你的UDF就和互相作用的相相联系了。否则,你需要硬代码调用DOMAIN_SUB_DOMAIN 宏给phase_domain_index 指针赋值。如果你的多相流模型有两相,然后phase_domain_index 初始相的值是0,第二相的值为1。然而,如果多相流模型中有更多的相,你需要用 14 PHASE_DOMAIN_INDEX宏来恢复与给定控制区的phase_domain_index。 详情参考 6.5.9 部分。 6.5.3 Phase-Level Thread Pointer Using the Phase Domain Index ( THREAD_SUB_THREAD) 6.5.3通过相控制区索引号使用相等值线指针 THREAD_SUB_THREAD宏可以用来恢复给定相控制区索引号的phase-level thread (subthread) 指针。 THREAD_SUB_THREAD有两个自变量: mixture_thread 和 phase_domain_index。这一函数返回给定phase_domain_index 的phase-level 线指针。 注意:THREAD_SUB_THREAD在执行上与DOMAIN_SUB_DOMAIN宏相似, 参见6.5.2.部分。 int phase_domain_index = 0; /* primary phase index is 0 */ Thread *mixture_thread; /* mixture-level thread pointer */ Thread *subthread = THREAD_SUB_THREAD(mixture_thread,phase_domain_index); mixture_thread是一mixture-level线的指针。当你用包含控制区自变量(e.g., DEFINE_ PROFILE) and的宏DEFINE时,自动通过FLUENT的求解器传递给你的 UDF文件,你的UDF文件就和混合物相关联了。否则,如果混合物控制线指针没 有显式地传递给你的UDF,你需要在调用Lookup_Thread宏之前,用另外一个宏 工具来恢复(e.g., Get_Domain(1)) 。参见 6.5.1 部分。 参考 6.5.7部分)。 phase_domain_index子区指针的索引号。它是一个整数初始相值为0,以后每相 依次加1。当你要用包含相控制区索引号变量( DEFINE_EXCHANGE_PROPERTY, DEFINE_VECTOR_EXCHANGE_PROPERTY)的DEFINE宏时, phase_domain_index 通 过FLUENT的求解器自动传递给你的UDF,你的UDF就和具体的相互作用相相互 关联了。 (参考UDF的例子见 4.4.2 部分) 否则, 你需要用硬代码改变宏 THREAD_SUB_THREAD的phase_domain_index值。如果你的多相流模型中只有两 相,那么phase_domain_index 对初始相是0,第二个相为1。然而,如果你有 更多的相,你需要用 PHASE_DOMAIN_INDEX 宏来恢复与给定区域相关的 phase_domain_index 。详情参考6.5.9部分。 6.5.4 Phase Thread Pointer Array Using Mixture-Level Thread ( THREAD_SUB_THREADS) 6.5.4通过混合物等值线使用相线指针数组 15 THREAD_SUB_THREADS宏 可以用以恢复指针数组, pt, 它的元素包含相等值线(子线)的指针。 THREADS_SUB_THREADS 有一个变量 mixture_thread。 Thread *mixture_thread; Thread **pt; /* initialize pt */ pt = THREAD_SUB_THREADS(mixture_thread); mixture_thread 是mixture-level thread代表网格线或面线的指针。当你用包含线变量(e.g., DEFINE_PROFILE)的DEFINE宏时,通过FLUENT的求解器自动传递给你的UDF,这个函数就和混合物有关了。否则,如果混合物线的指针没有显式地传递给你的UDF,然后你需要用令一个方法来恢复。例如:你可以用 Lookup_Thread 宏。 (参考 6.5.7部分)。 pt[i] 数组的元素是与第I相的相等值线有关的值,这里i是phase_domain_index。当你想恢复网格具体相的信息时,你可以用 pt[i] 做为一些网格变量宏的自变量。例如: C_R(c,pt[i])可以用来返回网格点c第I相的密度。 指针 pt[i] 可以用THREAD_SUB_THREAD来恢复,在 6.5.3部分讨论,用I做为自变量。phase_domain_index 可以用宏 PHASE_DOMAIN_INDEX 来恢复,参见 6.5.9 部分。 6.5.5 Mixture Domain Pointer Using a Phase Domain Pointer ( DOMAIN_SUPER_DOMAIN) 6.5.5通过相控制区指针调用混合物控制区指针 当你的UDF有权访问特殊的相等值线(子区)指针,你可以用宏 DOMAIN_SUPER_DOMAIN,恢复混合物等值线控制区指针。 DOMAIN_SUPER_DOMAIN 含有一个变量 subdomain。注意: DOMAIN_SUPER_DOMAIN 在执行上和THREAD_SUPER_THREAD宏是非常相似的。参考 6.5.6.部分。 Domain *subdomain; Domain *mixture_domain = DOMAIN_SUPER_DOMAIN(subdomain); Subdomain是多相流混合物控制区相等值线的指针。当你用包含控制区变量(e.g., DEFINE_ADJUST)的DEFINE宏时,通过FLUENT的求解器,它可以自动传递给你的UDF文件,这个函数就会和混合物中的第一相和第二相相关了。注意:在当前的FLUENT版本中, DOMAIN_SUPER_DOMAIN 将返回与Get_Domain(1)相同的指针。这样,如果你的UDF可以使用子区的指针,建议使用宏 16 DOMAIN_SUPER_DOMAIN 来代替 Get_Domain宏以避免将来的FLUENT版本造成的不兼容问题。 6.5.6 Mixture Thread Pointer Using a Phase Thread Pointer ( THREAD_SUPER_THREAD) 6.5.6通过相线指针使用混合物线指针 当你的UDF有权访问某一条相线()子线指针你想恢复混合物的等值线指针时,你可以使用宏THREAD_SUPER_THREAD 。THREAD_SUPER_有一个自变量 subthread。 Thread *subthread; Thread *mixture_thread = THREAD_SUPER_THREAD(subthread); subthread 在多相流混合物中是一个特殊的相等值线指针。当你使用包含线变量(e.g., DEFINE_PROFILE)的DEFINE宏时,通过FLUENT的求解器它自动传递给你的UDF文件,这个函数就和混合物中的两相相互关联了。注意:在执行上和THREAD_SUPER_THREAD宏是非常相似的。参考6.5.5.部分。 6.5.7 Thread Pointer Using a Zone ID ( Lookup_Thread) 6.5.7通过区的ID使用线指针 当你想要在FLUENT的边界条件面板中恢复与给定区域ID的线指针时,你可以使用宏Lookup_Thread 。例如,假设你的UDF需要对该区域的特殊线操作(并非查找所有的线), 你可以用DEFINE宏定义你的UDF文件,而不用将线指针(e.g., DEFINE_ADJUST)从FLUENT的求解器传递到你的UDF文件。你的UDF还可以使用 Lookup_Thread 来获得你想要的指针。这一过程分两步:首先,你应该从FLUENT的边界条件面板中区域的ID;然后,你需要使用硬代码做为自变量调用宏 Lookup_Thread。 Lookup_Thread 返回与给定区域ID相关的线的指针。你可以将线指针赋给thread_name,在你的UDF中使用。 int zone_ID; Thread *thread_name = Lookup_Thread(domain,zone_ID); 在多相流的上下文中,通过宏Lookup_Thread返回的线是与控制区自变量相关的相的等值线。 例子 下面是一个使用宏Lookup_Thread的UDF文件,在这个例子中,通过宏Lookup_Thread返回给定区域ID的线指针,将它赋给线。 在begin_f_loop 和 17 F_CENTROID中使用这个线指针查找与这个线相关的所有的面,获得面的质心输 出到文件。 /*******************************************************************/ /* Example of UDF that uses Lookup_Thread macro */ /* Note If UDF is applied to a multiphase flow problem, the domain*/ /* passed will be the mixture domain so that the thread that is */ /* returned is the mixture-level thread */ /*******************************************************************/ #include "udf.h" /* domain passed to Adjust function is mixture domain for multiphase*/ DEFINE_ADJUST(print_f_centroids, domain) { real FC[2]; face_t f; int ID = 1; /* Zone ID for wall-1 zone from Boundary Conditions panel */ Thread *thread = Lookup_Thread(domain, ID); begin_f_loop(f, thread) { F_CENTROID(FC, f, thread); printf("x-coord = %f y-coord = %f", FC[0], FC[1]); } end_f_loop(f, thread) } 6.5.8 domain_id Using a Phase Domain Pointer ( DOMAIN_ID) 6.5.8使用相的控制区指针 当你有权访问与给定相等值线控制区指针的domain_id时,你可以使用 DOMAIN_ID。DOMAIN_ID 有一个自变量subdomain,它是相等值线控制区的指针。 控制区(混合物)的最大的等值线的domain_id 的默认值是1。即:如过被传递 给DOMAIN_ID的控制区指针是混合物控制区的等值线指针,那么,函数的返回值 为1。 注意: 当你在FLUENT的相面板中选择需要的相时,宏所返回的domain_id 是和显示在图形用户界面中的整数值ID相同的。 Domain *subdomain; int domain_id = DOMAIN_ID(subdomain); 18 6.5.9 Phase Domain Index Using a Phase Domain Pointer ( PHASE_DOMAIN_INDEX) 6.5.9 通过相控制区使用相控制区索引号 宏PHASE_DOMAIN_INDEX返回给定相等值线控制区(子区)指针的 phase_domain_index。 PHASE_DOMAIN_INDEX 有一个自变量, subdomain,它是 phase-level domain的指针。 phase_domain_index 是子区指针的索引号。初 始相的值为整数0,以后每相依次加1。 Domain *subdomain; int phase_domain_index = PHASE_DOMAIN_INDEX(subdomain); 6.6 Accessing Neighboring Cell and Thread Variables 6.6访问邻近网格和线的变量 你可以用F luent Inc. 提供的宏来确定邻近网格面。在复杂的UDF文件中,当 你查询特定网格或线的面时,可能会用到这个信息。对给定的面f和它的线tf, 两个相邻的网格点为c0和c1。若是控制区附面层上的面则只有c0,c1的值为 NULL。一般的,然而 当把网格导入到FLUENT中时,按照右手定则定义面上节点 的顺序,面f上的网格点c0、c1都存在。下面的宏返回网格点c0和c1的ID 和所在的线。 cell_t c0 = F_C0(f,tf); /* returns ID for c0*/ tc0 = THREAD_T0(tf); /* returns the cell thread for c0 */ cell_t c1 = F_C1(f,tf); /*returns ID for c1 */ tc1 = THREAD_T1(tf); /* returns the cell thread for c1 */ 回忆由F_AREA 和 F_FLUX返回的信息是直接相关的,这些值从网格c0到c1返 回正值。 6.7 User-Defined Memory for Cells ( C_UDMI) 6.7 用户为网格定义内存 为了存储、恢复由UDF网格区域变量的值,你可以用C_UDMI函数分配500个单 元。这些值可以用做后处理,例如, 通过其它的UDFs。这个在用户定义内存中 存储变量的方法是比用户定义标量( C_UDSI)更有效。 19 宏: C_UDMI( c, thread, index) 自变量类型: cell_t c Thread *thread int index 函数返回值: void C_UDMI有三个自变量:c, thread, 和 index。 c 是网格标志符号, thread 是网格线指针, index 是识别数据内存分配的。与索引号0相关的用户定义的内存区域为0, (或 udm-0)。 在你用来在内存中存放变量之前,首先你需要在FLUENT的User-Defined Memory 面板中分配内存。参考8.1.5部分 Define User-Defined Memory... !!当在分配内存之前,如果你想用C_UDMI,就会出现错误。 你在图形用户窗口分配的每一个用户定义的内存,都会创建一个新的变量。例如:你要指定两个内存分配区,那么两个变量udm-0和and udm-1就会在数据储存器中产生。这些名字将会在后台处理面板中显示出来。下面是计算网格点的温度的例子,然后存放到用户定义的内存中。 例子: /* Computes cell temperature and then stores the value in */ /* user-defined memory location 0 (corresponding to udm-0) */ begin_c_loop(c, thread) { temp = C_T(c, thread); C_UDMI(c, thread, 0) = (temp - tmin) / (tmax-tmin); } end_c_loop(c, thread) 20 6.8 矢量工具 Fluent提供了一些工具,你可以用来在UDF中计算有关矢量的量。这些工具在源程序中以宏的形式运行。例如 你可以用实函数 NV_MAG(V)计算矢量V的大小(模)。另外你可以用函数NV_MAG2(V)获得矢量V模的平方。下面是在UDF中可以利用的矢量工具列表。在矢量工具宏中有个约定俗成的惯例,V代表矢量,S代表标量,D代表一系列三维的矢量,最后一项在二维计算中被忽略。 在矢量函数中约定的计算顺序括号、指数、乘除、加减(PEMDAS)不再适用。相反下划线符号( _) 用来表示一组操作数,因此对元素的操作先于形成一个矢量。 !! 注意:这部分所有的矢量工具都用在D 和3D中。因此,你没有必要在你的UDF中做任何的测试。 , 6.8.1 NV_MAG , 6.8.2 NV_MAG2 , 6.8.3 ND_ND , 6.8.4 ND_SUM , 6.8.5 ND_SET , 6.8.6 NV_V , 6.8.7 NV_VV , 6.8.8 NV_V_VS , 6.8.9 NV_VS_VS , 6.8.10 ND_DOT 6.8.1 NV_MAG NV_MAG计算矢量的大小,即矢量平方和的平方根。 NV_MAG(x) 2D: sqrt(x[0]*x[0] + x[1]*x[1]); 3D: sqrt(x[0]*x[0] + x[1]*x[1] + x[2]*x[2]); 6.8.2 NV_MAG2 21 NV_MAG2计算矢量的平方和。 NV_MAG2(x) 2D: (x[0]*x[0] + x[1]*x[1]); 3D: (x[0]*x[0] + x[1]*x[1] + x[2]*x[2]); 6.8.3 ND_ND 在 RP_2D ( FLUENT 2D) 和RP_3D ( FLUENT 3D)中,常数 ND_ND 定义为2 。如果你想在2D中建立一个 矩阵,或在3D中建立一个矩阵,可以用到它。当你用 ND_ND时,你的 UDF 可以在2D 和3D cases中使用, 不用做任何改动。 real A[ND_ND][ND_ND] for (i=0; i
本文档为【【2017年整理】FLUENT udf中文资料ch6】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_281650
暂无简介~
格式:doc
大小:87KB
软件:Word
页数:37
分类:工学
上传时间:2017-10-19
浏览量:49