Actual source code: ex33.c

  1: static char help[] = "Tests the routines VecScatterCreateToAll(), VecScatterCreateToZero()\n\n";

  3: #include <petscvec.h>

  5: int main(int argc, char **argv)
  6: {
  7:   PetscInt    n = 3, i, len, start, end;
  8:   PetscMPIInt size, rank;
  9:   PetscScalar value, *yy;
 10:   Vec         x, y, z, y_t;
 11:   VecScatter  toall, tozero;

 13:   PetscFunctionBeginUser;
 14:   PetscCall(PetscInitialize(&argc, &argv, NULL, help));
 15:   PetscCallMPI(MPI_Comm_size(PETSC_COMM_WORLD, &size));
 16:   PetscCallMPI(MPI_Comm_rank(PETSC_COMM_WORLD, &rank));

 18:   /* create two vectors */
 19:   PetscCall(VecCreateFromOptions(PETSC_COMM_WORLD, NULL, 1, PETSC_DECIDE, size * n, &x));

 21:   /* each processor inserts its values */

 23:   PetscCall(VecGetOwnershipRange(x, &start, &end));
 24:   for (i = start; i < end; i++) {
 25:     value = (PetscScalar)i;
 26:     PetscCall(VecSetValues(x, 1, &i, &value, INSERT_VALUES));
 27:   }
 28:   PetscCall(VecAssemblyBegin(x));
 29:   PetscCall(VecAssemblyEnd(x));
 30:   PetscCall(VecView(x, PETSC_VIEWER_STDOUT_WORLD));

 32:   PetscCall(VecScatterCreateToAll(x, &toall, &y));
 33:   PetscCall(VecScatterBegin(toall, x, y, INSERT_VALUES, SCATTER_FORWARD));
 34:   PetscCall(VecScatterEnd(toall, x, y, INSERT_VALUES, SCATTER_FORWARD));
 35:   PetscCall(VecScatterDestroy(&toall));

 37:   /* Cannot view the above vector with VecView(), so place it in an MPI Vec
 38:      and do a VecView() */
 39:   PetscCall(VecGetArray(y, &yy));
 40:   PetscCall(VecGetLocalSize(y, &len));
 41:   PetscCall(VecCreateMPIWithArray(PETSC_COMM_WORLD, 1, len, PETSC_DECIDE, yy, &y_t));
 42:   PetscCall(VecView(y_t, PETSC_VIEWER_STDOUT_WORLD));
 43:   PetscCall(VecDestroy(&y_t));
 44:   PetscCall(VecRestoreArray(y, &yy));

 46:   PetscCall(VecScatterCreateToAll(x, &tozero, &z));
 47:   PetscCall(VecScatterBegin(tozero, x, z, INSERT_VALUES, SCATTER_FORWARD));
 48:   PetscCall(VecScatterEnd(tozero, x, z, INSERT_VALUES, SCATTER_FORWARD));
 49:   PetscCall(VecScatterDestroy(&tozero));
 50:   if (rank == 0) PetscCall(VecView(z, PETSC_VIEWER_STDOUT_SELF));
 51:   PetscCall(VecDestroy(&z));

 53:   PetscCall(VecScatterCreateToZero(x, &tozero, &z));
 54:   PetscCall(VecScatterBegin(tozero, x, z, INSERT_VALUES, SCATTER_FORWARD));
 55:   PetscCall(VecScatterEnd(tozero, x, z, INSERT_VALUES, SCATTER_FORWARD));
 56:   PetscCall(VecScatterDestroy(&tozero));
 57:   PetscCall(VecDestroy(&z));

 59:   PetscCall(VecDestroy(&x));
 60:   PetscCall(VecDestroy(&y));

 62:   PetscCall(PetscFinalize());
 63:   return 0;
 64: }

 66: /*TEST

 68:    test:
 69:       nsize: 4

 71: TEST*/