FLUENT UDF作为FLUENT的一项拓展功能,其主要用于实现FLUENT标准界面难以实现的功能。它基于C语言开发,因此常常在UDF代码中看到C语言的影子:例如C语言中头文件的调用、变量的声明语句、循环结构语句、条件判断语句、逻辑判断语句和输入输出语句等会经常出现在UDF代码中。但UDF又有其独特之处,熟悉C语言的朋友们在初见UDF时依然会感到费解和头疼。原因在于UDF的代码功能是基于C语言的“封装“,出现了很多新的数据类型、循环结构以及其它一些零零散散的内容。后面围绕这一主题,依次展开介绍。在谈到UDF的特殊性时,首先要谈及其特殊的数据结构,包括域指针(Domain类型指针)、Thread类型指针等。域指针数据类型包含计算域内部的一切信息,其在单相流中主要包括计算域本身、网格面、网格边、网格节点等内容(图1)。在多相流中还存在关于“相“的信息;Thread类型指针包含两种:一种是face thread(边界),另一种是cell thread(计算域)。其在获取面相关物理量或网格单元相关物理量时有着极为重要的应用。同时,Domain类型指针和Thread 类型指针是UDF自身循环结构的重要组成部分,两者在UDF循环结构中属于一种层属关系。在UDF数据类型中,还包括其它类型的数据结构,包括face_t f、cell_t c、Node *node、File
*fp等。篇幅所限,不在进行介绍。UDF的循环结构,是UDF特殊性的又一重要体现。其自身循环语句较多,以单向流循环为例,介绍几个常见的循环语句。 thread_loop_c(t,d) 在domain里对计算域进行循环; thread_loop_f (t,d) 在domain里对边界进行循环; begin_c_loop(c,t) 在计算域内对网格单元进行循环; begin_f_loop(f,t) 在边界内对网格单元的面进行循环; end_c_loop(c,t) 结束在计算域内对网格单元进行循环; end_f_loop (f,t) 结束在边界内对网格单元进行循环等。 上面两种循环结构是典型的嵌套循环结构。分别表示在FLUNET标准界面里首先对计算域(边界)进行循环,再对每个计算域(边界)内的网格单元(网格面)进行循环。循环遍历后执行循环体,最后结束本次循环这样一个简单流程。解释如下:通过thread_loop_c(t,d)或thread_loop_f (t,d)在域指针(Domain *d)里获取每一个计算域(边界)所对应的Thread类型指针(Thread *t)。获取后将Thread
*t传递到下一层循环begin_c_loop(c,t)或begin_f_loop(f,t)中,继续在每一个计算域(边界)所对应的Thread *t中对每一个网格单元cell_t c(网格面face_t f)进行遍历循环。获取网格单元cell_t c(网格面face_t f)后将其传递到循环体,继而获取每一个网格单元(网格面)相关的物理量。最后通过使用end_c_loop(c,t)或end_f_loop (f,t)结束本次循环。实际上循环体执行语句大部分都是相关物理量获取语句。包括几何相关获取语句;网格面、网格单元物理量获取语句;时间相关获取语句等。NODE_X (v) 节点v的x方向的坐标 (Node *v) NODE_Y (v) 节点v的y方向的坐标 (Node *v) NODE_Z (v) 节点v的z方向的坐标 (Node *v) C_CENTROID(xx,c,t) 获取网格单元中心坐标存储到x数组里F_CENTROID(xx,c,t) 获取网格面中心坐标存储到x数组里注:real xx[ND_ND] :维数组。其中 xx[0] 、xx[1]、xx[2]分别表示网格单元(网格面)中心x、y、z三个方向坐标。C_VOLUME(c,t) 获取网格单元体积 (cell_t c,Thread *t)C_NNODES(c,t) 获取网格单元节点数量 (cell_t c,Thread *t)C_NFACES(c,t) 获取网格单元网格面数量 (cell_t c,Thread *t)F_AREA(A,f,t)
获取网格面的法向量 (real A[ND_ND]或NV_VEC(A),其中A[0]、 A[1] 、 A[2],
分别为x、y、z三个方向投影面积face_t f,Thread *t)F_U(f,t) x方向速度 (face_t f,Thread *t)F_V(f,t) y方向速度 (face_t f,Thread *t)F_W(f,t) z方向速度 (face_t f,Thread *t)F_T(f,t) 获取面上的温度 (face_t f,Thread *t) F_H(f,t) 获取面上的焓值 (face_t f,Thread *t) F_K(f,t) 获取面上的湍动能 (face_t f,Thread *t) F_D(f,t) 获取面上的湍流耗散率 (face_t
f,Thread *t)C_R(c,t) 获取网格单元密度 ( cell_t c,Thread *t)C_P(c,t) 获取网格单元压力 ( cell_t c,Thread *t)C_U(c,t) 获取网格单元x方向速度 ( cell_t c,Thread *t)C_V(c,t) 获取网格单元y方向速度 ( cell_t c,Thread *t)C_W(c,t) 获取网格单元z方向速度 (cell_t c,Thread *t)C_T (c,t) 获取网格单元的温度 ( cell_t c,Thread *t)C_H (c,t) 获取网格单元的焓值 ( cell_t c,Thread *t)C_K (c,t) 获取网格单元的湍动能 ( cell_t c,Thread *t)C_NUT(c,t) 获取网格单元的湍流粘度 ( cell_t
c,Thread *t)C_D(c,t) 获取网格单元的湍流耗散率 ( cell_t
c,Thread *t)C_YI(c,t ,i) 获取网格单元的组分质量分数( cell_t c,Thread*t)行笔至此,心中不由想起前人的一首古诗“山门大开不烧香,祸到临头许猪羊。任凭你把头磕破,自古人忙神不忙。”其实,对于UDF(任何技能)的学习更像是在遇到问题前“烧香拜佛”的过程。但“求仙问道”并非易事,在这个过程中需要我们提前付出极大的精力与热情。只有决心至此,才能以诚意换来神明的青睐,避免“临时抱佛脚”的心酸与无奈。在文章末尾点赞和在看,截图回复【UDF】 ,48小时内赠送Fluent UDF官方学习资料一份。 笔者原创首发的视频课程《Ansys Fluent UDF基础入门22讲:跟着帮助文档学Fluent UDF编程方法》,适用于任何版本的Fluent软件, 通过本系列视频可以快速全面掌握FLUENT UDF基本功能,还可以解决实际使用过程中遇到的问题,让用户成为解决FLUENT软件计算的高手。此外,该课程解决了用户实际工作中在面对FLUENT UDF无从下手的问题。课程大纲如下:(1) 系统化的了解FLUENT UDF的基本功能,让读者对FLUENT UDF的基本功能有一个全面的认识!以便更好的服务于科研或工程项目当中! (2)为订阅用户提供相关学习资料,VIP群行业交流和知识圈答疑服务(3)可以根据VIP群用户需要,酌情加餐内容或者直播。2、适合哪些人学习 (1)FLUENT UDF小白 (3)想要全面了解FLUENT拓展功能的CFD从业人员喜欢作者,请点赞和在看
|