← Back to team overview

dolfin team mailing list archive

Re: MeshFunction::get(..)

 

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?

Johan

> OK, that's what I want to know.
> 
> Garth
> 
> > --
> > Anders
> >
> >
> > ------------------------------------------------------------------------
> >
> > _______________________________________________
> > 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