大家都知道,Fluent UDF是基于C语言进行编程的。
C语言数据类型主要有整型int、浮点型float、指针*、数组array[]、结构体struct等。正常来说,既然UDF是以C语言进行编程的,那么UDF中的数据类型也应该是这几种才对,而不能无中生有搞出其他数据类型来。
UDF常用的数据类型如下:
1. 实数(real):
实数是Fluent UDF中最常用的数据类型之一,用于存储浮点数值。实数通常用于定义物理量,如速度、压力、温度等。具体是单精度还是双精度,取决于Fluent软件打开界面有没有勾选双精度。
2. cell_t:
cell_t是一个代表单元的整数据类型。在Fluent中,单元通常指的是三维空间中的体单元。cell_t类型用于访问单元的几何和物理特性。
#include "udf.h"
DEFINE_ON_DEMAND(cell_volume)
{
Domain *domain;
Thread *thread;
cell_t c;
domain = Get_Domain(1); /* 获取计算域 */
thread = Lookup_Thread(domain, 1); /* 获取Thread */
/* 遍历单元并计算体积 */
begin_c_loop(c, thread)
real volume = C_VOLUME(c, thread);
Message0("单元体积为: %lf\n", volume);
end_c_loop(c, thread)
}
3. face_t:
face_t是一个代表面的整数据类型。在Fluent中,面通常指的是单元的表面,也就是单元之间的接口。face_t类型用于访问面的几何和物理特性。
4. Thread:
Thread是ANSYS Fluent中的一个非常重要的结构体数据类型。在Fluent UDF中,Thread经常用于访问单元和面,以及定义物理量和边界条件等。
5. Domain:
Domain是一个代表整个计算域的结构体数据类型。它包含了所有的Thread,每个Thread又包含了一组单元和面。在Fluent UDF中,Domain经常用于定义物理量、边界条件和求解器选项等。例如,可以使用Domain中的函数来定义流体的初始条件和边界条件。
尽管UDF使用如cell_t等特殊字符来声明变量,但是其本质还是C语言常用的数据类型。
比如上面提到的Thread和Domain都是结构体类型,其中可能包含很多数据变量,如cell,face等
而比较有意思的是cell_t和face_t数据类型,cell_t可以用来声明网格cell,face_t用来声明face,但是他们竟然是整型变量!!!!
这引出来很多有意思的问题:
1. 既然cell_t声明的是整型变量,那声明语句cell_t c中的c就是一个整数,根本不是什么特别神秘的网格,其实就是一个整型变量。
2. begin_c_loop(c, thread)这个语句什么意思??循环遍历网格,如果c是一个整型变量,那么其实这个语句就类似于for循环,而其中的c只是循环变量。
begin_c_loop_int(c, t)
{
Message(" c=%d ", c);
C_UDMI(c, t, 0) =c;
}
end_c_loop_int_ext(c, t)
上面的代码会输出什么??c会从小到大输出0,1,2,3······
3. UDF遍历网格顺序是什么??
之前测试过UDF遍历网格的顺序,也得出来了结论,现在看来是错误的。UDF遍历网格的顺序很简单,就是c从小到大遍历,既不按照x轴坐标,也不按照y轴坐标
4. 每个网格都有一个编号,既然这样,只要知道了特定网格的编号,使用UDF似乎可以违背任何物理规律,为所欲为????