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

相关文章

SpringBoot整合mybatisPlus实现批量插入并获取ID详解

《SpringBoot整合mybatisPlus实现批量插入并获取ID详解》这篇文章主要为大家详细介绍了SpringBoot如何整合mybatisPlus实现批量插入并获取ID,文中的示例代码讲解详细... 目录【1】saveBATch(一万条数据总耗时:2478ms)【2】集合方式foreach(一万条数

python获取网页表格的多种方法汇总

《python获取网页表格的多种方法汇总》我们在网页上看到很多的表格,如果要获取里面的数据或者转化成其他格式,就需要将表格获取下来并进行整理,在Python中,获取网页表格的方法有多种,下面就跟随小编... 目录1. 使用Pandas的read_html2. 使用BeautifulSoup和pandas3.

SpringBoot UserAgentUtils获取用户浏览器的用法

《SpringBootUserAgentUtils获取用户浏览器的用法》UserAgentUtils是于处理用户代理(User-Agent)字符串的工具类,一般用于解析和处理浏览器、操作系统以及设备... 目录介绍效果图依赖封装客户端工具封装IP工具实体类获取设备信息入库介绍UserAgentUtils

使用Python从PPT文档中提取图片和图片信息(如坐标、宽度和高度等)

《使用Python从PPT文档中提取图片和图片信息(如坐标、宽度和高度等)》PPT是一种高效的信息展示工具,广泛应用于教育、商务和设计等多个领域,PPT文档中常常包含丰富的图片内容,这些图片不仅提升了... 目录一、引言二、环境与工具三、python 提取PPT背景图片3.1 提取幻灯片背景图片3.2 提取

C# foreach 循环中获取索引的实现方式

《C#foreach循环中获取索引的实现方式》:本文主要介绍C#foreach循环中获取索引的实现方式,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录一、手动维护索引变量二、LINQ Select + 元组解构三、扩展方法封装索引四、使用 for 循环替代

Linux下如何使用C++获取硬件信息

《Linux下如何使用C++获取硬件信息》这篇文章主要为大家详细介绍了如何使用C++实现获取CPU,主板,磁盘,BIOS信息等硬件信息,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下... 目录方法获取CPU信息:读取"/proc/cpuinfo"文件获取磁盘信息:读取"/proc/diskstats"文

Vue3组件中getCurrentInstance()获取App实例,但是返回null的解决方案

《Vue3组件中getCurrentInstance()获取App实例,但是返回null的解决方案》:本文主要介绍Vue3组件中getCurrentInstance()获取App实例,但是返回nu... 目录vue3组件中getCurrentInstajavascriptnce()获取App实例,但是返回n

SpringMVC获取请求参数的方法

《SpringMVC获取请求参数的方法》:本文主要介绍SpringMVC获取请求参数的方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下... 目录1、通过ServletAPI获取2、通过控制器方法的形参获取请求参数3、@RequestParam4、@

Python获取C++中返回的char*字段的两种思路

《Python获取C++中返回的char*字段的两种思路》有时候需要获取C++函数中返回来的不定长的char*字符串,本文小编为大家找到了两种解决问题的思路,感兴趣的小伙伴可以跟随小编一起学习一下... 有时候需要获取C++函数中返回来的不定长的char*字符串,目前我找到两种解决问题的思路,具体实现如下:

golang获取当前时间、时间戳和时间字符串及它们之间的相互转换方法

《golang获取当前时间、时间戳和时间字符串及它们之间的相互转换方法》:本文主要介绍golang获取当前时间、时间戳和时间字符串及它们之间的相互转换,本文通过实例代码给大家介绍的非常详细,感兴趣... 目录1、获取当前时间2、获取当前时间戳3、获取当前时间的字符串格式4、它们之间的相互转化上篇文章给大家介