Actual source code: ex60.c

  1: static char help[] = "Tests MatGetColumnVector().";

  3: #include <petscmat.h>

  5: int main(int argc, char **args)
  6: {
  7:   Mat         C;
  8:   PetscInt    i, j, m = 3, n = 2, Ii, J, col = 0;
  9:   PetscMPIInt size, rank;
 10:   PetscScalar v;
 11:   Vec         yy;

 13:   PetscFunctionBeginUser;
 14:   PetscCall(PetscInitialize(&argc, &args, NULL, help));
 15:   PetscCall(PetscOptionsGetInt(NULL, NULL, "-col", &col, NULL));

 17:   PetscCallMPI(MPI_Comm_rank(PETSC_COMM_WORLD, &rank));
 18:   PetscCallMPI(MPI_Comm_size(PETSC_COMM_WORLD, &size));
 19:   n = 2 * size;

 21:   /* create the matrix for the five point stencil, YET AGAIN*/
 22:   PetscCall(MatCreate(PETSC_COMM_WORLD, &C));
 23:   PetscCall(MatSetSizes(C, PETSC_DECIDE, PETSC_DECIDE, m * n, m * n));
 24:   PetscCall(MatSetFromOptions(C));
 25:   PetscCall(MatSeqAIJSetPreallocation(C, 5, NULL));
 26:   PetscCall(MatMPIAIJSetPreallocation(C, 5, NULL, 5, NULL));
 27:   PetscCall(MatSetUp(C));

 29:   for (i = 0; i < m; i++) {
 30:     for (j = 2 * rank; j < 2 * rank + 2; j++) {
 31:       v  = -1.0;
 32:       Ii = j + n * i;
 33:       if (i > 0) {
 34:         J = Ii - n;
 35:         PetscCall(MatSetValues(C, 1, &Ii, 1, &J, &v, INSERT_VALUES));
 36:       }
 37:       if (i < m - 1) {
 38:         J = Ii + n;
 39:         PetscCall(MatSetValues(C, 1, &Ii, 1, &J, &v, INSERT_VALUES));
 40:       }
 41:       if (j > 0) {
 42:         J = Ii - 1;
 43:         PetscCall(MatSetValues(C, 1, &Ii, 1, &J, &v, INSERT_VALUES));
 44:       }
 45:       if (j < n - 1) {
 46:         J = Ii + 1;
 47:         PetscCall(MatSetValues(C, 1, &Ii, 1, &J, &v, INSERT_VALUES));
 48:       }
 49:       v = 4.0;
 50:       PetscCall(MatSetValues(C, 1, &Ii, 1, &Ii, &v, INSERT_VALUES));
 51:     }
 52:   }
 53:   PetscCall(MatAssemblyBegin(C, MAT_FINAL_ASSEMBLY));
 54:   PetscCall(MatAssemblyEnd(C, MAT_FINAL_ASSEMBLY));
 55:   PetscCall(MatView(C, PETSC_VIEWER_STDOUT_WORLD));

 57:   PetscCall(MatCreateVecs(C, NULL, &yy));
 58:   PetscCall(VecSetFromOptions(yy));

 60:   PetscCall(MatGetColumnVector(C, yy, col));

 62:   PetscCall(VecView(yy, PETSC_VIEWER_STDOUT_WORLD));

 64:   PetscCall(VecDestroy(&yy));
 65:   PetscCall(MatDestroy(&C));
 66:   PetscCall(PetscFinalize());
 67:   return 0;
 68: }

 70: /*TEST

 72:    test:
 73:       nsize: 3
 74:       args: -col 7

 76:    test:
 77:       suffix: dense
 78:       nsize: 3
 79:       args: -col 7 -mat_type dense -vec_type {{mpi standard}}
 80:       filter: grep -v type

 82:    test:
 83:       requires: cuda
 84:       suffix: dense_cuda
 85:       nsize: 3
 86:       output_file: output/ex60_dense.out
 87:       args: -col 7 -mat_type {{mpidense mpidensecuda}} -vec_type {{mpi standard cuda mpicuda}}
 88:       filter: grep -v type

 90: TEST*/