← Back to team overview

dolfin team mailing list archive

Re: curved elements

 


On 24/03/11 04:38, walker@xxxxxxxxxxxx wrote:
> Hello Anders and Garth.
> 
> You may not remember me, but I had some interest way back in seeing this
> higher order geometry stuff put in.  

I remember!

> However, it seemed like P. Brune had
> a way so I backed off.   In the meantime, I decided to stick with my own
> FEM toolbox setup and continued developing it.  I have higher order
> elements implemented (in principle for any finite element that is defined)
> and I can do this for 1-D curves in 3-D and 2-D surface meshes in 3-D
> (which is another thing I would like to see in FEniCS), in addition to 2-D
> and 3-D curved meshes.  I can even compute things like the total curvature
> vector (i.e. 2nd fundamental form).  I even implemented some code
> generation in my setup because I think you have a good idea there.  But my
> goal is not to duplicate FEniCS (there is no way I could do that).  I just
> needed these basic components for my own work.
> 
> Anyway, I would like to describe how I did it, b/c the lessons I learned
> may be useful to you.
> 
> 1. Garth is correct.  All local geometric transformations should be
> computed separately from the tabulate tensor routine.  It has been awhile
> since I perused the FEniCS code, but I assume that is still the same.  I
> repeat, you should NOT compute the jacobian (or derivatives of the
> jacobian, or the normal vector, etc...) in the tabulate tensor.  This has
> the following advantages: (a) the code is more modular; you separate the
> geometry transformation from the element calculation; (b) you can *reuse*
> the jacobian calculation for each bilinear form that has to get assembled,
> instead of recomputing it every time you enter tabulate_tensor.
> 
> I personally found this to work great for me.  And I would like to
> emphasize that I do not see a 10-fold slow-down in assembly time (for a
> fixed quad rule); I don't remember the timings, but it seemed to be
> negligible b/c this calculation is done in cache.  Again, the local
> mapping transformation for each element should have *nothing to do* with
> the bilinear forms, etc.  It is a separate calculation (of course, you
> need to take into account Piola transform when appropriate, but this is
> minor).
> 
> 2. When the user wants to specify the type of "higher order" geometry, I
> would suggest the following.  You should have the user define a
> "Geometric_Element" just like when they define regular finite elements,
> i.e.
> 
> Geometric_Element = FiniteElement("triangle",1,1)
> 
> Or something like that (I don't remember your exact syntax).  In fact, you
> could even make "Geometric_Element" a keyword.  And if the user does not
> define it, then you default to first order lagrange continuous element
> (which is what you do now).
> 
> I think you have everything already to do this.  The Geometric_Element is
> just a special case of a regular finite element, except the element is
> *always* the reference element.  You should be able to reuse all of your
> FFC code generation.  Of course, computing higher order derivatives of
> basis functions will be more complicated (i.e. the chain rule will give
> more terms b/c of the nonlinear map), but I assume you are doing most of
> that symbolically within Python.
> 
> 3. One last thing I learned in doing this was I also separated the
> transformations of the basis functions.  So the order of operations in the
> assembly loop is:
> 
> (a) get the index for the current element.
> (b) compute geometric transformations.
> (c) compute basis function transformations.
> (d) compute local element tensors.
> (e) insert into global matrix.
> 
> At least for my setup, this gave a nice separation.  In fact, the tabulate
> tensor routine is almost trivial since all the transformations are done.
> 
> I hope this info is helpful.  I am not trying to imply that my setup is
> better; but maybe this gives a way for how to proceed.
>

Thanks. It's very helpful to hear your experience.

I'm wondering if it's all as simple as adding the geometric info to
ufl::cell. It makes sense that a cell can fully describe its own
geometry.  We could have:

  element = FiniteElement("triangle", 1, 1)

which would be a general case in which a ufc::cell would be queried from
inside tabulate_tensor to provide the Jacobian, etc. For efficiency, we
could also have

  element = FiniteElement("affine triangle", 1, 1)

which would assume an affine map and therefore not query ufc::cell for
the transformation data.

Garth

> p.s. is it possible yet to have finite element spaces defined on a
> subdomain of codimension 1 simultaneously with other codimension 0 spaces
> and be able to compute bilinear forms involving mixed elements?  I noticed
> you have some support for integrating on subdomains, but does that include
> this???
> 
> - Shawn
> 
> On Wed, March 23, 2011 7:27 pm, Anders Logg wrote:
>> On Wed, Mar 23, 2011 at 11:24:37PM +0000, Garth N. Wells wrote:
>>> We've heard about this work, but never seen it ;).
>>> Can you post it somewhere? It could provide a discussion basis on how
> to
>>> move this along.
>>> I think that we should be careful in asking FFC to do too much. It may
> better to compute J, det(J), etc, outside tabulate_tensor(...)
>>> functions.
>>
>> Aren't those computed using codesnippets just pasted in by FFC into the
> code anyway? Perhaps those codesnippets can be expanded with higher order
> codesnippets?
>>
>> --
>> Anders
>>
>>
>>> Garth
>>> On 23/03/11 21:05, Peter Brune wrote:
>>>> I saw this thread and had already started running the tests I had for
> this with the latest FFC to see if anything had changed recently.  I never
> made isoparametry through UFL public because I could never get
>>> the
>>>> efficiency to be reasonable.  The situation appears to have improved
> a
>>>> little bit from a year ago, but not much.  With the latest FFC, it's
> about 10x slower (in 2D) to assemble Poisson with P1 for the
>>> test/trial
>>>> space and P2 for the coordinates than the same problem with affine
> coordinates.  It's even worse if you include things like
>>>> Piola-transformed surface normals into the mix.  When I was working
> on
>>>> this I only assembled a very small fraction of the elements (around a
> cylinder in a flow) with the parametric Jacobian, so it worked OK for
> small problems.
>>>>
>>>> I believe that it would do much, much better if the optimizing
> quadrature compiler in FFC supported fractions.  This is necessary because
> you need to apply the inverse isoparametric Jacobian, which includes 1 /
> |J|, to any basis function derivatives in the form.
>>>>
>>>> For reference, here are the assembly times for the iso(super, I
>>> suppose
>>>> is more accurate)-parametric, optimized, and non-optimized Poisson
> problems in 2D on a 256x256 square (with the parametric coordinates
>>> just
>>>> being the regular coordinates passed through).
>>>>
>>>> isoparametric assembly      |        3.2017      3.2017     1
> optimized assembly          |       0.34515     0.34515     1 regular
> assembly            |       0.36524     0.36524     1
>>>>
>>>> I got really deep in FFC trying to make this work with no success,
> but
>>>> this was before the rewrite.  I'd be willing to declare victory on
>>> this
>>>> one and submit my code if someone else were willing to make it fast
> enough to use.  There's also the issue of how exactly to extend the
> interface to support this in an elegant fashion.  Right now I just
>>> call
>>>> a function that takes a form and a parametric Jacobian, runs a
> Transformer on the form, and spits out a new form.
>>>>
>>>> - Peter
>>>>
>>>>
>>>> On Wed, Mar 23, 2011 at 3:30 PM, Anders Logg <logg@xxxxxxxxx
>>>> <mailto:logg@xxxxxxxxx>> wrote:
>>>>
>>>>     Peter Brune claims to have solved this by a small addition to the
>>> form
>>>>     language that automatically expresses the curved elements as a
>>> mapping
>>>>     and expands appropriately (and invisible to the user) those
>>> mappings
>>>>     to yield a form that may then be assembled. The higher order
>>> geometry
>>>>     is then expressed as a vector-field on the mesh.
>>>>
>>>>     Perhaps Peter can be pushed to polish up on his code and submit
>>> it.
>>>>
>>>>
>>>>
>>>>     On Wed, Mar 23, 2011 at 07:46:57PM +0000, Garth N. Wells wrote:
>>>>     > We haven't really looked at this. It was discussed a while
> back,
>>>>     but no
>>>>     > one has committed much time to it. We struggled to settle on an
> appropriate abstraction to push on with.
>>>>     >
>>>>     > Garth
>>>>     >
>>>>     > On 23/03/11 18:40, Douglas Arnold wrote:
>>>>     > > What is the status of curved (e.g., isoparametric) elements
> in
>>>>     dolfin?
>>>>     > > I gather they are not implemented in the main branch.   Has
>>> anyone
>>>>     > > done anything with this can be used?  Is there any example
>>> code?
>>>>     > > (For example, if you want to
>>>>     > > solve the Poisson problem in a disc and get better than 2nd
>>> order
>>>>     > > convergence, you need to do better than polygonal
>>> approximation of
>>>>     > > the disc.)
>>>>     > >
>>>>     > >  -- Doug
>>>>     > >
>>>>     > > _______________________________________________
>>>>     > > Mailing list: https://launchpad.net/~dolfin
>>>>     <https://launchpad.net/%7Edolfin>
>>>>     > > Post to     : dolfin@xxxxxxxxxxxxxxxxxxx
>>>>     <mailto:dolfin@xxxxxxxxxxxxxxxxxxx>
>>>>     > > Unsubscribe : https://launchpad.net/~dolfin
>>>>     <https://launchpad.net/%7Edolfin>
>>>>     > > More help   : https://help.launchpad.net/ListHelp
>>>>     >
>>>>     > _______________________________________________
>>>>     > Mailing list: https://launchpad.net/~dolfin
>>>>     <https://launchpad.net/%7Edolfin>
>>>>     > Post to     : dolfin@xxxxxxxxxxxxxxxxxxx
>>>>     <mailto:dolfin@xxxxxxxxxxxxxxxxxxx>
>>>>     > Unsubscribe : https://launchpad.net/~dolfin
>>>>     <https://launchpad.net/%7Edolfin>
>>>>     > More help   : https://help.launchpad.net/ListHelp
>>>>
>>>>
>>
>> _______________________________________________
>> Mailing list: https://launchpad.net/~dolfin
>> Post to     : dolfin@xxxxxxxxxxxxxxxxxxx
>> Unsubscribe : https://launchpad.net/~dolfin
>> More help   : https://help.launchpad.net/ListHelp
>>
>>
> 
> 
> 
> 
> 
> 



Follow ups

References