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 17 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 34 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) 46 47 PetscCallA(VecView(v,PETSC_VIEWER_STDOUT_WORLD,ierr)) 48 PetscCallA(VecDestroy(v,ierr)) 49 PetscCallA(PetscFinalize(ierr)) 50 end 51 52!/*TEST 53! 54! build: 55! depends: ex43.c 56! 57! test: 58! 59!TEST*/ 60