2021年12月16日——udf并行中打印数据的问题

昨天失眠,今天nba还有俩绝杀。。
所以下午才开始干活,比较难受,先看下昨晚仿真的效果,然后解决一下压力曲线的问题

今天解决了一个fluent中udf打印数据的问题
本想参考这个
https://www.cnblogs.com/liusuanyatong/p/11259603.html
结果这哥们文章留坑没写完。。。

直接上自己的代码
没啥技术含量,也是师兄那继承下的
就是12个核跑就打印12遍比较恶心,后来发现有个环境变量表示着程序所在的计算节点号码

#include "udf.h"


#define CDA_NUM 25


int msgCount = 0; // 打印消息额次数

/* 计算流量 */
DEFINE_EXECUTE_AT_END(cal_discharge)
{
    Domain *domain;
    Thread *thread;
    face_t f;
    int ID = 11;

    domain = Get_Domain(1);
    thread = Lookup_Thread(domain, ID);
    # if !RP_NODE
    {
        Message("flow____cal\n");
    }  
    #endif
    begin_f_loop(f, thread)
    {
        F_UDMI(f, thread, 0) = F_FLUX(f, thread);
    }
    end_f_loop(f, thread)
}
/* 根据流量计算压力 */
DEFINE_PROFILE(p_outlet, t, i)
{
    face_t f;
    real density = 889.0;
    real p;
    real CdA = CDA_NUM * pow(10, -6);
    real flow = 0.0;
    real total_flow = 0.0;
    begin_f_loop(f, t)
    {
         flow += F_UDMI(f, t,0);
    }
    end_f_loop(f, t)
    
    total_flow = PRF_GRSUM1(flow);
    p = (((4*total_flow/density)/CdA)*((4*total_flow/density)/CdA))*density/2;
    
    if (p<0)
    {
        p = 0;
    }
    if (p>3500000)
    {
        p = 3500000;
    }
    // 做消息过滤
    if(myid==0) // myid为环境变量,表示自己所在node号码
    { 
    	// 过滤后还是重复3次,没找到原因,这里做一个去重
        if(msgCount++ == 0){
            Message("flux: %f kg/s\n", total_flow);
            Message("p: %f Pa\n", p);    
        }
        if(msgCount>2){
            msgCount=0;
        }
    }
    
    begin_f_loop(f, t)
    {
        F_PROFILE(f, t, i) = p;
    }
    end_f_loop(f, t)
}
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 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 文件,你需要使用相应的库函数来实现。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值