[petsc-users] PCFIELDSPLIT with BoomerAMG preconditioning on a Schur Complement
Lawrence Mitchell
wence at gmx.li
Tue Apr 27 17:01:51 CDT 2021
> On 22 Apr 2021, at 19:46, Tang, Qi via petsc-users <petsc-users at mcs.anl.gov> wrote:
>
> For our case, the Schur complement becomes a curl curl problem by designed. So we expect it is going to be scalable. We are still experimenting boomeramg, which seems be working, but would like to switch to AMS later if possible.
>
> The question is, can we use AMS for dmstag where dofs in our case lives on edges? One thing we are not so sure is the discrete gradient operator. We were told by our local expert that it needs to be scaled properly instead of 1 and -1. We are wondering if there are some examples using AMS beyond dmda, maybe in firedrake or dmstag? (Actually, in firedrake, we recently got AMS working with the lowest order RT space for a different project). Any example along the line would be useful.
I think the hookups we have for Hypre AMS and ADS in Firedrake are coded for first-order, but could easily be generalised. See here https://github.com/firedrakeproject/firedrake/blob/master/firedrake/preconditioners/hypre_ams.py
For example, for AMS, the hypre documentation says that for high order problems you should do:
https://hypre.readthedocs.io/en/latest/solvers-ams.html#high-order-discretizations
HYPRE_AMSSetDimension(solver, dim);
HYPRE_AMSSetDiscreteGradient(solver, G);
HYPRE_AMSSetInterpolations(solver, Pi, Pix, Piy, Piz);
The discrete gradient can be constructed with:
Suppose you want to do this for N1curl of degree 3
So you make
P3 = FunctionSpace(mesh, "P", 3)
N3 = FunctionSpace(mesh, "N1curl", 3)
G = Interpolator(grad(TestFunction(P3)), N3)
For Pi you need the vector version of P3
VP3 = VectorFunctionSpace(mesh, "P", 3)
(We guarantee this has the same dof ordering as the scalar field)
Then you can make the Pi interpolation matrices
Pi = Interpolator(TestFunction(VP3), N3))
Pix = Interpolator(TestFunction(VP3)[0], N3)
Piy = Interpolator(TestFunction(VP3)[1], N3)
Piz = Interpolator(TestFunction(VP3)[2], N3)
See the above-linked file for more of the details.
We'd happily help to generalise the AMS and ADS interfaces to handle arbitrary-order.
I note that you'd probably not want to do particularly high order this way, since the Poisson-like matrices you get are not perfectly solved by boomeramg. If you have geometric hierarchies, you could also do Arnold-Falk-Winther style geometric multigrid. If you only have an algebraic hierarchy, it might be worth experimenting with doing Arnold-Falk-Winther star-patch smoothing on the finest level and doing p-coarsening to lowest order and then doing the Hypre AMS (Hiptmair-Xu) approach, not sure.
Lawrence
More information about the petsc-users
mailing list