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