Well, we have the BoundingBoxTree, which similarly caches data that speed
up certain operations. We also have a Solver class and a free function
solve, an Assembler class and a free function assemble. Similarly we could
have a free function assign, which construct a FunctionAssign object.
However there is a lot of data which could be reused in the FunctionAssign
object. If a user want to utelize that he should instantiate the object and
use that in his code.

Johan



On Tue, Sep 24, 2013 at 10:27 AM, Anders Logg <l...@chalmers.se> wrote:

> Is it possible to solve this without introducing the design pattern
> with a class FunctionAssigner? We have been careful to avoid this in
> other places.
>
> --
> Anders
>
>
>
> On Mon, Sep 23, 2013 at 07:20:03PM +0200, Johan Hake wrote:
> > I am working on sub-function assignment. To facilitate caching of dof
> indices
> > for a particular assignment combination I suggest introducing a
> > FunctionAssigner class which caches the necessary indices (dofs) for the
> whole
> > domain.
> >
> > Something like:
> >
> >   mesh = UnitSquareMesh(10,10)
> >   V = FunctionSpace(mesh, "CG", 1)
> >   VV = V*V
> >
> >   # Assign two scalar functions to the components of a mixed function
> >   assigner0 = FunctionAssigner([V, V], VV)
> >
> >   # Assign components of a mixed function to scalar Functions
> >   assigner1 = FunctionAssigner(VV, [V, V])
> >
> >   # Assign a scalar function to a component of a mixed function
> >   assigner2 = FunctionAssigner(V, VV.sub(1))
> >
> >   u0, u1 = Function(V), Function(V)
> >   U = Function(VV)
> >
> > Then in some time loop:
> >
> >   while t < tstop:
> >       ...
> >       assigner0.assign([u0, u1], U)
> >       ...
> >       assigner1.assign(U, [u0, u1])
> >       ...
> >       assigner2.assign(u0, U.sub(1))
> >
> > In C++ the equivalent to a list of Foo will be a std::vector of shared
> Foos.
> >
> > Comments?
> >
> > By using sub spaces and sub functions we avoid using indices in the
> interface,
> > which I think is neat. However, there are some limitations with the
> present
> > interface:
> >
> > 1) The FunctionAssigner needs to have access to the local ownership
> range of a
> > sub dofmap, but that is not possible as it is set to 0,0 during
> construction.
> > Could we add a proper local ownership range to a sub dofmap?
> > 2) The FunctionAssigner need to be able to access the private _vector of
> a
> > parent Function during the assignment, as calling subfunc.vector()
> raises an
> > error. This can be fixed by a friend statement. Is that acceptable?
> >
> > Johan
>
> > _______________________________________________
> > fenics mailing list
> > fenics@fenicsproject.org
> > http://fenicsproject.org/mailman/listinfo/fenics
>
>
_______________________________________________
fenics mailing list
fenics@fenicsproject.org
http://fenicsproject.org/mailman/listinfo/fenics

Reply via email to