Actual source code: ex43f.F90
1: #include <petsc/finclude/petscvec.h>
2: module ex43fmodule
3: use, intrinsic :: iso_c_binding
4: implicit none
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
19: program ex43f
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: !
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
35: PetscCallA(PetscInitialize(ierr))
36: PetscCallA(VecCreate(PETSC_COMM_WORLD, v, ierr))
37: PetscCallA(VecSetSizes(v, PETSC_DECIDE, 5_PETSC_INT_KIND, ierr))
38: PetscCallA(VecSetFromOptions(v, ierr))
39: !
40: ! Now call a PETSc routine from Fortran
41: !
42: !
43: vaddr = v%v
44: call fillupvector(vaddr, err)
46: PetscCallA(VecView(v, PETSC_VIEWER_STDOUT_WORLD, ierr))
47: PetscCallA(VecDestroy(v, ierr))
48: PetscCallA(PetscFinalize(ierr))
49: end program ex43f
51: !/*TEST
52: !
53: ! build:
54: ! depends: ex43.c
55: !
56: ! test:
57: !
58: !TEST*/