dolfin team mailing list archive
-
dolfin team
-
Mailing list archive
-
Message #17261
Re: GenericVector assignment in PyDOLFIN
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()[:]
a_vec = 1.0/(2.0*beta)*((u_vec-u0_vec - v0_vec*dt)/(0.5*dt*dt) \
- (1.0-2.0*beta)*a0_vec)
v_vec = dt*((1.0-gamma)*a0_vec + gamma*a_vec) + v0_vec
# Update (U0 <- U0)
v0.vector()[:] = v_vec
a0.vector()[:] = a_vec
I guess I need to call array() to make this work?
Garth
> Johan
>
>> Garth
>>
>>> Johan
Follow ups
References