Multilevel Multilevel_new(SparseMatrix A0, real *node_weights, Multilevel_control ctrl){ Multilevel grid; SparseMatrix A = A0; if (!SparseMatrix_is_symmetric(A, FALSE) || A->type != MATRIX_TYPE_REAL){ A = SparseMatrix_get_real_adjacency_matrix_symmetrized(A); } grid = Multilevel_init(A, node_weights); grid = Multilevel_establish(grid, ctrl); if (A != A0) grid->delete_top_level_A = TRUE;/* be sure to clean up later */ return grid; }
Multilevel Multilevel_new(SparseMatrix A0, SparseMatrix D0, real *node_weights, Multilevel_control ctrl){ /* A: the weighting matrix. D: the distance matrix, could be NULL. If not null, the two matrices must have the same sparsity pattern */ Multilevel grid; SparseMatrix A = A0, D = D0; if (!SparseMatrix_is_symmetric(A, FALSE) || A->type != MATRIX_TYPE_REAL){ A = SparseMatrix_get_real_adjacency_matrix_symmetrized(A); } if (D && (!SparseMatrix_is_symmetric(D, FALSE) || D->type != MATRIX_TYPE_REAL)){ D = SparseMatrix_symmetrize_nodiag(D, FALSE); } grid = Multilevel_init(A, D, node_weights); grid = Multilevel_establish(grid, ctrl); if (A != A0) grid->delete_top_level_A = TRUE;/* be sure to clean up later */ return grid; }
static Multilevel Multilevel_establish(Multilevel grid, Multilevel_control ctrl){ Multilevel cgrid; int coarsen_scheme_used; real *cnode_weights = NULL; SparseMatrix P, R, A, cA, D, cD; #ifdef DEBUG_PRINT if (Verbose) { print_padding(grid->level); fprintf(stderr, "level -- %d, n = %d, nz = %d nz/n = %f\n", grid->level, grid->n, grid->A->nz, grid->A->nz/(double) grid->n); } #endif A = grid->A; D = grid->D; if (grid->level >= ctrl->maxlevel - 1) { #ifdef DEBUG_PRINT if (Verbose) { print_padding(grid->level); fprintf(stderr, " maxlevel reached, coarsening stops\n"); } #endif return grid; } Multilevel_coarsen(A, &cA, D, &cD, grid->node_weights, &cnode_weights, &P, &R, ctrl, &coarsen_scheme_used); if (!cA) return grid; cgrid = Multilevel_init(cA, cD, cnode_weights); grid->next = cgrid; cgrid->coarsen_scheme_used = coarsen_scheme_used; cgrid->level = grid->level + 1; cgrid->n = cA->m; cgrid->A = cA; cgrid->D = cD; cgrid->P = P; grid->R = R; cgrid->prev = grid; cgrid = Multilevel_establish(cgrid, ctrl); return grid; }