xref: /petsc/src/vec/vec/tutorials/ex43f.F90 (revision 989fa6391339cf14e48187f6100e73b78ee6c140)
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