欢迎访问海纳仿真交互平台!

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讨论,本着“今天你帮助我,明天我也会帮助你”原则,大家互助吧,当然最高境界,不求回报吧!

案例评价(0

线

欢迎咨询

售前咨询
售后服务
技术咨询

18792739811