85 if ( order == NULL ) {
86 pastix_print_error(
"orderSupernodes: invalid order pointer" );
90 lvl_kway = pastix_imax( lvl_proj, lvl_kway );
112 MALLOC_INTERN( n_levels, graph->n,
int );
113 for( sn_id=0; sn_id<order->
cblknbr; sn_id++ ) {
118 n_levels[ order->
peritab[i] ] = level;
127 MALLOC_INTERN( new_selevtx, order->
vertnbr, int8_t );
131 memset( new_selevtx, 0, order->
vertnbr *
sizeof(int8_t) );
133 new_cblknbr = sn_first;
135 for (sn_id = sn_first; sn_id < order->
cblknbr; sn_id++) {
136 pastix_graph_t sn_graph;
140 pastix_int_t sn_nbpart_proj, sn_nbparts, sn_nbparts_max;
142 perm_treetab[sn_id-sn_first] = new_cblknbr;
146 lnode = order->
rangtab[sn_id+1];
147 sn_vertnbr = lnode - fnode;
151 if ( (sn_level > (lvl_kway)) ||
152 (sn_nbparts_max == 1) ||
153 ((sn_id == order->
cblknbr-1) && (do_schur)) )
155 new_treetab[ new_cblknbr ] = order->
treetab[sn_id];
157 new_rangtab[ new_cblknbr ] = lnode;
162 fprintf( stdout,
" - Working on cblk %ld (level= %d, n= %ld):\n",
163 (
long)sn_id, (
int)sn_level, (
long)(lnode-fnode) );
170 memset( &sn_graph, 0,
sizeof(pastix_graph_t) );
180 if ( ret != EXIT_SUCCESS ) {
181 fprintf(stderr,
"Fatal error in graphIsolateSupernode()!\n");
184 assert( sn_vertnbr == sn_graph.n );
190 ( sn_level <= lvl_proj ) &&
194 memset( depth_size, 0, max_depth *
sizeof(
pastix_int_t) );
203 &sn_graph, &sn_order,
204 fnode, lnode, sn_level,
205 max_distance, max_depth, max_width,
211 fprintf(stdout,
" - Results of the projection:\n" );
212 for( i=0; i<max_depth; i++ ) {
213 fprintf( stdout,
" - At level %d: %8ld\n",
214 (
int)(i+1), (
long)depth_size[i] );
226 for( i=0; i<max_depth; i++ ) {
227 totalsel += depth_size[i];
230 if ( totalsel > selecmax ) {
234 total -= depth_size[i];
235 selected += depth_size[i];
255 fprintf( stdout,
" - %ld nodes selected, %ld remains for K-Way\n",
256 (
long)(sn_vertnbr - total), (
long)(total) );
263 if ( (sn_vertnbr - total) == 0 ) {
275 sn_nbpart_proj = sn_nbparts;
289 if ( nbpart_kway < 2 ) {
294 if ( sn_nbparts > 0 ) {
295 pastix_graph_t tmpgraph;
296 memset( &tmpgraph, 0,
sizeof(pastix_graph_t) );
307 memcpy( &sn_graph, &tmpgraph,
sizeof(pastix_graph_t) );
325 fprintf(stdout,
" - Connected components: %ld\n", (
long)comp_nbr );
329 for( i=0; i<comp_nbr; i++) {
337 cp_sz = comp_sze[cp_id];
342 if ( smallcp_id == -1 ) {
347 for( i=0; (i<sn_graph.n) && (cp_sz>0); i++) {
348 if ( comp_vtx[i] == cp_id ) {
349 comp_vtx[i] = smallcp_id;
354 comp_sze[ smallcp_id ] = smallcp_sz;
359 if ( nbpart_kway < 2 ) {
383 &comp_nbr, comp_sze, comp_vtx,
384 cp_id, nbpart_kway );
390 if ( comp_nbr > 1 ) {
392 sortptr[0] = comp_vtx;
393 sortptr[1] = order->
peritab + fnode;
395 qsort2IntAsc( sortptr, sn_graph.n );
398 for(i=comp_nbr-1; i>=0; i--) {
399 if (comp_sze[i] > 0) {
412 if ( sn_vertnbr > 0 ) {
417 assert( sn_nbparts >= 1 );
418 assert( new_rangtab[ new_cblknbr ] == fnode );
422 new_selevtx[ new_cblknbr ] = ( sn_nbparts-1 < sn_nbpart_proj ) ? SYMBCBLK_PROJ : SYMBCBLK_KWAY;
424 new_rangtab[ new_cblknbr ] = fnode;
427 assert( fnode <= lnode );
432 for(i=sn_nbparts-2; i>=0; i--)
435 new_treetab[new_cblknbr-1] = -1 - new_cblknbr;
436 new_selevtx[ new_cblknbr ] = ( i < sn_nbpart_proj ) ? SYMBCBLK_PROJ : SYMBCBLK_KWAY;
439 new_rangtab[new_cblknbr] = fnode;
442 assert( fnode <= lnode );
445 new_treetab[ new_cblknbr-1 ] = order->
treetab[sn_id];
455 assert( new_rangtab[new_cblknbr] == order->
vertnbr );
457 if ( n_levels != NULL ) {
460 if ( depth_size != NULL ) {
469 memFree_null( order->
treetab );
473 oldtree = new_treetab;
474 for(i=0; i<new_cblknbr; i++, newtree++, oldtree++) {
475 if ( *oldtree >= sn_first ) {
476 *newtree = perm_treetab[ *oldtree - sn_first ];
478 else if ( *oldtree >= 0 ) {
481 else if ( *oldtree == -1 ) {
486 *newtree = - *oldtree - 1;
489 memFree_null( new_treetab );
490 memFree_null( perm_treetab );
498 order->
selevtx = realloc( new_selevtx, new_cblknbr *
sizeof(int8_t) );
501 printf(
"pastixOrderCheck() at the end of OrderSupernodes() failed !!!");