Skip to content

MUMPS ICNTL(14)=200 in the default direct solver parameters never reaches MUMPS #5311

Description

@lrtfm

Describe the bug

The default direct-solver parameters set ICNTL(14) = 200 for MUMPS, but the option never reaches MUMPS: it is composed into pc_factor_mat_mumps_icntl_14, which PETSc reports as an unused option. MUMPS therefore runs with its own default ICNTL(14) = 20.

This silently removes the intended 200% working-space relaxation, making INFOG(1) = -9 ("main internal real/complex workarray too small") more likely on problems with significant extra fill-in — which is exactly the failure mode the default was added to protect against.

Steps to Reproduce

from firedrake import *
from firedrake.petsc import PETSc

mesh = UnitSquareMesh(8, 8)
V = FunctionSpace(mesh, "CG", 1)
u, v = TrialFunction(V), TestFunction(V)
uh = Function(V)
problem = LinearVariationalProblem(
    inner(grad(u), grad(v))*dx, inner(Constant(1), v)*dx,
    uh, bcs=DirichletBC(V, 0, "on_boundary"))

solver = LinearVariationalSolver(problem)          # defaults only
print("solver.parameters:", dict(solver.parameters))

prefix = solver.snes.getOptionsPrefix() or ""
pc = solver.snes.getKSP().getPC()

# ask MUMPS to print its own ICNTL table
PETSc.Options().setValue(prefix + "mat_mumps_icntl_4", "2")
solver.solve()
print("factor Mat prefix:", repr(pc.getFactorMatrix().getOptionsPrefix()))

Run with -options_left:

python3 mwe.py -options_left

Expected behavior

MUMPS reports ICNTL(14) = 200.

Actual behavior

solver.parameters: {'mat_type': 'aij', 'ksp_type': 'preonly', 'ksp_rtol': 1e-07,
                    'pc_type': 'lu', 'pc_factor_mat_solver_type': 'mumps',
                    'pc_factor_mat_mumps_icntl_14': 200, 'snes_type': 'ksponly'}

snes prefix:       'firedrake_1_'
factor Mat prefix: 'firedrake_1_'

 ICNTL(14) Percentage of memory relaxation      =              20
 ICNTL(14) Memory relaxation                =              20

Unused PETSc option: firedrake_1_pc_factor_mat_mumps_icntl_14

Analysis

The value itself is set with the correct key in _DEFAULT_DIRECT_SOLVER_PARAMETERS:

https://github.com/firedrakeproject/firedrake/blob/main/firedrake/petsc.py#L120-L122

if DEFAULT_DIRECT_SOLVER == "mumps":
    _DEFAULT_DIRECT_SOLVER_PARAMETERS["mat_mumps_icntl_14"] = 200

but that whole dict is then nested under a "pc_factor" key and flattened:

https://github.com/firedrakeproject/firedrake/blob/main/firedrake/petsc.py#L137-L143

_DEFAULT_KSP_PARAMETERS = petsctools.flatten_parameters({
    "mat_type": "aij",
    "ksp_type": "preonly",
    "ksp_rtol": 1e-7,
    "pc_type": "lu",
    "pc_factor": _DEFAULT_DIRECT_SOLVER_PARAMETERS
})

so {"pc_factor": {"mat_mumps_icntl_14": 200}} becomes pc_factor_mat_mumps_icntl_14.

The pc_factor_ nesting is right for mat_solver_type (pc_factor_mat_solver_type is a genuine PCFactor option and does take effect), but MUMPS ICNTL options are not in the PCFactor namespace — they belong to the factored Mat, whose options prefix is just the solver prefix (firedrake_1_ above, with no pc_factor_ segment). The factored matrix looks for <prefix>mat_mumps_icntl_14, so the composed key can never match.

Consistent with that, putting the key at the top level does work:

solver_parameters = {"ksp_type": "preonly", "pc_type": "lu",
                     "pc_factor_mat_solver_type": "mumps",
                     "mat_mumps_icntl_14": 77,
                     "mat_mumps_icntl_4": 2}
# -> ICNTL(14) Percentage of memory relaxation = 77

So the two kinds of options in _DEFAULT_DIRECT_SOLVER_PARAMETERS need different prefixes and cannot be flattened under a single "pc_factor" key.

This is related to, but distinct from, #2250 (user-supplied mg_coarse_mat_mumps_icntl_XX ignored in the multigrid coarse solver): that one is about propagating user options into a sub-solver, whereas this is Firedrake's own default silently not applying.

Environment

  • Firedrake 2026.4.1
  • PETSc 3.25
  • MUMPS 5.8.2
  • macOS (arm64)

Verified against main at the time of writing: firedrake/petsc.py lines 122 and 137–143 are unchanged from the installed version.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions