网格组成

大多数 UDF 需对求解器数据进行访问。由于 Fluent 求解器数据是根据网格组件定义的,因此在编写UDF之前,需要学习一些基本的网格术语。

有限体积法 (FVM) 网格由一系列控制体 (control volumeCV) 即网格单元 cell 组成,每个网格单元由一组网格节点、单元中心和单元边界面组成。Fluent 内部数据结构定义网格域;为网格中的单元、单元面和节点分配顺序;以及建立相邻网格单元之间的连接关系。Fluent导入网格时,将网格拓扑信息存储在求解器中。

注:通量 FluxFluxFlux​ 等数据储存在网格面上,一般的物理量如压力、温度、速度等储存在网格单元中心,与网格索引相关的数据储存在网格节点上。

网格由以下部分组成:

  • 2D:node(节点)、face(面)、cell(单元)
  • 3D:node(节点)、edge(边)、face(面)、cell(单元)
    在这里插入图片描述

数据类型

Fluent数据结构根据网格信息进行定义:

  • 域 (Domains) :网格节点、网格面和网格单元线程 (Threads) 的集合。
  • 线程 (Threads) :一系列网格节点 (Nodes)、 网格单元 (Cells) 和网格面 (Faces) 的集合
  • 网格单元(Cells) 和面 (Faces) 由节点 (Nodes) 组成。
    在这里插入图片描述

UDF基于C/C++编程语言编写,其支持标准的C/C++数据类型 (如real、int等),此外,Fluent 还有与网格结构相关联的特定数据类型。

常用的Fluent数据类型如下:

  • Node:结构体变量,用于存储与网格节点相关的数据。

  • face_t:整型变量,用于标识face Thread中的特定网格面。

  • cell_t:整型变量,用于标识cell Thread中的特定网格单元。

  • Thread:结构体变量,存储其所代表的网格单元或网格面的数据。

  • Domain:结构体变量。用于存储与网格节点、网格面和网格单元线程Thread集合相关的数据。

数据类型定义举例:

数据类型 变量名 描述
Domain *d 域指针
Thread *t 线程指针
cell_t c 单元索引
face_t f 面索引
Node *node 网格节点索引

使用上述数据类型定义的变量通常作为参数提供给DEFINE宏与其他数据访问函数。

​ UDF可以访问流体域和边界区中网格单元或单元面的求解变量,访问数据首先需确定所访问的数据存储位置,面ID或单元ID本身并不能唯一标识面或单元,需要与线程指针一起使用,才能标识面或单元所属的线程。一些UDF会将单元索引 c 作为参数传递(例如 DEFINE_PROPERTY(my_function,c,t) ),或者将面索引变量 f 作为参数传递(例如 DEFINE_UDS_FLUX(my_function,f,t,i) )。如果UDF没有将单元或面索引变量作为参数传递,但需要使用这些变量,可以在函数中局部声明后使用。

​ 如果 UDF 循环遍历 Domain 中的所有单元线程或面线程(使用 thread_c_loop(c,t)thread_f_loop(f,t)),且DEFINE宏没有传递相应的指针,只需在调用循环前局部声明线程指针(以及单元或面ID),不需要使用 Lookup_Thread 来获取线程指针。

数据访问有关的循环宏变量获取宏将在后续章节叙述。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐