吾生有涯 学海无涯
析模有界 知识无界

Fluent UDF|EX04 文件交互

内容纲要

本案例演示在Fluent UDF中进行文件读写的操作。

前面的案例演示了将计算结果输出到TUI窗口,但实际应用中常需要将这些输出输出到文件中,以方便进行后续的数据处理,此时就需要利用UDF进行文件读写操作。

Fluent UDF中的文件读写操作利用的是C语言的标准文件操作函数:

  • fprintf函数:写入文件
  • fscanf函数:读取文件

1 输入输出函数

C语言中的fprintf与fscanf函数的读写对象为磁盘文件,函数原型为:

int fscanf ( FILE *fp, char * format, ... );
int fprintf ( FILE *fp, char * format, ... );

其中,fp为文件指针,format为格式化字符串,…为参数列表。

如下所示的代码片段描述了数据的文件读取和输入过程:

FILE *fp;
int i, j;
char *str, ch;
fscanf(fp, "%d %s", &i, str);
fprintf(fp,"%d %c", j, ch);

2 改造UDF宏保存数据到文件

以前面的DEFINE_ON_DEMAND宏为基础进行修改,计算完毕后将所有节点上的温度值输出到文件中。

DEFINE_ON_DEMAND(write_temperature)
{
FILE *fp;
Thread *t;
Domain *d;
cell_t c;

const char FILENAME[] = "temperature.txt";
real position[ND_ND];

/* Check for UDMs */
if (N_UDM < 1)
{
Message("n Error: No UDM defined! Abort UDF execution.n");
return;
}
if ((fp = fopen(FILENAME, "w")) == NULL)
{
Message("n Error: No write access to file %s. Abort UDF execution.n", FILENAME);
return;
}
else
{
/* File does not exist, create file and write header */
fprintf(fp, "x mty mtTemperature degCn");
}
/* Loop over all cell threads */
d = Get_Domain(1);
thread_loop_c(t, d){
/* Loop over all cells */
begin_c_loop(c, t){
/* Get coordinates */
C_CENTROID(position, c, t);
/* Get temperature and write to file */
fprintf(fp, "%10.5et%10.5et%10.5en", position[0], position[1], C_T(c, t)-273.15);
}
end_c_loop(c, t)
}
/* Close file */
fclose(fp);
Message("n Finished writing to file temperature.txtn");
}

注意上面的代码未进行全局约简,因此若工作在多核心并行模式下会输出不正确的数据。

  • 单核启动Fluent
  • 读取cas与data文件
  • 编译UDF源文件UDF04.c并加载
  • 点击按钮**Execute on Demand…**打开对话框
  • 选择UDF宏write_temperature::libudf,点击按钮Execute执行该UDF宏
  • 执行完毕后TUI窗口输出信息如下图所示

注:

注意到信息输出语句被执行了两次,这是因为虽然利用的是单核CPU运行Fluent,但实际上还是启用的并行,Host节点与node0节点同时执行了此语句。千万注意前面的语句中没有进行全局约简,若采用的是多核并行运行Fluent,则此时保存到文件中的数据可能是错误的。

  • 打开工作路径下的temperature.txt文件,如下图所示,其中保存了计算区域中所有单元的x,y坐标以及对应的温度值

3 读取文件中的数据

读取文本文件使用fscanf函数,该函数的使用方法与fprintf类似。

如工作路径下包含文本文件input.txt,文件内容为:

4
11 3 3 1.0 0.0 0.0 0.0 1.0 0.0
10 3 2 1.0 0.0 0.0 0.0 1.0 0.0
8 5 4 0.0 0.0 1.0 1.0 0.0 0.0
7 4 3 1.0 0.0 0.0 0.0 1.0 0.0

文件第一行数据为数据行数,从第2行开始为待提取的数据。

利用DEFINE_ON_DEMAND宏进行测试,代码如下:

DEFINE_ON_DEMAND(read_file)
{
int i = 0;
int npost;
FILE *fpin;
int a[10];
int b[10];
int c[10];
float d[10];
float e[10];
float f[10];
float g[10];
float x[10];
float y[10];

if ((fpin = fopen("input.txt", "r")) == NULL)
{
Message0("Input file does not exist!");
}
fscanf(fpin, "%d", &npost);
for (i = 0; i < npost; i++)
{
fscanf(fpin, "%d %d %d %f %f %f %f %f %f", &a[i], &b[i], &c[i], &d[i], &e[i], &f[i], &g[i], &x[i], &y[i]);
}
fclose(fpin);

for (i = 0; i < npost; i++)
{
Message0("%dt %dt %dt %f t%f t%f t%f t%f t%fn", a[i], b[i], c[i], d[i], e[i], f[i], g[i], x[i], y[i]);
}
}

代码编译执行并调用后,TUI窗口输出信息如下图所示。

从图中可以看到,数据读入正常。


相关文件下载:

本篇文章来源于微信公众号: CFD之道

赞(4) 打赏
版权声明:未经允许,请勿随意用于商业用途。
文章名称:《Fluent UDF|EX04 文件交互》
文章链接:https://www.topcfd.cn/11764/
本站资源仅供个人学习交流,请于下载后24小时内删除,不允许用于商业用途,否则法律问题自行承担。
分享到

说两句 抢沙发

评论前必须登录!

 

觉得文章有用就打赏一下文章作者吧

非常感谢你的打赏,我们将继续给力更多优质内容,让我们一起创建更加美好的网络世界!

支付宝扫一扫

微信扫一扫

登录

找回密码

注册