← Back to team overview

dolfin team mailing list archive

Re: compile-error in python user-defined expression

 

On 4 September 2012 11:21, Johan Hake <hake.dev@xxxxxxxxx> wrote:
> On 09/04/2012 11:11 AM, Martin Sandve Alnæs wrote:
>> On 4 September 2012 11:05, Johan Hake <hake.dev@xxxxxxxxx> wrote:
>>> On 09/04/2012 10:58 AM, Martin Sandve Alnæs wrote:
>>>> On 4 September 2012 10:49, Johan Hake <hake.dev@xxxxxxxxx> wrote:
>>>>> On 09/04/2012 10:00 AM, Marco Morandini wrote:
>>>>>> On 09/03/2012 06:56 PM, Johan Hake wrote:
>>>>>>> Marco!
>>>>>>>
>>>>>>> This is caused by the new automatic parsing of dependencies for
>>>>>>> compiled_modules in Python. It was added so a minimum of dependencies
>>>>>>> are dragged into the compilation, reducing the compilation time
>>>>>>> considerably.
>>>>>>
>>>>>> Yes, I've seen you commits; they really reduce the compilation time.
>>>>>> Thanks!
>>>>>
>>>>> dolfin.h drags in a lot of types...
>>>>>
>>>>>>> I do agree that your case should be supported in a better way than
>>>>>>> adding it as a hack, as you did. Another hack is to introduce a dummy
>>>>>>> public dependency:
>>>>>>
>>>>>> ....
>>>>>>
>>>>>>>
>>>>>>> What we probably need is to expose some more compile options to the
>>>>>>> Expression interface so you can do:
>>>>>>>
>>>>>>>    Expression(cppcode_d1, element=DGe, \
>>>>>>>               system_headers=["dolfin/fem/GenericDofMap.h"])
>>>>>>>
>>>>>>> Other opinions?
>>>>>>
>>>>>>
>>>>>> I think that the dolfin namespace should be automatically dealt with
>>>>>> for code like
>>>>>>
>>>>>> p = Expression('x[0] + x[1]')
>>>>>>
>>>>>> but it should be the user's responsibility to deal with it
>>>>>> whenever this idiom
>>>>>>
>>>>>> delta1 = Expression(cppcode_d1, element=DGe)
>>>>>>
>>>>>> is used.
>>>>>>
>>>>>> I.e.
>>>>>>
>>>>>> p = Expression('x[0] + x[1]')
>>>>>>
>>>>>> should automatically generate
>>>>>>
>>>>>> namespace dolfin
>>>>>> {
>>>>>> class Expression_121446782cdb69f97c3b9ff77a93499b: public Expression
>>>>>> {
>>>>>> public:
>>>>>>   Expression_121446782cdb69f97c3b9ff77a93499b():Expression()
>>>>>>   {  }
>>>>>>   void eval(dolfin::Array<double>& values, const dolfin::Array<double>&
>>>>>> x) const
>>>>>>   { values[0] = x[0] + x[1]; }
>>>>>> };
>>>>>> }
>>>>>>
>>>>>> as it does right now,
>>>>>>
>>>>>> but for
>>>>>>
>>>>>> self.delta1 = Expression(cppcode_d1, element=DGe)
>>>>>>
>>>>>> the (supposedly proficient) user should explicitly
>>>>>> enter the namespace:
>>>>>>
>>>>>> cppcode_d1 = """
>>>>>> #include "whatever_must_be_additionally_included_and_is_not_detected"
>>>>>> namespace dolfin
>>>>>> {
>>>>>> class Delta1 : public Expression
>>>>>> {
>>>>>>  ....
>>>>>> }  //end class Delta1
>>>>>> }; //end namespace dolfin"""
>>>>>>
>>>>>> without having it auto-magically opened and closed.
>>>>>>
>>>>>> I don't know if this is possible, thought. It would perhaps break a lot
>>>>>> of user code but, on the other side, a lot of user code out there is
>>>>>> perhaps broken right now precisely because of this problem, and you
>>>>>> don't see any complaint because few users work with the trunk ....
>>>>>
>>>>> Might be. I have not thought of automatically adding namespace as a
>>>>> problem before. I suppose adding dolfin namespace automatically is a bit
>>>>> surprising for the power users. Especially if one wants to use other
>>>>> namespaces.
>>>>>
>>>>> We could use a regexp to check if a namespace is already added, and
>>>>> adding it if there isn't one?
>>>>>
>>>>> I still think it would be a good idea to add more powerful link and
>>>>> include options to the compiled expression interface. This would fix
>>>>> your case and others who wants more powerful external libraries.
>>>>>
>>>>> Johan
>>>>
>>>> I don't understand why the user-defined class is placed in the dolfin
>>>> library namespace in the first place?
>>>
>>> As I said, it do confuse a power user,
>>
>> Well, you're not explaining :-P
>>
>>> and make it just a bit easier for
>>> the average joe making a compiled Expression.
>>
>> How?
>>
>>> I am not vigorously defending this "feature", just saying it was
>>> introduced as a convenient thing.
>>
>> What's the convenience?
>
> Not having to add it :)
>
>>> Most people will generate code which
>>> should reside in the dolfin namespace anyway.
>>
>> Why? I don't agree in principle. The dolfin namespace is for the dolfin library.
>> If you want the dolfin namespace accessible, why not use a "using" statement?
>
> SWIG does not like that. We need full type info.

Ok, so SWIG understands that e.g. Mesh means dolfin::Mesh when inside
the dolfin namespace, but not when "using namespace dolfin" has been
declared? I remember there was some pain around those issues :)

Martin


Follow ups

References