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.2k 浏览
  • 从旧到新
  • 从新到旧
  • 最多赞同
回复
  • 在新帖中回复
登录后回复
此主题已被删除。只有拥有主题管理权限的用户可以查看。
  • C 离线
    C 离线
    csfine
    写于 最后由 编辑
    #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
    写于 最后由 编辑
    #2

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

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

    1 条回复 最后回复
  • M 离线
    M 离线
    martinliu
    写于 最后由 编辑
    #3

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

    1 条回复 最后回复

  • 登录

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