Actual source code: ex16f.F90

  1: program main
  2: #include <petsc/finclude/petscvec.h>
  3:   use petscvec
  4:   implicit none

  6:   Vec ::           v, s, r
  7:   Vec, pointer, dimension(:) ::  vecs
  8:   PetscInt :: i, start
  9:   PetscInt :: endd
 10:   PetscInt, parameter :: n = 20, four = 4, two = 2, one = 1
 11:   PetscErrorCode ierr
 12:   PetscScalar  ::  myValue
 13:   PetscBool :: flg

 15:   PetscCallA(PetscInitialize(ierr))

 17:   PetscCallA(PetscOptionsGetInt(PETSC_NULL_OPTIONS, PETSC_NULL_CHARACTER, '-n', n, flg, ierr))

 19:   !Create multi-component vector with 2 components
 20:   PetscCallA(VecCreate(PETSC_COMM_WORLD, v, ierr))
 21:   PetscCallA(VecSetSizes(v, PETSC_DECIDE, n, ierr))
 22:   PetscCallA(VecSetBlockSize(v, four, ierr))
 23:   PetscCallA(VecSetFromOptions(v, ierr))

 25:   ! Create double-component vectors

 27:   PetscCallA(VecCreate(PETSC_COMM_WORLD, s, ierr))
 28:   PetscCallA(VecSetSizes(s, PETSC_DECIDE, n/two, ierr))
 29:   PetscCallA(VecSetBlockSize(s, two, ierr))
 30:   PetscCallA(VecSetFromOptions(s, ierr))
 31:   PetscCallA(VecDuplicate(s, r, ierr))
 32:   allocate (vecs(0:2))

 34:   vecs(0) = s
 35:   vecs(1) = r

 37:   !Set the vector values

 39:   PetscCallA(VecGetOwnershipRange(v, start, endd, ierr))
 40:   do i = start, endd - 1
 41:     myValue = real(i)
 42:     PetscCallA(VecSetValues(v, one, [i], [myValue], INSERT_VALUES, ierr))
 43:   end do
 44:   PetscCallA(VecAssemblyBegin(v, ierr))
 45:   PetscCallA(VecAssemblyEnd(v, ierr))

 47:   ! Get the components from the multi-component vector to the other vectors

 49:   PetscCallA(VecStrideGatherAll(v, vecs, INSERT_VALUES, ierr))

 51:   PetscCallA(VecView(s, PETSC_VIEWER_STDOUT_WORLD, ierr))
 52:   PetscCallA(VecView(r, PETSC_VIEWER_STDOUT_WORLD, ierr))

 54:   PetscCallA(VecStrideScatterAll(vecs, v, ADD_VALUES, ierr))

 56:   PetscCallA(VecView(v, PETSC_VIEWER_STDOUT_WORLD, ierr))

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

 60:   deallocate (vecs)
 61:   PetscCallA(VecDestroy(v, ierr))
 62:   PetscCallA(VecDestroy(s, ierr))
 63:   PetscCallA(VecDestroy(r, ierr))
 64:   PetscCallA(PetscFinalize(ierr))

 66: end program

 68: !/*TEST
 69: !
 70: !     test:
 71: !       nsize: 2
 72: !       output_file: output/ex16_1.out
 73: !
 74: !TEST*/