On Wed, Oct 08, 2008 at 11:58:23PM +0200, Michael Brandl wrote:
Hi,
I am new to this list and using ffc for my bachelor thesis.
Hopefully I am not asking something stupid which has already been asked;
I tried to look through FFC-dev's archieves, but didn't find an answer.
What I want to do is using a mixed element (with a vector element and a
finite element), but then to access the single components of a test or
trial function defined on the vector element.
A concrete example would be this modification of the "Mixed formulation
of Stokes" from the documentation:
P2 = VectorElement("Lagrange", "triangle", 2)
P1 = FiniteElement("Lagrange", "triangle", 1)
TH = MixedElement([P2, P1])
(v, q) = TestFunctions(TH)
(u, p) = TrialFunctions(TH)
f = Function(P2)
a = (dot(grad(v), grad(u)) - div(v)*p + q*div(u))*dx
L = (v[i] * f[i])*dx
where I only changed the last line (from being "L = dot(v, f) * dx" into
its componentwise computation).
I get the following error:
--------
Preprocessing form file: Test.form --> Test.py
Traceback (most recent call last):
File "/usr/bin/ffc", line 180, in ?
sys.exit(main(sys.argv[1:]))
File "/usr/bin/ffc", line 107, in main
execfile(outname, ns)
File "Test.py", line 27, in ?
L = (v[i] * f[i])*dx
TypeError: list indices must be integers
-----
I am afraid that I am not good enough in Python to find a solution to
that, therefore I would appreciate any kind of help very much.
Thank you!
This is expected. FFC handles mixed elements like the one above by
first creating a vector-valued element that holds all components of
the system. In this case a vector-valued element with three components
is created.
Then TrialFunctions() etc creates a basis function in this space (with
three components) and returns components of this basis function split
into the parts that make up the element:
w = TrialFunction(TH)
u = [w[0], w[1]]
p = w[2]
So u is just a Python list and it does not know how to handle i which
is an FFC object of class Index.
This will be fixed in UFL as already noted by Martin.
By the way, while going through this example (Mixed formulation of
Stokes)from the documentation I found some minor errors there:
It should be
"P2 = VectorElement("Lagrange", "triangle", 2)"
instead of
"P2 = FiniteElement("Vector Lagrange", "triangle", 2)",
"a = (dot(grad(v), grad(u)) - div(v)*p + q*div(u))*dx"
instead of
"a = (dot(grad(v), grad(u)) - div(v)*P + q*div(u))*dx";
and finally the sentence about the example file with Heat.form seems to
be misplaced; I didn't manage to find this example there.
Thank you very much,
yours sincerely,
Michael Brandl
Thanks for reporting this. I see that Kristian has already updated the
manual.
------------------------------------------------------------------------
_______________________________________________
FFC-dev mailing list
FFC-dev@xxxxxxxxxx
http://www.fenics.org/mailman/listinfo/ffc-dev