Skip to content

Commit 0a19c96

Browse files
authored
Safer handling of PETSc destruction in high-level classes (#3951)
* Safer handling of PETSc destruction * Fix across the board * Follow @schnellerhase's logic and fix solver wrapper test * Ruff * Rename o->obj
1 parent ad7b25e commit 0a19c96

File tree

3 files changed

+12
-14
lines changed

3 files changed

+12
-14
lines changed

python/dolfinx/fem/petsc.py

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -879,12 +879,10 @@ def __init__(
879879
self.solver.getPC().setFieldSplitIS(*fieldsplit_IS)
880880

881881
def __del__(self):
882-
self._solver.destroy()
883-
self._A.destroy()
884-
self._b.destroy()
885-
self._x.destroy()
886-
if self._P_mat is not None:
887-
self._P_mat.destroy()
882+
for obj in filter(
883+
lambda obj: obj is not None, (self._solver, self._A, self._b, self._x, self._P_mat)
884+
):
885+
obj.destroy()
888886

889887
def solve(self) -> _Function | Sequence[_Function]:
890888
"""Solve the problem.
@@ -1359,12 +1357,10 @@ def solve(self) -> _Function | Sequence[_Function]:
13591357
return self.u
13601358

13611359
def __del__(self):
1362-
self._snes.destroy()
1363-
self._x.destroy()
1364-
self._A.destroy()
1365-
self._b.destroy()
1366-
if self._P_mat is not None:
1367-
self._P_mat.destroy()
1360+
for obj in filter(
1361+
lambda obj: obj is not None, (self._snes, self._A, self._b, self._x, self._P_mat)
1362+
):
1363+
obj.destroy()
13681364

13691365
@property
13701366
def F(self) -> Form | Sequence[Form]:

python/dolfinx/nls/petsc.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,8 +64,8 @@ def __init__(self, comm: MPI.Intracomm, problem: NewtonSolverNonlinearProblem):
6464
self.set_form(problem.form)
6565

6666
def __del__(self):
67-
self._A.destroy()
68-
self._b.destroy()
67+
for obj in filter(lambda obj: obj is not None, (self._A, self._b)):
68+
obj.destroy()
6969

7070
def solve(self, u: fem.Function):
7171
"""Solve non-linear problem into function u. Returns the number

python/test/unit/fem/test_petsc_solver_wrappers.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,8 @@ def test_compare_solution_linear_vs_nonlinear_problem(self, mode):
125125
def test_mixed_system(self, mode, kind):
126126
from petsc4py import PETSc
127127

128+
import dolfinx.fem.petsc
129+
128130
msh = dolfinx.mesh.create_unit_square(
129131
MPI.COMM_WORLD, 12, 12, ghost_mode=mode, dtype=PETSc.RealType
130132
)

0 commit comments

Comments
 (0)