> On Oct 23, 2017, at 6:01 PM, Adrian Croucher <[email protected]> 
> 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: [email protected]
> tel: +64 (0)9 923 4611
> 

Reply via email to