dolfin team mailing list archive
-
dolfin team
-
Mailing list archive
-
Message #07676
Re: Crouzeix-Raviart error
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.
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).
--
Anders
Follow ups
References