← Back to team overview

dolfin team mailing list archive

Re: Providing rank to tensor(vector) valued Expression

 

On Sep 5, 2010, at 8:39, Anders Logg <logg@xxxxxxxxx> wrote:

> On Sun, Sep 05, 2010 at 08:36:22AM -0700, Johan Hake wrote:
>> On Sunday September 5 2010 07:26:19 Anders Logg wrote:
>>> On Sat, Sep 04, 2010 at 08:16:43PM +0200, Marie Rognes wrote:
>>>> On 04. sep. 2010 18:26, Johan Hake wrote:
>>>>> 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.
>>>> 
>>>> Well, that part made perfect sense to me --- I think ;)
>>>> 
>>>>>>> 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?
>>>> 
>>>> Exactly what do you mean here? Keep needing to supply a method "dim",
>>>> but renaming it to "value_size" ? (I still don't find the name
>>>> value_size very intuitive.)
>>> 
>>> We have value_rank and value_dimension in the UFC interface. Those are
>>> well defined and well documented. value_size is not something the user
>>> should be worried about, but it is something that comes up in the code
>>> again and again when allocating arrays:
>>> 
>>>  int value_size = 1;
>>>  for (int i = 0; i < value_rank; i++)
>>>    value_size *= value_dimension(i)
>>> 
>>> Another option would be to set value_shape which is
>>> 
>>>  int value_shape[value_rank];
>>>  for (int i = 0; i < value_rank; i++)
>>>    value_shape[i] = value_dimension(i)
>> 
>> What with:
>> 
>>  class MyExpression(Expression):
>>      def eval(value, x):
>>           some_tensor_expression
>>      def value_shape(self):
>>          return (2,2)
>> 
>> If not given we assume, as today, that the value shape is ().
>> 
>> One should be able to instantiate it using a not automatically chosen
>> FiniteElement. We add check so the value shape agree with the passed Element.
>> 
>> We can add deprecation warnings for dim and rank for next release.
> 
> I think that looks good. It is natural to have
> 
>  value_rank
>  value_dimension
> 
> in C++ and
> 
>  value_shape
> 
> in Python (since tuples are problematic in C++).

Ok, will fix. 

Johan


> --
> Anders
> 
> _______________________________________________
> Mailing list: https://launchpad.net/~dolfin
> Post to     : dolfin@xxxxxxxxxxxxxxxxxxx
> Unsubscribe : https://launchpad.net/~dolfin
> More help   : https://help.launchpad.net/ListHelp



References