diff --git a/MathLib/LinAlg/Sparse/NestedDissectionPermutation/Cluster.cpp b/MathLib/LinAlg/Sparse/NestedDissectionPermutation/Cluster.cpp index 99d2c480a4774b3adb05ea1e662f2ba4e660c152..99fe759cc2a2a2a2010263a29fcf08e50b6c95d2 100644 --- a/MathLib/LinAlg/Sparse/NestedDissectionPermutation/Cluster.cpp +++ b/MathLib/LinAlg/Sparse/NestedDissectionPermutation/Cluster.cpp @@ -38,7 +38,7 @@ void Cluster::subdivide(unsigned bmin) idx_t *xadj(new idx_t[n_rows+1]); unsigned const*const original_row_ptr(_l_adj_mat->getRowPtrArray()); - for(unsigned k(0); k<=n_rows; k++) { + for(idx_t k(0); k<=n_rows; k++) { xadj[k] = original_row_ptr[k]; } @@ -62,7 +62,7 @@ void Cluster::subdivide(unsigned bmin) idx_t *vwgt(new idx_t[n_rows + 1]); // const unsigned nnz(xadj[n_rows]); // unsigned *adjwgt(new unsigned[nnz]); - for (unsigned k(0); k < n_rows + 1; k++) + for (idx_t k(0); k < n_rows + 1; k++) vwgt[k] = 1; // for (unsigned k(0); k < nnz; k++) // adjwgt[k] = 1; @@ -71,8 +71,26 @@ void Cluster::subdivide(unsigned bmin) // subdivide the index set into three parts employing METIS // METIS_ComputeVertexSeparator(&n_rows, xadj, adjncy, vwgt, &options, // &sepsize, part); - METIS_NodeND(&n_rows, xadj, adjncy, vwgt, options, _g_op_perm, _g_po_perm); - + idx_t *loc_op_perm(new idx_t[n_rows]); + idx_t *loc_po_perm(new idx_t[n_rows]); + for (idx_t k(0); k<n_rows; k++) { + loc_op_perm[k] = _g_op_perm[k]; + } + for (idx_t k(0); k<n_rows; k++) { + loc_po_perm[k] = _g_po_perm[k]; + } + METIS_NodeND(&n_rows, xadj, adjncy, vwgt, options, loc_op_perm, loc_po_perm); + for (idx_t k(0); k<n_rows; k++) { + _g_op_perm[k] = loc_op_perm[k]; + } + for (idx_t k(0); k<n_rows; k++) { + _g_po_perm[k] = loc_po_perm[k]; + } + delete [] loc_op_perm; + delete [] loc_po_perm; + delete [] vwgt; + delete [] adjncy; + delete [] xadj; // // create and init local permutations // unsigned *l_op_perm(new unsigned[size]); // unsigned *l_po_perm(new unsigned[size]);