Actual source code: ex26f.F90

  1: !
  2: !  Test VecGetSubVector()
  3: !  Contributed-by: Adrian Croucher <gitlab@mg.gitlab.com>
  4: #include <petsc/finclude/petsc.h>
  5: program main
  6:   use petsc
  7:   implicit none

  9:   PetscMPIInt :: rank
 10:   PetscErrorCode :: ierr
 11:   PetscInt :: num_cells, subsize, i
 12:   PetscInt, parameter :: blocksize = 3, field = 0
 13:   Vec :: v, subv
 14:   IS :: index_set
 15:   PetscInt, allocatable :: subindices(:)

 17:   PetscCallA(PetscInitialize(ierr))
 18:   PetscCallMPIA(MPI_COMM_RANK(PETSC_COMM_WORLD, rank, ierr))

 20:   if (rank == 0) then
 21:     num_cells = 1
 22:   else
 23:     num_cells = 0
 24:   end if

 26:   PetscCallA(VecCreate(PETSC_COMM_WORLD, v, ierr))
 27:   PetscCallA(VecSetSizes(v, num_cells*blocksize, PETSC_DECIDE, ierr))
 28:   PetscCallA(VecSetBlockSize(v, blocksize, ierr))
 29:   PetscCallA(VecSetFromOptions(v, ierr))

 31:   subsize = num_cells
 32:   allocate (subindices(0:subsize - 1))
 33:   subindices = [(i, i=0, subsize - 1)]*blocksize + field
 34:   PetscCallA(ISCreateGeneral(PETSC_COMM_WORLD, subsize, subindices, PETSC_COPY_VALUES, index_set, ierr))
 35:   deallocate (subindices)

 37:   PetscCallA(VecGetSubVector(v, index_set, subv, ierr))
 38:   PetscCallA(VecRestoreSubVector(v, index_set, subv, ierr))
 39:   PetscCallA(ISDestroy(index_set, ierr))

 41:   PetscCallA(VecDestroy(v, ierr))
 42:   PetscCallA(PetscFinalize(ierr))
 43: end

 45: !/*TEST
 46: !
 47: !   test:
 48: !      nsize: 2
 49: !      filter: sort -b
 50: !      filter_output: sort -b
 51: !      output_file: output/empty.out
 52: !
 53: !TEST*/