fluent 并行版的 Scheme 问题

49 篇文章 1 订阅
47 篇文章 3 订阅

运行并行版的 FLUENT,写 Scheme 需要注意一些问题。


1 rpgetvar or %rpgetvar


编写 UDF 和 Scheme 脚本的时候,发现 UDF 中执行 RP_Set_Real 后,用 rpgetvar 获取不到对应的值。


尝试各种方法始终没法正常获取,甚至是无奈的 CX_Interpret_String。


而执行 rpsetvar 后执行 RP_Get_Real 却不存在问题。


由于某个方法依赖于这种数据交换方式,这样就导致整个程序瘫痪。


无意间,使用 %rpgetvar 来获取,正确的值出现了。


两者的差别到底是什么呢?


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Fluent UDF 中并行读写文件可以通过以下步骤实现: 1. 定义一个文件句柄,指向你要读写的文件。可以使用标准的 C 文件 I/O 函数,如 fopen、fclose、fread 和 fwrite。 2. 使用 Fluent UDF 函数 hook_cold_init 来打开文件,并将文件句柄存储在一个全局变量中。这个函数只会在 Fluent 初始化时调用一次。 3. 在 Fluent UDF 函数 hook_loop 中,使用 Fluent API 函数,如 RP_Get_Real,来获取模拟时间步长的当前值。根据需要,可以将此值与一个预定义的时间间隔进行比较,以判断是否应该读写文件。 4. 如果需要读写文件,则使用 Fluent UDF 函数 hook_compute_fluxes 来读写数据。这个函数可以并行执行,因此可以在多个处理器上同时读写文件。 5. 在 Fluent UDF 函数 hook_cold_shutdown 中关闭文件句柄,并释放任何分配的内存。 以下是一个示例代码,用于并行读取和写入一个文本文件: ``` #include "udf.h" #include <stdio.h> #include <stdlib.h> #define FILENAME "data.txt" #define INTERVAL 10.0 FILE *fp; DEFINE_ON_DEMAND(open_file) { fp = fopen(FILENAME, "w"); if (fp == NULL) { Message("Error opening file.\n"); return; } fclose(fp); } DEFINE_ON_DEMAND(close_file) { if (fp != NULL) { fclose(fp); } } DEFINE_EXECUTE_AT_END(write_file) { real time = RP_Get_Real("flow-time"); if (time >= INTERVAL) { int i, myid, nproc; char filename[256]; sprintf(filename, "%s.%d", FILENAME, PRF_GRP_ID()); fp = fopen(filename, "w"); if (fp == NULL) { Message("Error opening file.\n"); return; } myid = PRF_GRP_ID(); nproc = PRF_NPROCS(); for (i = 0; i < 1000; i++) { if (i % nproc == myid) { fprintf(fp, "%d\n", i); } } fclose(fp); } } DEFINE_ON_DEMAND(read_file) { char line[256]; fp = fopen(FILENAME, "r"); if (fp == NULL) { Message("Error opening file.\n"); return; } while (fgets(line, sizeof(line), fp) != NULL) { Message("Line: %s", line); } fclose(fp); } ``` 在此示例中,我们使用了三个 Fluent UDF 函数:open_file、close_file 和 read_file。这些函数是通过在 Fluent 命令行中输入相应的文本来调用的,例如: ``` udf > define_on_demand open_file udf > define_on_demand close_file udf > define_on_demand read_file ``` 我们还定义了一个新的 Fluent UDF 函数 write_file,它使用 RP_Get_Real 函数获取当前模拟时间步长,然后在指定的时间间隔后并行写入数据到一个新的文件中。每个处理器只会写入一部分数据,以确保数据的一致性。 要使用 write_file 函数,请将以下文本添加到 Fluent 的启动脚本中: ``` (rp-var-define 'udf/execute-at-end-functions '((write_file))) ``` 这将确保 write_file 函数在每个时间步长结束时被调用。 请注意,此示例仅演示了如何并行读取和写入一个文本文件。如果你需要读写其他类型的文件,例如二进制文件或 HDF5 文件,你需要使用相应的库函数来实现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值