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