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.
Describe the bug
The default direct-solver parameters set
ICNTL(14) = 200for MUMPS, but the option never reaches MUMPS: it is composed intopc_factor_mat_mumps_icntl_14, which PETSc reports as an unused option. MUMPS therefore runs with its own defaultICNTL(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
Run with
-options_left:Expected behavior
MUMPS reports
ICNTL(14) = 200.Actual behavior
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
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
so
{"pc_factor": {"mat_mumps_icntl_14": 200}}becomespc_factor_mat_mumps_icntl_14.The
pc_factor_nesting is right format_solver_type(pc_factor_mat_solver_typeis a genuinePCFactoroption and does take effect), but MUMPSICNTLoptions are not in thePCFactornamespace — they belong to the factoredMat, whose options prefix is just the solver prefix (firedrake_1_above, with nopc_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:
So the two kinds of options in
_DEFAULT_DIRECT_SOLVER_PARAMETERSneed 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_XXignored 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
Verified against
mainat the time of writing:firedrake/petsc.pylines 122 and 137–143 are unchanged from the installed version.