On Thu, Mar 12, 2009 at 10:47 AM, Anders Logg <[email protected]> wrote: > On Thu, Mar 12, 2009 at 10:41:28AM +0100, Johan Hake wrote: >> On Thursday 12 March 2009 10:32:10 Anders Logg wrote: >> > On Thu, Mar 12, 2009 at 10:25:36AM +0100, Martin Sandve Alnæs wrote: >> > > I have serious problems with the idea of letting user-defined >> > > functions change nature to discrete functions as a side effect >> > > of other operations, effectively hiding the user-defined implementation >> > > of eval. >> > > >> > > (I know this concept wasn't introduced in this discussion, but it's >> > > related). >> > >> > You mean by calling u.vector()? Yes, I agree it's problematic. >> > >> > But I don't know how to handle it otherwise. Consider the following >> > example: >> > >> > u = Function(V) >> >> FYI: >> u is a discrete function here. This is a difference between the python and >> c++ >> interface. Please shout if this is not what we want. The c++ base class of u >> is the cpp.DiscreteFunction defined SpecialFunctions.h. >> >> I did this mostly for avoiding the director wrapper attached to all python >> functions that inherits the cpp.Function, and with the assumption that when a >> Function is instantiated as: >> >> u = Function(V) >> >> you also want a discrete function. The only thing the DiscreteFunction does >> is >> instantiating the vector and defining some constructors that is used else >> where in the python interface. >> >> Johan > > This looks good to me. I didn't know. > > Too bad we can't do the same thing in C++. It's a bit odd now. A > Function is by default discrete in Python, but not in C++ where it is > by default user-defined. > > Should we add a flag to the constructor(s) of Function so everything > is by default discrete? > > Function(const FunctionSpace& V, user_defined=false); > > or > > Function(const FunctionSpace& V, has_eval=true); > > If a Function is user-defined, the call to vector() would give an > error and suggest that the Function be interpolated first: > > u.interpolate(); > u.vector(); > > This would require adding a flag to all user-defined functions in C++. > It would also silently break all user code and make functions without > the flag correctly set just return zero (from the initialized zero > vector). But it might be worth it. > > -- > Anders
With my suggestions (see other email), no flag is necessary. A Function is (potentially) discrete if it is initialized with a function space, and the first call to f.vector() gives either a zero vector if no eval is implemented, or interpolates the user-defined eval to create the initial vector. I'm sure this can be hacked to work somehow with ugly but completely hidden code. Martin _______________________________________________ DOLFIN-dev mailing list [email protected] http://www.fenics.org/mailman/listinfo/dolfin-dev
