首页 > 其他分享 >Fluent UDF(四)数据访问宏(2)

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

时间:2024-06-20 08:59:25浏览次数:12  
标签:real cell Thread 0.5 Fluent 访问 UDF loop 单元

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

网格单元 (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》,笔者学识有限,请批评指正。

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

标签:real,cell,Thread,0.5,Fluent,访问,UDF,loop,单元
From: https://blog.csdn.net/weixin_48358398/article/details/139816073

相关文章

  • 【计算机网络仿真】b站湖科大教书匠思科Packet Tracer——实验一 Packet Tracer的简单
    一、实验目的1.掌握PacketTracer的简单使用方式;2.加深对网络体系结构的理解。二、实验要求1.搭建CiscoPacketTracer仿真平台使用环境;2.观看B站湖科大教书匠仿真实验视频,完成对应实验。三、实验内容第一部分:PacketTracer的简单使用1.下载CiscoPacketTracer并......
  • C++PrimerPlus:第十三章类和继承:访问控制:protected
    第十三章类和继承:访问控制:protected提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加例如:访问控制:protected提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录第十三章类和继承:访问控制:protected前言一、访问控制:protected总结......
  • Java访问控制符及final
    1、访问控制符在Java语言中,访问控制修饰符有4种,分别是public、private、protected和default。1) private用private修饰的类成员,只能被该类自身的方法访问和修改,而不能被任何其他类(包括该类的子类)访问和引用。因此,private修饰符具有最高的保护级别。2)default(默......
  • Hexo博客Next主题更换cdn加速访问
    有时候访问我的博客时,总是会出现cdn.jsdelivr.net无法访问或者访问速度过慢的情况。我的博客园使用的是BNDong/Cnblogs-Theme-SimpleMemory主题,也遇到的这样的情况。经过我的一番折腾之后,将js文件转移到了我自己的OSS中,并且又经过了我的一番折腾之后,设置好了跨域资源共享(CORS)策略,......
  • Linux 提权-MySQL UDF
    本文通过Google翻译MySQLUserDefinedFunctions–LinuxPrivilegeEscalation这篇文章所产生,本人仅是对机器翻译中部分表达别扭的字词进行了校正及个别注释补充。导航0前言1什么是用户定义函数(UDF)?2枚举UDF漏洞利用条件2.1手动枚举UDF漏洞利用条件......
  • FreeRTOS 体验教程:3.如何用互斥量实现FreeRTOS多线程访问共享资源?
    FreeRTOS互斥量使用教程互斥量(Mutex)是一种特殊的信号量,用于管理对共享资源的访问。在FreeRTOS中,互斥量的句柄类型依然是xSemaphoreHandle。本文将详细介绍如何在FreeRTOS中创建和使用互斥量,并通过实例展示其运行效果。1.创建互斥量在FreeRTOS中,创建互斥量非常简......
  • 15 远程访问及控制
    目录15.1SSH远程管理    15.1.1配置OpenSSH服务端    15.1.2使用SSH客户端程序    15.1.3构建密钥对验证的SSH体系15.2TCPWrappers访问控制    15.2.1TCPWrappers概述    15.2.2TCPWrappers的访问策略15.1SSH远程......
  • 网络安全管理是一个系统化的过程,旨在保护网络系统及数据免受未经授权的访问和各类网络
    网络安全管理是一个系统化的过程,旨在保护网络系统及数据免受未经授权的访问和各类网络攻击。其工作原理主要包括以下几个方面:预防措施:通过安全配置管理和需求分析确定潜在的安全威胁,并制定相应的预防策略。这包括对网络设备和软件进行严格的安全配置以及定期更新,确保系统......
  • 【Azure App Service】遇见az命令访问HTTPS App Service 时遇见SSL证书问题,暂时跳过证
    问题描述访问AppService的高级工具KUDU站点的URL,遇见无法访问,在通过azwebappdeploy发布时候,也遇见SSL错误(SSL:CERITIFICATE_VERIFY_FAILEDcertificateverifyfailed:unabletogetlocalissuercertificate)问题解答为AZ指令配置,跳过SSL认证,来实现AZWEBAPPDEPLOY......
  • linux远程访问及控制
    补充:终端:接收用户的指令TTY终端虚拟终端ssh:22端口号,加密。telnet:23端口号,不加密。解释器:shellSSH远程管理SSH(SecureShell)是一种安全通道协议,主要用来实现字符界面的远程登录、远程复制等功能。SSH协议对通信双方的数据传输进行了加密处理,其中包括用户登录时输入的......