1c4762a1bSJed Brown 2c4762a1bSJed Brown static char help[] = "Partition tiny grid.\n\n"; 3c4762a1bSJed Brown 4c4762a1bSJed Brown /* 5c4762a1bSJed Brown Include "petscmat.h" so that we can use matrices. Note that this file 6c4762a1bSJed Brown automatically includes: 7c4762a1bSJed Brown petscsys.h - base PETSc routines petscvec.h - vectors 8c4762a1bSJed Brown petscmat.h - matrices 9c4762a1bSJed Brown petscis.h - index sets 10c4762a1bSJed Brown petscviewer.h - viewers 11c4762a1bSJed Brown */ 12c4762a1bSJed Brown #include <petscmat.h> 13c4762a1bSJed Brown 14*d71ae5a4SJacob Faibussowitsch int main(int argc, char **args) 15*d71ae5a4SJacob Faibussowitsch { 166a09307cSBarry Smith Mat A, At; 17c4762a1bSJed Brown PetscMPIInt rank, size; 186a09307cSBarry Smith PetscInt *ia, *ja, row; 19c4762a1bSJed Brown MatPartitioning part; 20c4762a1bSJed Brown IS is, isn; 216a09307cSBarry Smith PetscBool equal; 22c4762a1bSJed Brown 23327415f7SBarry Smith PetscFunctionBeginUser; 249566063dSJacob Faibussowitsch PetscCall(PetscInitialize(&argc, &args, (char *)0, help)); 259566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_size(PETSC_COMM_WORLD, &size)); 26be096a46SBarry Smith PetscCheck(size == 4, PETSC_COMM_WORLD, PETSC_ERR_WRONG_MPI_SIZE, "Must run with 4 processors"); 279566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_rank(PETSC_COMM_WORLD, &rank)); 28c4762a1bSJed Brown 299566063dSJacob Faibussowitsch PetscCall(PetscMalloc1(5, &ia)); 309566063dSJacob Faibussowitsch PetscCall(PetscMalloc1(16, &ja)); 31dd400576SPatrick Sanan if (rank == 0) { 329371c9d4SSatish Balay ja[0] = 1; 339371c9d4SSatish Balay ja[1] = 4; 349371c9d4SSatish Balay ja[2] = 0; 359371c9d4SSatish Balay ja[3] = 2; 369371c9d4SSatish Balay ja[4] = 5; 379371c9d4SSatish Balay ja[5] = 1; 389371c9d4SSatish Balay ja[6] = 3; 399371c9d4SSatish Balay ja[7] = 6; 409371c9d4SSatish Balay ja[8] = 2; 419371c9d4SSatish Balay ja[9] = 7; 429371c9d4SSatish Balay ia[0] = 0; 439371c9d4SSatish Balay ia[1] = 2; 449371c9d4SSatish Balay ia[2] = 5; 459371c9d4SSatish Balay ia[3] = 8; 469371c9d4SSatish Balay ia[4] = 10; 47c4762a1bSJed Brown } else if (rank == 1) { 489371c9d4SSatish Balay ja[0] = 0; 499371c9d4SSatish Balay ja[1] = 5; 509371c9d4SSatish Balay ja[2] = 8; 519371c9d4SSatish Balay ja[3] = 1; 529371c9d4SSatish Balay ja[4] = 4; 539371c9d4SSatish Balay ja[5] = 6; 549371c9d4SSatish Balay ja[6] = 9; 559371c9d4SSatish Balay ja[7] = 2; 569371c9d4SSatish Balay ja[8] = 5; 579371c9d4SSatish Balay ja[9] = 7; 589371c9d4SSatish Balay ja[10] = 10; 599371c9d4SSatish Balay ja[11] = 3; 609371c9d4SSatish Balay ja[12] = 6; 619371c9d4SSatish Balay ja[13] = 11; 629371c9d4SSatish Balay ia[0] = 0; 639371c9d4SSatish Balay ia[1] = 3; 649371c9d4SSatish Balay ia[2] = 7; 659371c9d4SSatish Balay ia[3] = 11; 669371c9d4SSatish Balay ia[4] = 14; 67c4762a1bSJed Brown } else if (rank == 2) { 689371c9d4SSatish Balay ja[0] = 4; 699371c9d4SSatish Balay ja[1] = 9; 709371c9d4SSatish Balay ja[2] = 12; 719371c9d4SSatish Balay ja[3] = 5; 729371c9d4SSatish Balay ja[4] = 8; 739371c9d4SSatish Balay ja[5] = 10; 749371c9d4SSatish Balay ja[6] = 13; 759371c9d4SSatish Balay ja[7] = 6; 769371c9d4SSatish Balay ja[8] = 9; 779371c9d4SSatish Balay ja[9] = 11; 789371c9d4SSatish Balay ja[10] = 14; 799371c9d4SSatish Balay ja[11] = 7; 809371c9d4SSatish Balay ja[12] = 10; 819371c9d4SSatish Balay ja[13] = 15; 829371c9d4SSatish Balay ia[0] = 0; 839371c9d4SSatish Balay ia[1] = 3; 849371c9d4SSatish Balay ia[2] = 7; 859371c9d4SSatish Balay ia[3] = 11; 869371c9d4SSatish Balay ia[4] = 14; 87c4762a1bSJed Brown } else { 889371c9d4SSatish Balay ja[0] = 8; 899371c9d4SSatish Balay ja[1] = 13; 909371c9d4SSatish Balay ja[2] = 9; 919371c9d4SSatish Balay ja[3] = 12; 929371c9d4SSatish Balay ja[4] = 14; 939371c9d4SSatish Balay ja[5] = 10; 949371c9d4SSatish Balay ja[6] = 13; 959371c9d4SSatish Balay ja[7] = 15; 969371c9d4SSatish Balay ja[8] = 11; 979371c9d4SSatish Balay ja[9] = 14; 989371c9d4SSatish Balay ia[0] = 0; 999371c9d4SSatish Balay ia[1] = 2; 1009371c9d4SSatish Balay ia[2] = 5; 1019371c9d4SSatish Balay ia[3] = 8; 1029371c9d4SSatish Balay ia[4] = 10; 103c4762a1bSJed Brown } 104c4762a1bSJed Brown 1059566063dSJacob Faibussowitsch PetscCall(MatCreateMPIAdj(PETSC_COMM_WORLD, 4, 16, ia, ja, NULL, &A)); 1069566063dSJacob Faibussowitsch PetscCall(MatView(A, PETSC_VIEWER_STDOUT_WORLD)); 107c4762a1bSJed Brown 1086a09307cSBarry Smith /* Create the same matrix but using MatSetValues() */ 1096a09307cSBarry Smith PetscCall(MatCreate(PETSC_COMM_WORLD, &At)); 1106a09307cSBarry Smith PetscCall(MatSetSizes(At, 4, 4, 16, 16)); 1116a09307cSBarry Smith PetscCall(MatSetType(At, MATMPIADJ)); 1126a09307cSBarry Smith for (PetscInt i = 0; i < 4; i++) { 1136a09307cSBarry Smith row = i + 4 * rank; 1146a09307cSBarry Smith PetscCall(MatSetValues(At, 1, &row, ia[i + 1] - ia[i], ja + ia[i], NULL, INSERT_VALUES)); 1156a09307cSBarry Smith } 1166a09307cSBarry Smith PetscCall(MatAssemblyBegin(At, MAT_FINAL_ASSEMBLY)); 1176a09307cSBarry Smith PetscCall(MatAssemblyEnd(At, MAT_FINAL_ASSEMBLY)); 1186a09307cSBarry Smith PetscCall(MatEqual(A, At, &equal)); 1196a09307cSBarry Smith PetscCheck(equal, PETSC_COMM_WORLD, PETSC_ERR_PLIB, "Matrices are not equal that should be equal"); 1206a09307cSBarry Smith PetscCall(MatDestroy(&At)); 1216a09307cSBarry Smith 122c4762a1bSJed Brown /* 123c4762a1bSJed Brown Partition the graph of the matrix 124c4762a1bSJed Brown */ 1259566063dSJacob Faibussowitsch PetscCall(MatPartitioningCreate(PETSC_COMM_WORLD, &part)); 1269566063dSJacob Faibussowitsch PetscCall(MatPartitioningSetAdjacency(part, A)); 1279566063dSJacob Faibussowitsch PetscCall(MatPartitioningSetFromOptions(part)); 128c4762a1bSJed Brown /* get new processor owner number of each vertex */ 1299566063dSJacob Faibussowitsch PetscCall(MatPartitioningApply(part, &is)); 130c4762a1bSJed Brown /* get new global number of each old global number */ 1319566063dSJacob Faibussowitsch PetscCall(ISPartitioningToNumbering(is, &isn)); 1329566063dSJacob Faibussowitsch PetscCall(ISView(isn, PETSC_VIEWER_STDOUT_WORLD)); 1339566063dSJacob Faibussowitsch PetscCall(ISDestroy(&is)); 134c4762a1bSJed Brown 1359566063dSJacob Faibussowitsch PetscCall(ISDestroy(&isn)); 1369566063dSJacob Faibussowitsch PetscCall(MatPartitioningDestroy(&part)); 137c4762a1bSJed Brown 138c4762a1bSJed Brown /* 139c4762a1bSJed Brown Free work space. All PETSc objects should be destroyed when they 140c4762a1bSJed Brown are no longer needed. 141c4762a1bSJed Brown */ 1429566063dSJacob Faibussowitsch PetscCall(MatDestroy(&A)); 143c4762a1bSJed Brown 1449566063dSJacob Faibussowitsch PetscCall(PetscFinalize()); 145b122ec5aSJacob Faibussowitsch return 0; 146c4762a1bSJed Brown } 1476a09307cSBarry Smith /* 1486a09307cSBarry Smith test: 1496a09307cSBarry Smith requires: parmetis 1506a09307cSBarry Smith args: -mat_view 1516a09307cSBarry Smith nsize: 4 1526a09307cSBarry Smith */ 153