Subject: [Fenics] misleading message with interpolate?

From: Douglas Arnold <[email-masked]>
Date: Thu, 24 Jun 2010 17:57:57 -0500

If we run this simple program, which interpolates the quadratic  x*y
onto a mesh of the unit square and then integrate it, it gives
the exact answer .25.  This is not surprising, but the warning
message

   Automatic selection of expression element: <CG? on a <? of degree 1>>

is.  What does the "degree 1" refer to.  I interpreted it to be warning
me that the expression was interpolated into the P1 element space, but
that cannot be correct, since then I would not have gotten the exat
integral.

Code:

from dolfin import *
mesh = UnitSquare(4,4)
V = FunctionSpace(mesh,'CG',2)
f = interpolate(Expression("x[0]*x[1]"),V)
print(assemble(f*dx, mesh=mesh))

Output:

Warning: Converting real-valued parameter to double, might loose precision.
Automatic selection of expression element: <CG? on a <? of degree 1>>
Warning: Converting real-valued parameter to double, might loose precision.
0.25

---

From: Anders Logg <[email-masked]>
Date: Fri, 25 Jun 2010 08:53:55 +0200

> Warning: Converting real-valued parameter to double, might loose precision.

Degree 1 means here the degree of the mapping of the geometry (which
is almost always 1). It's there in UFL to enable higher order
(isoparametric) mapping.

The ? means that DOLFIN does not know the appropriate polynomial
degree of the function space at the time the message is written. The
degree is selected later by the form compiler. This is more of a debug
message that was introduced when we implemented the automatic
selection (to remove the need for the V=V argument).

I've removed that output now. What would be more interesting would be
for the form compiler to print the degree it selects. It does print
that but it gets lost somewhere in the communication between DOLFIN
and FFC. I'll see if it can be fixed.

--
Anders

---

From: Anders Logg <[email-masked]>
Date: Tue, 29 Jun 2010 18:14:33 +0200

> and FFC. I'll see if it can be fixed.

I looked a bit more at this.

To get more information from the form compiler, set the following parameter:

  parameters["form_compiler"]["log_level"] = DEBUG

Then look for "Adjust element..." in the output.

With your script above (a bit modified)

  from dolfin import *
  parameters["form_compiler"]["log_level"] = DEBUG
  mesh = UnitSquare(4,4)
  V = FunctionSpace(mesh,'CG',2)
  f = interpolate(Expression("x[0]*x[1]"),V)

no elements need to be adjusted since DOLFIN will just evaluate x*y at
the nodal points to get the dofs.

But if we change the last line to

  f = project(Expression("x[0]*x[1]"),V)

then DOLFIN will need to compute an integral containing x*y and then
it needs to know how to approximate x*y in that integral. The output
is now

  Adjusting element degree from ? to 2
  Adjusting element cell from <? of degree 1> to <triangle of degree 1>.

So FFC figures out it should approximate x*y with piecewise quadratics
which happens to be correct in the above case. Try other expressions
and see what happens.

--
Anders