Re: [Libmesh-users] Preconditioner advice? From: Jed Brown - 2012-09-17 23:02:53 ```On Mon, Sep 17, 2012 at 5:35 PM, Roy Stogner wrote: > I don't understand the reason for the failures, though. In that > thread Jed said that multigrid breaks down for indefinite systems, > which sounded reasonable. (inability to invert an indefinite matrix > is basically the null hypothesis) But Stokes stops being indefinite > if you handle the unconstrained pressure mode, yet both the pinned > pressure and the lagrange multiplier pressure formulations in our > examples still fail with BoomerAMG. > Remember that pressure is basically a Lagrange multiplier. The issue is not the one-dimensional null space. Indeed, multigrid typically works fine for positive semi-definite systems such as all-Neumann Poisson with a consistent right hand side (though you cannot use a direct solve on the coarsest level). The problem with Stokes is the zeros (or stabilization matrix) in the (pressure, pressure) block. This makes the problem a saddle point so the solve no longer equates to minimizing some functional. More importantly for multigrid, the strength of connection measures in algebraic multigrid are totally confused by these zeros and smoothers don't know what to do with that block. Geometric multigrid can be used directly for Stokes by (a) using interpolation operators that make sense for pressure and velocity independently and (b) using smoothers that respect the indefinite nature of the problem. Trottenberg's book has lots of details, but an example of a good smoother is due to Vanka. It is a multiplicative overlapping Schwarz method that uses domains obtained by taking a pressure node, adding all velocity dofs that touch it, then assembling that block problem (or extracting it from the matrix), solving, updating the state vector for all dofs under the block solve, then moving to the next pressure node. Efficiently implementing these with assembled matrices or continuous finite elements is unfortunately, somewhat problematic. DG is very nice for this purpose. In any case, if you want to work with assembled matrices and not dive too far into multigridding, we recommend distinguishing the degrees of freedom (via your DM interface or directly/less composably via PCFieldSplitSetISs()) and using PCFieldSplit so that multigrid only operates on the (velocity, velocity) block. We can produce most of the methods from the literature (of which there are many, perhaps start with Elman's) on the command line in this way. ```