From 194696bd1d536aeedcb0c4be907a1eafd7b30d5d Mon Sep 17 00:00:00 2001 From: Pablo Brubeck Date: Tue, 5 May 2026 10:25:19 +0100 Subject: [PATCH 1/4] AssembledPC: fix sub_mat_type --- firedrake/preconditioners/assembled.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/firedrake/preconditioners/assembled.py b/firedrake/preconditioners/assembled.py index d0e225e813..18dd0f3a5e 100644 --- a/firedrake/preconditioners/assembled.py +++ b/firedrake/preconditioners/assembled.py @@ -45,7 +45,10 @@ def initialize(self, pc): (a, bcs) = self.form(pc, test, trial) - form_assembler = get_assembler(a, bcs=bcs, form_compiler_parameters=fcp, mat_type=mat_type, options_prefix=options_prefix) + form_assembler = get_assembler(a, bcs=bcs, form_compiler_parameters=fcp, + mat_type=mat_type, + sub_mat_type=sub_mat_type, + options_prefix=options_prefix) self.P = form_assembler.allocate() self._assemble_P = form_assembler.assemble self._assemble_P(tensor=self.P) From 2eb8a0e086fab7f02f94072eb6ef0da66e98f388 Mon Sep 17 00:00:00 2001 From: Pablo Brubeck Date: Tue, 5 May 2026 10:55:04 +0100 Subject: [PATCH 2/4] get default (sub_)mat_type from parent _SNESContext --- firedrake/preconditioners/assembled.py | 14 +++++++------- firedrake/solving_utils.py | 5 ++++- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/firedrake/preconditioners/assembled.py b/firedrake/preconditioners/assembled.py index 18dd0f3a5e..873ce1d86d 100644 --- a/firedrake/preconditioners/assembled.py +++ b/firedrake/preconditioners/assembled.py @@ -45,9 +45,14 @@ def initialize(self, pc): (a, bcs) = self.form(pc, test, trial) + self._ctx_ref = self.new_snes_ctx(opc, a, bcs, mat_type, + fcp=fcp, + sub_mat_type=sub_mat_type, + options_prefix=options_prefix) + form_assembler = get_assembler(a, bcs=bcs, form_compiler_parameters=fcp, - mat_type=mat_type, - sub_mat_type=sub_mat_type, + mat_type=self._ctx_ref.mat_type, + sub_mat_type=self._ctx_ref.sub_mat_type, options_prefix=options_prefix) self.P = form_assembler.allocate() self._assemble_P = form_assembler.assemble @@ -65,11 +70,6 @@ def initialize(self, pc): # We set a DM and an appropriate SNESContext on the constructed PC so one # can do e.g. multigrid or patch solves. dm = opc.getDM() - self._ctx_ref = self.new_snes_ctx(opc, a, bcs, mat_type, - fcp=fcp, - sub_mat_type=sub_mat_type, - options_prefix=options_prefix) - pc.setDM(dm) pc.setOptionsPrefix(options_prefix) pc.setOperators(A, self.P.petscmat) diff --git a/firedrake/solving_utils.py b/firedrake/solving_utils.py index 5efecc2e20..ef720ae5e6 100644 --- a/firedrake/solving_utils.py +++ b/firedrake/solving_utils.py @@ -279,9 +279,12 @@ def __init__(self, problem, def reconstruct(self, problem=None, mat_type=None, pmat_type=None, **kwargs): """Reconstruct this _SNESContext instance with new arguments.""" - problem = problem or self.problem + problem = problem or self._problem mat_type = mat_type or self.mat_type pmat_type = pmat_type or self.pmat_type + for k, v in tuple(kwargs.items()): + if v is None: + kwargs.pop(k) kwargs.setdefault("sub_mat_type", self.sub_mat_type) kwargs.setdefault("sub_pmat_type", self.sub_pmat_type) kwargs.setdefault("appctx", self.appctx) From b4bb6156a47860cebbcb755864a9894405bf7d9c Mon Sep 17 00:00:00 2001 From: Pablo Brubeck Date: Tue, 5 May 2026 11:02:24 +0100 Subject: [PATCH 3/4] Use the assembler from _SNESContext --- firedrake/preconditioners/assembled.py | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/firedrake/preconditioners/assembled.py b/firedrake/preconditioners/assembled.py index 873ce1d86d..a0234048d5 100644 --- a/firedrake/preconditioners/assembled.py +++ b/firedrake/preconditioners/assembled.py @@ -17,7 +17,6 @@ class AssembledPC(PCBase): _prefix = "assembled_" def initialize(self, pc): - from firedrake.assemble import get_assembler A, P = pc.getOperators() if pc.type != "python": @@ -50,10 +49,8 @@ def initialize(self, pc): sub_mat_type=sub_mat_type, options_prefix=options_prefix) - form_assembler = get_assembler(a, bcs=bcs, form_compiler_parameters=fcp, - mat_type=self._ctx_ref.mat_type, - sub_mat_type=self._ctx_ref.sub_mat_type, - options_prefix=options_prefix) + form_assembler = self._ctx_ref._assembler_jac + self.P = form_assembler.allocate() self._assemble_P = form_assembler.assemble self._assemble_P(tensor=self.P) From 96ea75a492a8887b24bad788d33dedadeaf79742 Mon Sep 17 00:00:00 2001 From: Pablo Brubeck Date: Tue, 5 May 2026 13:53:09 +0100 Subject: [PATCH 4/4] Review suggestions --- firedrake/solving_utils.py | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/firedrake/solving_utils.py b/firedrake/solving_utils.py index ef720ae5e6..b1090d1111 100644 --- a/firedrake/solving_utils.py +++ b/firedrake/solving_utils.py @@ -282,15 +282,18 @@ def reconstruct(self, problem=None, mat_type=None, pmat_type=None, **kwargs): problem = problem or self._problem mat_type = mat_type or self.mat_type pmat_type = pmat_type or self.pmat_type - for k, v in tuple(kwargs.items()): - if v is None: - kwargs.pop(k) - kwargs.setdefault("sub_mat_type", self.sub_mat_type) - kwargs.setdefault("sub_pmat_type", self.sub_pmat_type) - kwargs.setdefault("appctx", self.appctx) - kwargs.setdefault("options_prefix", self.options_prefix) - kwargs.setdefault("transfer_manager", self.transfer_manager) - kwargs.setdefault("pre_apply_bcs", self.pre_apply_bcs) + + default_options = { + "sub_mat_type": self.sub_mat_type, + "sub_pmat_type": self.sub_pmat_type, + "appctx": self.appctx, + "options_prefix": self.options_prefix, + "transfer_manager": self.transfer_manager, + "pre_apply_bcs": self.pre_apply_bcs, + } + for k, v in default_options.items(): + if kwargs.get(k) is None: + kwargs[k] = v return _SNESContext(problem, mat_type, pmat_type, **kwargs) @property