> 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

Reply via email to