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:   num_cells = merge(1, 0, rank == 0)

 22:   PetscCallA(VecCreate(PETSC_COMM_WORLD, v, ierr))
 23:   PetscCallA(VecSetSizes(v, num_cells*blocksize, PETSC_DECIDE, ierr))
 24:   PetscCallA(VecSetBlockSize(v, blocksize, ierr))
 25:   PetscCallA(VecSetFromOptions(v, ierr))

 27:   subsize = num_cells
 28:   allocate (subindices(0:subsize - 1))
 29:   subindices = [(i, i=0, subsize - 1)]*blocksize + field
 30:   PetscCallA(ISCreateGeneral(PETSC_COMM_WORLD, subsize, subindices, PETSC_COPY_VALUES, index_set, ierr))
 31:   deallocate (subindices)

 33:   PetscCallA(VecGetSubVector(v, index_set, subv, ierr))
 34:   PetscCallA(VecRestoreSubVector(v, index_set, subv, ierr))
 35:   PetscCallA(ISDestroy(index_set, ierr))

 37:   PetscCallA(VecDestroy(v, ierr))
 38:   PetscCallA(PetscFinalize(ierr))
 39: end

 41: !/*TEST
 42: !
 43: !   test:
 44: !      nsize: 2
 45: !      filter: sort -b
 46: !      filter_output: sort -b
 47: !      output_file: output/empty.out
 48: !
 49: !TEST*/