Actual source code: ex12.c

  1: static char help[] = "Demonstrates VecStrideScatter() and VecStrideGather().\n\n";

  3: /*
  4:   Include "petscvec.h" so that we can use vectors.  Note that this file
  5:   automatically includes:
  6:      petscsys.h       - base PETSc routines   petscis.h     - index sets
  7:      petscviewer.h - viewers
  8: */

 10: #include <petscvec.h>

 12: int main(int argc, char **argv)
 13: {
 14:   Vec         v, s; /* vectors */
 15:   PetscInt    n   = 20;
 16:   PetscScalar one = 1.0;

 18:   PetscFunctionBeginUser;
 19:   PetscCall(PetscInitialize(&argc, &argv, (char *)0, help));
 20:   PetscCall(PetscOptionsGetInt(NULL, NULL, "-n", &n, NULL));

 22:   /*
 23:       Create multi-component vector with 2 components
 24:   */
 25:   PetscCall(VecCreate(PETSC_COMM_WORLD, &v));
 26:   PetscCall(VecSetSizes(v, PETSC_DECIDE, n));
 27:   PetscCall(VecSetBlockSize(v, 2));
 28:   PetscCall(VecSetFromOptions(v));

 30:   /*
 31:       Create single-component vector
 32:   */
 33:   PetscCall(VecCreate(PETSC_COMM_WORLD, &s));
 34:   PetscCall(VecSetSizes(s, PETSC_DECIDE, n / 2));
 35:   PetscCall(VecSetFromOptions(s));

 37:   /*
 38:      Set the vectors to entries to a constant value.
 39:   */
 40:   PetscCall(VecSet(v, one));

 42:   /*
 43:      Get the first component from the multi-component vector to the single vector
 44:   */
 45:   PetscCall(VecStrideGather(v, 0, s, INSERT_VALUES));

 47:   PetscCall(VecView(s, PETSC_VIEWER_STDOUT_WORLD));

 49:   /*
 50:      Put the values back into the second component
 51:   */
 52:   PetscCall(VecStrideScatter(s, 1, v, ADD_VALUES));

 54:   PetscCall(VecView(v, PETSC_VIEWER_STDOUT_WORLD));

 56:   /*
 57:      Free work space.  All PETSc objects should be destroyed when they
 58:      are no longer needed.
 59:   */
 60:   PetscCall(VecDestroy(&v));
 61:   PetscCall(VecDestroy(&s));
 62:   PetscCall(PetscFinalize());
 63:   return 0;
 64: }

 66: /*TEST

 68:      test:
 69:        nsize: 2

 71: TEST*/