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

相关文章

C#实现获取电脑中的端口号和硬件信息

《C#实现获取电脑中的端口号和硬件信息》这篇文章主要为大家详细介绍了C#实现获取电脑中的端口号和硬件信息的相关方法,文中的示例代码讲解详细,有需要的小伙伴可以参考一下... 我们经常在使用一个串口软件的时候,发现软件中的端口号并不是普通的COM1,而是带有硬件信息的。那么如果我们使用C#编写软件时候,如

C#实现WinForm控件焦点的获取与失去

《C#实现WinForm控件焦点的获取与失去》在一个数据输入表单中,当用户从一个文本框切换到另一个文本框时,需要准确地判断焦点的转移,以便进行数据验证、提示信息显示等操作,本文将探讨Winform控件... 目录前言获取焦点改变TabIndex属性值调用Focus方法失去焦点总结最后前言在一个数据输入表单

通过C#获取PDF中指定文本或所有文本的字体信息

《通过C#获取PDF中指定文本或所有文本的字体信息》在设计和出版行业中,字体的选择和使用对最终作品的质量有着重要影响,然而,有时我们可能会遇到包含未知字体的PDF文件,这使得我们无法准确地复制或修改文... 目录引言C# 获取PDF中指定文本的字体信息C# 获取PDF文档中用到的所有字体信息引言在设计和出

python中os.stat().st_size、os.path.getsize()获取文件大小

《python中os.stat().st_size、os.path.getsize()获取文件大小》本文介绍了使用os.stat()和os.path.getsize()函数获取文件大小,文中通过示例代... 目录一、os.stat().st_size二、os.path.getsize()三、函数封装一、os

python获取当前文件和目录路径的方法详解

《python获取当前文件和目录路径的方法详解》:本文主要介绍Python中获取当前文件路径和目录的方法,包括使用__file__关键字、os.path.abspath、os.path.realp... 目录1、获取当前文件路径2、获取当前文件所在目录3、os.path.abspath和os.path.re

Java子线程无法获取Attributes的解决方法(最新推荐)

《Java子线程无法获取Attributes的解决方法(最新推荐)》在Java多线程编程中,子线程无法直接获取主线程设置的Attributes是一个常见问题,本文探讨了这一问题的原因,并提供了两种解决... 目录一、问题原因二、解决方案1. 直接传递数据2. 使用ThreadLocal(适用于线程独立数据)

Android Environment 获取的路径问题

1. 以获取 /System 路径为例 /*** Return root of the "system" partition holding the core Android OS.* Always present and mounted read-only.*/public static @NonNull File getRootDirectory() {return DIR_ANDR

cell phone teardown 手机拆卸

tweezer 镊子 screwdriver 螺丝刀 opening tool 开口工具 repair 修理 battery 电池 rear panel 后盖 front and rear cameras 前后摄像头 volume button board 音量键线路板 headphone jack 耳机孔 a cracked screen 破裂屏 otherwise non-functiona

JS和jQuery获取节点的兄弟,父级,子级元素

原文转自http://blog.csdn.net/duanshuyong/article/details/7562423 先说一下JS的获取方法,其要比JQUERY的方法麻烦很多,后面以JQUERY的方法作对比。 JS的方法会比JQUERY麻烦很多,主要则是因为FF浏览器,FF浏览器会把你的换行也当最DOM元素。 <div id="test"><div></div><div></div

vcpkg子包路径批量获取

获取vcpkg 子包的路径,并拼接为set(CMAKE_PREFIX_PATH “拼接路径” ) import osdef find_directories_with_subdirs(root_dir):# 构建根目录下的 "packages" 文件夹路径root_packages_dir = os.path.join(root_dir, "packages")# 如果 "packages"