← Back to team overview

dolfin team mailing list archive

Re: SubFunctions

 



Johan Hake wrote:
On Monday 17 August 2009 14:03:55 Garth N. Wells wrote:
Johan Hake wrote:
On Monday 17 August 2009 13:33:21 Garth N. Wells wrote:
Please send any comments on how a SubFunction should work as I'm going
to work on it soon (the Cahn-Hilliard demo runs in parallel(!) ;) with
the exception of the extraction of sub-Functions for output). I'm
inlined to change a sub function such that for

   Function u0 = u[0]

the Function u0 will only point the vector belonging to u rather than
creating a new vector. The advantages are:

- No need to copy a vector
- DofMap will not require 'is_view'
- Possible to do things like
    u0  = 0.0;
    u1  += v;
    u0.interpolate();
What would Function::vector() for a SubFunction then return? The original
full Vector?
Yes.

Ok.

It would be cool to add a view of the original Vector that only
represents the values of the dofs in the SubFunction, without coping
data. I fiddled around with this when adding slicing for the PyDOLFIN la
interface, but realized that it would be too difficult.
This is more or less what I plan to do, although internally. A user
wouldn't see the vector, but operations like interpolate would only
involve part of the vector.

I see. Other direct Vector operations would then operate directly on the shared Vector, like get, set, aso.

We could add a class like

   VectorView(GenericVector& x, DofMap& dof),

which could derive from GenericVector, to provide views. It isn't a
priority for me though.

Yes, I also thought along these lines, however I did not think of doing it using a DofMap, which really is the natural thing. I will also not have possibility to priorities it for now.


On second thought,

  VectorView(GenericVector& x, std::vector<uint> map& map)

would be better. The DofMap could produce the map,

  std::vector<uint> map = dofmap.view();

Garth


Johan

Garth

Johan

Disadvantages are:

- It may be unclear that u0 and u share data.
- If u goes out of scope, u0 is will keep the vector belonging to u
alive (only an issue if the vector is very large compared to that
required by u0).

Garth
_______________________________________________
DOLFIN-dev mailing list
DOLFIN-dev@xxxxxxxxxx
http://www.fenics.org/mailman/listinfo/dolfin-dev




Follow ups

References