内容纲要
本案例演示在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之道
评论前必须登录!
注册