1 2 module ex43fmodule 3#include <petsc/finclude/petscvec.h> 4 use,intrinsic :: iso_c_binding 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 18 19#include <petsc/finclude/petscvec.h> 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 PetscInt five 29! 30! We need to use the same iso_c_binding variable types here or some compilers 31! will see a type mismatch in the call to fillupvector and thus not link 32! 33 integer(c_long_long) vaddr 34 integer(c_int) err 35 36 PetscCallA(PetscInitialize(ierr)) 37 PetscCallA(VecCreate(PETSC_COMM_WORLD,v,ierr)) 38 five = 5 39 PetscCallA(VecSetSizes(v,PETSC_DECIDE,five,ierr)) 40 PetscCallA(VecSetFromOptions(v,ierr)) 41! 42! Now Call a Petsc Routine from Fortran 43! 44! 45 vaddr = v%v 46 call fillupvector(vaddr,err) 47 48 PetscCallA(VecView(v,PETSC_VIEWER_STDOUT_WORLD,ierr)) 49 PetscCallA(VecDestroy(v,ierr)) 50 PetscCallA(PetscFinalize(ierr)) 51 end 52 53!/*TEST 54! 55! build: 56! depends: ex43.c 57! 58! test: 59! 60!TEST*/ 61