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