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