Balancing Domain Decomposition by Constraints (PCBDDC)

--pc-type bddc

1. Mathematical Idea

We have a global linear system:

\[A u = f\]

where the domain has been partitioned into subdomains (often one per MPI process). BDDC enforces continuity across subdomains by introducing a coarse space of “primal” unknowns on the subdomain interfaces. The method consists of:

  1. Local solves on each subdomain (with partially constrained boundary conditions).

  2. A global coarse solve that couples the subdomains via interface constraints.

Hence, it is a two-level (or multi-level) domain decomposition method: a local level to handle subdomains and a coarse level to ensure global coupling.

1.1. Unknowns Classification

Each subdomain has:

  • Interior degrees of freedom (DOFs): no direct interaction with other subdomains.

  • Interface DOFs: these must match up with neighboring subdomains. BDDC splits interface DOFs into:

    • Primal (coarse) DOFs, e.g. corner/vertex values, edge averages, face averages, etc.

    • Dual DOFs, i.e., the remaining interface unknowns.

1.2. Preconditioner Form

The BDDC preconditioner M_BDDC can be written schematically as:

\[M_\mathrm{BDDC} = R_0^T\,D_0^{-1}\,R_0 \;+\; B^T\,\tilde{S}_C^{-1}\,B\]

where:

  • \(R_0\) is the restriction/extension operator to local subdomains.

  • \(D_0^{-1}\) is block-diagonal, consisting of local subdomain solves.

  • \(B\) is an operator mapping coarse interface DOFs to the global interface unknowns.

  • \(\tilde{S}_C\) is the coarse Schur complement that enforces global interface constraints.

In effect:

  • The term \(R_0^T\,D_0^{-1}\,R_0\) provides local corrections within each subdomain.

  • The term \(B^T\,\tilde{S}_C^{-1}\,B\) supplies a coarse correction that enforces interface constraints and balances the subdomains globally.

2. Using PCBDDC in PETSc

In Feel++/PETSc, once you have:

--pc-type bddc

you can add options like:

# Use corner, edge, face constraints:
--pc-bddc-use-vertices=true
--pc-bddc-use-edges=true
--pc-bddc-use-faces=true

# If necessary, specify boundary conditions or custom constraints:
--pc-bddc-neumann-boundary=...
--pc-bddc-dirichlet-boundary=...
--pc-bddc-user-primal-vertices=...
--pc-bddc-numbering=...

Depending on your problem (e.g. elasticity, flow, etc.), you might enable or disable edges/faces in the primal space. The chosen constraints control the coarse space dimension and thus preconditioner performance.

3. Benefits

  • Scalable: Good parallel scaling for large 3D problems.

  • Robust: Typically more robust than simpler methods (e.g., block-Jacobi or ASM) for elliptic and nearly-elliptic PDEs.

  • Flexible: You can change which constraints (corners, edges, faces) are included in the coarse space.

4. References

  • C.R. Dohrmann, "An approximate BDDC preconditioner," Numerical Linear Algebra with Applications 14 (2007), 149–168.

  • J. Mandel and C.R. Dohrmann, "Convergence of a balancing domain decomposition by constraints and energy minimization," Numerical Linear Algebra with Applications 10 (2003), 639–659.

  • PETSc documentation on PCBDDC: petsc.org/main/docs/manualpages/PC/PCBDDC/