Actual source code: ex24.c

  1: static char help[] = "Scatters from a parallel vector to a sequential vector.\n\
  2: Tests where the local part of the scatter is a copy.\n\n";

  4: #include <petscvec.h>

  6: int main(int argc, char **argv)
  7: {
  8:   PetscMPIInt size, rank;
  9:   PetscInt    n = 5, i, *blks, bs = 1, m = 2;
 10:   PetscScalar value;
 11:   Vec         x, y;
 12:   IS          is1, is2;
 13:   VecScatter  ctx = 0;
 14:   PetscViewer sviewer;

 16:   PetscFunctionBeginUser;
 17:   PetscCall(PetscInitialize(&argc, &argv, NULL, help));

 19:   PetscCall(PetscOptionsGetInt(NULL, NULL, "-n", &n, NULL));
 20:   PetscCall(PetscOptionsGetInt(NULL, NULL, "-bs", &bs, NULL));

 22:   PetscCallMPI(MPI_Comm_size(PETSC_COMM_WORLD, &size));
 23:   PetscCallMPI(MPI_Comm_rank(PETSC_COMM_WORLD, &rank));

 25:   /* create two vectors */
 26:   PetscCall(VecCreate(PETSC_COMM_WORLD, &x));
 27:   PetscCall(VecSetSizes(x, PETSC_DECIDE, size * bs * n));
 28:   PetscCall(VecSetFromOptions(x));

 30:   /* create two index sets */
 31:   if (rank < size - 1) m = n + 2;
 32:   else m = n;

 34:   PetscCall(PetscMalloc1(m, &blks));
 35:   blks[0] = n * rank;
 36:   for (i = 1; i < m; i++) blks[i] = blks[i - 1] + 1;
 37:   PetscCall(ISCreateBlock(PETSC_COMM_SELF, bs, m, blks, PETSC_COPY_VALUES, &is1));
 38:   PetscCall(PetscFree(blks));

 40:   PetscCall(VecCreateSeq(PETSC_COMM_SELF, bs * m, &y));
 41:   PetscCall(ISCreateStride(PETSC_COMM_SELF, bs * m, 0, 1, &is2));

 43:   /* each processor inserts the entire vector */
 44:   /* this is redundant but tests assembly */
 45:   for (i = 0; i < bs * n * size; i++) {
 46:     value = (PetscScalar)i;
 47:     PetscCall(VecSetValues(x, 1, &i, &value, INSERT_VALUES));
 48:   }
 49:   PetscCall(VecAssemblyBegin(x));
 50:   PetscCall(VecAssemblyEnd(x));
 51:   PetscCall(VecView(x, PETSC_VIEWER_STDOUT_WORLD));

 53:   PetscCall(VecScatterCreate(x, is1, y, is2, &ctx));
 54:   PetscCall(VecScatterBegin(ctx, x, y, INSERT_VALUES, SCATTER_FORWARD));
 55:   PetscCall(VecScatterEnd(ctx, x, y, INSERT_VALUES, SCATTER_FORWARD));

 57:   PetscCall(PetscViewerASCIIPushSynchronized(PETSC_VIEWER_STDOUT_WORLD));
 58:   PetscCall(PetscViewerGetSubViewer(PETSC_VIEWER_STDOUT_WORLD, PETSC_COMM_SELF, &sviewer));
 59:   PetscCall(VecView(y, sviewer));
 60:   PetscCall(PetscViewerRestoreSubViewer(PETSC_VIEWER_STDOUT_WORLD, PETSC_COMM_SELF, &sviewer));
 61:   PetscCall(PetscViewerASCIIPopSynchronized(PETSC_VIEWER_STDOUT_WORLD));

 63:   PetscCall(VecScatterDestroy(&ctx));

 65:   PetscCall(VecDestroy(&x));
 66:   PetscCall(VecDestroy(&y));
 67:   PetscCall(ISDestroy(&is1));
 68:   PetscCall(ISDestroy(&is2));

 70:   PetscCall(PetscFinalize());
 71:   return 0;
 72: }

 74: /*TEST

 76:    testset:
 77:       nsize: 3
 78:       output_file: output/ex24_1.out
 79:       filter: grep -v "  type:"
 80:       test:
 81:         suffix: standard
 82:         args: -vec_type standard
 83:       test:
 84:         requires: cuda
 85:         suffix: cuda
 86:         args: -vec_type cuda
 87:       test:
 88:         requires: viennacl
 89:         suffix: viennacl
 90:         args: -vec_type viennacl

 92: TEST*/