Skip to content

Commit 3063f4f

Browse files
committed
Detect the mat_type of assembled Jacobian
1 parent f0e9789 commit 3063f4f

File tree

2 files changed

+12
-0
lines changed

2 files changed

+12
-0
lines changed

firedrake/variational_solver.py

+11
Original file line numberDiff line numberDiff line change
@@ -234,6 +234,17 @@ def update_diffusivity(current_solution):
234234
assert isinstance(problem, NonlinearVariationalProblem)
235235

236236
solver_parameters = flatten_parameters(solver_parameters or {})
237+
238+
if isinstance(problem.J, MatrixBase):
239+
solver_parameters.setdefault("mat_type", problem.J.mat_type)
240+
if solver_parameters["mat_type"] != problem.J.mat_type:
241+
raise ValueError("Cannot change the mat_type of an already assembled matrix.")
242+
243+
if isinstance(problem.Jp, MatrixBase):
244+
solver_parameters.setdefaul("pmat_type", problem.Jp.mat_type)
245+
if solver_parameters["pmat_type"] != problem.Jp.mat_type:
246+
raise ValueError("Cannot change the mat_type of an already assembled matrix.")
247+
237248
solver_parameters = solving_utils.set_defaults(solver_parameters,
238249
problem.J.arguments(),
239250
ksp_defaults=self.DEFAULT_KSP_PARAMETERS,

tests/firedrake/regression/test_matrix_free.py

+1
Original file line numberDiff line numberDiff line change
@@ -198,6 +198,7 @@ def test_fieldsplitting(mesh, preassembled, parameters, rhs):
198198
b = assemble(L)
199199
solve(A, f, b, solver_parameters=parameters)
200200
else:
201+
parameters = parameters.copy()
201202
parameters["mat_type"] = "matfree"
202203
solve(a == L, f, solver_parameters=parameters)
203204

0 commit comments

Comments
 (0)