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实现获取网页指定内容

《使用Python实现获取网页指定内容》在当今互联网时代,网页数据抓取是一项非常重要的技能,本文将带你从零开始学习如何使用Python获取网页中的指定内容,希望对大家有所帮助... 目录引言1. 网页抓取的基本概念2. python中的网页抓取库3. 安装必要的库4. 发送HTTP请求并获取网页内容5. 解

C++常见容器获取头元素的方法大全

《C++常见容器获取头元素的方法大全》在C++编程中,容器是存储和管理数据集合的重要工具,不同的容器提供了不同的接口来访问和操作其中的元素,获取容器的头元素(即第一个元素)是常见的操作之一,本文将详细... 目录一、std::vector二、std::list三、std::deque四、std::forwa

使用Python高效获取网络数据的操作指南

《使用Python高效获取网络数据的操作指南》网络爬虫是一种自动化程序,用于访问和提取网站上的数据,Python是进行网络爬虫开发的理想语言,拥有丰富的库和工具,使得编写和维护爬虫变得简单高效,本文将... 目录网络爬虫的基本概念常用库介绍安装库Requests和BeautifulSoup爬虫开发发送请求解

Android App安装列表获取方法(实践方案)

《AndroidApp安装列表获取方法(实践方案)》文章介绍了Android11及以上版本获取应用列表的方案调整,包括权限配置、白名单配置和action配置三种方式,并提供了相应的Java和Kotl... 目录前言实现方案         方案概述一、 androidManifest 三种配置方式

Python如何获取域名的SSL证书信息和到期时间

《Python如何获取域名的SSL证书信息和到期时间》在当今互联网时代,SSL证书的重要性不言而喻,它不仅为用户提供了安全的连接,还能提高网站的搜索引擎排名,那我们怎么才能通过Python获取域名的S... 目录了解SSL证书的基本概念使用python库来抓取SSL证书信息安装必要的库编写获取SSL证书信息

Win32下C++实现快速获取硬盘分区信息

《Win32下C++实现快速获取硬盘分区信息》这篇文章主要为大家详细介绍了Win32下C++如何实现快速获取硬盘分区信息,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 实现代码CDiskDriveUtils.h#pragma once #include <wtypesbase

Android如何获取当前CPU频率和占用率

《Android如何获取当前CPU频率和占用率》最近在优化App的性能,需要获取当前CPU视频频率和占用率,所以本文小编就来和大家总结一下如何在Android中获取当前CPU频率和占用率吧... 最近在优化 App 的性能,需要获取当前 CPU视频频率和占用率,通过查询资料,大致思路如下:目前没有标准的

golang获取prometheus数据(prometheus/client_golang包)

《golang获取prometheus数据(prometheus/client_golang包)》本文主要介绍了使用Go语言的prometheus/client_golang包来获取Prometheu... 目录1. 创建链接1.1 语法1.2 完整示例2. 简单查询2.1 语法2.2 完整示例3. 范围值

javaScript在表单提交时获取表单数据的示例代码

《javaScript在表单提交时获取表单数据的示例代码》本文介绍了五种在JavaScript中获取表单数据的方法:使用FormData对象、手动提取表单数据、使用querySelector获取单个字... 方法 1:使用 FormData 对象FormData 是一个方便的内置对象,用于获取表单中的键值

如何利用Java获取当天的开始和结束时间

《如何利用Java获取当天的开始和结束时间》:本文主要介绍如何使用Java8的LocalDate和LocalDateTime类获取指定日期的开始和结束时间,展示了如何通过这些类进行日期和时间的处... 目录前言1. Java日期时间API概述2. 获取当天的开始和结束时间代码解析运行结果3. 总结前言在J