void get_metis( int_t n, /* dimension of matrix B */ int_t bnz, /* number of nonzeros in matrix A. */ int_t *b_colptr, /* column pointer of size n+1 for matrix B. */ int_t *b_rowind, /* row indices of size bnz for matrix B. */ int_t *perm_c /* out - the column permutation vector. */ ) { #define METISOPTIONS 8 int ct, i, j, nm, numflag = 0; /* C-Style ordering */ int metis_options[METISOPTIONS]; int_t *perm, *iperm; metis_options[0] = 0; /* Use Defaults for now */ perm = intMalloc_dist(n); iperm = intMalloc_dist(n); nm = n; #ifdef USE_METIS /* Call metis */ #undef USEEND #ifdef USEEND METIS_EdgeND(&nm, b_colptr, b_rowind, &numflag, metis_options, perm, iperm); #else METIS_NodeND(&nm, b_colptr, b_rowind, &numflag, metis_options, perm, iperm); #endif #endif /* Copy the permutation vector into SuperLU data structure. */ for (i = 0; i < n; ++i) perm_c[i] = iperm[i]; SUPERLU_FREE(b_colptr); SUPERLU_FREE(b_rowind); SUPERLU_FREE(perm); SUPERLU_FREE(iperm); }
void metis_edgend(int *nvtxs, idxtype *xadj, idxtype *adjncy, int *numflag, int *options, idxtype *perm, idxtype *iperm) { METIS_EdgeND(nvtxs, xadj, adjncy, numflag, options, perm, iperm); }
void get_metis( int_t n, /* dimension of matrix B */ int_t bnz, /* number of nonzeros in matrix A. */ int_t *b_colptr, /* column pointer of size n+1 for matrix B. */ int_t *b_rowind, /* row indices of size bnz for matrix B. */ int_t *perm_c /* out - the column permutation vector. */ ) { /*#define METISOPTIONS 8*/ #define METISOPTIONS 40 int_t metis_options[METISOPTIONS]; int_t ct, i, j, nm, numflag = 0; /* C-Style ordering */ int_t *perm, *iperm; int_t *b_colptr_int, *b_rowind_int; extern int check_perm_dist(char *what, int_t n, int_t *perm); extern int METIS_NodeND(int_t*, int_t*, int_t*, int_t*, int_t*, int_t*, int_t*); metis_options[0] = 0; /* Use Defaults for now */ perm = (int_t*) SUPERLU_MALLOC(2*n * sizeof(int_t)); if (!perm) ABORT("SUPERLU_MALLOC fails for perm."); iperm = perm + n; nm = n; #if 0 #if defined(_LONGINT) /* Metis can only take 32-bit integers */ if ( !(b_colptr_int = (int*) SUPERLU_MALLOC((n+1) * sizeof(int))) ) ABORT("SUPERLU_MALLOC fails for b_colptr_int."); for (i = 0; i < n+1; ++i) b_colptr_int[i] = b_colptr[i]; SUPERLU_FREE(b_colptr); if ( !(b_rowind_int = (int*) SUPERLU_MALLOC(bnz * sizeof(int))) ) ABORT("SUPERLU_MALLOC fails for b_rowind_int."); for (i = 0; i < bnz; ++i) b_rowind_int[i] = b_rowind[i]; SUPERLU_FREE(b_rowind); #else b_colptr_int = b_colptr; b_rowind_int = b_rowind; #endif #endif /* Call metis */ #undef USEEND #ifdef USEEND METIS_EdgeND(&nm, b_colptr_int, b_rowind_int, &numflag, metis_options, perm, iperm); #else /* Earlier version 3.x.x */ /* METIS_NodeND(&nm, b_colptr, b_rowind, &numflag, metis_options, perm, iperm);*/ /* Latest version 4.x.x */ METIS_NodeND(&nm, b_colptr, b_rowind, NULL, NULL, perm, iperm); /*check_perm_dist("metis perm", n, perm);*/ #endif /* Copy the permutation vector into SuperLU data structure. */ for (i = 0; i < n; ++i) perm_c[i] = iperm[i]; #if 0 SUPERLU_FREE(b_colptr_int); SUPERLU_FREE(b_rowind_int); #else SUPERLU_FREE(b_colptr); SUPERLU_FREE(b_rowind); #endif SUPERLU_FREE(perm); }