Actual source code: ex16f.F90

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

  6:   Vec ::  v, s, r
  7:   Vec, pointer, dimension(:) ::  vecs
  8:   PetscInt :: i, start, endd, n
  9:   PetscErrorCode ierr
 10:   PetscScalar  ::  myValue
 11:   PetscBool :: flg

 13:   PetscCallA(PetscInitialize(ierr))

 15:   n = 20
 16:   PetscCallA(PetscOptionsGetInt(PETSC_NULL_OPTIONS, PETSC_NULL_CHARACTER, '-n', n, flg, ierr))

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

 24:   ! Create double-component vectors

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

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

 36:   !Set the vector values

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

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

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

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

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

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

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

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

 65: end program

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