[petsc-dev] [FORGED] Re: PetscSF in Fortran

Barry Smith bsmith at mcs.anl.gov
Mon Oct 23 18:46:40 CDT 2017


> On Oct 23, 2017, at 6:01 PM, Adrian Croucher <a.croucher at auckland.ac.nz> wrote:
> 
> hi Barry,
> 
> 
> On 23/10/17 15:04, Barry Smith wrote:
>>   Adrian,
>> 
>>    Sorry for the delay in generating the bindings for you. I have put them in the branch
>> 
>> barry/fortran-PetscSFBcastBegin
>> 
>> the example src/vec/sf/examples/tutorials/ex1f.F90 attempts to test them. Please let us know if this works for you and if you need anything else. They will only work for MPIU_INT and MPIU_REAL and MPIU_SCALAR because that is the only Fortran pointer arrays we support currently.
> 
> Oh, thanks very much for that. I really only need support for integers in my application at present, so what you've done should be fine for now.
> 
> I checked out your new branch but it is giving a bunch of warnings and errors when I try to make it.
> 
   These warnings should be gone in the latest version of the branch. Do a git pull on that branch. 

> The warnings are:
> 
> In file included from /home/acro018/software/PETSc/code/include/petscsys.h:1631:0,
>                 from /home/acro018/software/PETSc/code/include/petsc/private/petscimpl.h:8,
>                 from /home/acro018/software/PETSc/code/include/petsc/private/fortranimpl.h:6,
>                 from /home/acro018/software/PETSc/code/include/petsc/private/f90impl.h:4,
>                 from /home/acro018/software/PETSc/code/src/sys/f90-src/f90_cwrap.c:1:
> /home/acro018/software/PETSc/code/src/sys/f90-src/f90_cwrap.c: In function ‘F90Array1dCreate’:
> /home/acro018/software/PETSc/code/src/sys/f90-src/f90_cwrap.c:60:80: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
>   } else SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SUP,"unsupported MPI_Datatype: %d",(PetscInt)type);
> ^
> /home/acro018/software/PETSc/code/include/petscerror.h:126:122: note: in definition of macro ‘SETERRQ1’
> #define SETERRQ1(comm,ierr,s,a1) return PetscError(comm,__LINE__,PETSC_FUNCTION_NAME,__FILE__,ierr,PETSC_ERROR_INITIAL,s,a1)
> ^
> /home/acro018/software/PETSc/code/src/sys/f90-src/f90_cwrap.c: In function ‘F90Array1dAccess’:
> /home/acro018/software/PETSc/code/src/sys/f90-src/f90_cwrap.c:78:80: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
>   } else SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SUP,"unsupported MPI_Datatype: %d",(PetscInt)type);
> ^
> /home/acro018/software/PETSc/code/include/petscerror.h:126:122: note: in definition of macro ‘SETERRQ1’
> #define SETERRQ1(comm,ierr,s,a1) return PetscError(comm,__LINE__,PETSC_FUNCTION_NAME,__FILE__,ierr,PETSC_ERROR_INITIAL,s,a1)
> ^
> /home/acro018/software/PETSc/code/src/sys/f90-src/f90_cwrap.c: In function ‘F90Array1dDestroy’:
> /home/acro018/software/PETSc/code/src/sys/f90-src/f90_cwrap.c:93:80: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
>   } else SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SUP,"unsupported MPI_Datatype: %d",(PetscInt)type);
> ^
> /home/acro018/software/PETSc/code/include/petscerror.h:126:122: note: in definition of macro ‘SETERRQ1’
> #define SETERRQ1(comm,ierr,s,a1) return PetscError(comm,__LINE__,PETSC_FUNCTION_NAME,__FILE__,ierr,PETSC_ERROR_INITIAL,s,a1)
> ^
> /home/acro018/software/PETSc/code/src/sys/f90-src/f90_cwrap.c: In function ‘F90Array2dCreate’:
> /home/acro018/software/PETSc/code/src/sys/f90-src/f90_cwrap.c:151:80: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
>   } else SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SUP,"unsupported MPI_Datatype: %d",(PetscInt)type);
> ^
> /home/acro018/software/PETSc/code/include/petscerror.h:126:122: note: in definition of macro ‘SETERRQ1’
> #define SETERRQ1(comm,ierr,s,a1) return PetscError(comm,__LINE__,PETSC_FUNCTION_NAME,__FILE__,ierr,PETSC_ERROR_INITIAL,s,a1)
> ^
> /home/acro018/software/PETSc/code/src/sys/f90-src/f90_cwrap.c: In function ‘F90Array2dAccess’:
> /home/acro018/software/PETSc/code/src/sys/f90-src/f90_cwrap.c:166:80: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
>   } else SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SUP,"unsupported MPI_Datatype: %d",(PetscInt)type);
> ^
> /home/acro018/software/PETSc/code/include/petscerror.h:126:122: note: in definition of macro ‘SETERRQ1’
> #define SETERRQ1(comm,ierr,s,a1) return PetscError(comm,__LINE__,PETSC_FUNCTION_NAME,__FILE__,ierr,PETSC_ERROR_INITIAL,s,a1)
> ^
> /home/acro018/software/PETSc/code/src/sys/f90-src/f90_cwrap.c: In function ‘F90Array2dDestroy’:
> /home/acro018/software/PETSc/code/src/sys/f90-src/f90_cwrap.c:181:80: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
>   } else SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SUP,"unsupported MPI_Datatype: %d",(PetscInt)type);
> ^
> /home/acro018/software/PETSc/code/include/petscerror.h:126:122: note: in definition of macro ‘SETERRQ1’
> #define SETERRQ1(comm,ierr,s,a1) return PetscError(comm,__LINE__,PETSC_FUNCTION_NAME,__FILE__,ierr,PETSC_ERROR_INITIAL,s,a1)
> ^
> /home/acro018/software/PETSc/code/src/sys/f90-src/f90_cwrap.c: In function ‘F90Array3dCreate’:
> /home/acro018/software/PETSc/code/src/sys/f90-src/f90_cwrap.c:239:80: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
>   } else SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SUP,"unsupported MPI_Datatype: %d",(PetscInt)type);
> ^
> /home/acro018/software/PETSc/code/include/petscerror.h:126:122: note: in definition of macro ‘SETERRQ1’
> #define SETERRQ1(comm,ierr,s,a1) return PetscError(comm,__LINE__,PETSC_FUNCTION_NAME,__FILE__,ierr,PETSC_ERROR_INITIAL,s,a1)
> ^
> /home/acro018/software/PETSc/code/src/sys/f90-src/f90_cwrap.c: In function ‘F90Array3dAccess’:
> /home/acro018/software/PETSc/code/src/sys/f90-src/f90_cwrap.c:254:80: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
>   } else SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SUP,"unsupported MPI_Datatype: %d",(PetscInt)type);
> ^
> /home/acro018/software/PETSc/code/include/petscerror.h:126:122: note: in definition of macro ‘SETERRQ1’
> #define SETERRQ1(comm,ierr,s,a1) return PetscError(comm,__LINE__,PETSC_FUNCTION_NAME,__FILE__,ierr,PETSC_ERROR_INITIAL,s,a1)
> ^
> /home/acro018/software/PETSc/code/src/sys/f90-src/f90_cwrap.c: In function ‘F90Array3dDestroy’:
> /home/acro018/software/PETSc/code/src/sys/f90-src/f90_cwrap.c:269:80: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
>   } else SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SUP,"unsupported MPI_Datatype: %d",(PetscInt)type);
> ^
> /home/acro018/software/PETSc/code/include/petscerror.h:126:122: note: in definition of macro ‘SETERRQ1’
> #define SETERRQ1(comm,ierr,s,a1) return PetscError(comm,__LINE__,PETSC_FUNCTION_NAME,__FILE__,ierr,PETSC_ERROR_INITIAL,s,a1)
> ^
> /home/acro018/software/PETSc/code/src/sys/f90-src/f90_cwrap.c: In function ‘F90Array4dCreate’:
> /home/acro018/software/PETSc/code/src/sys/f90-src/f90_cwrap.c:320:80: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
>   } else SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SUP,"unsupported MPI_Datatype: %d",(PetscInt)type);
> ^
> /home/acro018/software/PETSc/code/include/petscerror.h:126:122: note: in definition of macro ‘SETERRQ1’
> #define SETERRQ1(comm,ierr,s,a1) return PetscError(comm,__LINE__,PETSC_FUNCTION_NAME,__FILE__,ierr,PETSC_ERROR_INITIAL,s,a1)
> ^
> /home/acro018/software/PETSc/code/src/sys/f90-src/f90_cwrap.c: In function ‘F90Array4dAccess’:
> /home/acro018/software/PETSc/code/src/sys/f90-src/f90_cwrap.c:335:80: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
>   } else SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SUP,"unsupported MPI_Datatype: %d",(PetscInt)type);
> ^
> /home/acro018/software/PETSc/code/include/petscerror.h:126:122: note: in definition of macro ‘SETERRQ1’
> #define SETERRQ1(comm,ierr,s,a1) return PetscError(comm,__LINE__,PETSC_FUNCTION_NAME,__FILE__,ierr,PETSC_ERROR_INITIAL,s,a1)
> ^
> /home/acro018/software/PETSc/code/src/sys/f90-src/f90_cwrap.c: In function ‘F90Array4dDestroy’:
> /home/acro018/software/PETSc/code/src/sys/f90-src/f90_cwrap.c:344:80: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
>   } else SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SUP,"unsupported MPI_Datatype: %d",(PetscInt)type);
> ^
> /home/acro018/software/PETSc/code/include/petscerror.h:126:122: note: in definition of macro ‘SETERRQ1’
> #define SETERRQ1(comm,ierr,s,a1) return PetscError(comm,__LINE__,PETSC_FUNCTION_NAME,__FILE__,ierr,PETSC_ERROR_INITIAL,s,a1)
> 
> 

   I don't know where these come from. In the branch you need to do a make allfortranstubs, this may fix the problem

> 
> The errors look like they're from some unrelated DMPlex box mesh changes:
> 
> /home/acro018/software/PETSc/code/src/dm/impls/plex/ftn-auto/plexcreatef.c: In function ‘dmplexcreateboxmesh_’:
> /home/acro018/software/PETSc/code/src/dm/impls/plex/ftn-auto/plexcreatef.c:105:11: error: incompatible type for argument 4 of ‘DMPlexCreateBoxMesh’
> *__ierr = DMPlexCreateBoxMesh(
>           ^
> In file included from /home/acro018/software/PETSc/code/src/dm/impls/plex/ftn-auto/plexcreatef.c:30:0:
> /home/acro018/software/PETSc/code/include/petscdmplex.h:124:29: note: expected ‘const PetscInt *’ but argument is of type ‘PetscBool’
> PETSC_EXTERN PetscErrorCode DMPlexCreateBoxMesh(MPI_Comm, PetscInt, PetscBool, const PetscInt[], const PetscReal[], const PetscReal[], const DMBoundaryType[], PetscBool, DM *);
>                             ^
> /home/acro018/software/PETSc/code/src/dm/impls/plex/ftn-auto/plexcreatef.c:106:52: warning: passing argument 5 of ‘DMPlexCreateBoxMesh’ from incompatible pointer type
>  MPI_Comm_f2c(*(comm)),*dim,*numFaces,*interpolate,dm);
>                                                    ^
> In file included from /home/acro018/software/PETSc/code/src/dm/impls/plex/ftn-auto/plexcreatef.c:30:0:
> /home/acro018/software/PETSc/code/include/petscdmplex.h:124:29: note: expected ‘const PetscReal *’ but argument is of type ‘struct _p_DM **’
> PETSC_EXTERN PetscErrorCode DMPlexCreateBoxMesh(MPI_Comm, PetscInt, PetscBool, const PetscInt[], const PetscReal[], const PetscReal[], const DMBoundaryType[], PetscBool, DM *);
>                             ^
> /home/acro018/software/PETSc/code/src/dm/impls/plex/ftn-auto/plexcreatef.c:105:11: error: too few arguments to function ‘DMPlexCreateBoxMesh’
> *__ierr = DMPlexCreateBoxMesh(
>           ^
> In file included from /home/acro018/software/PETSc/code/src/dm/impls/plex/ftn-auto/plexcreatef.c:30:0:
> /home/acro018/software/PETSc/code/include/petscdmplex.h:124:29: note: declared here
> PETSC_EXTERN PetscErrorCode DMPlexCreateBoxMesh(MPI_Comm, PetscInt, PetscBool, const PetscInt[], const PetscReal[], const PetscReal[], const DMBoundaryType[], PetscBool, DM *);
>                             ^
> /home/acro018/software/PETSc/code/src/dm/impls/plex/ftn-auto/plexcreatef.c: In function ‘dmplexcreatehexboxmesh_’:
> /home/acro018/software/PETSc/code/src/dm/impls/plex/ftn-auto/plexcreatef.c:109:1: warning: implicit declaration of function ‘DMPlexCreateHexBoxMesh’ [-Wimplicit-function-declaration]
> *__ierr = DMPlexCreateHexBoxMesh(
> ^
> gmakefile:227: recipe for target 'linux-gnu-c-opt/obj/src/dm/impls/plex/ftn-auto/plexcreatef.o' failed
> make[2]: *** [linux-gnu-c-opt/obj/src/dm/impls/plex/ftn-auto/plexcreatef.o] Error 1
> 
> 
>> I was shocked, shocked to discover that it looks like PetscSF has essentially no bindings for Fortran. We can add more relatively easily if you need them. I don't understand how you could previously test your code given that PetscSFCreate() didn't even have a Fortran stub generated?
> 
> My tests are based on DMPlex and I was just using DMGetPointSF() and DMPlexDistribute() to get some SFs to test.
> 

    You shouldn't need to make any of these stubs. They can be automatically generated. I turned on the automatic generation for them if
you do 

make allfortranstubs

I think you should throw away the stubs you wrote.

  Please let me know if what I suggested above doesn't resolve everything.

  Barry


> 
> I have also written some Fortran bindings for PetscSFGetGraph() and PetscSFSetGraph(). However it looks like you have made the PetscSFNode type accessible from Fortran in your branch? In which case my bindings could probably be modified to make use of that. Currently they look like this (using a 2-by-n array of int instead of an array of PetscSFNode for the root data array):
> 
> +      Interface
> +         Subroutine PetscSFGetGraph(sf,nroots,nleaves,
> +     &      larray,rarray,ierr)
> +          use petscisdef
> +          PetscSF :: sf
> +          PetscInt :: nroots, nleaves
> +          PetscInt, pointer :: larray(:)
> +          PetscInt, pointer :: rarray(:,:)
> +          PetscErrorCode :: ierr
> +        End Subroutine
> +      End Interface
> 
> 
> +PETSC_EXTERN void PETSC_STDCALL petscsfgetgraph_(PetscSF *sf, PetscInt *nroots, PetscInt *nleaves, F90Array1d *lptr, F90Array2d *rptr, int *ierr PETSC_F90_2PTR_PROTO(lptrd) PETSC_F90_2PTR_PROTO(rptrd))
> +{
> +  const PetscInt *ilocal;
> +  const PetscSFNode *iremote;
> +
> +  *ierr = PetscSFGetGraph(*sf, nroots, nleaves, &ilocal, &iremote); if (*ierr) return;
> +
> +  *ierr = F90Array1dCreate((void*) ilocal, PETSC_INT, 1, *nleaves, lptr PETSC_F90_2PTR_PARAM(lptrd)); if (*ierr) return;
> +  *ierr = F90Array2dCreate((void*) iremote, PETSC_INT, 1, 2, 1, *nleaves, rptr PETSC_F90_2PTR_PARAM(rptrd));
> +}
> 
> - Adrian
> 
> -- 
> Dr Adrian Croucher
> Senior Research Fellow
> Department of Engineering Science
> University of Auckland, New Zealand
> email: a.croucher at auckland.ac.nz
> tel: +64 (0)9 923 4611
> 



More information about the petsc-dev mailing list