Multilevel next;
Multilevel prev;
int delete_top_level_A;
- int coarsen_scheme_used;/* to get from previous level to here */
};
enum {MAX_CLUSTER_SIZE = 4};
-enum {EDGE_BASED_STA, COARSEN_INDEPENDENT_EDGE_SET, COARSEN_INDEPENDENT_EDGE_SET_HEAVEST_EDGE_PERNODE, COARSEN_INDEPENDENT_EDGE_SET_HEAVEST_EDGE_PERNODE_LEAVES_FIRST, COARSEN_INDEPENDENT_EDGE_SET_HEAVEST_EDGE_PERNODE_SUPERNODES_FIRST, COARSEN_INDEPENDENT_EDGE_SET_HEAVEST_EDGE_PERNODE_DEGREE_SCALED, COARSEN_INDEPENDENT_EDGE_SET_HEAVEST_CLUSTER_PERNODE_LEAVES_FIRST, EDGE_BASED_STO, VERTEX_BASED_STA, COARSEN_INDEPENDENT_VERTEX_SET, COARSEN_INDEPENDENT_VERTEX_SET_RS, VERTEX_BASED_STO, COARSEN_HYBRID};
-
struct Multilevel_control_struct {
int minsize;
double min_coarsen_factor;
free(y);
}
-static void prolongate(int dim, SparseMatrix A, SparseMatrix P, SparseMatrix R, double *x, double *y, int coarsen_scheme_used, double delta){
+static void prolongate(int dim, SparseMatrix A, SparseMatrix P, SparseMatrix R, double *x, double *y, double delta){
int nc, *ia, *ja, i, j, k;
SparseMatrix_multiply_dense(P, x, &y, dim);
/* xu yao rao dong */
- if (coarsen_scheme_used > EDGE_BASED_STA && coarsen_scheme_used < EDGE_BASED_STO){
- interpolate_coord(dim, A, y);
- nc = R->m;
- ia = R->ia;
- ja = R->ja;
- for (i = 0; i < nc; i++){
- for (j = ia[i]+1; j < ia[i+1]; j++){
- for (k = 0; k < dim; k++){
- y[ja[j]*dim + k] += delta*(drand() - 0.5);
- }
+ interpolate_coord(dim, A, y);
+ nc = R->m;
+ ia = R->ia;
+ ja = R->ja;
+ for (i = 0; i < nc; i++){
+ for (j = ia[i]+1; j < ia[i+1]; j++){
+ for (k = 0; k < dim; k++){
+ y[ja[j]*dim + k] += delta*(drand() - 0.5);
}
}
}
Multilevel_control mctrl = NULL;
- int n, plg, coarsen_scheme_used;
+ int n, plg;
SparseMatrix A = A0, D = D0, P = NULL;
Multilevel grid, grid0;
double *xc = NULL, *xf = NULL;
goto RETURN;
}
P = grid->P;
- coarsen_scheme_used = grid->coarsen_scheme_used;
grid = grid->prev;
if (Multilevel_is_finest(grid)){
xf = x;
} else {
xf = gv_calloc(grid->n * dim, sizeof(double));
}
- prolongate(dim, grid->A, P, grid->R, xc, xf, coarsen_scheme_used, (ctrl->K)*0.001);
+ prolongate(dim, grid->A, P, grid->R, xc, xf, (ctrl->K)*0.001);
free(xc);
xc = xf;
ctrl->random_start = FALSE;
ctrl->K = ctrl->K * 0.75;
ctrl->adaptive_cooling = FALSE;
- if (grid->next->coarsen_scheme_used > VERTEX_BASED_STA &&
- grid->next->coarsen_scheme_used < VERTEX_BASED_STO){
- ctrl->step = 1;
- } else {
- ctrl->step = .1;
- }
+ ctrl->step = .1;
} while (grid);
#ifdef TIME