Actual source code: ex12f.F90

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

  6:   PetscErrorCode ierr
  7:   Vec v, s
  8:   PetscInt :: n
  9:   PetscScalar, parameter :: one = 1.0
 10:   PetscBool :: flg

 12:   PetscCallA(PetscInitialize(ierr))

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

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

 23:   ! Create single-component vector
 24:   PetscCallA(VecCreate(PETSC_COMM_WORLD, s, ierr))
 25:   PetscCallA(VecSetSizes(s, PETSC_DECIDE, n/2, ierr))
 26:   PetscCallA(VecSetFromOptions(s, ierr))

 28:   !Set the vectors to entries to a constant value.
 29:   PetscCallA(VecSet(v, one, ierr))

 31:   !Get the first component from the multi-component vector to the single vector
 32:   PetscCallA(VecStrideGather(v, 0_PETSC_INT_KIND, s, INSERT_VALUES, ierr))

 34:   PetscCallA(VecView(s, PETSC_VIEWER_STDOUT_WORLD, ierr))

 36:   !Put the values back into the second component
 37:   PetscCallA(VecStrideScatter(s, 1_PETSC_INT_KIND, v, ADD_VALUES, ierr))

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

 41:   ! Free work space.All PETSc objects should be destroyed when they are no longer needed.
 42:   PetscCallA(VecDestroy(v, ierr))
 43:   PetscCallA(VecDestroy(s, ierr))
 44:   PetscCallA(PetscFinalize(ierr))

 46: end program

 48: !/*TEST
 49: !
 50: !     test:
 51: !       nsize: 2
 52: !       output_file: output/ex12_1.out
 53: !
 54: !TEST*/