← Back to team overview

dolfin team mailing list archive

Re: curved elements

 


On 24/03/11 12:50, Kristian Ølgaard wrote:
> On 24 March 2011 13:09, Garth N. Wells <gnw20@xxxxxxxxx> wrote:
>>
>>
>> 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.
> 
> I think there is already something in UFL that we could use for this.
> The default (affine) triangle is:
> 
> R2 = Space(2)
> triangle      = Cell("triangle", 1, R2)
> 
> Changing the degree to '2':
> 
> triangle      = Cell("triangle", 2, R2)
> 
> will imply a higher order geometry, of course we need to implement
> support in the form compilers to generate actual code.
> 

But what kind of mapping does it imply? We want to generalised beyond
using the FE basis functions for the map.

Garth

> Kristian
> 
>> 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
>>>>
>>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>
>> _______________________________________________
>> 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