dolfin team mailing list archive
-
dolfin team
-
Mailing list archive
-
Message #22307
Re: curved elements
On 24/03/11 14:28, walker@xxxxxxxxxxxx wrote:
> On Thu, March 24, 2011 8:53 am, Peter Brune wrote:
>> Ah, this argument, again. I continue to disagree. While you could
>> certainly home-roll a FEM code that does this under assumptions like
>> constant quadrature order and small meshes, this is going to fall down
>> hard
>> as soon as you have varying quadrature degree or type, which we always do.
>> This would also keep around way more state than the current assembly
>> paradigm allows, not to mention the per-quadrature-point storage
>> requirements of a full-blown tensor.
>
> I don't see why constant quadrature order is so terrible. Is it really
> necessary to have varying quadrature degree? What do you mean be more
> state info? This is just another locally defined function. I am a little
> unclear about what you are saying.
>
I don't see what the 'argument' is either. What is it exactly?
>> The other problem with this approach is that you severely restrict the
>> spaces your coordinates can live in by having some oddly-defined notion of
>> "higher-order vertices. If you have some coefficient that is the
>> coordinates instead it's automatic. I think you definitely should
>> recreate
>> the jacobian in tabulate_tensor; it's what we do now; it's what we should
>> do
>> if we don't want to store per-quadrature-point tensors on the DOLFIN side
>> when the DOLFIN side doesn't even know about quadrature points.
>
> I am not proposing having higher order vertices. I am saying treat the
> geometric map like **it has its own finite element space**! If you want
> to have a special map for each bilinear form (so you can have varying quad
> degree) then fine. But keep in mind that once you have a non-linear map
> for the geometry, you will (in general) not be able to compute the tensors
> exactly. So you will need to fix the quad degree somehow.
>
I agree with this. Forgetting forms and PDEs, we should be able able to
have a pure geometric representation. Say, for example, that I have a
mesh that uses some mapping and I want to know (possibly approximately)
its volume. The mesh and cells need to know all the geometry. Also, say
I want to know in which cell a point (in the real coordiantes) lies.
This is not related to forms.
Garth
>> Arguments about the interface can come later. I'm sanity checking the
>> code
>> I updated to the latest FFC with a couple test cases and should have it in
>> a
>> repo somewhere public shortly.
>>
>> - Peter
>
> I think I will let other people figure out how to put this into FEniCS.
> Obviously, my experience is limited. However, my code is available on my
> web page: https://www.math.lsu.edu/~walker/FELICITY.html
>
> I am NOT advertising my code. I am just offering it as an example of what
> to do or what NOT to do.
>
> If you are curious about how the generated code looks, please have a look.
> All you need to have is MATLAB and a C++ compiler. So the instructions
> are:
>
> 1. Open MATLAB.
> 2. type "mex -setup" to pick the C++ compiler (this is easy).
> 3. unzip my code to a directory.
> 4. within MATLAB, change to that directory.
> 5. run this script: "FELICITY_paths.m". This will add all of the
> appropriate paths and unit tests.
> 6. then run this script: "test_FELICITY.m". This runs all the unit tests
> I have so far.
> 7. It you want to see the code that is generated, then just go to the
> Unit_Test subdir under the Matrix_Assembly dir.
>
> Steps 1-6 should not take more 5 mins (maximum). I have tested it on
> windows and LINUX. If it doesn't run, please let me know.
>
> - Shawn
>
>> On Thu, Mar 24, 2011 at 7:09 AM, 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.
>>>
>>> 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