← Back to team overview

dolfin team mailing list archive

Re: ConstantFunctions have undefined value rank and dimension

 

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.

// 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


Follow ups

References