How to check NULL pointer in Fortran
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
You could try this: integer :: i real :: r i = loc(r) print *, i On Fri, Nov 19, 2021 at 12:34 AM 袁煕 <[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
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]> 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
participants (3)
-
Barry Smith -
Mark Adams -
袁煕