Actual source code: ex24.c


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

  5: #include <petscvec.h>

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

 18:   PetscInitialize(&argc, &argv, (char *)0, help);

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

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

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

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

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

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

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

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

 58:   PetscViewerASCIIPushSynchronized(PETSC_VIEWER_STDOUT_WORLD);
 59:   PetscViewerASCIISynchronizedPrintf(PETSC_VIEWER_STDOUT_WORLD, "----\n");
 60:   PetscViewerGetSubViewer(PETSC_VIEWER_STDOUT_WORLD, PETSC_COMM_SELF, &sviewer);
 61:   VecView(y, sviewer);
 62:   fflush(stdout);
 63:   PetscViewerRestoreSubViewer(PETSC_VIEWER_STDOUT_WORLD, PETSC_COMM_SELF, &sviewer);
 64:   PetscViewerFlush(PETSC_VIEWER_STDOUT_WORLD);
 65:   PetscViewerASCIIPopSynchronized(PETSC_VIEWER_STDOUT_WORLD);

 67:   VecScatterDestroy(&ctx);

 69:   VecDestroy(&x);
 70:   VecDestroy(&y);
 71:   ISDestroy(&is1);
 72:   ISDestroy(&is2);

 74:   PetscFinalize();
 75:   return 0;
 76: }

 78: /*TEST

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

 96: TEST*/