On Thu, May 15, 2014 at 2:08 AM, Jed Brown <[email protected]> wrote:
> Christophe Ortiz <[email protected]> writes: > > > Hi all, > > > > I am experiencing some problems of memory corruption with PetscMemzero(). > > > > I set the values of the Jacobian by blocks using MatSetValuesBlocked(). > To > > do so, I use some temporary two-dimensional arrays[dof][dof] that I must > > reset at each loop. > > > > Inside FormIJacobian, for instance, I declare the following > two-dimensional > > array: > > > > PetscScalar diag[dof][dof]; > > > > and then, to zero the array diag[][] I do > > > > ierr = PetscMemzero(diag,dof*dof*sizeof(PetscScalar)); > > Note that this can also be spelled > > PetscMemzero(diag,sizeof diag); > Ok. > > > Then, inside main(), once dof is determined, I allocate memory for diag > as > > follows: > > > > diag = (PetscScalar**)malloc(sizeof(PetscScalar*) * dof); > > > > for (k = 0; k < dof; k++){ > > diag[k] = (PetscScalar*)malloc(sizeof(PetscScalar) * dof); > > } > > That is, the classical way to allocate memory using the pointer notation. > > Note that you can do a contiguous allocation by creating a Vec, then use > VecGetArray2D to get 2D indexing of it. > Good to know. I'll try. Thanks.
