moplye 发表于 2016-4-19 20:50:18

关于udf输出参数心得体会,输出压力、速度、或者定义一些参数等udf应用心得

一段时间内,遇到许多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
另外附一个例子吧
/********************************************************************
   UDF for integrating turbulent dissipation and printing it to   
   console window at the end of the current iteration or time step
*********************************************************************/

#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;
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;
                                       y_body1=FC;
                                 p_body1=C_P(c,ft);
                                  
                       }

             end_c_loop(c,ft)
          }
       
          }


    fprintf(fp,"x= %-8.5f   y= %-8.5fdp=%-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讨论,本着“今天你帮助我,明天我也会帮助你”原则,大家互助吧,当然最高境界,不求回报吧!

milaoshu 发表于 2016-4-20 08:23:43

点赞 学习了

suhuihot 发表于 2016-4-20 08:39:05

学习,mark

Heaven0931 发表于 2016-4-20 23:11:20

不错

taiwangwsg 发表于 2016-4-26 16:56:16

好东西。多谢楼主。

moplye 发表于 2016-4-28 14:52:18

谢谢各位!会继续更新!

xuwanshun 发表于 2016-9-5 17:07:35

本帖最后由 xuwanshun 于 2016-9-5 19:36 编辑

Thread *ft=Lookup_Thread(d,5);
请问这个5是怎么评断的。
这个thread ID一直不知道怎么确定,刚开始以为是线程1线程2.。。但好像不对
并行计算时候,我把边界条件设置中找到的ID加进去,也不对,,,

moplye 发表于 2016-9-6 13:37:41

在边界条件 或者区域条件里有个wall id

wxjwhu 发表于 2016-9-23 09:57:42

看起来好复杂,还是谢谢楼主了

超级金城武 发表于 2023-1-3 15:32:00

本帖最后由 超级金城武 于 2023-1-3 15:33 编辑

你好 请问C_U(c,t); U-velocity
C_V(c,t); V-velocity
C_W(c,t); W-velocity
这几个是不同方向的速度,就是流速吧,那我想引用剪切速率,是速率对间隙的导数,有没有直接引用的代码,难不成要编写的时候导一下嘛?

超级金城武 发表于 2023-1-3 15:35:24

超级金城武 发表于 2023-1-3 15:32
你好 请问C_U(c,t); U-velocity
C_V(c,t); V-velocity
C_W(c,t); W-velocity


我初衷是想根据不同的剪切速率,设置不同的粘度,就是fluent中自带的HB模型,其中是关于剪切速率的分段函数,我没找到哪里可以引用当前剪切速率的代码,就只找到不同方向的速度,是就没有嘛

敷衍 发表于 2023-8-7 13:17:05

超级金城武 发表于 2023-1-3 15:35
我初衷是想根据不同的剪切速率,设置不同的粘度,就是fluent中自带的HB模型,其中是关于剪切速率的分段函 ...

我跟你的目的差不多,也是苦于不知道怎么获取或者计算剪切速率,请问您现在解决了吗
页: [1]
查看完整版本: 关于udf输出参数心得体会,输出压力、速度、或者定义一些参数等udf应用心得