Looks like the current code is buggy. Pushed the fix to petsc-dev now.

thanks,
Satish

On Wed, 8 Jun 2011, Blaise Bourdin wrote:

> Hi,
> 
> After poking a bit, I found out the bug causing a segfault in the 
> above-mentioned functions. It seems that gfortran will gladly nullify a bogus 
> pointer, whereas ifort can be a bit pickier, hence the bug coming up only 
> with intel compilers. 
> Can you check that the following patch makes sense and if so apply it to 
> petsc-dev?
> 
> Thanks,
> 
> Blaise
> 
> --- a/src/dm/impls/mesh/f90-custom/zmeshf90.c Tue Jun 07 23:08:25 2011 -0500
> +++ b/src/dm/impls/mesh/f90-custom/zmeshf90.c Wed Jun 08 09:54:14 2011 -0500
> @@ -31,7 +31,7 @@ void PETSC_STDCALL dmmeshrestorecoordina
> {
>   PetscReal *c;
>   *__ierr = F90Array2dAccess(ptr,PETSC_REAL,(void**)&c 
> PETSC_F90_2PTR_PARAM(ptrd));if (*__ierr) return;
> -  *__ierr = F90Array2dDestroy(&ptr,PETSC_REAL PETSC_F90_2PTR_PARAM(ptrd));if 
> (*__ierr) return;
> +  *__ierr = F90Array2dDestroy(ptr,PETSC_REAL PETSC_F90_2PTR_PARAM(ptrd));if 
> (*__ierr) return;
>   *__ierr = PetscFree(c);
> }
> void PETSC_STDCALL dmmeshgetelementsf90_(DM *dm,F90Array2d *ptr,int *__ierr 
> PETSC_F90_2PTR_PROTO(ptrd))
> @@ -45,7 +45,7 @@ void PETSC_STDCALL dmmeshrestoreelements
> {
>   PetscInt   *v;
>   *__ierr = F90Array2dAccess(ptr,PETSC_INT,(void**)&v 
> PETSC_F90_2PTR_PARAM(ptrd));if (*__ierr) return;
> -  *__ierr = F90Array2dDestroy(&ptr,PETSC_INT PETSC_F90_2PTR_PARAM(ptrd));if 
> (*__ierr) return;
> +  *__ierr = F90Array2dDestroy(ptr,PETSC_INT PETSC_F90_2PTR_PARAM(ptrd));if 
> (*__ierr) return;
>   *__ierr = PetscFree(v);
> }
> void PETSC_STDCALL dmmeshgetconef90_(DM *dm,PetscInt *p,F90Array1d *ptr,int 
> *__ierr PETSC_F90_2PTR_PROTO(ptrd))
> @@ -56,7 +56,7 @@ void PETSC_STDCALL dmmeshgetconef90_(DM 
> }
> void PETSC_STDCALL dmmeshrestoreconef90_(DM *dm,F90Array1d *ptr,int *__ierr 
> PETSC_F90_2PTR_PROTO(ptrd))
> {
> -  *__ierr = F90Array2dDestroy(&ptr,PETSC_INT PETSC_F90_2PTR_PARAM(ptrd));if 
> (*__ierr) return;
> +  *__ierr = F90Array2dDestroy(ptr,PETSC_INT PETSC_F90_2PTR_PARAM(ptrd));if 
> (*__ierr) return;
> }
> 
> #if 0
> @@ -64,7 +64,7 @@ void PETSC_STDCALL dmmeshrestoreclosuref
> {
>   PetscReal *c;
>   *__ierr = F90Array1dAccess(ptr,PETSC_REAL,(void**)&c 
> PETSC_F90_2PTR_PARAM(ptrd));if (*__ierr) return;
> -  *__ierr = F90Array1dDestroy(&ptr,PETSC_REAL PETSC_F90_2PTR_PARAM(ptrd));if 
> (*__ierr) return;
> +  *__ierr = F90Array1dDestroy(ptr,PETSC_REAL PETSC_F90_2PTR_PARAM(ptrd));if 
> (*__ierr) return;
>   *__ierr = PetscFree(c);
> }
> #endif
> 


Reply via email to