1! 2! 3 4 module mymoduleex43f 5#include <petsc/finclude/petscvec.h> 6 use iso_c_binding 7 interface 8 subroutine fillupvector(vaddr,ierr) bind ( C, name = "fillupvector") 9! 10! We need to use iso_c_binding variables or otherwise we get compiler warnings 11! Warning: Variable 'vaddr' at (1) is a dummy argument of the BIND(C) 12! procedure 'fillupvector' but may not be C interoperable 13! 14 use iso_c_binding 15 integer(c_long_long) vaddr 16 integer(c_int) ierr 17 end subroutine fillupvector 18 end interface 19 end module 20 21#include <petsc/finclude/petscvec.h> 22 use iso_c_binding 23 use petscvec 24 use mymoduleex43f 25 implicit none 26! 27! This routine demonstates how to call a bind C function from Fortran 28 Vec v 29 PetscErrorCode ierr 30 PetscInt five 31! 32! We need to use the same iso_c_binding variable types here or some compilers 33! will see a type mismatch in the call to fillupvector and thus not link 34! 35 integer(c_long_long) vaddr 36 integer(c_int) err 37 38 call PetscInitialize(PETSC_NULL_CHARACTER,ierr) 39 call VecCreate(PETSC_COMM_WORLD,v,ierr);CHKERRA(ierr) 40 five = 5 41 call VecSetSizes(v,PETSC_DECIDE,five,ierr);CHKERRA(ierr) 42 call VecSetFromOptions(v,ierr);CHKERRA(ierr) 43! 44! Now Call a Petsc Routine from Fortran 45! 46! 47 vaddr = v%v 48 call fillupvector(vaddr,err);CHKERRA(ierr) 49 50 call VecView(v,PETSC_VIEWER_STDOUT_WORLD,ierr);CHKERRA(ierr) 51 call VecDestroy(v,ierr);CHKERRA(ierr) 52 call PetscFinalize(ierr) 53 end 54 55 56!/*TEST 57! 58! build: 59! depends: ex43.c 60! 61! test: 62! 63!TEST*/ 64