On Nov 22, 2010, at 10:09 PM, Dmitry Karpeev wrote:

> This sounds good to me.  While at it, why not make
> VecGet/RestoreArrayRead take a const PetscScalar ** second argument?

    It does.

> Somewhat unrelated: should VecGet/RestoreArray(Read) be renamed
> VecGet/RestoreLocalArray(Read)?
> This would conform to the IS usage.  I guess that last change would
> have a significant impact on the user code, though.
> Dmitry.
> 
> On Mon, Nov 22, 2010 at 9:57 PM, Barry Smith <bsmith at mcs.anl.gov> wrote:
>> 
>>   Hg pull; hg update before reading this.
>> 
>>   VecGet/RestoreArrayRead() is suppose to be read only. 
>> VecGet/RestoreArray() is read/write and increases the state of the vector. 
>> These are the standard public methods.
>> 
>> 
>>   VecGetArrayPrivate() is read/write but DOES NOT increase the state of the 
>> vector directly, this is used by Vector operations that manage the change in 
>> state themselves. For example VecGetArrayPrivate() is used in, for example 
>> VecScale_Seq() because the VecScale() outer method manages increasing the 
>> state and preserving the norm value if it was set. If we used 
>> VecGetArrayRead() in that location (and did not have VecGetArrayPrivate() it 
>> would be very confusing since in VecScale_Seq() it does change the values so 
>> read is not appropriate but VecGetArray() would result in a double increase 
>> in the state and hence lose the VecNorm cached.
>> 
>>   In looking at the code now I make the following observation. The state 
>> increase operation being given inside the outer method (for example 
>> VecScale) comes from the days when the individual implementations (like 
>> VecScale_Seq) did not call VecGetArray....() but just accessed the array 
>> inside the structure directly.  We then went to the model where NO method 
>> (like VecScale_Seq) was ever suppose to directly access the array and always 
>> when through a VecGetArray....(), I had to introduce the 
>> VecGetArrayPrivate() to avoid double increasing the state of the vector (and 
>> thus losing some cached VecNorms).  I think if we removed ALL the increase 
>> state from the outer methods (like VecScale) we could remove the 
>> VecGetArrayPrivate() and always use VecGetArray() or write ones and 
>> VecGetArrayRead() for read ones inside the private methods. This has to be 
>> done with care, if all agree I'll do it.
>> 
>> 
>>   Barry
>> 
>> 
>> On Nov 22, 2010, at 8:54 PM, Matthew Knepley wrote:
>> 
>>> Why would you use Private, since Read jsut seems to call it?
>>> 
>>>   Thanks,
>>> 
>>>      Matt
>>> 
>>> --
>>> What most experimenters take for granted before they begin their 
>>> experiments is infinitely more interesting than any results to which their 
>>> experiments lead.
>>> -- Norbert Wiener
>> 
>> 


Reply via email to