Anders Logg wrote:
> On Mon, Apr 28, 2008 at 02:24:38PM +0200, Anders Logg wrote:
>   
>> On Mon, Apr 28, 2008 at 03:00:26PM +0200, Marie Rognes wrote:
>>     
>>> Error:
>>>
>>>     Traceback (most recent call last):
>>>       File "test.py", line 33, in ?
>>>         u0.assign(w)
>>>       File
>>>     
>>> "/home/meg/src/dolfin/dolfin/local/lib/python2.4/site-packages/dolfin/dolfin.py",
>>>     line 3172, in assign
>>>         return _dolfin.cpp_Function_assign(*args)
>>>     RuntimeError: *** Error: Unable to find finite element in library:
>>>     "Mixed finite element: [Crouzeix-Raviart finite element of degree 1
>>>     on a triangle, Crouzeix-Raviart finite element of degree 1 on a
>>>     triangle]".
>>>     Segmentation fault
>>>
>>>
>>> Code:
>>>
>>>     from dolfin import *
>>>
>>>     # Geometry of the domain and mesh
>>>     shape = "triangle"
>>>     mesh = UnitSquare(16, 16)
>>>
>>>     # Setting up the elements
>>>     V = VectorElement("CR", shape, 1)
>>>
>>>     u0 = Function(V, mesh, 0.0)
>>>
>>>     v = TestFunction(V)
>>>     u = TrialFunction(V)
>>>     a = dot(grad(u), grad(v))*dx
>>>     L = dot(u0, v)*dx
>>>
>>>     pde = LinearPDE(a, L, mesh)
>>>     w = pde.solve()
>>>     u0.assign(w)
>>>
>>>    
>>> Easy fix?
>>>       
>> Probably not. The message comes from the copy constructor (in C++) of
>> DiscreteFunction, which looks in the list of precompiled elements and
>> that list does not include vector-valued CR elements.
>>
>> I'll see if I can find the problem. You are doing this from Python so
>> it should be possible to get around this problem and not need to
>> create the element from precompiled code.
>>     
>
> ok, I found a solution (temporary).
>
> If you change the line
>
>   u0 = Function(V, mesh, 0.0)
>
> to
>
>   u0 = Function(V, mesh, Vector())
>
> it should work.
>
>   

Perfect. Thanks!

> Then both w and u0 will be discrete functions (i.e. storing their
> values in a vector). They will also be defined on the same space so
> then just the values in the vector need to get copied and that works
> nicely (in operator= in DiscreteFunction).
>
> The problem with your code is that u0 was not a discrete function, but
> instead a "constant function" which does not store its values in a
> vector. So then what happens is that a new discrete function must be
> created (including a new finite element) and then DOLFIN must (in C++)
> look in its library of precompiled elements (which is limited to
> reduce compile times).
>
> We can fix this and related issues when we rework/cleanup the function
> classes (now that the linear algebra seems to be ok).
>
>   

Good.

-- 
Marie E. Rognes
Ph.D Fellow, 
Centre of Mathematics for Applications, 
University of Oslo
http://folk.uio.no/meg

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

Reply via email to