> On 31 Oct 2017, at 15:36, Blaise A Bourdin <[email protected]> wrote:
>
> Hi,
>
> I am losing my mind over segfaults in DMPlexVecGetClosure.
>
> In the example below, I get a segfault whenever cval is not set to NULL
> before calling DMPlexVecGetClosure. Is this expected? The documentations says
> nothing about this
> Also, after calling DMPlexVecRestoreClosure, the values of cval are discarded
> and neither global nor coord are changed.
>
> I am obviously doing something wrong but cannot figure it out...
The interface is similar to DMPlexGetClosure.
DMPlexVecGetClosure fills the array you provide it with values. It can
allocate a work array for you if you don't provide one, but you must indicate
so explicitly by setting it to NULL:
so
PetscScalar *values = NULL;
DMPlexVecGetClosure(...., &values);
Do things with values
Now you need to release the work array, you do that with the matching restore
closure call.
DMPlexVecRestoreClosure(...., &values);
Now, these arrays you get are *not* pointers into the global Vec array, instead
they are local buffers. If you want to update the Vec with the values you've
put in values, you need to call DMPlexVecSetClosure:
e.g.
DMPlexVecSetClosure(..., values, INSERT_VALUES);
So the calling sequence should be something like:
PetscScalar *values = NULL;
for ( int p = 0; p < ...; p++ ) {
DMPlexVecGetClosure(..., p, ..., &values);
// do stuff with values.
DMPlexVecSetClosure(..., p, ..., values, INSERT_VALUES);
}
// Finally, restore work array
DMPlexVecRestoreClosure(..., 0, ..., &values);
Cheers,
Lawrence