Garth N. Wells wrote:
> 
> Anders Logg wrote:
>> On Wed, Mar 11, 2009 at 11:15:44PM +0100, Anders Logg wrote:
>>> On Wed, Mar 11, 2009 at 11:01:56PM +0100, DOLFIN wrote:
>>>> One or more new changesets pushed to the primary dolfin repository.
>>>> A short summary of the last three changesets is included below.
>>>>
>>>> changeset:   5853:f1ef6132a568d5a56e5c70b17ce118c19bfa961c
>>>> tag:         tip
>>>> user:        Anders Logg <[email protected]>
>>>> date:        Wed Mar 11 23:01:49 2009 +0100
>>>> files:       ChangeLog demo/pde/poisson/cpp/Poisson.h 
>>>> dolfin/function/Function.cpp sandbox/misc/Poisson.form 
>>>> sandbox/misc/Poisson.h sandbox/misc/README sandbox/misc/SConstruct 
>>>> sandbox/misc/cpp/Poisson.form sandbox/misc/cpp/Poisson.h 
>>>> sandbox/misc/cpp/SConstruct sandbox/misc/cpp/main.cpp sandbox/misc/main.cpp
>>>> description:
>>>> Automatically interpolate user-defined functions on assignment
>>> This is something we discussed a while back but we didn't agree on
>>> whether or not it was a good idea. I think it is and it's easy enough
>>> to remove if there is strong enough pressure against it.
>>>
>>> Here are two examples of assignment:
>>>
>>> Case 1: Time-stepping with user-defined initial data
>>>
>>>     # Initializations
>>>     mesh = UnitSquare(32, 32)
>>>     V = FunctionSpace(mesh, "Lagrange", 1)
>>>     u0 = Function(V, "sin(x[0])")
>>>     u1 = Function(V)
>>>
>>>     # Time stepping
>>>     for i in range(10):
>>>
>>>         print i
>>>
>>>         # Solve for u1
>>>         u1.vector()
>>>
>>>         # Assign u0 = u1
>>>         u0.assign(u1)
>>>
>>>
>>> This works fine since u1 is defined by a vector of dofs so the
>>> assignment is allowed.
>>>
>>> Case 2: Time-stepping with user-defined coefficient
>>>
>>>     # Initializations
>>>     mesh = UnitSquare(32, 32)
>>>     V = FunctionSpace(mesh, "Lagrange", 1)
>>>     w0 = Function(V)
>>>     w1 = Function(V, "sin(t*x[0])")
>>>
>>>     # Time stepping
>>>     for i in range(10):
>>>
>>>         print i
>>>
>>>         # Update w1
>>>         w1.t = float(i)
>>>         
>>>         # Solve for u
>>>
>>>         # Assign w0 = w1 (does not work)
>>>         w0.assign(w1)
>>>         #w0 = interpolate(w1, V)
>>>         #w0 = project(w1, V)
>>>
>>> This breaks since assignment is not allowed from the user-defined
>>> Function w1. Interpolation or projection helps, but each of these
>>> return a new function, which will confuse the JIT compiler (at least
>>> the current FFC JIT compiler) and lead to excessive generation of code
>>> (no cache reuse).
>>>
>>> The new version of the assignment operator allows this kind of
>>> assignment and automatically interpolates when necessary. It also
>>> prints out the following message:
>>>
>>>   Assignment from user-defined function, interpolating.
>>>
>>> So it should be clear what happens. Any objections?
>> Any more thoughts on this?
>>
> 
> Below is how I would prefer to have it:
> 
> Case 1: Time-stepping with user-defined initial data
> 
>      # Initializations
>      mesh = UnitSquare(32, 32)
>      V = FunctionSpace(mesh, "Lagrange", 1)
>      u0 = Function(V, "sin(x[0])")
>      u1 = Function(V)
> 
>      # Interpolate the initial data
>      u0.interpolate()
> 
>      # Time stepping
>      for i in range(10):
> 
>          print i
> 
>          # Solve for u1
>          u1.vector()
> 
>          # Assign u0 = u1
>          u0.assign(u1)
> 

I've changed my mind for the above example. If u0 is defined as

     u0 = Function(V, "sin(x[0])")

(it has a FunctionSpace) then interpolation upon assignment is OK. What 
I would object to is a user-defined Function which does not yet have a 
FunctionSpace being interpolated (which might be prevented by the 
current design anyway).

Garth

> We now have interpolation upon assignment, but why not for example 
> projection upon assignment? Either way the Function being assigned to is 
> not the same as the Function on the RHS of the assignment operator.
> 
> Garth
> 
>>
>> ------------------------------------------------------------------------
>>
>> _______________________________________________
>> DOLFIN-dev mailing list
>> [email protected]
>> http://www.fenics.org/mailman/listinfo/dolfin-dev
> 
> 
> _______________________________________________
> DOLFIN-dev mailing list
> [email protected]
> http://www.fenics.org/mailman/listinfo/dolfin-dev


_______________________________________________
DOLFIN-dev mailing list
[email protected]
http://www.fenics.org/mailman/listinfo/dolfin-dev

Reply via email to