I believe I have fixed the bug in the branch barry/2021-11-26/fix-petscsfgetgraph-fortran/release https://gitlab.com/petsc/petsc/-/merge_requests/4605 <https://gitlab.com/petsc/petsc/-/merge_requests/4605>
See src/vec/is/sf/tutorials/ex1f.F90 for how to check if the returned value is a FORTRAN_NULL_INTEGER Barry > On Nov 24, 2021, at 3:19 AM, 袁煕 <[email protected]> wrote: > > Thank you for the clarification. I am looking forward to this bug fix. > > Yuan > > 2021年11月22日(月) 23:17 Barry Smith <[email protected] <mailto:[email protected]>>: > > The address of PETSC_NULL_INTEGER is not 0, it in some common block > location. PETSC_NULL_INTEGER should not be used in the form > if idx == PETSC_NULL_INTEGER, it is only to be used as an argument to a PETSc > function that on the C side can take a NULL (integer) argument. > > As I noted before whoever wrote the incorrect petscsfgetgraph_ Fortran > wrapper needs to fix it. > > Barry > > >> On Nov 21, 2021, at 8:05 PM, 袁煕 <[email protected] >> <mailto:[email protected]>> wrote: >> >> Thank you very much. >> >> The NULL pointer could be identified by if( loc(gmine)==PETSC_NULL_INTEGER) >> as above @Mark Adams <mailto:[email protected]> suggested. However, It seems >> that there is a memory leak here? >> >> Yuan >> >> 2021年11月19日(金) 22:20 Barry Smith <[email protected] >> <mailto:[email protected]>>: >> >> it is very possible there is a bug in the Fortran interface for this >> function. It looks like whoever wrote the Fortran interface did not think >> through the special case of contiguous entries. >> >> PETSC_EXTERN void petscsfgetgraph_(PetscSF *sf,PetscInt *nroots,PetscInt >> *nleaves, F90Array1d *ailocal, F90Array1d *airemote, PetscErrorCode *ierr >> PETSC_F90_2PTR_PROTO(pilocal) PETSC_F90_2PTR_PROTO(piremote)) >> { >> const PetscInt *ilocal; >> const PetscSFNode *iremote; >> >> *ierr = PetscSFGetGraph(*sf,nroots,nleaves,&ilocal,&iremote);if (*ierr) >> return; >> *ierr = F90Array1dCreate((void*)ilocal,MPIU_INT,1,*nleaves, ailocal >> PETSC_F90_2PTR_PARAM(pilocal)); >> /* this creates a memory leak */ >> f90arraysfnodecreate_((PetscInt*)iremote,nleaves, airemote >> PETSC_F90_2PTR_PARAM(piremote)); >> } >> >> PetscErrorCode F90Array1dCreate(void *array,MPI_Datatype type,PetscInt >> start,PetscInt len,F90Array1d *ptr PETSC_F90_2PTR_PROTO(ptrd)) >> { >> PetscFunctionBegin; >> if (type == MPIU_SCALAR) { >> if (!len) array = PETSC_NULL_SCALAR_Fortran; >> f90array1dcreatescalar_(array,&start,&len,ptr >> PETSC_F90_2PTR_PARAM(ptrd)); >> } else if (type == MPIU_REAL) { >> if (!len) array = PETSC_NULL_REAL_Fortran; >> f90array1dcreatereal_(array,&start,&len,ptr PETSC_F90_2PTR_PARAM(ptrd)); >> } else if (type == MPIU_INT) { >> if (!len) array = PETSC_NULL_INTEGER_Fortran; >> f90array1dcreateint_(array,&start,&len,ptr PETSC_F90_2PTR_PARAM(ptrd)); >> } else if (type == MPIU_FORTRANADDR) { >> f90array1dcreatefortranaddr_(array,&start,&len,ptr >> PETSC_F90_2PTR_PARAM(ptrd)); >> } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Unsupported MPI_Datatype"); >> PetscFunctionReturn(0); >> } >> >> It blindly calls F90Array1dCreate() with a len = *nleaves > 0 but a NULL >> array ilocal then f90array1dcreateint_ must create an invalid object. >> >> Barry >> >> >> >> > On Nov 19, 2021, at 12:34 AM, 袁煕 <[email protected] >> > <mailto:[email protected]>> wrote: >> > >> > Dear PETSc-team, >> > >> > I am using function PetscSFGetGraph in my program like >> > ----------------------- >> > call PetscSFGetGraph(sf,gnroots,gnleaves,gmine,gremote,ierr) >> > ----------------------- >> > >> > In some cases, it works well. But in some cases, I encountered following >> > error >> > ------------------ >> > PETSC ERROR: Caught signal number 11 SEGV: Segmentation Violation, >> > probably memory access out of range >> > ------------------ >> > I found it is due to the action of reading gmine, which is a fortran >> > pointer point to an array. It is reasonable because PETSc manual tells me >> > "if returned value is NULL, it means leaves are in contiguous storage". >> > The problem is that I cannot find if gmine is a null pointer. >> > 1) I cannot use "if (gmine==PETSC_NULL_INTEGER)" because my intel >> > compiler would return a compile error "A scalar-valued expression is >> > required in this context" >> > 2) When using standard style of checking a null pointer in fortran, >> > "associated(gmine)", it returns "T". Even in cases such action of "print >> > *, gmine(1)" would give rise to above Segmentation Violation error. >> > Is there any means to check the NULL pointer in Fortran in above cases. >> > Many thanks, >> > Yuan >> >
