[petsc-dev] PetscMalloc1() transformation failed on DMDAGetArray()
Barry Smith
bsmith at mcs.anl.gov
Sat Dec 7 22:02:46 CST 2013
Jed
Seems your transformation failed badly on this nasty stuff (don’t blame me, I didn’t write the original code). There will be memory corruption right and left
PetscErrorCode DMDAGetArray(DM da,PetscBool ghosted,void *vptr)
{
PetscErrorCode ierr;
PetscInt j,i,xs,ys,xm,ym,zs,zm;
char *iarray_start;
void **iptr = (void**)vptr;
DM_DA *dd = (DM_DA*)da->data;
PetscFunctionBegin;
PetscValidHeaderSpecific(da,DM_CLASSID,1);
if (ghosted) {
for (i=0; i<DMDA_MAX_WORK_ARRAYS; i++) {
if (dd->arrayghostedin[i]) {
*iptr = dd->arrayghostedin[i];
iarray_start = (char*)dd->startghostedin[i];
dd->arrayghostedin[i] = NULL;
dd->startghostedin[i] = NULL;
goto done;
}
}
xs = dd->Xs;
ys = dd->Ys;
zs = dd->Zs;
xm = dd->Xe-dd->Xs;
ym = dd->Ye-dd->Ys;
zm = dd->Ze-dd->Zs;
} else {
for (i=0; i<DMDA_MAX_WORK_ARRAYS; i++) {
if (dd->arrayin[i]) {
*iptr = dd->arrayin[i];
iarray_start = (char*)dd->startin[i];
dd->arrayin[i] = NULL;
dd->startin[i] = NULL;
goto done;
}
}
xs = dd->xs;
ys = dd->ys;
zs = dd->zs;
xm = dd->xe-dd->xs;
ym = dd->ye-dd->ys;
zm = dd->ze-dd->zs;
}
switch (dd->dim) {
case 1: {
void *ptr;
ierr = PetscMalloc1(xm,&iarray_start);CHKERRQ(ierr);
ptr = (void*)(iarray_start - xs*sizeof(PetscScalar));
*iptr = (void*)ptr;
break;
}
case 2: {
void **ptr;
ierr = PetscMalloc1((ym+1)*sizeof(void*)+xm*ym,&iarray_start);CHKERRQ(ierr);
ptr = (void**)(iarray_start + xm*ym*sizeof(PetscScalar) - ys*sizeof(void*));
for (j=ys; j<ys+ym; j++) ptr[j] = iarray_start + sizeof(PetscScalar)*(xm*(j-ys) - xs);
*iptr = (void*)ptr;
break;
}
More information about the petsc-dev
mailing list