On Thursday 12 March 2009 09:37:58 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?
Fine with me. Could you add some unit tests for this? Johan _______________________________________________ DOLFIN-dev mailing list [email protected] http://www.fenics.org/mailman/listinfo/dolfin-dev
