Actual source code: ex43f.F90

  1: #include <petsc/finclude/petscvec.h>
  2: module ex43fmodule
  3:   use, intrinsic :: iso_c_binding
  4:   implicit none
  5:   interface
  6:     subroutine fillupvector(vaddr, err) bind(C, name='fillupvector')
  7: !
  8: !     We need to use iso_c_binding variables or otherwise we get compiler warnings
  9: !     Warning: Variable 'vaddr' at (1) is a dummy argument of the BIND(C)
 10: !              procedure 'fillupvector' but may not be C interoperable
 11: !
 12:       use, intrinsic :: iso_c_binding
 13:       integer(c_long_long) vaddr
 14:       integer(c_int) err
 15:     end subroutine fillupvector
 16:   end interface
 17: end module

 19: program ex43f
 20:   use, intrinsic :: iso_c_binding
 21:   use petscvec
 22:   use ex43fmodule
 23:   implicit none
 24: !
 25: !  This routine demonstrates how to call a bind C function from Fortran
 26:   Vec v
 27:   PetscErrorCode ierr
 28: !
 29: !     We need to use the same iso_c_binding variable types here or some compilers
 30: !     will see a type mismatch in the call to fillupvector and thus not link
 31: !
 32:   integer(c_long_long) vaddr
 33:   integer(c_int) err

 35:   PetscCallA(PetscInitialize(ierr))
 36:   PetscCallA(VecCreate(PETSC_COMM_WORLD, v, ierr))
 37:   PetscCallA(VecSetSizes(v, PETSC_DECIDE, 5_PETSC_INT_KIND, ierr))
 38:   PetscCallA(VecSetFromOptions(v, ierr))
 39: !
 40: !     Now call a PETSc routine from Fortran
 41: !
 42: !
 43:   vaddr = v%v
 44:   call fillupvector(vaddr, err)

 46:   PetscCallA(VecView(v, PETSC_VIEWER_STDOUT_WORLD, ierr))
 47:   PetscCallA(VecDestroy(v, ierr))
 48:   PetscCallA(PetscFinalize(ierr))
 49: end program ex43f

 51: !/*TEST
 52: !
 53: !   build:
 54: !     depends: ex43.c
 55: !
 56: !   test:
 57: !
 58: !TEST*/