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.
>


Would the following be ok ?

//Creation of vector X of size dof*dof:
VecCreateSeq(PETSC_COMM_SELF,dof*dof,&X);

// Using two-dimensional array style:
PetscScalar *x;
VecGetArray2d(X,dof,dof,0,0,&x);

x[i][j] = ...;

Is it ok ?
Then, what should be passed to MatSetValuesBlocked() ?

Reply via email to