Block Preconditioners and DoF classification

35 views
Skip to first unread message

Raymon White

unread,
Sep 25, 2015, 1:03:15 PM9/25/15
to deal.II User Group
Hello,


I'm looking through the documentation and I cannot work out how easy or hard it is to implement block preconditioners for the Navier-Stokes equations (I know that the Schur Complement preconditioner is already implemented, but I want to write other block preconditioners).

This would involve classifying degrees of freedom (DoFs) such that the blocks in the Jacobian matrix can be extracted (for example, extracting the block matrix which corresponds to the U_x velocity).

What about things like splitting the DoF TYPES such that the DoFs at a particular boundary is classified separately? (Possibly via Face/Ghost elements?) For example, in 2D, I would have U_x, U_xb, U_y, U_yb, where xb an yb denotes the DoFs at the boundary.

I read that triangles/tetrahedrals would be difficult to implement as it involves writing a lot of code to classify the DoFs (amongst other things such as writing the shape functions). But what about something like re-classifying a set of DoFs so that I can extract a particular block from the Jacobian to play around with?


Kind Regards,

-- 
Ray

Guido Kanschat

unread,
Sep 28, 2015, 1:00:43 AM9/28/15
to dea...@googlegroups.com
Dear Ray,


I'm looking through the documentation and I cannot work out how easy or hard it is to implement block preconditioners for the Navier-Stokes equations (I know that the Schur Complement preconditioner is already implemented, but I want to write other block preconditioners).

This is not a problem in deal.II, see for instance my old and Daniel Arndt's more recent publications on
Navier-Stokes.
 

This would involve classifying degrees of freedom (DoFs) such that the blocks in the Jacobian matrix can be extracted (for example, extracting the block matrix which corresponds to the U_x velocity).

If you use an FESystem, you can sort degrees of freedom by block or vector component and separate them into the blocks of a BlockVector.

What about things like splitting the DoF TYPES such that the DoFs at a particular boundary is classified separately? (Possibly via Face/Ghost elements?) For example, in 2D, I would have U_x, U_xb, U_y, U_yb, where xb an yb denotes the DoFs at the boundary.

The renumbering into blocks is guaranteed not to change the numbering within a block. Therefore, if you write your own renumbering with boundary dofs first, you can run the block renumbering afterwards and have the boundary dofs first in each block.
 
Best,
Guido

Ray

unread,
Sep 28, 2015, 2:51:50 AM9/28/15
to deal.II User Group
Dear Guido,



Thank you for the reply, I appreciate this a lot. I've spent the weekend reading up more about the FESystem class. It's pretty nice! Last query:
Let's say I've written a block preconditioner which modifies a certain block of the Jacobian.
Then is it possible to use a pre-written preconditioner to operate on the modified blocks?
For example, I want add a constant to the velocity blocks. This is all my preconditioner does.
Then I want to use a Schur preconditioner (which is already written either by myself or someone else) "underneath". So the Schur preconditioner will use the modified blocks, not the blocks from the Jacobian.

Or would the best thing to do be to write a preconditioner which modifies the blocks AND apply the operations done by a Schur preconditioner?


Kind Regards,


Ray
Reply all
Reply to author
Forward
0 new messages