[petsc-users] use of VecGetArray() with dof>1 (block size > 1)
Ed Bueler
elbueler at alaska.edu
Fri May 27 15:24:19 CDT 2016
Dave --
Perhaps you should re-read my questions. My points were missed. But you
motivated me to look slightly deeper; see below.
> I would say the reason why the last arg to VecGetArray() is not void* is
because
> it is intended to give you direct access to the pointer associated with
the entries
> within the vector - these are also PetscScalar's
Yes, that is fine. But DMDAVecGetArray() does it the other way, using
"void *" instead. The question was, why does the PETSc API have two
different approaches.
Jed's "more information" answer about unstructured grids is a bit vague,
but it must be the one that motivates the difference.
> I don't believe it is ever recommended anywhere to do the following:
> VecGetArray(DM da,Vec local,(PetscScalar**)&u)
I do not recommend it; I am annoyed that I need it!
My point was that this awkward construct allowed the "recommended
approach"---which is a quote from the PETSc manual and not my own
recommendation---to proceed with VecGetArray(). Whereas this awkward
construct is not needed in user code which uses DMDAVecGetArray().
> Trying to trick the compile with such a cast is just begging for memory
> corruption to occur.
Maybe so, but you do it all the time with PETSc structured grids. In fact,
the third line of the implementation of DMDAVecGetArray() is
" VecGetArray(vec,(PetscScalar**)array); "
That is, in the "recommended approach", the cast occurs inside
DMDAVecGetArray(). The same cast is simply exposed to the user if they
want to get a struct-valued pointer from VecGetArray().
Ed
On Fri, May 27, 2016 at 12:06 PM, Dave May <dave.mayhem23 at gmail.com> wrote:
>
>
> On 27 May 2016 at 20:34, Ed Bueler <elbueler at alaska.edu> wrote:
>
>> Dear PETSc --
>>
>> This is an "am I using it correctly" question. Probably the API has the
>> current design because of something I am missing.
>>
>> First, a quote from the PETSc manual which I fully understand; it works
>> great and gives literate code (to the extent possible...):
>>
>> """
>> The recommended approach for multi-component PDEs is to declare a struct
>> representing the fields defined
>> at each node of the grid, e.g.
>>
>> typedef struct {
>> PetscScalar u,v,omega,temperature;
>> } Node;
>>
>> and write residual evaluation using
>>
>> Node **f,**u;
>> DMDAVecGetArray(DM da,Vec local,&u);
>> DMDAVecGetArray(DM da,Vec global,&f);
>> ...
>> f[i][j].omega = ...
>>
>
> Note that here the indexing should be
> f[ *j* ][ *i* ].omega
>
>
>
>> ...
>> DMDAVecRestoreArray(DM da,Vec local,&u);
>> DMDAVecRestoreArray(DM da,Vec global,&f);
>> """
>>
>> Now the three questions:
>>
>> 1) The third argument to DMDAVec{Get,Restore}Array() is of type "void
>> *". It makes the above convenient. But the third argument of the
>> unstructured version Vec{Get,Restore}Array() is of type "PetscScalar **",
>> which means that in an unstructured case, with the same Node struct, I
>> would write
>> "VecGetArray(DM da,Vec local,(PetscScalar **)&u);"
>> to get the same functionality. Why is it this way? More specifically,
>> why not have the argument to VecGetArray() be of type "void *"?
>>
>
> I would say the reason why the last arg to VecGetArray() is not void* is
> because it is intended to give you direct access to the pointer associated
> with the entries within the vector - these are also PetscScalar's
>
>
>>
>> 2) Given that the "recommended approach"
>>
>
> I don't believe it is ever recommended anywhere to do the following:
> VecGetArray(DM da,Vec local,(PetscScalar**)&u)
>
> Trying to trick the compile with such a cast is just begging for memory
> corruption to occur.
>
> above works just fine, why do DMDAVec{Get,Restore}ArrayDOF() exist? (I.e.
>> is there something I am missing about C indexing?)
>>
>
> As an additional point, DMDAVec{Get,Restore}ArrayDOF() return
>
> void *array
>
> so that the same API will work for 1D, 2D and 3D DMDA's which would
> require PetscScalar **data, PetscScalar ***data, PetscScalar ****data
> respectively.
>
>
> Cheers,
> Dave
>
>
>> 3) There are parts of the PETSc API that refer to "dof" and parts that
>> refer to "block size". Is this a systematic distinction with an underlying
>> reason? It seems "block size" is more generic, but also it seems that it
>> could replace "dof" everywhere.
>>
>> Thanks for addressing silly questions.
>>
>> Ed
>>
>>
>> --
>> Ed Bueler
>> Dept of Math and Stat and Geophysical Institute
>> University of Alaska Fairbanks
>> Fairbanks, AK 99775-6660
>> 301C Chapman and 410D Elvey
>> 907 474-7693 and 907 474-7199 (fax 907 474-5394)
>>
>
>
--
Ed Bueler
Dept of Math and Stat and Geophysical Institute
University of Alaska Fairbanks
Fairbanks, AK 99775-6660
301C Chapman and 410D Elvey
907 474-7693 and 907 474-7199 (fax 907 474-5394)
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mcs.anl.gov/pipermail/petsc-users/attachments/20160527/45765ee5/attachment-0001.html>
More information about the petsc-users
mailing list