413 PASTIX_Comm pastix_comm )
446 MPI_Comm_rank( pastix_comm, &procnum );
462 if ( rat_blas < 0 ) {
463 rat_blas = -rat_blas;
464 rat_cblk = MIN( rat_blas,
RAT_CBLK );
479 assert( graphL->n == oldcblknbr );
480 for ( i = 0; i < n; i++ ) {
481 colweight[i] = oldrangtab[i + 1] - oldrangtab[i];
482 assert( ( graphL->nnz[i] >= colweight[i] ) && ( colweight[i] > 0 ) );
484#if !defined( NDEBUG ) && defined( PASTIX_DEBUG_SYMBOL )
489 for ( j = 0; j < n; j++ ) {
491 for ( l = oldrangtab[j]; l < oldrangtab[j + 1]; l++ ) {
492 assert( graphL->rows[j][k] == l );
501 nn = oldrangtab[oldcblknbr];
515 nnzL = graphL->total_nnz;
516 fillcblk = (
pastix_int_t)lround( (
double)nnzL * rat_cblk );
517 fillblas = (
pastix_int_t)lround( (
double)nnzL * rat_blas );
518 fillwhile = fillcblk;
520#if defined( PASTIX_DEBUG_SYMBOL )
524 pastix_print( procnum, 0,
"fillcblk %ld fillmax %ld \n", (
long)fillcblk, (
long)fillblas );
526 for ( i = 0; i < graphL->n; i++ ) {
527 key += cblktime( graphL->nnz[i], graphL->rows[i], colweight[i] );
529 pastix_print( procnum, 0,
"COST of the NON AMALGAMATED MATRIX = %e\n", key );
543 for ( i = 0; i < n - 1; i++ ) {
544 if ( oldtreetab[i] >= 0 ) {
545 tmp[oldtreetab[i]]++;
549 assert( nbsons < n );
559 for ( i = 0; i < n; i++ ) {
560 sonindex[i + 1] = sonindex[i] + tmp[i];
565 for ( i = 0; i < n - 1; i++ ) {
567 assert( ( father != i ) && ( father < n ) );
570 assert( sontab[tmp[father]] == -1 );
571 sontab[tmp[father]] = i;
573 assert( tmp[father] <= sonindex[father + 1] );
582 MALLOC_INTERN( gain, n,
double );
583 for ( i = 0; i < n; i++ ) {
584 father = oldtreetab[i];
585 if ( ( father == -1 ) || ( father == i ) ) {
592 gain[i] = (double)( nnzadd[i] );
599 for ( i = 0; i < n; i++ ) {
600 assert( colweight[i] > 0 );
602 if ( ( colweight[i] != 0 ) && ( nnzadd[i] == 0 ) ) {
603 father = oldtreetab[i];
604 assert( ( father > 0 ) && ( father != i ) );
612 colweight[father] += colweight[i];
616 k = oldtreetab[father];
617 if ( ( k != -1 ) && ( k != father ) ) {
619 gain[father] = (double)( nnzadd[father] );
624 for ( j = 0; j < ind; j++ ) {
626 assert( k != father );
627 oldtreetab[k] = father;
629 gain[k] = (double)( nnzadd[k] );
634 pastix_print( procnum,
636 "Number of cblk after amalgamation initialization = %ld (reduced by %ld)\n",
637 (
long)( n - nbcblk_merged ),
638 (
long)nbcblk_merged );
643 for ( i = 0; i < n; i++ ) {
644 if ( ( colweight[i] > 0 ) && ( oldtreetab[i] > 0 ) && ( oldtreetab[i] != i ) ) {
656 while ( (
pqueueSize( &heap ) > 0 ) && ( fill < fillwhile ) ) {
660 if ( ( gain[i] != key ) || ( colweight[i] <= 0 ) )
664 if ( ( fill + nnzadd[i] ) > fillwhile )
670 father = oldtreetab[i];
671 assert( ( father > 0 ) && ( father != i ) );
672 assert( colweight[father] > 0 );
678 colweight[father] += colweight[i];
682 k = oldtreetab[father];
683 if ( ( k != -1 ) && ( k != father ) ) {
685 if ( blas_gain == 1 ) {
689 if ( gain[father] <= 0 )
693 gain[father] = (double)( nnzadd[father] );
700 for ( j = 0; j < ind; j++ ) {
702 assert( k != father );
703 oldtreetab[k] = father;
706 if ( blas_gain == 1 ) {
713 gain[k] = (double)( nnzadd[k] );
720 pastix_print( procnum,
722 "Number of cblk after amalgamation phase = %ld (reduced by %ld)\n",
723 (
long)( n - nbcblk_merged ),
724 (
long)nbcblk_merged );
727 if ( fillwhile < fillblas ) {
729 assert( blas_gain == 0 );
732 fillwhile = fillblas;
736 for ( i = 0; i < n; i++ ) {
737 father = oldtreetab[i];
738 if ( father == -1 || father == i ) {
745 if ( ( colweight[i] > 0 ) && ( oldtreetab[i] > 0 ) && ( oldtreetab[i] != i ) &&
746 ( gain[i] <= 0. ) ) {
756 if ( tmp2 != NULL ) {
771 order->
cblknbr = n - nbcblk_merged;
785 for ( i = 0; i < n; i++ ) {
786 if ( colweight[i] > 0 ) {
788 newrangtab[k] = colweight[i];
794 for ( i = 0; i < order->
cblknbr; i++ ) {
795 newrangtab[i + 1] += newrangtab[i];
799 for ( i = 0; i < n; i++ ) {
801 if ( colweight[i] <= 0 ) {
803 while ( colweight[father] <= 0 ) {
804 father = oldtreetab[father];
805 assert( father > 0 );
809 newfather = newnum[father];
812 for ( j = oldrangtab[i]; j < oldrangtab[i + 1]; j++ ) {
813 newperitab[newrangtab[newfather]++] = oldperitab[j];
817 if ( oldtreetab[father] != -1 ) {
818 newtreetab[newfather] = newnum[oldtreetab[father]];
821 newtreetab[newfather] = -1;
826 for ( i = order->
cblknbr; i > 0; i-- ) {
827 newrangtab[i] = newrangtab[i - 1];
832 for ( i = 0; i < order->
vertnbr; i++ ) {
833 order->
permtab[newperitab[i]] = i;
836#if defined( PASTIX_DEBUG_SYMBOL )
842 assert( graphL->n == order->
cblknbr );
845 for ( i = 0; i < graphL->n; i++ ) {
847 ja = graphL->rows[i];
848 for ( j = 0; j < graphL->nnz[i]; j++ ) {
853 for ( i = 0; i < graphL->n; i++ ) {
854 key += cblktime( graphL->nnz[i], graphL->rows[i], colweight[i] );
856 pastix_print( procnum, 0,
"COST of the AMALGAMATED MATRIX = %e\n", key );
860 memFree( oldrangtab );
861 memFree( oldtreetab );
862 memFree( oldperitab );
867 memFree( colweight );
869#if !defined( NDEBUG )