← Back to team overview

dolfin team mailing list archive

Re: curved elements

 

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.

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