Anders Logg wrote:
> I thought we finally reached a good design after last year's redesign
> of the Function/FunctionSpace classes, but I think we need to redo it.
> 
> I had a long discussion with Marie and Johan yesterday and here are
> some of our conclusions.
> 
> First a couple of motivating examples and then a simple and elegant
> solution. :-)
> 
> Consider first the function g(x, y) = x*(1 - x)*y*(1 - y) on a 1 x 1 mesh
> of the unit square. This function is zero along the boundary and in
> particular in each vertex. Then consider the following code:
> 
>   g = "x[0]*(1 - x[0])*x[1]*(1 - x[1])"
>   mesh = UnitSquare(1, 1)
>   V1 = FunctionSpace(mesh, "CG", 1)
>   V2 = FunctionSpace(mesh, "CG", 2)
> 
>   # Create function f in V1
>   f1 = Function(V1, g)
> 
>   # Evaluate f at x = (0.5, 0,5)
>   x = array((0.5, 0.5))
>   values = array((0.0,))
>   f1.eval(values, x)
> 
>   # Project f to piecewise quadratics
>   f2 = project(f1)
> 
> Now, the question is, what is values[0] and what is f2?
> 
> One would think that values[0] = f2 = 0. This would be natural since
> f1 is zero in each vertex and thus should be zero everywhere. But what
> happens is that values[0] will be 1/16 and f2 will be a bubble
> function on the unit square.
> 
> This is because f1 is not really a function in V1. It only behaves
> that way when used as a coefficient in a form in which case it will be
> interpolated on each cell.
> 
> Adding a call to f1.interpolate() in the above code fixes this.
> 
> So our suggestion is to make sure that f1 is really a function in V1
> and at the same time make sure that:
> 
> 1. A Function always has a FunctionSpace
> 
> 2. A Function always has a Vector
> 
> We can do this by breaking out the functionality for user-defined
> functions or expressions like g = "x[0]*(1 - x[0])*x[1]*(1 - x[1])"
> into a separate class. Then we can have a clean and simple
> implementation of the Function class free from all complex logic wrt
> having or not having a vector, creating a vector when it doesn't exist
> etc.
> 
> I suggest calling this new class Expression and keeping it very
> simple. An Expression is something like "x[0]*(1 - x[0])*x[1]*(1 -
> x[1])" or more specifically something having an eval operator. Both
> Functions and Expressions can be used as coefficients in forms, so the
> following design seems appropriate:
> 
>   class Expression : public ufc::function, public Coefficient
>   {
>   public:
> 
>     /// Function evaluation (simple version)
>     virtual void eval(double* values, const double* x) const;
> 
>     /// Function evaluation (alternate version)
>     virtual void eval(double* values, const Data& data) const;
> 
>     /// Implementation of ufc::function interface
>     void evaluate(double* values, const double* coordinates, const ufc::cell& 
> cell) const;
> 
>     /// Implementation of Coefficient interface
>     void interpolate(double* coefficients, const ufc::cell& ufc_cell, uint 
> cell_index, int local_facet=-1) const;
> 
>   };
> 
>   class Function : public Coefficient
>   {
>   public:
> 
>     ...
> 
>     /// Implementation of Coefficient interface
>     void interpolate(double* coefficients, const ufc::cell& ufc_cell, uint 
> cell_index, int local_facet=-1) const;
> 
>   };
> 
> We will need to change the name of the current Coefficient class and
> introduce the new Coefficient base class.
> 
> I believe this will also take care of all earlier reported problems on
> mysterious behavior of the Function class.
> 

Sounds good. It follows what was suggested in recent discussions on the 
list - a function should be user-defined or discrete and stay that way.

> This redesign is probably something that should wait until after the
> parallel effort is fully in place, but it would be good to spend some
> effort on formulating a plan now.
> 

Yes, the parallel effort should be the top priority!

Would be good to add the above description to Blueprints. Things tend 
get lost over time on the mailing list.

Garth

> --
> Anders
> 
> 
> ------------------------------------------------------------------------
> 
> _______________________________________________
> 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