Actual source code: ex2.c

petsc-3.14.6 2021-03-30
Report Typos and Errors

  2: static char help[] = "Builds a parallel vector with 1 component on the first processor, 2 on the second, etc.\n\
  3:   Then each processor adds one to all elements except the last rank.\n\n";

  5: /*T
  6:    Concepts: vectors^assembling vectors;
  7:    Processors: n
  8: T*/

 10: /*
 11:   Include "petscvec.h" so that we can use vectors.  Note that this file
 12:   automatically includes:
 13:      petscsys.h       - base PETSc routines   petscis.h     - index sets
 14:      petscviewer.h - viewers
 15: */
 16: #include <petscvec.h>

 18: int main(int argc,char **argv)
 19: {
 21:   PetscMPIInt    rank;
 22:   PetscInt       i,N;
 23:   PetscScalar    one = 1.0;
 24:   Vec            x;

 26:   PetscInitialize(&argc,&argv,(char*)0,help);if (ierr) return ierr;
 27:   MPI_Comm_rank(PETSC_COMM_WORLD,&rank);

 29:   /*
 30:      Create a parallel vector.
 31:       - In this case, we specify the size of each processor's local
 32:         portion, and PETSc computes the global size.  Alternatively,
 33:         if we pass the global size and use PETSC_DECIDE for the
 34:         local size PETSc will choose a reasonable partition trying
 35:         to put nearly an equal number of elements on each processor.
 36:   */
 37:   VecCreate(PETSC_COMM_WORLD,&x);
 38:   VecSetSizes(x,rank+1,PETSC_DECIDE);
 39:   VecSetFromOptions(x);
 40:   VecGetSize(x,&N);
 41:   VecSet(x,one);

 43:   /*
 44:      Set the vector elements.
 45:       - Always specify global locations of vector entries.
 46:       - Each processor can contribute any vector entries,
 47:         regardless of which processor "owns" them; any nonlocal
 48:         contributions will be transferred to the appropriate processor
 49:         during the assembly process.
 50:       - In this example, the flag ADD_VALUES indicates that all
 51:         contributions will be added together.
 52:   */
 53:   for (i=0; i<N-rank; i++) {
 54:     VecSetValues(x,1,&i,&one,ADD_VALUES);
 55:   }

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

 66:   /*
 67:       View the vector; then destroy it.
 68:   */
 69:   VecView(x,PETSC_VIEWER_STDOUT_WORLD);
 70:   VecDestroy(&x);

 72:   PetscFinalize();
 73:   return ierr;
 74: }

 76: /*TEST

 78:      test:
 79:        nsize: 2

 81: TEST*/