Fluent UDF 根据给定点坐标获取cell

2024-02-25 18:18

本文主要是介绍Fluent UDF 根据给定点坐标获取cell,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

很多朋友在开发Fluent模型中需要根据点的坐标来查找对应的cell。总体来说,有两种方法,一种是利用内置的函数来查找,另外一种就是自己写代码查找,这里逐一介绍。

1. 利用内置函数查找

Fluent有一个内置函数CX_Find_Cell_With_Point可以根据点坐标查询对应cell号码。原型声明如下,注意不同Fluent版本中参数有所变化。

CX_Cell_Id *CX_Find_Cell_With_Point(float v[3]);  // 对于Fluent version 6.3~12.1
CX_Cell_Id *CX_Find_Cell_With_Point(ND_Search *, float v[3]);  //对于 Fluent version 13.0
CX_Cell_Id *CX_Find_Cell_With_Point(ND_Search *, double v[3], double time); //对于Fluent version>=14.0

具体怎么用就直接上代码吧(本例利用VC++ UDF Studio插件编译通过,示例代码考虑了不同的Fluent版本,兼容所有Fluent版本)。

#include "udf.h"
extern "C"
{
#if RampantReleaseMajor>=13#include "cxndsearch.h"  //需要的头文件
#endif
};DEFINE_ON_DEMAND(find_cell)
{cell_t c;Thread *t;real coord_Cell[ND_ND];  //找到的cell的中心坐标CX_Cell_Id* cx_cell = NULL;real Pt_to_find[3]={0.0, 0.0, 0.0}; //指定寻找点的坐标
#if RampantReleaseMajor>=14 // for Fluent >=14.0double Pt[3];ND_Search*domain_table = NULL;domain_table = CX_Start_ND_Point_Search(domain_table,TRUE,-1); //准备开始查找点NV_V(Pt, =, Pt_to_find);cx_cell = CX_Find_Cell_With_Point(domain_table, Pt, 0);	
#elif RampantReleaseMajor>=13  // for Fluent13.0float Pt[3];ND_Search*domain_table = NULL;domain_table = CX_Start_ND_Point_Search(domain_table,TRUE,-1); //准备开始查找点NV_V(Pt, =, Pt_to_find);	cx_cell = CX_Find_Cell_With_Point(domain_table, Pt);	
#else  // for Fluent6.3~12.1float Pt[3];NV_V(Pt, =, Pt_to_find);CX_Start_ND_Point_Search();//准备开始查找点cx_cell = CX_Find_Cell_With_Point(Pt);
#endifif (NULL != cx_cell){c=RP_CELL(cx_cell); //找到的cell序号t = RP_THREAD(cx_cell); // 找到的cell线索C_CENTROID(coord_Cell,c,t);  //获取cell中心坐标Message0("coordinate of the specified point: x=%g,y=%g,z=%g\n",Pt_to_find[0],Pt_to_find[1],Pt_to_find[2]);Message0("coordinate of the cell found: x=%g,y=%g,z=%g\n",coord_Cell[0],coord_Cell[1],coord_Cell[2]);} elseMessage("Could not find cell at [%g,%g,%g]!\n",Pt_to_find[0],Pt_to_find[1],Pt_to_find[2]);#if RampantReleaseMajor>=13  // for Fluent >=13.0domain_table = CX_End_ND_Point_Search(domain_table);  //结束查找
#elseCX_End_ND_Point_Search();  //结束查找
#endif
}

2. 自己写代码查找

自己写代码查找原理很简单,就是遍历计算区域内所有的cell,然后判断哪个cell中心到指定点坐标距离最小的即为找到的cell。以下是串行示例代码(并行还需进一步改进)。

#include "udf.h"DEFINE_ON_DEMAND(find_cell)
{cell_t c;Thread *t;cat_t found_cell;real dist, min_dist=1E10;real xc[ND_ND],coord_Cell[ND_ND], NV_VEC(dist_vector);Domain*domain = Get_Domain(1);real Pt_to_find[3]={0.0, 0.0, 0.0}; //指定寻找点的坐标thread_loop_c (t,domain){begin_c_loop(c,t){C_CENTROID(xc,c,t);NV_VV(dist_vector, =, Pt_to_find, -, xc);  //从当前cell到指定查找点的矢量dist=NV_MAG(dist_vector); //获取矢量长度,即距离if(dist<min_dist){min_dist=dist;found_cell.c=c;found_cell.t=t;}}end_c_loop(c,t)}C_CENTROID(coord_Cell, found_cell.c, found_cell.t);  // 获取找到的cell的中心坐标Message0("coordinate of the specified point: x=%g,y=%g,z=%g\n",Pt_to_find[0],Pt_to_find[1],Pt_to_find[2]);Message0("coordinate of the cell found: x=%g,y=%g,z=%g\n",coord_Cell[0],coord_Cell[1],coord_Cell[2]);
}

总体来说,第二种方法更加简单易懂,也不容易出错,但因为需要对所有cell进行循环,可能会浪费一些计算量,尤其不要放在迭代时每个cell都会调用一遍的宏中,比如DEFINE_SOURCE,DEFINE_PROFILE等等。

这篇关于Fluent UDF 根据给定点坐标获取cell的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/746304

相关文章

Python获取浏览器Cookies的四种方式小结

《Python获取浏览器Cookies的四种方式小结》在进行Web应用程序测试和开发时,获取浏览器Cookies是一项重要任务,本文我们介绍四种用Python获取浏览器Cookies的方式,具有一定的... 目录什么是 Cookie?1.使用Selenium库获取浏览器Cookies2.使用浏览器开发者工具

Java获取当前时间String类型和Date类型方式

《Java获取当前时间String类型和Date类型方式》:本文主要介绍Java获取当前时间String类型和Date类型方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录Java获取当前时间String和Date类型String类型和Date类型输出结果总结Java获取

C#监听txt文档获取新数据方式

《C#监听txt文档获取新数据方式》文章介绍通过监听txt文件获取最新数据,并实现开机自启动、禁用窗口关闭按钮、阻止Ctrl+C中断及防止程序退出等功能,代码整合于主函数中,供参考学习... 目录前言一、监听txt文档增加数据二、其他功能1. 设置开机自启动2. 禁止控制台窗口关闭按钮3. 阻止Ctrl +

一文详解如何使用Java获取PDF页面信息

《一文详解如何使用Java获取PDF页面信息》了解PDF页面属性是我们在处理文档、内容提取、打印设置或页面重组等任务时不可或缺的一环,下面我们就来看看如何使用Java语言获取这些信息吧... 目录引言一、安装和引入PDF处理库引入依赖二、获取 PDF 页数三、获取页面尺寸(宽高)四、获取页面旋转角度五、判断

Python使用OpenCV实现获取视频时长的小工具

《Python使用OpenCV实现获取视频时长的小工具》在处理视频数据时,获取视频的时长是一项常见且基础的需求,本文将详细介绍如何使用Python和OpenCV获取视频时长,并对每一行代码进行深入解析... 目录一、代码实现二、代码解析1. 导入 OpenCV 库2. 定义获取视频时长的函数3. 打开视频文

MySQL 获取字符串长度及注意事项

《MySQL获取字符串长度及注意事项》本文通过实例代码给大家介绍MySQL获取字符串长度及注意事项,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录mysql 获取字符串长度详解 核心长度函数对比⚠️ 六大关键注意事项1. 字符编码决定字节长度2

python3如何找到字典的下标index、获取list中指定元素的位置索引

《python3如何找到字典的下标index、获取list中指定元素的位置索引》:本文主要介绍python3如何找到字典的下标index、获取list中指定元素的位置索引问题,具有很好的参考价值,... 目录enumerate()找到字典的下标 index获取list中指定元素的位置索引总结enumerat

SpringMVC高效获取JavaBean对象指南

《SpringMVC高效获取JavaBean对象指南》SpringMVC通过数据绑定自动将请求参数映射到JavaBean,支持表单、URL及JSON数据,需用@ModelAttribute、@Requ... 目录Spring MVC 获取 JavaBean 对象指南核心机制:数据绑定实现步骤1. 定义 Ja

C++中RAII资源获取即初始化

《C++中RAII资源获取即初始化》RAII通过构造/析构自动管理资源生命周期,确保安全释放,本文就来介绍一下C++中的RAII技术及其应用,具有一定的参考价值,感兴趣的可以了解一下... 目录一、核心原理与机制二、标准库中的RAII实现三、自定义RAII类设计原则四、常见应用场景1. 内存管理2. 文件操

SpringBoot服务获取Pod当前IP的两种方案

《SpringBoot服务获取Pod当前IP的两种方案》在Kubernetes集群中,SpringBoot服务获取Pod当前IP的方案主要有两种,通过环境变量注入或通过Java代码动态获取网络接口IP... 目录方案一:通过 Kubernetes Downward API 注入环境变量原理步骤方案二:通过