From f813825741002569b43b8bb463ffc247341ef59e Mon Sep 17 00:00:00 2001 From: Daniel Wheeler Date: Mon, 22 Mar 2021 16:30:21 -0400 Subject: [PATCH] fix: stop divide by zero warning in LU solvers Stop the divide by zero warning in LU solvers by rearranging the tolerance check. --- fipy/solvers/petsc/linearLUSolver.py | 19 +++++++++---------- fipy/solvers/pysparse/linearLUSolver.py | 2 +- fipy/solvers/scipy/linearLUSolver.py | 2 +- 3 files changed, 11 insertions(+), 12 deletions(-) diff --git a/fipy/solvers/petsc/linearLUSolver.py b/fipy/solvers/petsc/linearLUSolver.py index b1e3bae3f4..fd94e7c5cb 100644 --- a/fipy/solvers/petsc/linearLUSolver.py +++ b/fipy/solvers/petsc/linearLUSolver.py @@ -18,13 +18,13 @@ class LinearLUSolver(PETScSolver): A direct solve is performed. """ - + def __init__(self, tolerance=1e-10, iterations=10, precon="lu"): """ :Parameters: - `tolerance`: The required error tolerance. - `iterations`: The maximum number of iterative steps to perform. - - `precon`: *Ignored*. + - `precon`: *Ignored*. """ PETScSolver.__init__(self, tolerance=tolerance, @@ -38,26 +38,26 @@ def _solve_(self, L, x, b): # TODO: SuperLU invoked with PCFactorSetMatSolverType(pc, MATSOLVERSUPERLU) # see: http://www.mcs.anl.gov/petsc/petsc-dev/src/ksp/ksp/examples/tutorials/ex52.c.html # PETSc.PC().setFactorSolverType("superlu") - + L.assemble() ksp.setOperators(L) ksp.setFromOptions() - + for iteration in range(self.iterations): errorVector = L * x - b tol = errorVector.norm() - + if iteration == 0: tol0 = tol - - if (tol / tol0) <= self.tolerance: + + if tol <= self.tolerance * tol0: break - + xError = x.copy() ksp.solve(errorVector, xError) x -= xError - + if 'FIPY_VERBOSE_SOLVER' in os.environ: from fipy.tools.debug import PRINT # L.view() @@ -66,4 +66,3 @@ def _solve_(self, L, x, b): PRINT('precon:', ksp.getPC().type) PRINT('iterations: %d / %d' % (iteration+1, self.iterations)) PRINT('residual:', errorVector.norm(1)) - diff --git a/fipy/solvers/pysparse/linearLUSolver.py b/fipy/solvers/pysparse/linearLUSolver.py index 3686b973b8..829950cc85 100644 --- a/fipy/solvers/pysparse/linearLUSolver.py +++ b/fipy/solvers/pysparse/linearLUSolver.py @@ -69,7 +69,7 @@ def _solve_(self, L, x, b): for iteration in range(self.iterations): errorVector = L * x - b - if (numerix.sqrt(numerix.sum(errorVector**2)) / error0) <= self.tolerance: + if numerix.sqrt(numerix.sum(errorVector**2)) <= self.tolerance * error0: break xError = numerix.zeros(len(b), 'd') diff --git a/fipy/solvers/scipy/linearLUSolver.py b/fipy/solvers/scipy/linearLUSolver.py index 4dc423454b..76bf105457 100644 --- a/fipy/solvers/scipy/linearLUSolver.py +++ b/fipy/solvers/scipy/linearLUSolver.py @@ -38,7 +38,7 @@ def _solve_(self, L, x, b): for iteration in range(min(self.iterations, 10)): errorVector = L * x - b - if (numerix.sqrt(numerix.sum(errorVector**2)) / error0) <= self.tolerance: + if numerix.sqrt(numerix.sum(errorVector**2)) <= self.tolerance * error0: break xError = LU.solve(errorVector)