static char help[] = "Example of using graph partitioning to partition a graph\n\n"; /*T Concepts: Mat^mat partitioning Concepts: Mat^image segmentation Processors: n T*/ #include int main(int argc, char **args) { Mat A; MatPartitioning part; IS is; PetscInt r,N = 10, start, end; PetscErrorCode ierr; ierr = PetscInitialize(&argc, &args, (char*) 0, help);CHKERRQ(ierr); ierr = PetscOptionsGetInt(NULL,NULL, "-N", &N, NULL);CHKERRQ(ierr); ierr = MatCreate(PETSC_COMM_WORLD, &A);CHKERRQ(ierr); ierr = MatSetSizes(A, PETSC_DECIDE, PETSC_DECIDE, N, N);CHKERRQ(ierr); ierr = MatSetType(A, MATMPIAIJ);CHKERRQ(ierr); ierr = MatSetFromOptions(A);CHKERRQ(ierr); ierr = MatMPIAIJSetPreallocation(A, 1, NULL, 0, NULL);CHKERRQ(ierr); Mat B, C, D; /* Create a linear mesh */ ierr = MatGetOwnershipRange(A, &start, &end);CHKERRQ(ierr); ierr = MatCreate(PETSC_COMM_WORLD, &B);CHKERRQ(ierr); ierr = MatSetSizes(B, end - start, PETSC_DECIDE, N, 4);CHKERRQ(ierr); ierr = MatSetType(B, MATMPIDENSE);CHKERRQ(ierr); ierr = MatMPIDenseSetPreallocation(B, NULL);CHKERRQ(ierr); for (r = start; r < end; ++r) { PetscInt cols[1]; PetscScalar vals[1]; cols[0] = r; vals[0] = 1.0; ierr = MatSetValues(A, 1, &r, 1, cols, vals, INSERT_VALUES);CHKERRQ(ierr); cols[0] = 0; ierr = MatSetValues(B, 1, &r, 1, cols, vals, INSERT_VALUES);CHKERRQ(ierr); } ierr = MatAssemblyBegin(A, MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); ierr = MatAssemblyEnd(A, MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); ierr = MatAssemblyBegin(B, MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); ierr = MatAssemblyEnd(B, MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); MatMatMult(A, B, MAT_INITIAL_MATRIX, PETSC_DEFAULT, &D); MatMatMult(A, B, MAT_REUSE_MATRIX, PETSC_DEFAULT, &D); MatTransposeMatMult(A, B, MAT_INITIAL_MATRIX, PETSC_DEFAULT, &C); MatTransposeMatMult(A, B, MAT_REUSE_MATRIX, PETSC_DEFAULT, &C); ierr = MatDestroy(&D);CHKERRQ(ierr); ierr = MatDestroy(&C);CHKERRQ(ierr); ierr = MatDestroy(&B);CHKERRQ(ierr); ierr = MatDestroy(&A);CHKERRQ(ierr); ierr = PetscFinalize(); return ierr; } /*TEST test: nsize: 3 requires: parmetis args: -mat_partitioning_type parmetis test: suffix: 2 nsize: 3 requires: ptscotch args: -mat_partitioning_type ptscotch test: suffix: 3 nsize: 4 requires: party args: -mat_partitioning_type party test: suffix: 4 nsize: 3 requires: chaco args: -mat_partitioning_type chaco test: suffix: 5 nsize: 3 requires: parmetis args: -mat_partitioning_type hierarch -mat_partitioning_hierarchical_nfineparts 3 -mat_partitioning_nparts 10 -N 100 TEST*/