UDF求计算域中某网格到壁面的最近距离(C_WALL_DIST宏)
-
大家好我有一个小问题想请教各位大神。
问题简单描述:
我想求计算域中每个网格的中心到最近壁面的距离。
问题详细描述:
我使用的是C_WALL_DIST宏,但是发现在初始化的时候会报错。在二维的算例中能编译通过并进行计算,但是在三维的算例中可以编译通过但初始化错误(试过几台电脑,也试过串行并行)。
错误提示为:f1 process could not be started fluent.我的问题
请问要求计算域中每个网格的中心到最近壁面的距离,有什么办法可以实现?这个C_WALL_DIST宏在帮助手册里没有说明,不知道可否满足我的需求。另外,我网上查找的时候,有人说(链接地址)可以先定义一个标量,把距离存在标量中,再拿到udf中计算用,他的代码完全看不懂啊(心累),请问这样可以吗?
谢谢大家
我的UDF代码如下:/*用于修改湍流模型中的湍流粘度*/ #include "udf.h" DEFINE_TURBULENT_VISCOSITY(chen_mu_t,cell,thread) { real chen_mu_t; real rho = C_R(cell,thread); real u,v,w; u=C_U(cell,thread); v=C_V(cell,thread); w=C_W(cell,thread); real local_velocity = sqrt(pow(u,2.0)+pow(v,2.0)+pow(w,2.0)); real distance =C_WALL_DIST(cell,thread); chen_mu_t = 0.03874*rho*local_velocity*distance; return chen_mu_t; }
-
这个问题我解决了,宏C_WALL_DIST在高版本里面确实不能用了,从CFDonline上找到了一个可以用的代码,代码如下:
#include "udf.h" #include "prox.h" static cxboolean wall_dist_set = FALSE;//cxboolean布尔运算,与或非,对错 DEFINE_ON_DEMAND(set_wall_dist_udm0) { #if !RP_HOST//表示非host节点的话,执行后面的代码,fluent并行的话,会启动一个 host节点和指定个数的node节点,host节点主要处理GUI和结果收集之类的任务node节点负责分区计算任务 Domain *domain; Thread *t; cell_t c; if (! wall_dist_set) { domain = Get_Domain(1);//ROOT_DOMAIN_ID? Alloc_Storage_Vars(domain, SV_RTMP_0, SV_NULL);//Alloc_Storage_Vars 用于更改分配 Calc_Cell_Wall_Distance_New(domain, SV_RTMP_0); thread_loop_c(t,domain) { begin_c_loop(c,t) { C_UDMI(c,t,0) = C_TMP0(c,t); } end_c_loop(c,t) } wall_dist_set = TRUE; } #endif /* !RP_HOST */ } DEFINE_ON_DEMAND(reset_udm0) { #if !RP_HOST Domain *domain; Thread *t; cell_t c; domain = Get_Domain(1); thread_loop_c(t,domain) { begin_c_loop(c,t) { C_UDMI(c,t,0) = 0.0; } end_c_loop(c,t) } #endif /* !RP_HOST */ wall_dist_set = FALSE; }
说实话这个代码我不能完全看懂,但是主要思想就是用DEFINE_ON_DEMAND定义两个命令reset_udm0和set_wall_dist_udm0,前者将壁面到最近壁面的距离reset为0,后者可以求出想要的结果,经过测试两个命令应该都是必须的,另外我放的代码和CFDonline上有一点不同,domain = Get_Domain(1);这一行在原代码里面是domain = Get_Domain(ROOT_DOMAIN_ID);注意修改,下图是我测试的一个水翼网格的结果,结果是对的,
再啰嗦几句代码使用方法,这个代码直接复制到一个.c文件中,在fluent中添加memory的数量为2,编译.c文件并load,在calculate之前,点Execute on Demand,并先后运行reset_udm0和set_wall_dist_udm0,然后就可以calculate了