1c4762a1bSJed Brown static char help[] = "Testing MatCreateMPIMatConcatenateSeqMat().\n\n"; 2c4762a1bSJed Brown 3c4762a1bSJed Brown #include <petscmat.h> 4d71ae5a4SJacob Faibussowitsch int main(int argc, char **argv) 5d71ae5a4SJacob Faibussowitsch { 6c4762a1bSJed Brown Mat seqmat, mpimat; 7c4762a1bSJed Brown PetscMPIInt rank; 8c4762a1bSJed Brown PetscScalar value[3], *vals; 9c4762a1bSJed Brown PetscInt i, col[3], n = 5, bs = 1; 10c4762a1bSJed Brown 11327415f7SBarry Smith PetscFunctionBeginUser; 12*c8025a54SPierre Jolivet PetscCall(PetscInitialize(&argc, &argv, NULL, help)); 139566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_rank(PETSC_COMM_WORLD, &rank)); 149566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetInt(NULL, NULL, "-bs", &bs, NULL)); 15c4762a1bSJed Brown 16c4762a1bSJed Brown /* Create seqaij matrices of size (n+rank) by n */ 179566063dSJacob Faibussowitsch PetscCall(MatCreate(PETSC_COMM_SELF, &seqmat)); 189566063dSJacob Faibussowitsch PetscCall(MatSetSizes(seqmat, (n + rank) * bs, PETSC_DECIDE, PETSC_DECIDE, n * bs)); 199566063dSJacob Faibussowitsch PetscCall(MatSetFromOptions(seqmat)); 209566063dSJacob Faibussowitsch PetscCall(MatSeqAIJSetPreallocation(seqmat, 3 * bs, NULL)); 219566063dSJacob Faibussowitsch PetscCall(MatSeqBAIJSetPreallocation(seqmat, bs, 3, NULL)); 22c4762a1bSJed Brown 23c4762a1bSJed Brown if (bs == 1) { 249371c9d4SSatish Balay value[0] = -1.0; 259371c9d4SSatish Balay value[1] = 2.0; 269371c9d4SSatish Balay value[2] = -1.0; 27c4762a1bSJed Brown for (i = 1; i < n - 1; i++) { 289371c9d4SSatish Balay col[0] = i - 1; 299371c9d4SSatish Balay col[1] = i; 309371c9d4SSatish Balay col[2] = i + 1; 319566063dSJacob Faibussowitsch PetscCall(MatSetValues(seqmat, 1, &i, 3, col, value, INSERT_VALUES)); 32c4762a1bSJed Brown } 339371c9d4SSatish Balay i = n - 1; 349371c9d4SSatish Balay col[0] = n - 2; 359371c9d4SSatish Balay col[1] = n - 1; 369566063dSJacob Faibussowitsch PetscCall(MatSetValues(seqmat, 1, &i, 2, col, value, INSERT_VALUES)); 37c4762a1bSJed Brown 389371c9d4SSatish Balay i = 0; 399371c9d4SSatish Balay col[0] = 0; 409371c9d4SSatish Balay col[1] = 1; 419371c9d4SSatish Balay value[0] = 2.0; 429371c9d4SSatish Balay value[1] = -1.0; 439566063dSJacob Faibussowitsch PetscCall(MatSetValues(seqmat, 1, &i, 2, col, value, INSERT_VALUES)); 44c4762a1bSJed Brown } else { 45c4762a1bSJed Brown PetscInt *rows, *cols, j; 469566063dSJacob Faibussowitsch PetscCall(PetscMalloc3(bs * bs, &vals, bs, &rows, bs, &cols)); 47c4762a1bSJed Brown /* diagonal blocks */ 48c4762a1bSJed Brown for (i = 0; i < bs * bs; i++) vals[i] = 2.0; 49c4762a1bSJed Brown for (i = 0; i < n * bs; i += bs) { 509371c9d4SSatish Balay for (j = 0; j < bs; j++) { 519371c9d4SSatish Balay rows[j] = i + j; 529371c9d4SSatish Balay cols[j] = i + j; 539371c9d4SSatish Balay } 549566063dSJacob Faibussowitsch PetscCall(MatSetValues(seqmat, bs, rows, bs, cols, vals, INSERT_VALUES)); 55c4762a1bSJed Brown } 56c4762a1bSJed Brown /* off-diagonal blocks */ 57c4762a1bSJed Brown for (i = 0; i < bs * bs; i++) vals[i] = -1.0; 58c4762a1bSJed Brown for (i = 0; i < (n - 1) * bs; i += bs) { 599371c9d4SSatish Balay for (j = 0; j < bs; j++) { 609371c9d4SSatish Balay rows[j] = i + j; 619371c9d4SSatish Balay cols[j] = i + bs + j; 629371c9d4SSatish Balay } 639566063dSJacob Faibussowitsch PetscCall(MatSetValues(seqmat, bs, rows, bs, cols, vals, INSERT_VALUES)); 64c4762a1bSJed Brown } 65c4762a1bSJed Brown 669566063dSJacob Faibussowitsch PetscCall(PetscFree3(vals, rows, cols)); 67c4762a1bSJed Brown } 689566063dSJacob Faibussowitsch PetscCall(MatAssemblyBegin(seqmat, MAT_FINAL_ASSEMBLY)); 699566063dSJacob Faibussowitsch PetscCall(MatAssemblyEnd(seqmat, MAT_FINAL_ASSEMBLY)); 70dd400576SPatrick Sanan if (rank == 0) { 719566063dSJacob Faibussowitsch PetscCall(PetscPrintf(PETSC_COMM_SELF, "[%d] seqmat:\n", rank)); 729566063dSJacob Faibussowitsch PetscCall(MatView(seqmat, PETSC_VIEWER_STDOUT_SELF)); 73c4762a1bSJed Brown } 74c4762a1bSJed Brown 759566063dSJacob Faibussowitsch PetscCall(MatCreateMPIMatConcatenateSeqMat(PETSC_COMM_WORLD, seqmat, PETSC_DECIDE, MAT_INITIAL_MATRIX, &mpimat)); 769566063dSJacob Faibussowitsch PetscCall(MatCreateMPIMatConcatenateSeqMat(PETSC_COMM_WORLD, seqmat, PETSC_DECIDE, MAT_REUSE_MATRIX, &mpimat)); 779566063dSJacob Faibussowitsch PetscCall(MatView(mpimat, PETSC_VIEWER_STDOUT_WORLD)); 78c4762a1bSJed Brown 799566063dSJacob Faibussowitsch PetscCall(MatDestroy(&seqmat)); 809566063dSJacob Faibussowitsch PetscCall(MatDestroy(&mpimat)); 819566063dSJacob Faibussowitsch PetscCall(PetscFinalize()); 82b122ec5aSJacob Faibussowitsch return 0; 83c4762a1bSJed Brown } 84c4762a1bSJed Brown 85c4762a1bSJed Brown /*TEST 86c4762a1bSJed Brown 87c4762a1bSJed Brown test: 88c4762a1bSJed Brown nsize: 3 89c4762a1bSJed Brown 90c4762a1bSJed Brown test: 91c4762a1bSJed Brown suffix: 2 92c4762a1bSJed Brown nsize: 3 93c4762a1bSJed Brown args: -mat_type baij 94c4762a1bSJed Brown 95c4762a1bSJed Brown test: 96c4762a1bSJed Brown suffix: 3 97c4762a1bSJed Brown nsize: 3 98c4762a1bSJed Brown args: -mat_type baij -bs 2 99c4762a1bSJed Brown 100c4762a1bSJed Brown TEST*/ 101