Actual source code: ex3.c

      1: static char help[] = "Parallel vector layout.\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: */
      9: #include <petscvec.h>

     11: int main(int argc, char **argv)
     12: {
     13:   PetscMPIInt rank;
     14:   PetscInt    i, istart, iend, n = 6, nlocal;
     15:   PetscScalar v, *array;
     16:   Vec         x;
     17:   PetscViewer viewer;

     19:   PetscFunctionBeginUser;
     20:   PetscCall(PetscInitialize(&argc, &argv, NULL, help));
     21:   PetscCallMPI(MPI_Comm_rank(PETSC_COMM_WORLD, &rank));

     23:   PetscCall(PetscOptionsGetInt(NULL, NULL, "-n", &n, NULL));

     25:   /*
     26:      Create a vector, specifying only its global dimension.
     27:      When using VecCreate(), VecSetSizes() and VecSetFromOptions(),
     28:      the vector format (currently parallel or sequential) is
     29:      determined at runtime.  Also, the parallel partitioning of
     30:      the vector is determined by PETSc at runtime.
     31:   */
     32:   PetscCall(VecCreate(PETSC_COMM_WORLD, &x));
     33:   PetscCall(VecSetSizes(x, PETSC_DECIDE, n));
     34:   PetscCall(VecSetFromOptions(x));

     36:   /*
     37:      PETSc parallel vectors are partitioned by
     38:      contiguous chunks of rows across the processors.  Determine
     39:      which vector are locally owned.
     40:   */
     41:   PetscCall(VecGetOwnershipRange(x, &istart, &iend));

     43:   /* --------------------------------------------------------------------
     44:      Set the vector elements.
     45:       - Always specify global locations of vector entries.
     46:       - Each processor can insert into any location, even ones it does not own
     47:       - In this case each processor adds values to all the entries,
     48:          this is not practical, but is merely done as an example
     49:    */
     50:   for (i = 0; i < n; i++) {
     51:     v = (PetscReal)(rank * i);
     52:     PetscCall(VecSetValues(x, 1, &i, &v, ADD_VALUES));
     53:   }

     55:   /*
     56:      Assemble vector, using the 2-step process:
     57:        VecAssemblyBegin(), VecAssemblyEnd()
     58:      Computations can be done while messages are in transition
     59:      by placing code between these two statements.
     60:   */
     61:   PetscCall(VecAssemblyBegin(x));
     62:   PetscCall(VecAssemblyEnd(x));

     64:   /*
     65:      Open an X-window viewer.  Note that we specify the same communicator
     66:      for the viewer as we used for the distributed vector (PETSC_COMM_WORLD).
     67:        - Helpful runtime option:
     68:             -draw_pause <pause> : sets time (in seconds) that the
     69:                   program pauses after PetscDrawPause() has been called
     70:                   (0 is default, -1 implies until user input).

     72:   */
     73:   PetscCall(PetscViewerDrawOpen(PETSC_COMM_WORLD, NULL, NULL, 0, 0, 300, 300, &viewer));
     74:   PetscCall(PetscObjectSetName((PetscObject)viewer, "Line graph Plot"));
     75:   PetscCall(PetscViewerPushFormat(viewer, PETSC_VIEWER_DRAW_LG));
     76:   /*
     77:      View the vector
     78:   */
     79:   PetscCall(VecView(x, viewer));

     81:   /* --------------------------------------------------------------------
     82:        Access the vector values directly. Each processor has access only
     83:     to its portion of the vector. For default PETSc vectors VecGetArray()
     84:     does NOT involve a copy
     85:   */
     86:   PetscCall(VecGetLocalSize(x, &nlocal));
     87:   PetscCall(VecGetArray(x, &array));
     88:   for (i = 0; i < nlocal; i++) array[i] = rank + 1;
     89:   PetscCall(VecRestoreArray(x, &array));

     91:   /*
     92:      View the vector
     93:   */
     94:   PetscCall(VecView(x, viewer));

     96:   /*
     97:      Free work space.  All PETSc objects should be destroyed when they
     98:      are no longer needed.
     99:   */
    100:   PetscCall(PetscViewerPopFormat(viewer));
    101:   PetscCall(PetscViewerDestroy(&viewer));
    102:   PetscCall(VecDestroy(&x));

    104:   PetscCall(PetscFinalize());
    105:   return 0;
    106: }

    108: /*TEST

    110:      test:
    111:        nsize: 2
    112:        output_file: output/empty.out

    114: TEST*/