Fluent UDF(四)数据访问宏(2)

上一节介绍了网格节点网格面数据获取宏,本节继续介绍网格单元数据获取宏。

网格单元 (cell) 存储着许多几何参数和物理参数(单元中心、温度、压力等变量),这些参数均可利用对应的单元数据获取宏进行数据访问和操作,单元宏以C_前缀开头,获取的变量均以国际单位制 (SI) 返回,对于某些特定数据获取宏,只有启用对应模型状态下才能使用。

例如,当在 Fluent 的 "Species Model"选项卡中启用组分输运模型时,才能访问获取组分质量分数。

3.1 单元质心 (C_CENTROID)

与前述获取面心坐标宏F_CENTROID类似,利用C_CENTROID(x,c,t)宏可获取单元质心坐标,其定义如下:

参数类型返回值
C_CENTROID(x,c,t)real x[ND_ND], cell_t c, Thread * tx (cell centroid)

C_CENTROID(x,c,t)宏包含三个参数:

  • x 用于存储获取质心的坐标信息,数组维度取决于求解问题;
  • c 为单元标识符;
  • t 是表示单元所属的单元线程的线程指针。

x、c、t 为自定义的变量名,可采用其他符合C语言命名规则的变量名。

例如:real pos(ND_ND)cell_t cellThread *ct

数据获取宏不能单独使用,一般得根据问题和其他DEFINE宏和循环宏搭配使用,用法如下:

Domain *domain;
Thread *c_thread;
cell_t c;
real pos(ND_ND);//用于存储质心坐标的数组
thread_loop_c(c_thread,domain)
{          
	begin_c_loop(c,c_thread)
		{
        	C_CENTROID(pos, c, t);
        	/*对质心坐标进行操作*/
		}
		end_c_loop(c,c_thread)
}

示例:下列 UDF 用于初始化单元的温度分布。如果单元质心坐标与点 ( 0.5 , 0.5 , 0.5 ) (0.5, 0.5, 0.5) (0.5,0.5,0.5) 的距离小于 0.25 0.25 0.25,则将该单元的温度设置为 400 K 400\text{K} 400K,否则设置为 300 K 300\text{K} 300K

#include "udf.h"

// 定义一个初始化函数,名字为 my_init_func,应用于域 d
DEFINE_INIT(my_init_func, d)
{
    cell_t c; // 定义一个变量 c,用于存储单元的索引
    Thread *t; // 定义一个指针 t,用于指向单元线程
    real xc[ND_ND]; // 定义一个数组 xc,用于存储单元质心的坐标

    // 遍历域 d 中的所有单元线程
    thread_loop_c(t, d)
    {
        // 遍历单元线程 t 中的所有单元
        begin_c_loop(c, t)
        {
            // 获取单元 c 的质心坐标,并存储在 xc 数组中
            C_CENTROID(xc, c, t);

            // 计算质心与点 (0.5, 0.5, 0.5) 的距离
            if (sqrt(ND_SUM(pow(xc[0] - 0.5, 2.0),
                            pow(xc[1] - 0.5, 2.0),
                            pow(xc[2] - 0.5, 2.0))) < 0.25)
                // 如果距离小于 0.25,则将单元温度设置为 400
                C_T(c, t) = 400.0;
            else
                // 否则,将单元温度设置为 300
                C_T(c, t) = 300.0;
        }
        // 结束单元循环
        end_c_loop(c, t)
    }
}

注意:

  • ND_SUM 是一个宏,用于根据问题的维数(2D 或 3D)计算坐标的平方和
  • sqrt 函数用于计算质心与点 (0.5, 0.5, 0.5) 之间的欧几里得距离。
  • C_T(c, t)为单元温度获取宏,将在本文后续进行介绍。

该初始化函数可以在仿真开始时根据单元几何位置初始化单元的温度分布,从而实现特定的初始条件设置。


3.2 单元体积 (C_VOLUME)

C_VOLUME(c,t)宏可用于访问获取二维、三维和轴对称问题中网格单元体积,该宏定义在头文件mem.h

参数类型返回值
C_VOLUME(c,t)cell_t c, Thread *treal cell volume for 2D or 3D, real cell volume/2π for axisymmetric

示例:

#include "udf.h"
/*每次时间步结束时执行的函数*/
DEFINE_EXECUTE_AT_END(print_cell_volumes)
{
    Domain *domain;
    Thread *t;
    cell_t c;
    real volume;

    /* 获取域指针,1 表示默认的流体域 */
    domain = Get_Domain(1);

    /* 遍历域中所有单元线程 */
    thread_loop_c(t, domain)
    {
        /* 遍历单元线程中的所有单元 */
        begin_c_loop(c, t)
        {
            /* 获取单元体积 */
            volume = C_VOLUME(c, t);
            
            /* 执行与单元体积相关操作 */
        }
        end_c_loop(c, t)
    }
}
3.3 单元面和节点数量 (C_NFACESC_NNODES)

C_NFACESC_NNODES分别用于获取网格单元 (cell) 上网格面 (face) 和网格节点 (node) 数量,

参数类型返回值
C_NNODES(c,t)cell_t c, Thread *tint number of nodes in a cell
C_NFACES(c,t)cell_t c, Thread *tint number of faces in a cell

用法:

int num_faces, num_nodes;
num_faces = C_NFACES(c, t);
num_nodes = C_NNODES(c, t);

该宏可用于在进行网格处理或分析时,获取单元的几何信息,以便进行进一步的计算或处理。

3.4 单元索引 (C_FACEC_FACE_THREAD)

C_FACE 宏用于返回给定的 cell_t c, Thread *t, 和局部面索引号 i 的全局面索引 face_t f。该宏在mem.h 中定义。

注意:如果并行运行,C_FACE 返回计算节点的局部面索引。

C_FACE_THREAD 返回由 C_FACE 返回的 face_t f 的线程 *t,可以通过整数索引 i 访问特定的面,也可以使用 c_face_loop 循环所有面,该宏在mem.h 中定义。

参数类型返回值
C_FACE(c,t,i)cell_t c, Thread *t, int iglobal face index face_t f
C_FACE_THREADcell_t c, Thread *t, int iThread *t of face_t f returned by C_FACE.
3.5 单元流动变量

前述几节介绍了获取单元位置信息与几何信息相关的宏,对于CFD模拟,我们更关注物理信息的获取。Fluent 提供了一系列用于访问单元流动变量的宏,这些宏用于在 UDF 中访问和操作 CFD 模型中的单元格流动变量

参数类型返回值
C_R(c,t)cell_t c, Thread *t密度 (real)
C_P(c,t)cell_t c, Thread *t压力 (real)
C_U(c,t)cell_t c, Thread *tx 方向速度 (real)
C_V(c,t)cell_t c, Thread *ty 方向速度 (real)
C_W(c,t)cell_t c, Thread *tz 方向速度 (real)
C_T(c,t)cell_t c, Thread *t温度 (real)
C_H(c,t)cell_t c, Thread *t焓 (real)
C_K(c,t)cell_t c, Thread *t湍流动能 (real)
C_D(c,t)cell_t c, Thread *t湍流耗散率 (real)
C_YI(c,t,i)cell_t c, Thread *t, int i组分质量分数 (real)
C_MU_L(c,t)cell_t c, Thread *t层流粘度 (real)
C_MU_T(c,t)cell_t c, Thread *t湍流粘度 (real)
C_MU_EFF(c,t)cell_t c, Thread *t有效粘度 (real)
C_POR(c,t)cell_t c, Thread *t孔隙率

示例一:遍历计算域中的所有单元,累加每个单元湍流耗散率单元体积的乘积,最终计算出湍流耗散率的体积积分,并将结果打印到控制台。

#include "udf.h"
// 定义ADJUST宏,每次迭代运行,后续章节介绍
DEFINE_ADJUST(my_adjust, d)
{
    Thread *t; // 定义一个指针 t,用于指向单元线程
    real sum_diss = 0.0; // 初始化变量 sum_diss,用于累加湍流耗散率
    cell_t c; // 定义变量 c,用于存储单元的索引

    // 遍历域 d 中的所有单元线程
    thread_loop_c(t, d)
    {
        // 遍历单元线程 t 中的所有单元
        begin_c_loop(c, t)
        {
            // 计算当前单元的湍流耗散率乘以体积,并累加到 sum_diss
            sum_diss += C_D(c, t) * C_VOLUME(c, t);
        }
        end_c_loop(c, t) // 结束单元循环
    }

    // 打印湍流耗散率的体积积分结果
    printf("Volume integral of turbulent dissipation: %g\n", sum_diss);
}

示例二:初始化单元压力分布

如图所示二维流场,现需初始化流场压力分布,流场中心圆域内压力为 500 Pa 500 \text{Pa} 500Pa,圆域外压力为 300 Pa 300\text{Pa} 300Pa,圆心坐标 ( 0 , 0 ) (0,0) (0,0) ,半径 3 mm 3 \text{mm} 3mm
在这里插入图片描述
编写UDF:

#include "udf.h" 

// 定义一个初始化函数,名字为 initp,应用于域 d
DEFINE_INIT(initp, d)
{
    cell_t c; // 定义一个变量 c,用于存储单元的索引
    Thread *t; // 定义一个指针 t,用于指向单元线程
    real xc[ND_ND]; // 定义一个数组 xc,用于存储单元质心的坐标

    // 遍历域 d 中的所有单元线程
    thread_loop_c(t, d)
    {
        // 遍历单元线程 t 中的所有单元
        begin_c_loop(c, t)
        {
            // 获取单元 c 的质心坐标,并存储在 xc 数组中
            C_CENTROID(xc, c, t);
            
			/* 判断单元格是否在圆域内 */
            if ((pow(xc[0], 2) + pow(xc[1], 2)) < pow(0.003, 2))
                // 单元质心坐标在圆域内,则将单元压力设置为 500.0
                C_P(c, t) = 500.0;
            else
                // 否则,将单元压力设置为 300
                C_P(c, t) = 300;
        }
        // 结束单元循环
        end_c_loop(c, t)
    }
}

编译UDF:采用解释型编译Compiled 在这里插入图片描述

挂载UDFDEFINE_INIT宏需要挂载使用,点击Function Hooks 在这里插入图片描述

初始化:点击initialize进行流场初始化。

初始化完成后可在结果里面查看流场压力云图如下:在这里插入图片描述

3.6 材料属性

Fluent 提供了一系列用于访问单元材料属性的宏,其可用于仿真过程中获取单元材料物性相关参数,以便进行各种物理计算和分析。

参数类型返回值
C_MU_L(c,t)cell_t c, Thread *t层流粘度
C_MU_T(c,t)cell_t c, Thread *t湍流粘度
C_MU_EFF(c,t)cell_t c, Thread *t有效粘度
C_K_L(c,t)cell_t c, Thread *t导热系数
C_K_T(c,t,prt)cell_t c, Thread *t, real prt湍流热导率
C_K_EFF(c,t,prt)cell_t c, Thread *t, real prt有效导热系数
C_DIFF_L(c,t,i,j)cell_t c, Thread *t, int i, int j层流组分扩散系数
C_DIFF_EFF(c,t,i)cell_t c, Thread *t, int i有效组分扩散系数
C_CP(c,t)cell_t c, Thread *t比热
C_RGAS(c,t)cell_t c, Thread *t理想气体常数/分子量
C_NUT(c,t)cell_t c, Thread *tSpalart-Allmaras湍流粘度
C_SCAT_COEFF(c,t)cell_t c, Thread *t发射系数
C_ABS_COEFF(c,t)cell_t c, Thread *t吸收系数

本节介绍了一些采用的单元数据访问宏,并给出部分UDF示例,对于一些特殊的单元数据访问宏(如梯度宏、导数宏、多相流宏等)将在后续学习中穿插介绍。

文章部分内容整理翻译于《Ansys Fluent UDF Manual》,笔者学识有限,请批评指正。

欢迎大家评论区或者私信交流

  • 26
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于Fluent UDF(User Defined Function),您可以参考以下步骤进行学习: 1. 理解Fluent UDF的概念:Fluent UDF是用于扩展Fluent软件功能的用户定义函数。它允许您通过编写自己的函数来实现特定的建模、求解或后处理任务。 2. 学习Fluent UDF的基础知识:了解Fluent UDF的基本语法、函数类型和参数传递方式。可以阅读Fluent UDF文档或参考Fluent UDF教程,以了解如何编写和使用UDF代码。 3. 选择编程语言:Fluent UDF支持多种编程语言,如C、C++和Fortran。选择一种您熟悉或感兴趣的编程语言,并学习其语法和相关开发环境。 4. 编写UDF代码:按照Fluent UDF的语法规则,编写您的自定义函数。根据您的需求,可以实现不同类型的UDF,例如边界条件、源项或用户定义的模型。 5. 编译和加载UDF:将编写好的UDF代码编译为动态链接库,并将其加载到Fluent软件中。这样,您就可以在Fluent界面中使用自定义函数。 6. 验证和调试:在Fluent软件中验证您的UDF是否正常工作。如果出现错误或问题,可以使用调试工具和日志信息进行排查。 7. 进一步学习和应用:通过解决实际问题或参与相关项目来进一步学习和应用Fluent UDF。与其他用户交流经验、参加培训课程或阅读相关文献也是提高技能的有效途径。 请注意,Fluent UDF的学习过程可能需要一定的时间和耐心。不断练习和实践,您将能够熟练地使用Fluent UDF来解决复杂的流体力学问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值