2021年对一个简单解释型udf程序的详细解释

2021年对一个简单解释型udf程序的详细解释
2021年对一个简单解释型udf程序的详细解释

对一个简单解释型udf程序的详细解

欧阳光明(2021.03.07)

#include "udf.h"

/*udf.h是一个头文件,如果不写的话就不能使用fluent udf中的宏,函数等*/

DEFINE_PROFILE(pressure_profile, t, i)

/*是一个宏,本例中用来说明进口压力与垂直坐标变量(还可以是其他的变量)的关系。pressure_profile 是函数名,可随意指定。t的数据类型是Thread *t ,t表示指向结构体thread(这里的thread表示边界上所有的网格面的集合)的指针。i的数据类型是Int,表示边界的位置?或者说是什么每个循环内对位置变量(这里应该是质心的纵坐标)设置的数值标签*/

{

real x[ND_ND];

/* 定义了质心的三维坐标,数据类型为real*/

real y;

/*定义了一个变量y,数据类型为real */

face_t f;

/*定义了一个变量f,数据类型为face_t,也就是网格面的意思,即f代表一个网格单元的网格面 */

begin_f_loop(f, t)

/*表示遍寻网格面,它的意思是说在计算的时候,要扫描所定义边界的所有网格面,对每个网格面都要赋值,值存储在F_PROFILE(f, t, i)中*/

{

F_CENTROID(x,f,t);

/*一个函数,它的意思是读取每个网格面质心的二维坐标,并赋值给x。x为名称,接收三维坐标值。f为网格面(因为这里只是取的面的二维坐标,所以为f,如果是网格单元的话,这里就为c)。t为指向结构体thread(这里的thread表示边界上所有的网格面的集合)的指针*/

y = x[1];

/*把质心的三维坐标的纵坐标的数值赋给y*/

F_PROFILE(f, t, i) = 1.1e5 y*y/(.0745*.0745)*0.1e5;

/*赋给每个网格面的数值与网格质心纵坐标的关系。其实就是赋给质心的速度值(这里只有大小)与质心纵坐标的函数关系,因为fluent在计算的时候是把数据存储到网格质心上的,所以网格质心的速度值就代表网格的速度值。这里有了网格的质心纵坐标,然后有了质心速度值与纵坐标的函数关系,那么每个进口网格面的速度值也就知道了。f依然代表网格面。t表示指向结构体thread(这里的thread表示边界上所有的网格面的集合)的指针。i每个循环内对位置变量(这里应该是质心的纵坐标)设置的数值标签*/

}

end_f_loop(f, t)/*结束循环*/

}

整体来看:包括两个宏:DEFINE_PROFILE(pressure_profile, t, i)和beginend_f_loop(f, t)。两个函数:F_CENTROID(x,f,t)和F_PROFILE(f, t, i)。其他都是变量。

求解思路为,首先看用到的宏,本例中用到的是DEFINE_PROFILE(name,t,i),它可以给进口或者边壁加载速度,温度,压力等变量。

然后我们知道了进口速度和进口纵坐标的关系,其实也就是每个网格面质心的速度值与质心纵坐标的关系。这样就好了,现在的关键是如何得到每个网格质心的纵坐标的数值。程序里是这样做的:首先通过F_CENTROID(x,f,t)函数得到质心的二维坐标并赋给x[ND_ND],然后利用y = x[1]函数得到质心的纵坐标。;

得到了质心纵坐标以后,知道质心速度值与质心纵坐标的关系,再通过F_PROFILE(f, t, i)函数,就可以把由函数关系式得到的速度值赋给每个网格面的质心了。

注:1.real类型,在fluent单精度里为float,双精度里为double float。

2.beginend_f_loop(f, t)循环宏,相当于c语言中的循环语句。因为上述都是说的对每一个网格面的赋值,而进口有很多网格面,所以就需要利用这个宏扫描所有的网格面,然后给所有的网格质心赋值。

相关主题
相关文档
最新文档