Actual source code: ex43f.F90

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

 18: #include <petsc/finclude/petscvec.h>
 19: use, intrinsic :: iso_c_binding
 20: use petscvec
 21: use ex43fmodule
 22: implicit none
 23: !
 24: !  This routine demonstrates how to call a bind C function from Fortran
 25: Vec v
 26: PetscErrorCode ierr
 27: PetscInt five
 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: five = 5
 38: PetscCallA(VecSetSizes(v, PETSC_DECIDE, five, ierr))
 39: PetscCallA(VecSetFromOptions(v, ierr))
 40: !
 41: !     Now call a PETSc routine from Fortran
 42: !
 43: !
 44: vaddr = v%v
 45: call fillupvector(vaddr, err)

 47: PetscCallA(VecView(v, PETSC_VIEWER_STDOUT_WORLD, ierr))
 48: PetscCallA(VecDestroy(v, ierr))
 49: PetscCallA(PetscFinalize(ierr))
 50: end

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