Skip to content

Commit 19b4d15

Browse files
thilinarmtbstgeke
authored andcommitted
[gencon] Add redundant runs and return error when face-check fails
1 parent 63c4445 commit 19b4d15

File tree

7 files changed

+105
-112
lines changed

7 files changed

+105
-112
lines changed

src/gencon/face-check.c

Lines changed: 29 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -205,41 +205,47 @@ int faceCheck(Mesh mesh,struct comm *c)
205205
struct array shared; array_init(ElementID,&shared,200);
206206
buffer bfr; buffer_init(&bfr,1024);
207207

208-
int i,j,k,l;
209-
for(i=0; i<nelt; i++){
210-
for(j=0; j<nf; j++){
211-
shared.n=0;
208+
int err = 0;
209+
210+
int i, j, k, l;
211+
for (i = 0; i < nelt && err == 0; i++) {
212+
for (j = 0; j < nf && err == 0; j++) {
213+
shared.n = 0;
212214

213-
for(k=0; k<nfv; k++){
214-
ulong globalId=ptr[i*nv+faces[j][k]-1].globalId+1;
215-
int indx=getPosition(map,globalId);
216-
assert(indx<map->size && "Return index out of bounds");
215+
for (k = 0; k < nfv; k++) {
216+
ulong globalId = ptr[i*nv + faces[j][k] - 1].globalId + 1;
217+
int indx = getPosition(map, globalId);
218+
assert(indx < map->size && "Return index out of bounds");
217219

218220
ElementID elemId;
219-
for(l=map->offsets[indx]; l<map->offsets[indx+1]; l++){
220-
elemId.elementId=map->elements[l];
221-
array_cat(ElementID,&shared,&elemId,1);
221+
for (l = map->offsets[indx]; l < map->offsets[indx + 1]; l++) {
222+
elemId.elementId = map->elements[l];
223+
array_cat(ElementID, &shared, &elemId, 1);
222224
}
223225
}
224226

225-
sarray_sort(ElementID,shared.ptr,shared.n,elementId,1,&bfr);
226-
227-
ulong prev=0; int ncount=1;
228-
ElementID *ptr=shared.ptr;
229-
for(l=1; l<shared.n; l++){
230-
if(ptr[l].elementId!=ptr[prev].elementId){
231-
assert(ncount!=3);
232-
prev=l,ncount=1;
233-
} else ncount++;
227+
sarray_sort(ElementID, shared.ptr, shared.n, elementId, 1, &bfr);
228+
229+
ulong prev = 0;
230+
int ncount = 1;
231+
ElementID *ptr = shared.ptr;
232+
for (l = 1; l < shared.n; l++) {
233+
if (ptr[l].elementId != ptr[prev].elementId) {
234+
if (ncount == 3) err = 1;
235+
prev = l;
236+
ncount = 1;
237+
} else
238+
ncount++;
234239
}
235-
assert(ncount!=3);
240+
241+
if (ncount == 3)
242+
err = 1;
236243
}
237244
}
238245

239246
buffer_free(&bfr);
240247
array_free(&shared);
241-
242248
freeVToEMap(map);
243249

244-
return 0;
250+
return err;
245251
}

src/gencon/gencon.h

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -32,25 +32,26 @@ extern int PRE_TO_SYM_VERTEX[GC_MAX_VERTICES];
3232
extern int PRE_TO_SYM_FACE[GC_MAX_FACES];
3333

3434
/* Mesh */
35-
int mesh_init(Mesh *m,int nel,int nDim);
35+
int mesh_init(Mesh *m, int nel, int nDim);
3636
Element MeshGetElements(Mesh m);
37-
void get_vertex_ids(long long **ids,Mesh m);
38-
void get_vertex_coordinates(double **coords,Mesh m);
37+
void get_vertex_ids(long long **ids, Mesh m);
38+
void get_vertex_coordinates(double **coords, Mesh m);
3939
int get_mesh_dim(Mesh m);
4040
int get_mesh_nel(Mesh m);
4141
int mesh_free(Mesh m);
4242

4343
/* Read Nek5000 mesh files */
44-
int read_geometry(Mesh *mesh,char *fname,struct comm *c);
45-
int read_connectivity(Mesh mesh,char *fname,struct comm *c);
46-
int write_connectivity(Mesh mesh,char *fname,struct comm *c);
47-
int read_co2_mesh(Mesh *mesh,char *fname,struct comm *c);
44+
int read_geometry(Mesh *mesh, char *fname, struct comm *c);
45+
int read_connectivity(Mesh mesh, char *fname, struct comm *c);
46+
int write_connectivity(Mesh mesh, char *fname, struct comm *c);
47+
int read_co2_mesh(Mesh *mesh, char *fname, struct comm *c);
4848

49+
/* Connectivity */
4950
int findMinNeighborDistance(Mesh mesh);
50-
int findSegments(Mesh mesh,struct comm *c,GenmapScalar tol,int verbose,buffer *bfr);
51-
int faceCheck(Mesh mesh,struct comm *c);
52-
int setGlobalID(Mesh mesh,struct comm *c);
53-
int sendBack(Mesh mesh,struct comm *c);
54-
int matchPeriodicFaces(Mesh mesh,struct comm *c);
51+
int findSegments(Mesh mesh, struct comm *c, GenmapScalar tol, int verbose, buffer *bfr);
52+
int faceCheck(Mesh mesh, struct comm *c);
53+
int setGlobalID(Mesh mesh, struct comm *c);
54+
int sendBack(Mesh mesh, struct comm *c, buffer *bfr);
55+
int matchPeriodicFaces(Mesh mesh, struct comm *c, buffer *bfr);
5556

5657
#endif

src/gencon/geometry-io.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@ int transferBoundaryFaces(Mesh mesh,struct comm *c){
2929
struct crystal cr; crystal_init(&cr,c);
3030
sarray_transfer(struct Boundary_private,boundary,proc,1,&cr);
3131
crystal_free(&cr);
32+
33+
return 0;
3234
}
3335

3436
int readRe2Header(Mesh *mesh_,MPI_File file,struct comm *c){

src/gencon/global-id.c

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -48,16 +48,13 @@ int setGlobalID(Mesh mesh, struct comm *c) {
4848
return 0;
4949
}
5050

51-
int sendBack(Mesh mesh, struct comm *c) {
51+
int sendBack(Mesh mesh, struct comm *c, buffer *bfr) {
5252
struct crystal cr;
5353
crystal_init(&cr, c);
5454
sarray_transfer(struct Point_private, &mesh->elements, origin, 0, &cr);
5555
crystal_free(&cr);
5656

57-
buffer bfr;
58-
buffer_init(&bfr, 1024);
59-
sarray_sort(struct Point_private, mesh->elements.ptr, mesh->elements.n, sequenceId, 1, &bfr);
60-
buffer_free(&bfr);
57+
sarray_sort(struct Point_private, mesh->elements.ptr, mesh->elements.n, sequenceId, 1, bfr);
6158

6259
return 0;
6360
}

src/gencon/periodic.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -284,7 +284,7 @@ int setPeriodicFaceCoordinates(Mesh mesh, struct comm *c){
284284
}
285285
}
286286

287-
int matchPeriodicFaces(Mesh mesh, struct comm *c){
287+
int matchPeriodicFaces(Mesh mesh, struct comm *c, buffer *bfr){
288288
setPeriodicFaceCoordinates(mesh, c);
289289
gatherMatchingPeriodicFaces(mesh, c);
290290

@@ -296,7 +296,7 @@ int matchPeriodicFaces(Mesh mesh, struct comm *c){
296296
array_free(&matched);
297297

298298
compressPeriodicVertices(mesh, c);
299-
sendBack(mesh, c);
299+
sendBack(mesh, c, bfr);
300300

301301
return 0;
302302
}

src/gencon/segments.c

Lines changed: 39 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,6 @@ static int sortSegments(Mesh mesh, struct comm *c, int dim, buffer *bfr) {
3131
s = e;
3232
}
3333

34-
comm_barrier(c);
35-
3634
// Set globalId
3735
slong out[2][1], buf[2][1], in[1];
3836
in[0] = nPoints;
@@ -145,75 +143,58 @@ int findSegments(Mesh mesh, struct comm *c, GenmapScalar tol, int verbose, buffe
145143
// }
146144
// comm_barrier(&nonZeroRanks);
147145

148-
// if (verbose > 1 && rank == 0) {
149-
// printf("\tDone initializing\n");
150-
// fflush(stdout);
151-
// }
152-
// comm_barrier(&nonZeroRanks);
153-
154146
comm_ext orig;
155147
#ifdef MPI
156148
MPI_Comm_dup(c->c, &orig);
157149
#endif
158150
struct comm nonZeroRanks;
159151

160-
int dim, bin, rank;
161-
for (dim = 0; dim < nDim; dim++) {
162-
nPoints = mesh->elements.n;
163-
164-
bin = 1;
165-
if (nPoints == 0)
166-
bin = 0;
167-
152+
int dim, bin, rank, t;
153+
for (t = 0; t < nDim; t++) {
154+
for (dim = 0; dim < nDim; dim++) {
155+
nPoints = mesh->elements.n;
156+
157+
bin = 1;
158+
if (nPoints == 0)
159+
bin = 0;
160+
168161
#ifdef MPI
169-
MPI_Comm new;
170-
MPI_Comm_split(orig, bin, rank, &new);
171-
comm_init(&nonZeroRanks, new);
172-
MPI_Comm_free(&new);
162+
MPI_Comm new;
163+
MPI_Comm_split(orig, bin, rank, &new);
164+
comm_init(&nonZeroRanks, new);
165+
MPI_Comm_free(&new);
173166
#else
174-
comm_init(&nonZeroRanks, 1);
167+
comm_init(&nonZeroRanks, 1);
175168
#endif
176169

177-
rank = nonZeroRanks.id;
178-
for (i = 0; i < nPoints; i++)
179-
points[i].proc = rank;
170+
rank = nonZeroRanks.id;
171+
for (i = 0; i < nPoints; i++)
172+
points[i].proc = rank;
180173

181-
if (bin == 1) {
182-
if (verbose > 0 && rank == 0) {
183-
printf("\tsortSegments started.\n");
184-
fflush(stdout);
185-
}
186-
sortSegments(mesh, &nonZeroRanks, dim, bfr);
187-
comm_barrier(&nonZeroRanks);
188-
if (verbose > 0 && rank == 0)
189-
printf("\tsortSegments finished.\n");
190-
191-
findLocalSegments(mesh, dim, tolSquared);
192-
comm_barrier(&nonZeroRanks);
193-
if (verbose > 0 && rank == 0)
194-
printf("\tfindLocalSegments finished.\n");
195-
196-
mergeSegments(mesh, &nonZeroRanks, dim, tolSquared, bfr);
197-
comm_barrier(&nonZeroRanks);
198-
if (verbose > 0 && rank == 0)
199-
printf("\tmergeSegments finished.\n");
200-
201-
if (verbose > 0) {
202-
nPoints = mesh->elements.n;
203-
points = mesh->elements.ptr;
204-
sint count = 0;
205-
for (i = 0; i < nPoints; i++)
206-
if (points[i].ifSegment > 0)
207-
count++;
208-
209-
in[0] = count;
210-
comm_allreduce(&nonZeroRanks, gs_long, gs_add, in, 1, buf);
211-
if (rank == 0)
212-
printf("locglob: %d %lld\n", dim + 1, in[0] + 1);
174+
if (bin == 1) {
175+
sortSegments(mesh, &nonZeroRanks, dim, bfr);
176+
177+
findLocalSegments(mesh, dim, tolSquared);
178+
179+
mergeSegments(mesh, &nonZeroRanks, dim, tolSquared, bfr);
180+
181+
if (verbose > 0) {
182+
nPoints = mesh->elements.n;
183+
points = mesh->elements.ptr;
184+
sint count = 0;
185+
for (i = 0; i < nPoints; i++)
186+
if (points[i].ifSegment > 0)
187+
count++;
188+
189+
in[0] = count;
190+
comm_allreduce(&nonZeroRanks, gs_long, gs_add, in, 1, buf);
191+
if (rank == 0)
192+
printf("\tlocglob: %d %d %lld\n", t + 1, dim + 1, in[0] + 1);
193+
}
213194
}
214-
}
215195

216-
comm_free(&nonZeroRanks);
196+
comm_free(&nonZeroRanks);
197+
}
217198
}
218199

219200
#ifdef MPI

src/parCon.c

Lines changed: 18 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -26,12 +26,9 @@ int parRSB_findConnectivity(long long *vertexid, double *coord, int nelt, int nd
2626
uint size = c.np;
2727

2828
if (rank == 0 && verbose > 0)
29-
printf("Generating connectivity ...");
29+
printf("Generating connectivity ...\n");
3030
fflush(stdout);
3131

32-
if (verbose > 0 && rank == 0)
33-
printf("\n\tnelt/ndim/nperiodic: %d/%d/%d\n", nelt, ndim, nPeriodicFaces);
34-
3532
double t_con = 0.0;
3633
comm_barrier(&c);
3734
t_con -= comm_time();
@@ -86,18 +83,25 @@ int parRSB_findConnectivity(long long *vertexid, double *coord, int nelt, int nd
8683

8784
buffer bfr;
8885
buffer_init(&bfr, 1024);
86+
8987
findSegments(mesh, &c, tol, verbose, &bfr);
90-
buffer_free(&bfr);
9188

9289
setGlobalID(mesh, &c);
90+
sendBack(mesh, &c, &bfr);
91+
92+
sint buf;
93+
sint err = faceCheck(mesh, &c);
94+
comm_allreduce(&c, gs_int, gs_max, &err, 1, &buf);
95+
if (err > 0) {
96+
buffer_free(&bfr);
97+
mesh_free(mesh);
98+
comm_free(&c);
99+
return err;
100+
}
93101

94-
sendBack(mesh, &c);
95-
96-
faceCheck(mesh, &c);
97-
98-
matchPeriodicFaces(mesh, &c);
102+
matchPeriodicFaces(mesh, &c, &bfr);
99103

100-
// copy output
104+
// Copy output
101105
Point ptr = mesh->elements.ptr;
102106
for (i = 0; i < nelt*nvertex; i++)
103107
vertexid[i] = ptr[i].globalId + 1;
@@ -107,9 +111,11 @@ int parRSB_findConnectivity(long long *vertexid, double *coord, int nelt, int nd
107111

108112
if (rank == 0 && verbose > 0)
109113
printf("\tfinished in %g s\n",t_con);
114+
fflush(stdout);
110115

116+
buffer_free(&bfr);
111117
mesh_free(mesh);
112118
comm_free(&c);
113119

114-
return 0;
120+
return err;
115121
}

0 commit comments

Comments
 (0)