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