首页/文章/ 详情

Fluent UDF为所欲为的后门

1年前浏览1548

大家都知道,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似乎可以违背任何物理规律,为所欲为????


来源:Fluent学习笔记
FluentUDFUMANSYS
著作权归作者所有,欢迎分享,未经许可,不得转载
首次发布时间:2023-07-19
最近编辑:1年前
Fluent学习笔记
博士 签名征集中
获赞 124粉丝 326文章 133课程 3
点赞
收藏
未登录
还没有评论
课程
培训
服务
行家
VIP会员 学习 福利任务 兑换礼品
下载APP
联系我们
帮助与反馈