BoundingBoxTree is more than data associations. It provides a lot of
methods. I see that the dofmap mapping could potentially be used by
different operations, but I then suggest we then extend with some member
method. Obviously the name is then a problem, and we could pick some more
generic name I guess. But you suggestion is maybe a bit verbose ;)

Johan


On Tue, Sep 24, 2013 at 10:44 AM, Martin Sandve Alnæs <marti...@simula.no>wrote:

> Would you agree that that the BoundingBoxTree represents data
> associations, not an operation, similar to my just-now suggestion 
> DofMapToDofMapMapping
> instead of FunctionAssigner? An object that represents the mapping could
> conceivably be useful for operations other than assign as well.
>
> Martin
>
>
> On 24 September 2013 10:39, Johan Hake <hake....@gmail.com> wrote:
>
>> 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
>>
>>
>
_______________________________________________
fenics mailing list
fenics@fenicsproject.org
http://fenicsproject.org/mailman/listinfo/fenics

Reply via email to