On 17/12/08 05:11 AM, Johan Hake wrote:
> On Tuesday 16 December 2008 23:30:17 Bartosz Sawicki wrote:
>> On 16/12/08 03:04 PM, Garth N. Wells wrote:
>>> Bartosz Sawicki wrote:
>>>> Before the function revolution there was method cell() inside the
>>>> Function. I used it to determine index of current cell during assembly
>>>> procedures, in eval() method. I realized that it disappeared now.
>>>> How similar functionality can be achieved today?
>>> You'll need to use the eval variant
>>>
>>>    void eval(double* values, const Data& data) const;
>>>
>>> and you can then access the cell via
>>>
>>>   const Cell& cell = data.cell();
>> Thanks. That's clear now.
>> Remember that corresponding section of the manual needs to be updated.
> 
> That is probably true, together with a lot of other stuff... :)
> 
>> Do you plan to extend python interface to follow this changes?
> 
> The pure python interface only support values and x as arguments to the 
> callback function eval(). It should probably be possible to expose the data 
> structure to python too, but this wont be a priority right now. 
> 
> You can always define your own C++ function and compile it in python.
> 
>    cppcode = '''
>     class MyFunc : public Function
>     {
>     public:
> 
>       MyFunc(FunctionSpace& V) : Function(V) {}
> 
>       void eval(double* values, const Data& data)
>       {
>          // write your C++ code here!
>       }
> 
>     };'''
>  
>    my_func = Function(V,cppcode)
>    
> my_func can then be used in form formulation, and then automaticly used in 
> the 
> assembly too. Unfortunatly you cannot use this function directly from the 
> python prompt, i.e.
>   
>    my_func.eval(v,x)
> 
> wont work, as the data structure is created duing assemble.
> 
> Btw, with the new Function interface we have made it much easier to use 
> compiled c++ function from python. Have a look in the docstring of Function. 
> I strongly encourage you to use compiled function instead of pure python 
> functions as the performance boost is significant during assemble.

Thank you for explanation. I've just tried tried to apply this, but I 
failed.
Please have a look into this simple example:

u = Function("poisson.xml")
mesh = u.function_space().mesh()
Vv = VectorFunctionSpace(mesh, "Discontinuous Lagrange", 0)
cppcode = '''
class MyFunc : public Function
{
public:
   MyFunc(FunctionSpace& V) : Function(V) {}
   void eval(double* values, const Data& data){
     values[0] = 1.0;
   }
};
'''
v = TestFunction(Vv)
E = TrialFunction(Vv)
mat = Function(Vv, cppcode)
a = dot(v,E)*dx
L = -mat[0]*dot(v,grad(u))*dx
pde = LinearPDE(a, L)
E = pde.solve()

And error message:

Ordering mesh (finished).
Creating linear PDE with 0 boundary condition(s).
Solving linear PDE.
   Assembling matrix over cells (finished).
   Assembling vector over cells (finished).
Traceback (most recent call last):
   File "grad.py", line 41, in <module>
     E = pde.solve()
   File 
"/home/sawickib/dolfin/local/lib/python2.5/site-packages/dolfin/pde.py",
line 54, in solve
     cpp.LinearPDE.solve(self, u)
   File 
"/home/sawickib/dolfin/local/lib/python2.5/site-packages/dolfin/cpp.py",
line 10908, in solve
     return _cpp.LinearPDE_solve(*args)
RuntimeError: *** Error: Missing eval() for user-defined function
(must be overloaded).


Error message is a little bit strange for me. Why it doesn't see eval() 
function?

BArtek





_______________________________________________
DOLFIN-dev mailing list
[email protected]
http://www.fenics.org/mailman/listinfo/dolfin-dev

Reply via email to