37 #include "boost/lambda/lambda.hpp"
56 adj_of_proc( vtx_distr.np() )
69 : vtx_distr(loc_size, comm),
73 adj_of_proc( vtx_distr.np() )
99 memcpy(
vtx_XYZ+3*loc_index, xyz, 3*
sizeof(
float));
120 ASSERT(
adj==NULL,
"Graph is already finalized\n");
125 unsigned int edge_size=3;
137 sdispls[proc] = total_size;
138 scounts[proc] = edge_size * (s)->size();
139 total_size += edge_size * ((s)->size)();
141 int * sendbuf = (
int *)
xmalloc( (total_size+1) *
sizeof(int ) );
147 ASSERT(sdispls[proc] == buf_pos,
148 "Mismatch between displacement %d and buffer position %d. \n", sdispls[proc], buf_pos );
149 while ( ! (s)->empty() ) {
151 sendbuf[buf_pos++]=edge.
from;
152 sendbuf[buf_pos++]=edge.
to;
153 sendbuf[buf_pos++]=edge.
weight;
167 rdispls[proc] = total_size;
168 total_size += rcounts[proc];
171 int * recvbuf = (
int *)
xmalloc( (total_size+1) *
sizeof(int ) );
174 sendbuf, scounts, sdispls,
MPI_INT,
175 recvbuf, rcounts, rdispls,
MPI_INT,
188 int size=total_size/edge_size;
189 std::sort(edges, edges + size);
204 Edge unknown_edge={-1,-1,0};
205 Edge *last_edge=&unknown_edge;
207 for(i=0;i<size;i++) {
208 if (! (*last_edge < edges[i]) )
continue;
212 "Received non-local edge: %d %d at position %d\n",edges[i].
from, edges[i].
to,i);
215 ASSERT( row <= loc_from,
"Decrease in sorted edges at %d\n",i);
217 while ( row < loc_from ) rows[++row]=i;
218 adj[i_adj]=edges[i].
to;
260 DBGMSG(
"Connectivity of subgraphs is OK.\n");
271 for(
int i_neigh=
rows[vtx]; i_neigh<
rows[vtx+1];i_neigh++) {
272 neighbour =
adj[i_neigh];
285 ASSERT(
adj,
"Can not view non finalized graph.\n");
290 for(col=
rows[row]; col<
rows[row+1]; col++) {
301 int loc_row, row, row_pos;
302 int col_pos,col,loc_col;
306 for(row_pos=
rows[loc_row];row_pos<
rows[loc_row+1];row_pos++) {
311 for(col_pos=rows[loc_col]; col_pos<rows[loc_col+1]; col_pos++)
312 if (
adj[col_pos]==row)
break;
313 if (
adj[col_pos]!=row)
return false;
348 PetscMalloc(lsize_vtxs*
sizeof(
int), &
rows);
349 PetscMalloc(lsize_adj*
sizeof(
int),&
adj);
356 ASSERT(
adj &&
rows,
"Can not make partition of non finalized graph.\n");
366 const PetscInt *is_array;
367 ISGetIndices(
part_IS, &is_array);
369 ISRestoreIndices(
part_IS, &is_array);
394 rows =
new int[lsize_vtxs];
395 adj =
new int[lsize_adj];
404 "METIS could be used only with localized distribution.\n");
419 #if (METIS_VER_MAJOR >= 5)
420 if (
sizeof(idx_t) !=
sizeof(
int) ) {
421 printf(
"ERROR in GRAPH_DIVIDE_C: Wrong type of integers for METIS.\n");
429 int options[METIS_NOPTIONS];
431 for (
unsigned int i = 0;i < METIS_NOPTIONS;i++) options[i] = -1;
433 options[METIS_OPTION_OBJTYPE] = METIS_OBJTYPE_CUT;
434 options[METIS_OPTION_CTYPE] = METIS_CTYPE_RM;
435 options[METIS_OPTION_IPTYPE] = METIS_IPTYPE_GROW;
436 options[METIS_OPTION_RTYPE] = METIS_RTYPE_GREEDY;
437 options[METIS_OPTION_NCUTS] = 1;
438 options[METIS_OPTION_NSEPS] = 1;
439 options[METIS_OPTION_NUMBERING] = num_flag;
440 options[METIS_OPTION_NITER] = 10;
441 options[METIS_OPTION_SEED] = 12345;
442 options[METIS_OPTION_MINCONN] = 1;
443 options[METIS_OPTION_CONTIG] = 0;
444 options[METIS_OPTION_COMPRESS] = 0;
445 options[METIS_OPTION_CCORDER] = 0;
446 options[METIS_OPTION_UFACTOR] = 0;
448 options[METIS_OPTION_DBGLVL] = 0;
454 for (
unsigned int i = 0; i < 5; i++ ) options[i] = 0;
464 for (
unsigned int i = 0; i <
vtx_distr.
lsize(); i++ ) part[i] = num_flag;
472 #if (METIS_VER_MAJOR >= 5)
473 options[METIS_OPTION_PTYPE] = METIS_PTYPE_RB;
474 options[METIS_OPTION_UFACTOR] = 1;
475 METIS_PartGraphRecursive(&n_vtx, &ncon,
rows,
adj,
477 ubvec, options, &edgecut,part);
480 METIS_PartGraphRecursive(&n_vtx,
rows,
adj,
482 &n_proc, options, &edgecut, part);
486 #if (METIS_VER_MAJOR >= 5)
487 options[METIS_OPTION_PTYPE] = METIS_PTYPE_KWAY;
488 options[METIS_OPTION_UFACTOR] = 30;
489 METIS_PartGraphKway(&n_vtx, &ncon,
rows,
adj,
491 ubvec, options, &edgecut, part);
493 METIS_PartGraphKway(&n_vtx,
rows,
adj,
495 &n_proc,options,&edgecut,part);