← Back to team overview

dolfin team mailing list archive

Re: GenericVector assignment in PyDOLFIN

 


Johan Hake wrote:
> On Sunday 24 January 2010 16:39:14 Garth N. Wells wrote:
>> Johan Hake wrote:
>>> On Sunday 24 January 2010 16:12:37 Garth N. Wells wrote:
>>>> Johan Hake wrote:
>>>>> On Sunday 24 January 2010 00:03:41 Garth N. Wells wrote:
>>>>>> Johan Hake wrote:
>>>>>>> On Saturday 23 January 2010 14:55:08 Garth N. Wells wrote:
>>>>>>>> Johan Hake wrote:
>>>>>>>>> On Saturday 23 January 2010 08:42:14 Garth N. Wells wrote:
>>>>>>>>>> Is it correct that behind the scenes that
>>>>>>>>>>
>>>>>>>>>>   U0 = Function(V)
>>>>>>>>>>   U  = Function(V)
>>>>>>>>>>   U0.vector()[:] = U.vector()[:]
>>>>>>>>>>
>>>>>>>>>> involves a GenericVector::get(..) call and a
>>>>>>>>>> GenericVector::set(..) call? If so, it isn't ideal since it
>>>>>>>>>> introduces unnecessary new/delete operations and unnecessary
>>>>>>>>>> copying of data.
>>>>>>>>> None of GenericVector::get(..) or GenericVector::set(..) are
>>>>>>>>> invoked, see __getslice__ and __setslice__ in la_post.i.
>>>>>>>>>
>>>>>>>>>    U0.vector()[:]
>>>>>>>>>
>>>>>>>>> involves
>>>>>>>>>
>>>>>>>>>   GenericVector::operator =(..)
>>>>>>>>>
>>>>>>>>> and
>>>>>>>>>
>>>>>>>>>   U.vector()[:]
>>>>>>>>>
>>>>>>>>> involves
>>>>>>>>>
>>>>>>>>>   GenericVector::copy()
>>>>>>>>>
>>>>>>>>> However the latter is unnecessary as you instead can do:
>>>>>>>>>
>>>>>>>>>   U0.vector()[:] = U.vector()
>>>>>>>>>
>>>>>>>>> invoking the assignment operator of U0's vector with U's vector.
>>>>>>>> What happens if I do
>>>>>>>>
>>>>>>>>   x = U.vector()[:]
>>>>>>> It just triggers the copy method of GenericVector, which is the same
>>>>>>> behavior as for other itterable Python types.
>>>>>>>
>>>>>>>> ? Is x a numpy array?
>>>>>>> No you need to call array() to accomplish that.
>>>>>> OK. What I'm trying to do is
>>>>>>
>>>>>>     # Get vectors
>>>>>>     u_vec  = u.vector()[:]
>>>>>>     u0_vec = u0.vector()[:]
>>>>>>     v0_vec = v0.vector()[:]
>>>>>>     a0_vec = a0.vector()[:]
>>>>> You should not need to make a copy of the vectors here.
>>>> How can I avoid it?
>>> a_vec and v_vec are new vectors. None of the four vectors below get
>>> modified by the a_vec and v_vec expressions so no need of copying, and
>>> the v0 and a0 assignment should work with GenericVectors too.
>> Do you mean that just
>>
>>   a_vec = 1.0/(2.0*beta)*((u - u0 - v0*dt)/(0.5*dt*dt) \
>>            - (1.0-2.0*beta)*a0 )
>>
>> where u and u0 are GenericVectors should work?
> 
> Have you tried? 
> 

Can I somehow get a 'reference' to the vector so I don't have to use
u.vector()[:] in the expressions?

Garth


> As long as the rest (besides a0, which I assume also is a GenericVector) are 
> scalars everything should just work. The Python LA interface (at least for 
> GenericVector) should work more or less as the NumPy interface which I think 
> is nice :)
> 
> We cannot take 1./v, where v is a GenericVector. 
>  
>>> Do you get any error messages?
>> No errors. What I have now seems to work fine.
> 
> Ok, and that is because what you do obviously works for NumPy arrays.
> 
> Johan
> 
>> Garth




Follow ups

References