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中文网

C

csfine

@csfine
关于
帖子
8
主题
2
群组
0
粉丝
0
关注
2

帖子

最新

  • 关于UDF node_to_host传递数据的问题
    C csfine

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

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


  • 关于UDF node_to_host传递数据的问题
    C csfine

    #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节点接收其他计算节点的坐标数组。
    由于本人计算机知识浅薄,目前尚不能明白上述问题所在,如有大神不吝赐教,我不胜感激!


  • 使用DEFINE_ON_DEMAND编译完成之后出现一些问题
    C csfine

    @coolhhh 感谢您的回复 ,确实是这个样,没发现那个字母大写了。


  • 使用DEFINE_ON_DEMAND编译完成之后出现一些问题
    C csfine

    继续更新,后面发生了很奇怪的事情,我试着重新编译,但是报错了,报错提示如下:看他的意时缺少了一个分号,但是我觉得这不合理,我仔细检查了语法,没有错误。

    image.png

    之后我重新尝试把代码复制到另外一个文件夹:但是却报了一个新的错误,不知道咋办了。有大佬给点建议吗,这可能是什么原因呢?我试着编译一些其他的代码,编译能成功。

    image.png


  • 使用DEFINE_ON_DEMAND编译完成之后出现一些问题
    C csfine

    我使用DEDINE_ON_DEMAND,目的是为了输出网格点坐标,在fluent完成了build,也完成了load。但是在excute on demand 里面发现 什么也没有,到目前不知道是为啥。
    代码如下:

    #include "udf.h"
    
    
    struct Point
    {
        double x ;
        double y ;
    #if RP_3D
        double z ;
    #endif    
    } ;
    
    DEFINE_ON_DEMAND(Read_point)
    {
        FILE * fp ;
        Thread * t ;
        Domain * domain ;
        cell_t c  ;
        Node * node ;
        int n  ;
    
        struct Point point ;
    
        domain = Get_Domain(1) ;
    
        fp = fopen ("data.txt" , "a+") ;
        fprintf(fp,  "x         y");
    
    #if RP_3D
        fprintf(fp  , "     z") ;
    #endif
        fprintf(fp , "\n");
    
        Thread_loop_c(t , domain)
        {
            begin_c_loop(c , t)
            {
                c_node_loop(c , t , n)
                {
                    node = C_NODE(c, t, n);
                    point.x = NODE_X(node);
                    point.y = NODE_Y(node);
    
                    #if RP_3D
    				point.z = NODE_Z(node);
    			    #endif
    
                    fprintf(fp , "%g    %g" , point.x , point.y) ;
    
                    #if RP_3D
    				fprintf(fp , "      %g" , point.z) ;
    			    #endif
                }
            }
            end_c_loop(c ,t) 
        }
    
        fclose (fp) ;
    }
    

    c3d5474c-f237-4bc5-bfb1-105f4d067e21-image.png


  • 基于Fluent 中的UDF做双向流固耦合。
    C csfine

    @吴优 现在的问题是如何将我的我的结构求解模块和fluent联立起来。是如何获取wall的表面力用于插值到固体域网格。


  • 感觉读了个假博士
    C csfine

    @李东岳 哈哈,东岳博士好有趣,关注cici楼主动态持续三年。


  • 基于Fluent 中的UDF做双向流固耦合。
    C csfine

    @吴优 您好,不知道可否得到您的联系方式,想向您请教一下。谢谢

  • 登录

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