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*/