dolfin team mailing list archive
-
dolfin team
-
Mailing list archive
-
Message #14304
Re: [UFL-dev] A form-based approach to isoparametry
On Tue, Jul 07, 2009 at 02:12:51PM -0400, Shawn Walker wrote:
>
> On Tue, 7 Jul 2009, Peter Brune wrote:
>
>> Reversing the affine transformation is a temporary measure; it's because I haven't modified FFC to stop
>> generating the affine jacobian.
>>
>> It all depends on what level things are done at as to what gets complicated; It seems that generating this
>> code gets complicated either way, so here's how it looks:
>>
>> My present musings work entirely within UFL, and I can easily add geometric terms at the form level like
>> this, but will only work with affinely-transforming elements -- a large class, but we're going for the
>> general case. There are two ways we could go from there -- the one I was considering with this question was
>> keeping this in UFL and extracting the transformation type from the basis functions (for non-affine basis
>> functions, at least). This appears to be possible, but really quite a lot of code, as done in the likes of
>> the quadraturetransformer in FFC.
>>
>> The other option is to generate code for the jacobian in FFC/Syfi/etc. I examined the generation code and
>> determined that the second is probably the best option for generality's sake. However, it's still not
>> pretty. There's a lot of code wrapped up in the affine transformation from FIAT onward, as you are probably
>> quite aware. :)
>>
>> - Peter
>
> Actually, I am not that aware of the innards of FFC. I am a humble man!
> :) But I thought that since the application of the jacobian is already
> structurally there, having a variable jacobian is not such a big deal.
> We need an FFC person to come to our aid! I was also hoping Anders would
> comment on this.
I'm on vacation so I only have time to reply when something is either
(1) extremely urgent or (2) simple to respond to. This is neither so
it will have to wait... :-)
--
Anders
> - Shawn
>
>> On Tue, Jul 7, 2009 at 10:50 AM, Shawn Walker <walker@xxxxxxxxxxxxxxx> wrote:
>>
>> On Tue, 7 Jul 2009, Peter Brune wrote:
>>
>> Ah, let me explain further: The reason I have the two vector spaces -- affine and iso, is
>> so that I can
>> reverse the affine transformation before applying the isoparametric transformation. Today
>> I found a small
>> bug in my isoparametric transformer, and now I'm sure stokes works; the pretty example
>> showing the
>> differences between refined affine and unrefined isoparametric is coming along! We want to
>> get rid of having
>> to transform back to the reference using the affine coefficient space before this is ready
>> to be used. I
>> have been looking through UFL and FFC for a good way to drop in a new jacobian. Passing
>> the new jacobian to
>> FFC is really easy using metadata... using it is harder.
>>
>>
>> I'm a little unclear why you need to reverse the transformation.
>>
>> So, anyone else have any tips on that? Here's the MAJOR issue I can see cropping up -- I
>> can pepper the form
>> itself with the new Jacobian in order to transform function (derivatives) affinely, but
>> other transformations
>> (co/contravariant Piola anyone?) will not work like this. I NEED to give FFC something
>> that can be
>> manipulated like the pullback/pushforward between geometries to use the more interesting
>> element types, or
>> even more interesting forms. I need to be able to extract information like how a given
>> basis function (and
>> its derivatives) transform at the UFL form-transformation level, OR I need to be able to
>> change the Jacobian
>> (per-measure).
>>
>> Peter
>>
>>
>> It sounds like this is more complicated than it needs to be. But maybe I am missing something.
>>
>> Currently, in the FFC generated form file, the jacobian inverse terms enter into the quadrature loop as
>> constants. All one has to do is replace those constants by the variable jacobian terms that are
>> determined by your local map. I did a manual modification of this and it seemed to work.
>>
>> My view of this is that FFC would need to be extended to generate this code, which shouldn't be too bad
>> given that you can pass a Function/FunctionSpace to the form file that represents the higher order mesh
>> geometry.
>>
>> The main point here is that you can pass a Function and FunctionSpace as a separate object to the form
>> file, which we missed before.
>>
>> - Shawn
>>
>>
>> On Tue, Jul 7, 2009 at 8:25 AM, Shawn Walker <walker@xxxxxxxxxxxxxxx> wrote:
>> ok. So, this is why you had those two spaces defined in the .ufl file. That way the
>> form knows
>> how to handle it.
>>
>> This sounds pretty good! :)
>>
>> - Shawn
>>
>>
>> On Tue, 7 Jul 2009, Peter Brune wrote:
>>
>> It becomes a vector coefficient to the form.
>>
>> - Peter
>>
>> On Tue, Jul 7, 2009 at 12:04 AM, Shawn Walker <walker@xxxxxxxxxxxxxxx> wrote:
>> Actually, I just realized a problem with what I was proposing.
>>
>> When you assemble the matrix, you loop through each triangle. But the higher
>> order
>> mesh function
>> is defined on a different function space. How does the tabulate_tensor routine
>> know
>> which
>> triangle to access in the higher order mesh function?
>>
>> - Shawn
>>
>>
>> On Mon, 6 Jul 2009, Anders Logg wrote:
>>
>> On Mon, Jul 06, 2009 at 09:34:43AM -0400, Shawn Walker wrote:
>>
>> On Mon, 6 Jul 2009, Peter Brune wrote:
>>
>> 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
>>
>>
>> How exactly do you represent the geometry as a function space? We had
>> thought about this before and there was a problem (because you need a
>> mesh to create a function space in the furst place).
>>
>> 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.
>>
>>
>> This is great. There is some support for reading in higher order meshes
>> in DOLFIN now. There is even a boolean parameter for saying which
>> triangles are curved and which are affine.
>>
>> Please keep in mind that you may want to have triangles that are NOT on
>> the boundary to also be curved. This is necessary if the mesh is highly
>> anisotropic (picture a wing with a very anisotropic curved mesh at the
>> boundary).
>>
>> 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
>>
>>
>> So, you have done this in UFL? Does that mean just the notation is
>> setup? I had done a hand modification of a poisson demo that reads in a
>> higher order mesh and computes the stiffness matrix on two triangles
>> (only one is curved) and compare it to a stiffness matrix computed by
>> other means. I don't know if this will be useful for you; what I did was
>> a little hacky. Have you thought about how the higher order mesh would be
>> stored in an XML file? I can resend the example I made (that shows
>> this), but it should be in the archive on DOLFIN.
>>
>> I am traveling right now, so I won't be able to say much on this,
>> unfortunately.
>>
>>
>> I'm on vacation so I also won't have much to say about this right now,
>> but the form-based approach is very appealing since (1) it is a simple
>> layer on top of existing functionality (so we don't need to modify
>> the form compilers) and (2) it is more general since we can use any
>> Function to map the mesh from the reference geometry.
>>
>> We still have the problem of reading/storing the geometry and we
>> concluded a while back that we didn't want to use Function for this,
>> since it would create a circular dependency between the Mesh and
>> Function classes. But if the mapping of the mesh can be stored
>> separately from the mesh (as a coefficient in the form) then I guess
>> this is no longer a problem. (?)
>>
>> --
>> Anders
>>
>>
>> _______________________________________________
>> UFL-dev mailing list
>> UFL-dev@xxxxxxxxxx
>> http://fenics.org/mailman/listinfo/ufl-dev
>>
>>
>>
>>
>>
>>
>>
>>
> _______________________________________________
> UFL-dev mailing list
> UFL-dev@xxxxxxxxxx
> http://fenics.org/mailman/listinfo/ufl-dev
Attachment:
signature.asc
Description: Digital signature
Follow ups
References