发帖不多,帖子显示出来格式不大好看,大家包容包容。
我想要发送总的网格节点到host的目的是为了构造一个数组来接收网格坐标以供后续使用,在我的代码中,我只是将数据写入文件夹,但是实际上我想要的是存进一个数组里面,各位大佬如果有好的思路可以给我分享一下。
发帖不多,帖子显示出来格式不大好看,大家包容包容。
我想要发送总的网格节点到host的目的是为了构造一个数组来接收网格坐标以供后续使用,在我的代码中,我只是将数据写入文件夹,但是实际上我想要的是存进一个数组里面,各位大佬如果有好的思路可以给我分享一下。
#include "udf.h"
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节点接收其他计算节点的坐标数组。
由于本人计算机知识浅薄,目前尚不能明白上述问题所在,如有大神不吝赐教,我不胜感激!
@coolhhh 感谢您的回复 ,确实是这个样,没发现那个字母大写了。
继续更新,后面发生了很奇怪的事情,我试着重新编译,但是报错了,报错提示如下:看他的意时缺少了一个分号,但是我觉得这不合理,我仔细检查了语法,没有错误。
之后我重新尝试把代码复制到另外一个文件夹:但是却报了一个新的错误,不知道咋办了。有大佬给点建议吗,这可能是什么原因呢?我试着编译一些其他的代码,编译能成功。
我使用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) ;
}
@吴优 现在的问题是如何将我的我的结构求解模块和fluent联立起来。是如何获取wall的表面力用于插值到固体域网格。
@李东岳 哈哈,东岳博士好有趣,关注cici楼主动态持续三年。
@吴优 您好,不知道可否得到您的联系方式,想向您请教一下。谢谢