udf输出一些心得体会
资料分类:流体CFD 文件类型:视频 人气:130 大小:36K 更新日期: 2016-10-11 16:27
一段时间内,遇到许多QQ网友问到如何输出软件计算数据,这样方便自己处理数据,对数据进一步进行分析。这些同学大多对于fluent自定义函数udf不太了解,或者软件输出数据后处理软件不太了解。换句话说,fluent软件提供一些后处理方法,辅助于后期处理,效果也比较不错,但是需要你对这个软件进行系统学习,需要花个两到三天左右时间,往往我们同学都不乐意付出这样时间,希望立马解决自己问题,这个时候就会多个群里进行询问,或者百度搜索。为此我今天将介绍第二种比较快捷方法,采用自定义函数udf输出软件计算参数。
首先,大家要明白一点,fluent软件计算也是一种程序计算方法,计算结果只不过是封装在case和data中,也就是你将case和data导入一些分析软件,例如tecplot就会显示一些数据;例如:速度场,压力场,速度梯度等;我们目前需要做的就是,利用我们编译得udf去输出每个时刻你所要区域速度、压力等参数,这个时候你可以利用fluent自带宏,例如 excute at the end,在每个时刻运算结束后输出数据,或者 adjust在每个迭代过程中输出数据,或者on demand在需要时候运行你的udf程序。这些通用宏,在什么时候调用,调用了起到什么效果,一定要搞清楚,搞明白了,就可以在这些宏里进行编写代码了。
编写代码是许多同学遇到头疼问题。为什么会感觉头疼,主要是由于自己看不懂,还不知道如何去解决。会很迷茫。既然我们知道他是代码,我们就要寻求代码含义,这就需要大家去fluent udfhelp 文档,每个代码含义说的清清楚楚,等看懂了,在来编写程序,你就会发现非常简单。这是一种方法,具体我们来初步认识下udf基本用法,首先我们要认识下指针,我们利用网格指针、线程指针、区域指针,分来来指向不同网格,线程、区域,这样进行区分。然后我们就可以在这些网格、线程、区域上可以进行循环,相当于for或者do循环语句,循环目的就是走遍这个区域,然后寻找你要输出参数,这些参数值,我们可以通过一些定义好专用获得数据宏来得到,这些宏百度下都会找到,例如C_P(c,t),这里如果我们知道网格指针和线程t指针,例如这里t指针指的是边界条件,我们就可以从fluent边界条件找到它的id,我们就可以输出边界上压力,当然如果我们具体到某一个点压力值,也可以输出,只不过在增加一些判断语句罢了。下面列举下一些指针和循环语句:
一些指针例子:
Type Variable Meaning of the declaration
Domain *d; d is a pointer to domain thread 区域指针,多相流运用时要注意。
Thread *t; t is a pointer to thread 线程指针
cell_t c; c is cell thread variable 网格指针
face_t f; f is a face thread variable 面指针
Node *node; node is a pointer to a node. 节点指针
常用循环宏:
– Loop over all cell threads in domain d:区域d指针内网格循环
thread_loop_c(ct,d) { }
– Loop over face threads in domain d:区域d指针指向内面网格循环
thread_loop_f(ft,d) { }
– Loop over all cells in a cell thread t:在线程t指针下网格循环
begin_c_loop(c, t)
{...}
end_c_loop (c,t)
– Loop over faces in a face thread f_thread:在线程f下面循环
begin_f_loop(f, f_thread)
{ … }
end_f_loop(f, f_thread)
一些数据获取宏
C_R(c,t); Density
C_P(c,t); Pressure
C_U(c,t); U-velocity
C_V(c,t); V-velocity
C_W(c,t); W-velocity
C_T(c,t); Temperature
C H(c,t); Enthalpy
C_K(c,t); Turbulent kinetic energy (k)
C_D(c,t); Turbulent dissipation rate (ε)
C_O(c,t); Specific dissipation of k (ω)
C_YI(c,t,i); Species mass fraction
C_UDSI(c,t,i); UDS scalars
C_UDMI(c,t,i); UDM scalars
C_DUDX(c,t); Velocity derivative
C_DUDY(c,t); Velocity derivative
C_DUDZ(c,t); Velocity derivative
C_DVDX(c,t); Velocity derivative
C_DVDY(c,t); Velocity derivative
C_DVDZ(c,t); Velocity derivative
C_DWDX(c,t); Velocity derivative
C_DWDY(c,t); Velocity derivative
C_DWDZ(c,t); Velocity derivative
C_MU_L(c,t); Laminar viscosity
C_MU_T(c,t); Turbulent viscosity
C_MU_EFF(c,t); Effective viscosity
C_K_L(c,t); Laminar thermal conductivity
C_K_T(c,t); Turbulent thermal conductivity
C_K_EFF(c,t); Effective thermal conductivity
C_CP(c,t); Specific heat
C_RGAS(c,t); Gas constant
另外附一个例子吧
#include "udf.h"
#include "math.h"
#include "mem.h"
#include "global.h"
FILE *fp;
FILE *fp1;
DEFINE_EXECUTE_AT_END(pressure)
{
Domain *d;
d=Get_Domain(1);
fp=fopen("dp_body.txt","a");
real FC[ND_ND];
real x_body1,y_body1,p_body1;
cell_t c;
Thread *ft=Lookup_Thread(d,5);
Thread *ft1=Lookup_Thread(d,20);
thread_loop_c(ft,d)
{
//loop over all cells//
begin_c_loop(c, ft)
{
C_P(c,ft);//get the pressure//
C_CENTROID(FC,c,ft);
// 输出x坐标和压力值
x_body1=FC[0];
y_body1=FC[1];
p_body1=C_P(c,ft);
}
end_c_loop(c,ft)
}
}
fprintf(fp," x= %-8.5f y= %-8.5f dp=%-12.5f\n ",x_body1,y_body1,dp); //输入到文本里。
Message(" x= %-8.5f dp=%-12.5f\n ",x_body1,dp); //直接输出到fluent运行界面
fclose(fp);
}
这是在每个时步结束时刻输出自己想要得到值,仅供大家学习与参考,由于udf包含内容很多,想要全部包含在里面也很难。如果有问题可以留言,也可以加入群
ANSYS CFD学习交流群 226551509讨论,本着“今天你帮助我,明天我也会帮助你”原则,大家互助吧,当然最高境界,不求回报吧!