|
[Sponsors] | |||||
How do I read/write files in parallel using UDF? |
![]() |
|
|
LinkBack | Thread Tools | Search this Thread | Display Modes |
|
|
|
#1 |
|
New Member
Join Date: Nov 2022
Posts: 10
Rep Power: 4 ![]() |
Hey all, I'm trying to create a udf that reads a file containing x,y,z coordinates and then returning the value of the cell nearest to it. I managed to create the code, but I have trouble parallelizing it. At first, I had trouble because ansys repeats my udf 4 times (which is equal to the number of solver processes I input), so I decided to just use my udf on compute node zero by using if(I_AM_NODE_ZERO_P). However, I began to realize that this will fail because the other compute nodes will not be processed, and thus the I will not get the cell values at those compute nodes. My question now is, how do I parallelize reading/writing csv files using UDF? I consulted the ansys documentation on parallelizing udf, but I do not know how to start. Here is my code:
Code:
#include <udf.h>
#include <cxndsearch.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
static ND_Search *domain_table = NULL;
DEFINE_ON_DEMAND(find_cells)
{
#if !RP_HOST
if(I_AM_NODE_ZERO_P){
cell_t c;
Thread *t;
CX_Cell_Id *cx_cell;
real cCentroid;
real cVolume;
real P[3];
real P_Cell[3];
FILE *fp;
char line[1024];
int rayID, side, prevID, nextID, surfID;
double x,y,z;
fp = fopen("rays_csv_new.csv","r");
if(fp == NULL){
printf("Trouble reading file\nAborting..");
fclose(fp);
abort();
}
domain_table = CX_Start_ND_Point_Search(domain_table,TRUE,-1);
Message("Starting Cell Search...");
while(fgets(line,1024,fp)){
sscanf(line,"%d,%lg,%lg,%lg,%d,%d,%d,%d",&rayID,&x,&y,&z,&side,&prevID,&nextID,&surfID);
P[0] = x;
P[1] = y;
P[2] = z;
cx_cell = CX_Find_Cell_With_Point(domain_table,P,0.0);
if(cx_cell){
c = RP_CELL(cx_cell);
t = RP_THREAD(cx_cell);
cCentroid = C_CENTROID(P_Cell,c,t);
cVolume = C_VOLUME(c,t);
Message("%g \t %g \t %g \t %g\n",P[0],P[1],P[2],cVolume);
}else{
Message("Could not find cell at [%g,%g,%g]\n",P[0],P[1],P[2]);
}
}
domain_table = CX_End_ND_Point_Search(domain_table);
fclose(fp);
}
#endif
}
Code:
x y z 0.227898,1.0,-0.448053 4,-0.106937,1.0,0.379007 7,-0.350153,1.0,0.031367 9,0.293532,1.0,0.357582 11,-0.403077,1.0,-0.409584 13,0.476352,1.0,-0.0787738 15,-0.400827,1.0,-0.0563139 18,0.189004,1.0,0.217153 Code:
Could not find cell at [0.227898,1,-0.448053] Could not find cell at [-0.106937,1,0.379007] Could not find cell at [-0.350153,1,0.0313674] 0.293532 1 0.357582 1.82506e-08 Could not find cell at [-0.403077,1,-0.409584] Could not find cell at [0.476352,1,-0.0787738] Could not find cell at [-0.400827,1,-0.0563139] 0.189004 1 0.217153 1.95857e-08 |
|
|
|
|
|
|
|
|
#2 |
|
Senior Member
Alexander
Join Date: Apr 2013
Posts: 2,363
Rep Power: 35 ![]() ![]() |
try this code,
modify FL variable which represents the number of lines into your table file Code:
#include <udf.h>
#include <cxndsearch.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define FL 100 /*file length*/
static ND_Search *domain_table = NULL;
int rayID[FL], side[FL], prevID[FL], nextID[FL], surfID[FL];
real x[FL],y[FL],z[FL];
void my_read_from_table(char *file)
{
FILE *fp;
char line[1024];
int i=0;
fp = fopen(file,"r");
if(fp == NULL){
printf("Trouble reading file\nAborting..");
fclose(fp);
abort();
}
while(fgets(line,1024,fp)){
sscanf(line,"%d,%lf,%lf,%lf,%d,%d,%d,%d",&rayID[i],&x[i],&y[i],&z[i],&side[i],&prevID[i],&nextID[i],&surfID[i]);
i++;
}
fclose(fp);
Message("DEBUG: last line from table:\n %d,%f,%f,%f,%d,%d,%d,%d \n",rayID[FL],x[FL],y[FL],z[FL],side[FL],prevID[FL],nextID[FL],surfID[FL]);
}
DEFINE_ON_DEMAND(find_cells)
{
cell_t c;
Thread *t;
CX_Cell_Id *cx_cell;
real cCentroid;
real cVolume;
real P[3];
real P_Cell[3];
int i;
#if !RP_NODE
my_read_from_table("rays_csv_new.csv");
#endif
host_to_node_int(rayID,FL);
host_to_node_int(side,FL);
host_to_node_int(prevID,FL);
host_to_node_int(nextID,FL);
host_to_node_int(surfID,FL);
host_to_node_int(x,FL);
host_to_node_int(y,FL);
host_to_node_int(z,FL);
#if !RP_HOST
domain_table = CX_Start_ND_Point_Search(domain_table,TRUE,-1);
Message0("Starting Cell Search...");
for (i=0;i<FL;i++)
{
P[0] = x[i];
P[1] = y[i];
P[2] = z[i];
cx_cell = CX_Find_Cell_With_Point(domain_table,P,0.0);
if(cx_cell){
c = RP_CELL(cx_cell);
t = RP_THREAD(cx_cell);
cCentroid = C_CENTROID(P_Cell,c,t);
cVolume = C_VOLUME(c,t);
Message0("%f \t %f \t %f \t %f\n",P[0],P[1],P[2],cVolume);
}else{
Message0("Could not find cell at [%f,%f,%f]\n",P[0],P[1],P[2]);
}
}
domain_table = CX_End_ND_Point_Search(domain_table);
#endif
}
__________________
best regards ****************************** press LIKE if this message was helpful |
|
|
|
|
|
|
|
|
#3 | |
|
New Member
Join Date: Nov 2022
Posts: 10
Rep Power: 4 ![]() |
Quote:
Could not find cell at [0.000000,0.000000,0.000000] Could not find cell at [0.000000,0.000000,0.000000] Could not find cell at [0.000000,0.000000,0.000000] But I don't think this thread matters anymore since I've decided to just use a serial solver to do the udf. I was hoping you could help me with my other problem located here |
||
|
|
|
||
![]() |
| Tags |
| parallel, udf |
| Thread Tools | Search this Thread |
| Display Modes | |
|
|
Similar Threads
|
||||
| Thread | Thread Starter | Forum | Replies | Last Post |
| Dynamic mesh in parallel udf | rsarma | Fluent UDF and Scheme Programming | 4 | March 18, 2025 06:18 |
| UDF Compiling / Parallel mode | MV78 | Fluent UDF and Scheme Programming | 6 | May 29, 2018 06:02 |
| Fluent UDF wrong number of cells in parallel - correct in serial | dralexpe | Fluent UDF and Scheme Programming | 7 | May 17, 2018 09:26 |
| Strange problem: unresolved external symbol only for parallel UDF | lisa_china | Fluent UDF and Scheme Programming | 1 | May 29, 2017 23:50 |
| Parallel Fluent +UDF | Jack Martinez | FLUENT | 0 | June 28, 2007 12:19 |