← Back to team overview

dolfin team mailing list archive

Re: MeshFunction::get(..)

 

On Tuesday 29 September 2009 15:15:12 Anders Logg wrote:
> On Tue, Sep 29, 2009 at 03:07:33PM +0200, Johan Hake wrote:
> > On Tuesday 29 September 2009 14:06:20 Garth N. Wells wrote:
> > > Anders Logg wrote:
> > > > On Tue, Sep 29, 2009 at 01:01:35PM +0100, Garth N. Wells wrote:
> > > >> Anders Logg wrote:
> > > >>> On Tue, Sep 29, 2009 at 12:42:54PM +0100, Garth N. Wells wrote:
> > > >>>> Anders Logg wrote:
> > > >>>>> On Tue, Sep 29, 2009 at 07:39:01AM +0100, Garth N. Wells wrote:
> > > >>>>>> Is there a reason why the MeshFunction.get(..) functions return
> > > >>>>>> by value rather then reference, e.g. it is currently
> > > >>>>>>
> > > >>>>>>      inline T get(const MeshEntity& entity) const
> > > >>>>>>
> > > >>>>>> rather than
> > > >>>>>>
> > > >>>>>>      inline T& get(const MeshEntity& entity) const
> > > >>>>>>
> > > >>>>>> Garth
> > > >>>>>
> > > >>>>> Yes, we have a set() function for setting the values.
> > > >>>>
> > > >>>> I know, but I would like to get a reference rather than copying
> > > >>>> data
> > > >>>>
> > > >>>>     unsigned int index = 3;
> > > >>>>     const std::vector<double>& vec =  mesh_function.get(index)
> > > >>>>
> > > >>>> I can do this when I have the MeshEntitiy, but not when using the
> > > >>>> index.
> > > >>>
> > > >>> Does it work if you do
> > > >>>
> > > >>>   &vec[0] = mesh_function.values();
> > > >>
> > > >> Probably, bit it's not what I want. I have a std::vector attached to
> > > >> mesh entities (MeshFunction<std::vector<double> >). I want a
> > > >> reference to the std::vector attached to a particular entity
> > > >>
> > > >>    std::vector<double> vec& =  mesh_function(my_entity);
> > > >>
> > > >> is fine, but
> > > >>
> > > >>    std::vector<double> vec& =  mesh_function.get(my_index);
> > > >>
> > > >> is not.
> > > >
> > > > What if you just add operator[] for uint?
> > > >
> > > >> Back to my question: Is there a reason why MeshFunction::get returns
> > > >> by value and not by reference?
> > > >
> > > > There might be a reason. I think we introduced get/set for use in the
> > > > Python interface. Perhaps Johan remembers?
> >
> > Well, this was before my time ;)
> >
> > But I see that get is used to overload the __call__ method in Python. I
> > am quite sure this can be done in a nicer way. We probably had
> > difficulties with extending the MeshFunctions as these are templated
> > classes. We know how to do this now.
> >
> > I am not sure why we return by value, but it might have something to do
> > with memory management in Python. However these things could be handled
> > in the wrapper layer anyway.
> >
> > I suggest we define the C++ interface as we want it to be, then I am
> > quite sure I can mimic this in Python. (starting to get bald I think ;))
> >
> > So whats the logic here. Should
> >
> >   &T operator()
> >
> > be used when we have the entity, and maybe
> >
> >   &T operator[]
> >
> > when we have the index, or should one of the operators be used for both
> > cases?
> 
> I think it would be safe to overload operator[].

Do we still want to make this transition? I have started it but it requires 
quite a lot of changes...

Johan

> --
> Anders
> 
> > Johan
> >
> > > OK, that's what I want to know.
> > >
> > > Garth
> > >
> > > > ---------------------------------------------------------------------
> > > >---
> > > >
> > > > _______________________________________________
> > > > DOLFIN-dev mailing list
> > > > DOLFIN-dev@xxxxxxxxxx
> > > > http://www.fenics.org/mailman/listinfo/dolfin-dev
> > >
> > > _______________________________________________
> > > DOLFIN-dev mailing list
> > > DOLFIN-dev@xxxxxxxxxx
> > > http://www.fenics.org/mailman/listinfo/dolfin-dev
> >
> > _______________________________________________
> > DOLFIN-dev mailing list
> > DOLFIN-dev@xxxxxxxxxx
> > http://www.fenics.org/mailman/listinfo/dolfin-dev
> 


Follow ups

References