Actual source code: ex86.c

  1: static char help[] = "Testing MatCreateMPIMatConcatenateSeqMat().\n\n";

  3: #include <petscmat.h>
  4: int main(int argc, char **argv)
  5: {
  6:   Mat         seqmat, mpimat;
  7:   PetscMPIInt rank;
  8:   PetscScalar value[3], *vals;
  9:   PetscInt    i, col[3], n = 5, bs = 1;

 12:   PetscInitialize(&argc, &argv, (char *)0, help);
 13:   MPI_Comm_rank(PETSC_COMM_WORLD, &rank);
 14:   PetscOptionsGetInt(NULL, NULL, "-bs", &bs, NULL);

 16:   /* Create seqaij matrices of size (n+rank) by n */
 17:   MatCreate(PETSC_COMM_SELF, &seqmat);
 18:   MatSetSizes(seqmat, (n + rank) * bs, PETSC_DECIDE, PETSC_DECIDE, n * bs);
 19:   MatSetFromOptions(seqmat);
 20:   MatSeqAIJSetPreallocation(seqmat, 3 * bs, NULL);
 21:   MatSeqBAIJSetPreallocation(seqmat, bs, 3, NULL);

 23:   if (bs == 1) {
 24:     value[0] = -1.0;
 25:     value[1] = 2.0;
 26:     value[2] = -1.0;
 27:     for (i = 1; i < n - 1; i++) {
 28:       col[0] = i - 1;
 29:       col[1] = i;
 30:       col[2] = i + 1;
 31:       MatSetValues(seqmat, 1, &i, 3, col, value, INSERT_VALUES);
 32:     }
 33:     i      = n - 1;
 34:     col[0] = n - 2;
 35:     col[1] = n - 1;
 36:     MatSetValues(seqmat, 1, &i, 2, col, value, INSERT_VALUES);

 38:     i        = 0;
 39:     col[0]   = 0;
 40:     col[1]   = 1;
 41:     value[0] = 2.0;
 42:     value[1] = -1.0;
 43:     MatSetValues(seqmat, 1, &i, 2, col, value, INSERT_VALUES);
 44:   } else {
 45:     PetscInt *rows, *cols, j;
 46:     PetscMalloc3(bs * bs, &vals, bs, &rows, bs, &cols);
 47:     /* diagonal blocks */
 48:     for (i = 0; i < bs * bs; i++) vals[i] = 2.0;
 49:     for (i = 0; i < n * bs; i += bs) {
 50:       for (j = 0; j < bs; j++) {
 51:         rows[j] = i + j;
 52:         cols[j] = i + j;
 53:       }
 54:       MatSetValues(seqmat, bs, rows, bs, cols, vals, INSERT_VALUES);
 55:     }
 56:     /* off-diagonal blocks */
 57:     for (i = 0; i < bs * bs; i++) vals[i] = -1.0;
 58:     for (i = 0; i < (n - 1) * bs; i += bs) {
 59:       for (j = 0; j < bs; j++) {
 60:         rows[j] = i + j;
 61:         cols[j] = i + bs + j;
 62:       }
 63:       MatSetValues(seqmat, bs, rows, bs, cols, vals, INSERT_VALUES);
 64:     }

 66:     PetscFree3(vals, rows, cols);
 67:   }
 68:   MatAssemblyBegin(seqmat, MAT_FINAL_ASSEMBLY);
 69:   MatAssemblyEnd(seqmat, MAT_FINAL_ASSEMBLY);
 70:   if (rank == 0) {
 71:     PetscPrintf(PETSC_COMM_SELF, "[%d] seqmat:\n", rank);
 72:     MatView(seqmat, PETSC_VIEWER_STDOUT_SELF);
 73:   }

 75:   MatCreateMPIMatConcatenateSeqMat(PETSC_COMM_WORLD, seqmat, PETSC_DECIDE, MAT_INITIAL_MATRIX, &mpimat);
 76:   MatCreateMPIMatConcatenateSeqMat(PETSC_COMM_WORLD, seqmat, PETSC_DECIDE, MAT_REUSE_MATRIX, &mpimat);
 77:   MatView(mpimat, PETSC_VIEWER_STDOUT_WORLD);

 79:   MatDestroy(&seqmat);
 80:   MatDestroy(&mpimat);
 81:   PetscFinalize();
 82:   return 0;
 83: }

 85: /*TEST

 87:    test:
 88:       nsize: 3

 90:    test:
 91:       suffix: 2
 92:       nsize: 3
 93:       args: -mat_type baij

 95:    test:
 96:       suffix: 3
 97:       nsize: 3
 98:       args: -mat_type baij -bs 2

100: TEST*/