> On 22 Apr 2021, at 19:46, Tang, Qi via petsc-users <[email protected]>
> 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