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 
> <petsc-users@mcs.anl.gov> 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 
>  
> 
> 
> 

Reply via email to