← Back to team overview

dolfin team mailing list archive

Re: Providing rank to tensor(vector) valued Expression

 

On Saturday September 4 2010 03:54:35 Marie Rognes wrote:
> On 04. sep. 2010 01:36, Johan Hake wrote:
> > Hello!
> > 
> > Garth found an ambiguity in the Expression doc string regarding how a
> > user should initiate a user defined Expression (not a compiled one) in
> > Python. If the Expression is vector or tensor valued the user need to
> > provide information about this.
> > 
> > This can be done in two ways. Either overload the dim method or provide a
> > ufl FiniteElement while instantiating the Expression. Neither of these
> > methods are documented in the docstring.
> > 
> > In the mixed poisson demo both dim and rank are overloaded. I think rank
> > is not needed (works fine without). However dim is just a method
> > introduced to be able to automatically select a FiniteElement.
> 
> Thanks for bringing this up -- evidently I'm confused.

Well, me too. Ever since Anders introduced the automatic selection of elements 
for the Expressions, I have been some what confused.

> > First I am not sure dim is the correct name. We could use value_size as
> > this is present in the GenericFunction interface for just this purpose.
> > Second I am not sure overloading a method is the best and most clear way
> > to provide this information. Maybee he could do it while instantiating
> > the Expression instead?
> > 
> >   class BoundarySource(Expression):
> >       def eval_data(self, values, data):
> >           g = sin(5*data.x()[0])
> >           values[0] = g*data.normal()[0]
> >           values[1] = g*data.normal()[1]
> >   
> >   s = BoundarySource(value_size=2)
> 
> I don't really like the name value_size, but this looks natural to me.
> What would it be for matrix-valued functions?

As I have understand it, value_size is the size of the values array passed to 
the Expression. So that would then be:

  value_size = m x n

I am not totally happy with the above code as the class should contain 
everything it needs to be instantiated correctly.

Would it make more sense to change the name of dim to value_size?

> > Or just use the FiniteElement which is a litle bit over kill but already
> > possible as it is.
> > 
> >   s = BoundarySource(element=BDM.ufl_element())
> > 
> > What you say?
> 
> When prescribing an element (or a function space) to anything that
> resembles a function, I assume that the function (in this case, the
> Expression) is interpolated into the function space defined by that
> element. Is that correct? 

Yes, that is correct. We need a FiniteElement to be able to initiate the 
ufl.Coefficient. If not provided we automatically choose one based on (for now 
the dim method) what the user provides.

Johan


> If no, then the behaviour is confusing. If
> yes, then that is not what I wanted to do above.
> 
> 
> --
> Marie
> 
> _______________________________________________
> Mailing list: https://launchpad.net/~dolfin
> Post to     : dolfin@xxxxxxxxxxxxxxxxxxx
> Unsubscribe : https://launchpad.net/~dolfin
> More help   : https://help.launchpad.net/ListHelp



Follow ups

References