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

Aperta
#5,311 0 commenti 0 reazioni 0 assegnatari Vedi su GitHub

I maintainer di solito rispondono entro 1 giorno

Nessuno ha ancora preso questa issue.

Valutazione

Difficoltà
3/5
Tempo stimato
1-2 giorni
Idoneità per principianti
72/100
Tipo di issue
Bug
Chiarezza
Specificata chiaramente
Stato di attività
Tranquilla
Stack tecnologico
python
Ambito
backend

Direzione di ricerca

Inizia in firedrake/petsc.py intorno a _DEFAULT_DIRECT_SOLVER_PARAMETERS e _DEFAULT_KSP_PARAMETERS, quindi esegui il riproduttore MUMPS fornito con -options_left. La correzione è completa quando il valore predefinito raggiunge MUMPS come ICNTL(14)=200 e non viene segnalata alcuna opzione PETSc inutilizzata corrispondente.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Descrizione

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.

Lingua principale
Python
Stelle
684
Fork
204
Merge medio
4g 14h
PR unite (30g)
46

Preparare l'ambiente

  • Nessun Dockerfile né file Docker Compose
  • Ha un modello di pull request
  • Nessuna guida per i contributori

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Altre issue di firedrakeproject/firedrake

Tutte le issue di firedrakeproject/firedrake

Issue simili

Altre issue su Python

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.