ufl team mailing list archive
-
ufl team
-
Mailing list archive
-
Message #01380
A form-based approach to isoparametry
I'm working on some problems with sub/super/isoparametric elements and have
very quickly implemented it entirely using UFL and a transformation of the
form to include a geometric coefficient. This is done using the
transformation framework to append the geometric information to the parts of
the form that require transformation.
I had previously written calculations to include the coefficient space for
geometry by hand, but I talked with Anders at ENUMATH and he told me more
about the Transformer machinery. Right now, a Poisson form with this looks
like:
cell = triangle
iso_element = VectorElement("Lagrange", cell, 4)
aff_element = VectorElement("Lagrange", cell, 1)
element = FiniteElement("Lagrange", cell, 4)
iso_func = Function(iso_element)
affine_func = Function(aff_element)
u = TrialFunction(element)
v = TestFunction(element)
f = Function(element)
b = inner(grad(u), grad(v))
K = v*f
J = dot(inv(grad(iso_func)), grad(affine_func))
detJ = det(J)
a = apply_geometry(b, J)
L = apply_geometry(K, J)
a = a*dx
L = L*dx
Where apply_geometry applies a Transformer to the form in order to include
the geometric coefficients.
The benefits of this approach are:
1. General function spaces for the geometry -- no reliance on the somewhat
contradictory concept of "extra vertices." on a simplex.
2. Uses all the already existing mechanisms for compilation and optimization
Right now I'm stuck transforming the affinely-transformed components back to
the reference and applying the map. The ideal would be appending something
to the measure, which is then appended to the form. This might look like:
J = grad(iso_func)
a = inner(grad(u), grad(v))*dx(0) + inner(grad(u), grad(v))*dx(1, jacobian =
J)
L = v*f*dx(0) + v*f*dx(1, jacobian = J)
With the form compiler then omitting the generation of the affine Jacobian.
Like this we can easily have the higher-order geometry only defined on, say,
boundary cells where we have a higher-order geometry defined. Otherwise the
affine form can be used.
Thoughts on how I should go about this? I'm still generalizing my
transformer, but have run a demos of simple forms (Poisson, Stokes) with no
real problems; now I'm moving onto what I actually want to do like this, but
improving the interface would be nice eventually.
- Peter Brune
Follow ups