← Back to team overview

ffc team mailing list archive

Re: Error accessing vectors via indices in mixed elements

 

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.

-- 
Anders

Attachment: signature.asc
Description: Digital signature


Follow ups

References