amgcl: Block preconditioners

Hi,

I’m looking to solve a linear system which is algebraically similar to the Stokes problem, in the sense that I have a matrix in the following block form:

[ A     B ]
[ B^T   0 ]

with A symmetric positive definite, and B has full row rank.

I am trying to find an efficient way to solve this system, and I hope to be able to adapt techniques one may use for the Stokes problem, as seen towards the end in this lecture by Wolfgang Bangerth. In this video, Bangerth advocates using the following (right) block preconditioner in conjunction with GMRES:

[ A^-1    -A^-1 B^T S^-1 ]
[ 0            S^-1      ]

where S = B^T A^-1 B. Of course, one does not know the exact inverses of A and S, so one would like to approximate these. For the Stokes problem, one can approximate S^-1 by the inverse of the mass matrix (but for my problem I need to use a different matrix that I hope is somewhat similar), and Bangerth suggests using “one step of multigrid” to approximate the action of applying A^-1.

I’ve been poking around the docs and the source code, and I think it should be possible to accomplish this kind of block-preconditioning with amgcl. Is this correct? I see that there’s a block_preconditioner.hpp related to MPI, and also a schur_pressure_correction.hpp, both of which might be useful for me to understand how to assemble this, but I find it a little hard to decipher what’s going on, especially since I’m not familiar with Schur pressure correction.

In particular, can I perform “one step” of AMG for the approximation of A^-1? I’m struggling to see how to assemble the pieces, and any suggestions (or confirmation on whether or not I can do what I want) would be most welcome!

P.S: I realize this is not truly an “issue”, but I could not find any other place to ask questions to the community of users of amgcl. I hope this is OK.

About this issue

  • Original URL
  • State: closed
  • Created 8 years ago
  • Comments: 20 (6 by maintainers)

Commits related to this issue

Most upvoted comments

To tell you the truth, I don’t feel particularly qualified to give an answer to that. However, I suppose being able to set relative and absolute tolerances is basically a generalization of having a single tolerance, and so unless it’s very inconvenient to implement, it would give the user the most flexibility without much loss to usability in the case when the user wants to use a single tolerance value.