PETSc uses the Sowing packages bfort tool for automatically generating
"Fortran stub functions" and interface definitions. There are certain C
functions that bfort cannot handling including (at least)
1) functions with character string arguments
2) functions with function pointer arguments (such as SNESSetFunction())
3) functions that support polymorphism between array and non-array arguments
(for example VecSetValues() where the ix and y arguments can be either scalars
or arrays).
4) functions that can take a NULL argument.
Functions that bfort can automatically generate the stub and the interface
definition are marked with /*@ at the beginning of the comment above the
function (see for example src/ksp/ksp/interface/itcreate.c KSPCreate()). If
bfort cannot work then the comment begins with /*@C (see for example
src/sys/objects/pinit.c PetscInitiialize()).
It is our intention to provide manual Fortran stubs and interface for
functions that bfort cannot handle.
As you note we do not currently provide all the interface definitions, many
even basic ones are missing. This is because we wrote the manual stub functions
many, many years ago when we wrote the C functions but only in the past couple
of years have we been providing interfaces and no one went back and added all
the required manual interface definitions.
I did not know about the gfortran option -Wimplicit-interface; this is a
great tool for finding missing interfaces. Thanks for letting us know about it.
The manually generated stub functions are stored in files in the
subdirectories ftn-custom from where the C function is defined. The filename is
the C file name prepended with a Z and appended with an f. For example snes.c
becomes ftn-custom/zsnesf.c The manually generated interface definitions
should go into the file src/XXX/f90-mod/petscYYY.h90 for example the interfaces
for VecSetValues are in src/vec/f90-mod/petscvec.h90
If you are ambitious and know about pull requests we'd be very happy to
accept a pull request that provided the missing manual interface definitions.
If you are less ambitious you could send us the interface definitions that you
create and we'll add them ourselves to the PETSc repository. Or eventually
we'll provide more and more of the interface definitions as time permits.
Barry
> On Nov 27, 2018, at 9:28 AM, Natacha BEREUX via petsc-users
> <[email protected]> wrote:
>
> Hello,
> I work on a Fortran software that uses PETSc for linear solvers. Therefore,
> we have a PETSc interface to convert our matrices to PETSc Mat.
> I have noticed several compiler warnings ( I use gfortran with
> -Wimplicit-interface) during compilation. The warnings point out that some
> (but not all) fortran interfaces are missing.
>
> The behaviour is the same when I compile a PETSC example. Below is
> src/vec/vec/examples/tutorials/ex9f.F compiled with gfortran.
>
> mpif90 -c -fPIC -Wall -ffree-line-length-0 -Wno-unused-dummy-argument
> -Wimplicit-interface -g -O -I/home/H03755/Librairies/petsc-3.10.1/include
> -I/home/H03755/Librairies/petsc-3.10.1/linux-opt-mumps-ml-hypre-superlu/include
>
> -I/home/H03755/dev/codeaster-prerequisites/v14/prerequisites/Mumps-512_consortium_aster3/MPI/include
> -I/home/H03755/local/petsc/petsc-3.10.1/include -o ex9f.o ex9f.F90
> ex9f.F90:34.53:
>
> call PetscInitialize(PETSC_NULL_CHARACTER,ierr)
> 1
> Warning: Procedure 'petscinitialize' called with an implicit interface at (1)
> ex9f.F90:42.91:
>
> if (size .ne. 2) then; call PetscError(PETSC_COMM_WORLD,1,0,'Requires 2
> processors'); call MPIU_Abort(PETSC_COMM_WORLD,1); endif
>
> 1
> Warning: Procedure 'petscerror' called with an implicit interface at (1)
> ex9f.F90:42.128:
>
> if (size .ne. 2) then; call PetscError(PETSC_COMM_WORLD,1,0,'Requires 2
> processors'); call MPIU_Abort(PETSC_COMM_WORLD,1); endif
>
> 1
> Warning: Procedure 'mpiu_abort' called with an implicit interface at (1)
> ex9f.F90:81.56:
>
> & PETSC_DECIDE,nghost,ifrom,tarray,gxs,ierr)
> 1
> Warning: Procedure 'veccreateghostwitharray' called with an implicit
> interface at (1)
> ex9f.F90:99.53:
>
> call VecGetOwnershipRange(gx,rstart,rend,ierr)
> 1
> Warning: Procedure 'vecgetownershiprange' called with an implicit interface
> at (1)
> ex9f.F90:115.93:
>
> call
> PetscViewerGetSubViewer(PETSC_VIEWER_STDOUT_WORLD,PETSC_COMM_SELF,subviewer,ierr)
>
> 1
> Warning: Procedure 'petscviewergetsubviewer' called with an implicit
> interface at (1)
> ex9f.F90:117.97:
>
> call
> PetscViewerRestoreSubViewer(PETSC_VIEWER_STDOUT_WORLD,PETSC_COMM_SELF,subviewer,ierr)
>
> 1
> Warning: Procedure 'petscviewerrestoresubviewer' called with an implicit
> interface at (1)
> ex9f.F90:121.31:
>
> call PetscFinalize(ierr)
> 1
> Warning: Procedure 'petscfinalize' called with an implicit interface at (1)
>
>
> Why does the compiler complain ?
> Did I miss something when I compiled PETSc library ? Is there a way to
> properly generate all the Fortran interfaces in the compiled library ?
> Or is it normal that PETSc only generates some interfaces but not all ?
> In this case, is there a way to know which interfaces are explicitly and
> automatically defined in PETSc library ? So that I can provide manually
> the missing ones in my code ?
>
> Thanks a lot for your help !
> Best regards,
> Natacha
>
>
>
>