← Back to team overview

dolfin team mailing list archive

Re: ConstantFunctions have undefined value rank and dimension

 

Martin Sandve Alnæs wrote:
> 2008/7/2 Dag Lindbo <dag@xxxxxxxxxx>:
>> Martin Sandve Alnæs wrote:
>>> I just added checks for valid Functions to the assembler, but this
>>> turned out to break some demos so I changed it to warnings.
>> This seems like helpful checks to make!
>>
>>> The reason is that Function(mesh, 0.0), which creates a ConstantFunction,
>>> is used for zero vector functions as well, which leaves the value shape
>>> of such a function undefined. This makes error checking impossible,
>>> which is not very nice.
>>>
>>> In my opinion, the correct next step is to keep these warnings,
>>> and turn them into errors after "a while". We should either add
>>> support for ConstantFunctions with tensor shape (would be nice),
>>> or make the demos and apps use user-define functions.
>> Adding tensor shape to the existing concept of ConstantFunction seems
>> like the way to go. IMHO, the convenience if this over user defined
>> functions is too great to discard.
>>
>> Would it not just amount to having ConstantFunction::rank() return the
>> proper value as determined by the mutable member size, instead of 0? (on
>> line 28 of ConstantFunction.cpp)
> 
> No, because this size isn't known at construction time, only when
> interpolate is called with a finite_element object. A suitable (set
> of) constructor(s) needs to be defined, mirrored in Function, and
> handled in the swig interface for python.

Yes, I see that this is needed if the rank and shape of the function is
to be set constructor. Clearly, this makes for a nice user interface! My
suggestion was more along the lines of a quick fix to get rid of the
warnings: rank() returns zero if size == 1, returns 1 if size == 2 or 3 etc.

/Dag

> 
> // Scalar constructor
> Function f(mesh, 0.0);
> 
> // General tensor constructor:
> Function f(Mesh& mesh, uint rank, uint* shape, uint* values);
> 
> // vector
> uint rank = 1;
> uint shape[1] = { 2 };
> real values[2] = { 1., 2. };
> Function f(mesh, rank, shape, values);
> // or
> uint size = 2;
> real values[2] = { 1., 2. };
> Function f(mesh, 1, &size, values);
> 
> // 3x3 tensor:
> uint rank = 2;
> uint shape[2] = { 3, 3 };
> real values[9] = {
>    1., 2., 3.,
>    4., 5., 6.,
>    7., 8., 9. };
> Function f(mesh, rank, shape, values);
> 
> --
> Martin

Attachment: signature.asc
Description: OpenPGP digital signature


Follow ups

References