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