Skip to content
  • 最新
  • 版块
  • 东岳流体
  • 随机看[请狂点我]
皮肤
  • Light
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • 默认(不使用皮肤)
  • 不使用皮肤
折叠
CFD中文网

CFD中文网

  1. CFD中文网
  2. Fluent
  3. 关于UDF node_to_host传递数据的问题

关于UDF node_to_host传递数据的问题

已定时 已固定 已锁定 已移动 Fluent
3 帖子 2 发布者 2.7k 浏览
  • 从旧到新
  • 从新到旧
  • 最多赞同
回复
  • 在新帖中回复
登录后回复
此主题已被删除。只有拥有主题管理权限的用户可以查看。
  • C 离线
    C 离线
    csfine
    写于2023年12月20日 13:21 最后由 编辑
    #1

    #include "udf.h"

    define FLUID_ID 6

    define Total_node 5000

    struct Point
    {
    double x ;
    double y ;
    double z ;
    } ;

    DEFINE_ON_DEMAND(pressures_to_file)
    {

    int all_nodes ;
    int node_num = 0; //
    //double *array;
    int pe;
    double (*array)[3];
    //double ** array ;
    #if !RP_NODE
    FILE *fp1 =fopen("Grid coordinates.dat" , "w");
    #endif
    #if RP_NODE
    Domain *domain=Get_Domain(1);
    Thread *t;
    //cell_t c;
    face_t f ;
    Node *node ;
    int n ;
    t=Lookup_Thread(domain,FLUID_ID);
    double Pnode[Total_node][3]={0};
    struct Point point ;
    begin_f_loop(f,t)
    {
    f_node_loop(f,t,n)
    {
    node = F_NODE(f, t, n);
    point.x = NODE_X(node);
    point.y = NODE_Y(node);
    point.z = NODE_Z(node);
    int false = 0 ;
    for (int i = 0; i < node_num; i++)
    {
    if(Pnode[i][0] == point.x && Pnode[i][1] == point.y && Pnode[i][2] == point.z )
    {
    false = 1 ;
    }
    }
    if (false == 0)
    {
    Pnode[node_num][0] = point.x ;
    Pnode[node_num][1] = point.y ;
    Pnode[node_num][2] = point.z ;
    node_num = node_num +1 ;
    }
    }
    }
    end_f_loop(f,t)
    array=(double (*)[3])malloc(3*node_num*sizeof(double));
    int kk = 0;
    begin_f_loop(f,t)
    {
    f_node_loop(f,t,n)
    {
    node = F_NODE(f, t, n);
    point.x = NODE_X(node);
    point.y = NODE_Y(node);
    point.z = NODE_Z(node);
    int false = 0 ;
    for (int i = 0; i < kk; i++)
    {
    if(array[i][0] == point.x && array[i][1] == point.y && array[i][2] == point.z )
    {
    false = 1 ;
    }
    }
    if (false == 0)
    {
    array[kk][0] = point.x ;
    array[kk][1] = point.y ;
    array[kk][2] = point.z ;
    kk = kk +1 ;
    }
    }
    }
    end_f_loop(f,t)
    //Message(" node is %d\n" , kk);
    all_nodes = PRF_GISUM1(kk) ;
    pe = (I_AM_NODE_ZERO_P) ? node_host : node_zero;
    PRF_CSEND_INT(pe, &node_num, 1, myid);
    PRF_CSEND_DOUBLE(pe, array[0], 3*node_num, myid);
    free(array);
    if (I_AM_NODE_ZERO_P)
    compute_node_loop_not_zero (pe)
    {
    PRF_CRECV_INT(pe, &node_num, 1, pe);
    array=(double (*)[3])malloc(3*node_num*sizeof(double));
    PRF_CRECV_DOUBLE(pe, array[0], 3*node_num, pe);
    PRF_CSEND_INT(node_host, &node_num, 1, myid);
    PRF_CSEND_DOUBLE(node_host, array[0], 3*node_num, myid);
    free(array);
    }
    #endif
    //node_to_host_int_1(all_nodes) ;
    #if RP_HOST
    compute_node_loop (pe)
    {
    PRF_CRECV_INT(node_zero, &node_num, 1, node_zero);
    array=(double (*)[3])malloc(3*node_num*sizeof(double));
    PRF_CRECV_DOUBLE(node_zero, array[0], 3*node_num, node_zero);
    for (int i = 0; i < node_num; i++)
    {
    for (int j = 0; j < 3; j++)
    {
    fprintf(fp1 , "%g " , array[i][j]) ;
    }
    fprintf(fp1 , "\n") ;
    }
    free(array);
    }
    #endif
    node_to_host_int_1(all_nodes) ;
    #if !RP_NODE
    fclose(fp1) ;
    Message("Finished writing !\n");
    Message("all nodes= %d\n" , all_nodes);
    #endif

    }

    代码如上所示,主要实现的功能是将各个计算节点中的网格坐标发送到Host 节点。这一部分经过我的测试,没有问题。
    在上述代码中,我统计了总的网格节点数量(90行),并将节点总数发送到host节点,问题就来了:如果我把node_to_host 命令放在115行(已注释),当编译完成之后在fluent挂载的时候直接就卡死了,一直没反应。但是当我把这个命令放在143行的时候,就能成功显示。
    我的猜测是和117~145这一段的代码有关系,这一段代码主要是实现在host节点接收其他计算节点的坐标数组。
    由于本人计算机知识浅薄,目前尚不能明白上述问题所在,如有大神不吝赐教,我不胜感激!

    1 条回复 最后回复
  • C 离线
    C 离线
    csfine
    写于2023年12月20日 13:42 最后由 编辑
    #2

    发帖不多,帖子显示出来格式不大好看,大家包容包容。

    我想要发送总的网格节点到host的目的是为了构造一个数组来接收网格坐标以供后续使用,在我的代码中,我只是将数据写入文件夹,但是实际上我想要的是存进一个数组里面,各位大佬如果有好的思路可以给我分享一下。

    1 条回复 最后回复
  • M 离线
    M 离线
    martinliu
    写于2025年3月19日 04:43 最后由 编辑
    #3

    compute_node_loop 不能在HOST节点运行,你117行#if RP_HOST 规定了下面的代码在HOST节点里,但是还要进行compute node 循环,所以会卡住,可能?

    1 条回复 最后回复
2023年12月20日 13:21

1/3

2023年12月20日 13:21

2025年3月19日 04:43
  • 登录

  • 登录或注册以进行搜索。
1 / 3
  • 第一个帖子
    1/3
    最后一个帖子
0
  • 最新
  • 版块
  • 东岳流体
  • 随机看[请狂点我]