Actual source code: ex208.c

  1: static char help[] = "Test MatCreateRedundantMatrix for rectangular matrix.\n\
  2:                       Contributed by Jose E. Roman, July 2017\n\n";

  4: #include <petscmat.h>
  5: int main(int argc, char **args)
  6: {
  7:   Mat         A, B;
  8:   PetscInt    m = 3, n = 4, i, nsubcomm;
  9:   PetscMPIInt size, rank;

 11:   PetscFunctionBeginUser;
 12:   PetscCall(PetscInitialize(&argc, &args, NULL, help));
 13:   PetscCallMPI(MPI_Comm_size(PETSC_COMM_WORLD, &size));
 14:   PetscCallMPI(MPI_Comm_rank(PETSC_COMM_WORLD, &rank));

 16:   nsubcomm = size;
 17:   PetscCall(PetscOptionsGetInt(NULL, NULL, "-nsubcomm", &nsubcomm, NULL));

 19:   PetscCall(MatCreate(PETSC_COMM_WORLD, &A));
 20:   PetscCall(MatSetSizes(A, m, n, PETSC_DETERMINE, PETSC_DETERMINE));
 21:   PetscCall(MatSetType(A, MATAIJ));
 22:   PetscCall(MatSetFromOptions(A));
 23:   PetscCall(MatSetUp(A));

 25:   if (rank == 0) {
 26:     for (i = 0; i < size * PetscMin(m, n); i++) PetscCall(MatSetValue(A, i, i, 1.0, INSERT_VALUES));
 27:   }
 28:   PetscCall(MatAssemblyBegin(A, MAT_FINAL_ASSEMBLY));
 29:   PetscCall(MatAssemblyEnd(A, MAT_FINAL_ASSEMBLY));
 30:   PetscCall(MatView(A, PETSC_VIEWER_STDOUT_WORLD));

 32:   PetscCall(MatCreateRedundantMatrix(A, nsubcomm, MPI_COMM_NULL, MAT_INITIAL_MATRIX, &B));
 33:   if (nsubcomm == size) { /* B is a sequential matrix */
 34:     if (rank == 0) PetscCall(MatView(B, PETSC_VIEWER_STDOUT_SELF));
 35:   } else {
 36:     MPI_Comm comm;
 37:     PetscCall(PetscObjectGetComm((PetscObject)B, &comm));
 38:     PetscCall(MatView(B, PETSC_VIEWER_STDOUT_(comm)));
 39:   }

 41:   PetscCall(MatDestroy(&A));
 42:   PetscCall(MatDestroy(&B));
 43:   PetscCall(PetscFinalize());
 44:   return 0;
 45: }

 47: /*TEST

 49:    test:

 51:    test:
 52:       suffix: 2
 53:       nsize: 3

 55:    test:
 56:       suffix: baij
 57:       args: -mat_type baij

 59:    test:
 60:       suffix: baij_2
 61:       nsize: 3
 62:       args: -mat_type baij

 64:    test:
 65:       suffix: dense
 66:       args: -mat_type dense

 68:    test:
 69:       suffix: dense_2
 70:       nsize: 3
 71:       args: -mat_type dense

 73: TEST*/