We consider a second order elliptic PDE discretized by the Hybrid High-Order method, for which globally coupled unknowns are located at faces. To efficiently solve the resulting linear system, we propose a geometric multigrid algorithm that keeps the degrees of freedom on the faces at every grid level. The core of the algorithm lies in the design of the prolongation operator that passes information from coarse to fine faces through the reconstruction of an intermediary polynomial of higher degree on the cells. High orders are natively handled by the use of the same polynomial degree at every grid level. The proposed algorithm requires a hierarchy of nested meshes, such that the faces (and not only the elements) are successively coarsened. Numerical tests on homogeneous and heterogeneous diffusion problems show fast convergence, scalability in the mesh size and polynomial order, and robustness with respect to heterogeneity of the diffusion coefficient.
The experiments can be reproduced with the open-source code fhhos4, release 1.0.
# 2D cart
> fhhos4 -geo square -mesh cart -mesher inhouse -s mg -cycle V,1,1 -k 0 -n {32|64|128|256|512|1024}
> fhhos4 -geo square -mesh cart -mesher inhouse -s mg -cycle V,1,1 -k 1 -n {32|64|128|256|512|1024}
> fhhos4 -geo square -mesh cart -mesher inhouse -s mg -cycle V,1,1 -k 2 -n {32|64|128|256|512|1024}
> fhhos4 -geo square -mesh cart -mesher inhouse -s mg -cycle V,1,1 -k 3 -n {32|64|128|256|512|1024}
# 2D tri
> fhhos4 -geo square -mesh stri -mesher inhouse -s mg -cycle V,1,1 -k 0 -n {32|64|128|256|512|1024|2048}
> fhhos4 -geo square -mesh stri -mesher inhouse -s mg -cycle V,1,1 -k 1 -n {32|64|128|256|512|1024}
> fhhos4 -geo square -mesh stri -mesher inhouse -s mg -cycle V,1,1 -k 2 -n {32|64|128|256|512}
> fhhos4 -geo square -mesh stri -mesher inhouse -s mg -cycle V,1,1 -k 3 -n {32|64|128|256|512}
# 3D cart
> fhhos4 -geo cube -mesh cart -mesher inhouse -s mg -cycle V,1,1 -k 0 -n {16|32|64|128}
> fhhos4 -geo cube -mesh cart -mesher inhouse -s mg -cycle V,1,1 -k 1 -n {16|32|64|128}
> fhhos4 -geo cube -mesh cart -mesher inhouse -s mg -cycle V,1,1 -k 2 -n {8|16|32|64}
> fhhos4 -geo cube -mesh cart -mesher inhouse -s mg -cycle V,1,1 -k 3 -n {8|16|32|64}
# 3D tetra
> fhhos4 -geo cube -mesh stetra -mesher inhouse -s mg -cycle V,2,2 -k 0 -n 16 # diverging
> fhhos4 -geo cube -mesh stetra -mesher inhouse -s mg -cycle V,2,2 -k 1 -n {8|16|32|64}
> fhhos4 -geo cube -mesh stetra -mesher inhouse -s mg -cycle V,2,2 -k 2 -n {8|16|32}
> fhhos4 -geo cube -mesh stetra -mesher inhouse -s mg -cycle V,2,2 -k 3 -n {8|16|32}
Replace the * characters with numerical values in
> fhhos4 -geo square -mesh stri -mesher inhouse -k 1 -n 512 -s mg -cycle V,*,*
Replace the * characters with numerical values in
> fhhos4 -geo square -mesh stetra -mesher inhouse -k 1 -n 32 -s mg -cycle V,*,*
Important parameter: -smoothers bj23,bj23
.
Replace the * characters with numerical values in
> fhhos4 -geo square -mesh stri -mesher inhouse -k 1 -n 512 -s mg -smoothers bj23,bj23 -cycle V,*,*
# 2D cart
> fhhos4 -geo square -mesh cart -mesher inhouse -s mg -cycle V,0,3 -k 0 -n {32|64|128|256|512|1024}
> fhhos4 -geo square -mesh cart -mesher inhouse -s mg -cycle V,0,3 -k 1 -n {32|64|128|256|512|1024}
> fhhos4 -geo square -mesh cart -mesher inhouse -s mg -cycle V,0,3 -k 2 -n {32|64|128|256|512|1024}
> fhhos4 -geo square -mesh cart -mesher inhouse -s mg -cycle V,0,3 -k 3 -n {32|64|128|256|512|1024}
# 2D tri
> fhhos4 -geo square -mesh stri -mesher inhouse -s mg -cycle V,0,3 -k 0 -n {32|64|128|256|512|1024|2048}
> fhhos4 -geo square -mesh stri -mesher inhouse -s mg -cycle V,0,3 -k 1 -n {32|64|128|256|512|1024}
> fhhos4 -geo square -mesh stri -mesher inhouse -s mg -cycle V,0,3 -k 2 -n {32|64|128|256|512}
> fhhos4 -geo square -mesh stri -mesher inhouse -s mg -cycle V,0,3 -k 3 -n {32|64|128|256|512}
# 3D cart
> fhhos4 -geo cube -mesh cart -mesher inhouse -s mg -cycle V,0,6 -k 0 -n {16|32|64|128}
> fhhos4 -geo cube -mesh cart -mesher inhouse -s mg -cycle V,0,6 -k 1 -n {16|32|64|128}
> fhhos4 -geo cube -mesh cart -mesher inhouse -s mg -cycle V,0,6 -k 2 -n {8|16|32|64}
> fhhos4 -geo cube -mesh cart -mesher inhouse -s mg -cycle V,0,6 -k 3 -n {8|16|32|64}
# 3D tetra
> fhhos4 -geo cube -mesh stetra -mesher inhouse -s mg -cycle V,0,6 -k 0 -n 16 # diverging
> fhhos4 -geo cube -mesh stetra -mesher inhouse -s mg -cycle V,0,6 -k 1 -n {8|16|32|64}
> fhhos4 -geo cube -mesh stetra -mesher inhouse -s mg -cycle V,0,6 -k 2 -n {8|16|32}
> fhhos4 -geo cube -mesh stetra -mesher inhouse -s mg -cycle V,0,6 -k 3 -n {8|16|32}
> fhhos4 -geo square4quadrants -tc kellogg -mesh cart -mesher inhouse -s mg -cycle V,1,1 -k 0 -n {32|64|128|256|512|1024}
> fhhos4 -geo square4quadrants -tc kellogg -mesh cart -mesher inhouse -s mg -cycle V,1,1 -k 1 -n {32|64|128|256|512|1024}
> fhhos4 -geo square4quadrants -tc kellogg -mesh cart -mesher inhouse -s mg -cycle V,1,1 -k 2 -n {32|64|128|256|512}
> fhhos4 -geo square4quadrants -tc kellogg -mesh cart -mesher inhouse -s mg -cycle V,1,1 -k 3 -n {32|64|128|256|512}
Important parameters: -prolong {1|2} [-disable-hor]
.
# cell k and injection
> fhhos4 -geo square -mesh stri -mesher inhouse -k 1 -s mg -cycle V,0,3 -prolong 2 -disable-hor -n {32|64|128|256|512|1024}
# cell k and average
> fhhos4 -geo square -mesh stri -mesher inhouse -k 1 -s mg -cycle V,0,3 -prolong 1 -disable-hor -n {32|64|128|256|512|1024}
# cell k+1 and injection
> fhhos4 -geo square -mesh stri -mesher inhouse -k 1 -s mg -cycle V,0,3 -prolong 2 -n {32|64|128|256|512|1024}
# cell k+1 and average (final algo)
> fhhos4 -geo square -mesh stri -mesher inhouse -k 1 -s mg -cycle V,0,3 -prolong 1 -n {32|64|128|256|512|1024}
# cell k and injection
> fhhos4 -geo square -mesh stri -mesher inhouse -k 1 -s mg -cycle V,1,2 -prolong 2 -disable-hor -n {32|64|128|256|512|1024}
# cell k and average
> fhhos4 -geo square -mesh stri -mesher inhouse -k 1 -s mg -cycle V,1,2 -prolong 1 -disable-hor -n {32|64|128|256|512|1024}
# cell k+1 and injection
> fhhos4 -geo square -mesh stri -mesher inhouse -k 1 -s mg -cycle V,1,2 -prolong 2 -n {32|64|128|256|512|1024}
# cell k+1 and average (final algo)
> fhhos4 -geo square -mesh stri -mesher inhouse -k 1 -s mg -cycle V,1,2 -prolong 1 -n {32|64|128|256|512|1024}
Modify the value of the parameter -heterog
from 1e0 to 1e8:
> fhhos4 -geo square4quadrants -mesh cart -mesher inhouse -n 64 -s mg -g 1 -cycle V,0,3 -k 0 -heterog {1e0-1e8}
> fhhos4 -geo square4quadrants -mesh cart -mesher inhouse -n 64 -s mg -g 1 -cycle V,0,3 -k 1 -heterog {1e0-1e8}
> fhhos4 -geo square4quadrants -mesh cart -mesher inhouse -n 64 -s mg -g 1 -cycle V,0,3 -k 2 -heterog {1e0-1e8}
> fhhos4 -geo square4quadrants -mesh cart -mesher inhouse -n 64 -s mg -g 1 -cycle V,0,3 -k 3 -heterog {1e0-1e8}
Important parameter: -disable-heterog-weight
.
> fhhos4 -geo square4quadrants -mesh cart -mesher inhouse -n 64 -s mg -g 1 -cycle V,0,3 -disable-heterog-weight -k 0 -heterog {1e0-1e8}
> fhhos4 -geo square4quadrants -mesh cart -mesher inhouse -n 64 -s mg -g 1 -cycle V,0,3 -disable-heterog-weight -k 1 -heterog {1e0-1e8}
> fhhos4 -geo square4quadrants -mesh cart -mesher inhouse -n 64 -s mg -g 1 -cycle V,0,3 -disable-heterog-weight -k 2 -heterog {1e0-1e8}
> fhhos4 -geo square4quadrants -mesh cart -mesher inhouse -n 64 -s mg -g 1 -cycle V,0,3 -disable-heterog-weight -k 3 -heterog {1e0-1e8}
Important parameter: -fcs {0|1}
.
> fhhos4 -geo square -mesh cart -mesher inhouse -s mg -cycle V,0,3 -cs s -fcs 1 -k 0 -n {32|64|128|256|512}
> fhhos4 -geo square -mesh cart -mesher inhouse -s mg -cycle V,0,3 -cs s -fcs 1 -k 1 -n {32|64|128|256|512}
> fhhos4 -geo square -mesh cart -mesher inhouse -s mg -cycle V,0,3 -cs s -fcs 1 -k 2 -n {32|64|128|256|512}
> fhhos4 -geo square -mesh cart -mesher inhouse -s mg -cycle V,0,3 -cs s -fcs 1 -k 3 -n {32|64|128|256|512}
> fhhos4 -geo square -mesh cart -mesher inhouse -s mg -cycle V,0,3 -cs s -fcs 0 -k 0 -n {32|64|128|256|512}
> fhhos4 -geo square -mesh cart -mesher inhouse -s mg -cycle V,0,3 -cs s -fcs 0 -k 1 -n {32|64|128|256|512}
> fhhos4 -geo square -mesh cart -mesher inhouse -s mg -cycle V,0,3 -cs s -fcs 0 -k 2 -n {32|64|128|256|512}
> fhhos4 -geo square -mesh cart -mesher inhouse -s mg -cycle V,0,3 -cs s -fcs 0 -k 3 -n {32|64|128|256|512}
Important parameter: -cs b
.
# Custom Bey's refinement, V(0,6)
> fhhos4 -geo cube -mesh tetra -mesher inhouse -k 1 -s mg -cs b -cycle V,0,6 -n {8|16|32|64}
# Custom Bey's refinement, V(0,8)
> fhhos4 -geo cube -mesh tetra -mesher inhouse -k 1 -s mg -cs b -cycle V,0,8 -n {8|16|32|64}
# Custom Bey's refinement, V(0,10)
> fhhos4 -geo cube -mesh tetra -mesher inhouse -k 1 -s mg -cs b -cycle V,0,10 -n {8|16|32|64}
# Cartesian tet. refinement, V(0,6)
> fhhos4 -geo cube -mesh stetra -mesher inhouse -k 1 -s mg -cs s -cycle V,0,6 -n {8|16|32|64}
> fhhos4 -geo platewith4holes -s mg -cs b -cycle V,0,10 -k 0 -n {8|16|32} # diverges at n=32
> fhhos4 -geo platewith4holes -s mg -cs b -cycle V,0,10 -k 1 -n {8|16|32}
> fhhos4 -geo platewith4holes -s mg -cs b -cycle V,0,10 -k 2 -n {8|16|32}
> fhhos4 -geo platewith4holes -s mg -cs b -cycle V,0,10 -k 3 -n {8|16|32}
Important parameter: -cs r
.
> fhhos4 -geo squarecircle -s mg -cs r -cycle V,0,3 -k 0 -n {32|64|128|256|512|1024}
> fhhos4 -geo squarecircle -s mg -cs r -cycle V,0,3 -k 1 -n {32|64|128|256|512|1024}
> fhhos4 -geo squarecircle -s mg -cs r -cycle V,0,3 -k 2 -n {32|64|128|256|512}
> fhhos4 -geo squarecircle -s mg -cs r -cycle V,0,3 -k 3 -n {32|64|128|256|512}