On Tue, May 20, 2014 at 3:17 PM, Jed Brown <[email protected]> wrote:
> Matthew Knepley <[email protected]> writes: > >> array = (PetscScalar**)malloc(sizeof(PetscScalar*) * dof); > >> for (k = 0; k < dof; k++){ > >> array[k] = (PetscScalar*)malloc(sizeof(PetscScalar) * dof); > >> } > >> > >> When I pass it to MatSetValuesBlocked() there is a problem. Either Petsc > >> complains because I am not passing it the right way or when it accepts > it, > >> wrong data is passed because the solution is not correct. Maybe Petsc > >> expect dof*dof values and only dof are passed ? > >> > > > > You can only pass contiguous memory to MatSetValues(). > > And, while perhaps atypical, VecGetArray2D will give you contiguous > memory behind the scenes, so it would work in this case. (Make a Vec of > the right size using COMM_SELF instead of malloc.) > > With C99, you can use VLA pointers to get the "2D indexing" without > setting up explicit pointers. > Since for some reasons I need global two-dimensional arrays, what I did is the following. I declared a PetscScalar **array outside main(), ie before dof is determined. Then, knowing dof I use malloc inside main() to allocate memory to the array. I use then array in different functions and in order to pass it to MatSetValues, I copy it to a local and classical two-dimensional array[dof][dof] (contiguous memory) which is passed to MatSetValues. It works. But I'll try with VecGetArray2D.
