Actual source code: ex3f.F90

  1: !
  2: !
  3: !  Description: Displays a vector visually.
  4: !
  5: ! -----------------------------------------------------------------------

  7:       program main
  8: #include <petsc/finclude/petscvec.h>
  9:       use petscvec
 10:       implicit none

 12: ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 13: !                 Beginning of program
 14: ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

 16:       Vec     x
 17:       PetscViewer  viewer
 18:       PetscScalar  v
 19:       PetscInt :: i,istart,iend
 20:       PetscInt, parameter :: ione = 1, n = 50
 21:       PetscErrorCode ierr
 22:       PetscBool  flg
 23:       integer4 xl,yl,w,h

 25:       PetscCallA(PetscInitialize(ierr))
 26:       PetscCallA(PetscOptionsGetInt(PETSC_NULL_OPTIONS,PETSC_NULL_CHARACTER,'-n',n,flg,ierr))

 28: !  Create a vector, specifying only its global dimension.
 29: !  When using VecCreate(), VecSetSizes() and VecSetFromOptions(),
 30: !  the vector format (currently parallel
 31: !  or sequential) is determined at runtime.  Also, the parallel
 32: !  partitioning of the vector is determined by PETSc at runtime.
 33:       PetscCallA(VecCreate(PETSC_COMM_WORLD,x,ierr))
 34:       PetscCallA(VecSetSizes(x,PETSC_DECIDE,n,ierr))
 35:       PetscCallA(VecSetFromOptions(x,ierr))

 37: !  Currently, all PETSc parallel vectors are partitioned by
 38: !  contiguous chunks of rows across the processors.  Determine
 39: !  which vector are locally owned.
 40:       PetscCallA(VecGetOwnershipRange(x,istart,iend,ierr))

 42: !  Set the vector elements.
 43: !   - Always specify global locations of vector entries.
 44: !   - Each processor needs to insert only elements that it owns locally.
 45:       do 100 i=istart,iend-1
 46:          v = 1.0*real(i)
 47:          PetscCallA(VecSetValues(x,ione,[i],[v],INSERT_VALUES,ierr))
 48:  100  continue

 50: !  Assemble vector, using the 2-step process:
 51: !    VecAssemblyBegin(), VecAssemblyEnd()
 52: !  Computations can be done while messages are in transition
 53: !  by placing code between these two statements.
 54:       PetscCallA(VecAssemblyBegin(x,ierr))
 55:       PetscCallA(VecAssemblyEnd(x,ierr))

 57: !  Open an X-window viewer.  Note that we specify the same communicator
 58: !  for the viewer as we used for the distributed vector (PETSC_COMM_WORLD).
 59: !    - Helpful runtime option:
 60: !         -draw_pause <pause> : sets time (in seconds) that the
 61: !               program pauses after PetscDrawPause() has been called
 62: !              (0 is default, -1 implies until user input).

 64:       xl = 0
 65:       yl = 0
 66:       w  = 300
 67:       h  = 300
 68:       PetscCallA(PetscViewerDrawOpen(PETSC_COMM_WORLD,PETSC_NULL_CHARACTER,PETSC_NULL_CHARACTER,xl,yl,w,h,viewer,ierr))

 70: !  View the vector
 71:       PetscCallA(VecView(x,viewer,ierr))

 73: !  Free work space.  All PETSc objects should be destroyed when they
 74: !  are no longer needed.

 76:       PetscCallA(PetscViewerDestroy(viewer,ierr))
 77:       PetscCallA(VecDestroy(x,ierr))

 79:       PetscCallA(PetscFinalize(ierr))
 80:       end

 82: !/*TEST
 83: !
 84: !     test:
 85: !       nsize: 2
 86: !
 87: !TEST*/