From 57e5ffcee31955aaf43afb3d3f50bb464116e832 Mon Sep 17 00:00:00 2001 From: emmetfrancis Date: Tue, 9 Apr 2024 23:41:52 -0700 Subject: [PATCH] Detect when d.assemble_mixed returns nan and recompute --- smart/solvers.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/smart/solvers.py b/smart/solvers.py index fe124ba4..b95d8063 100644 --- a/smart/solvers.py +++ b/smart/solvers.py @@ -9,6 +9,8 @@ from .common import Stopwatch from .model_assembly import Compartment +import numpy as np + logger = logging.getLogger(__name__) __all__ = ["smartSNESProblem"] @@ -350,7 +352,11 @@ def assemble_Fnest(self, Fnest): Fvecs.append([]) for k in range(len(self.Fforms[j])): # , tensor=d.PETScVector(Fvecs[idx])) - Fvecs[j].append(d.as_backend_type(d.assemble_mixed(self.Fforms[j][k]))) + # assemble_mixed sometimes returns nan (nondeterministic???) + cur_vec = d.assemble_mixed(self.Fforms[j][k]) + while any(np.isnan(cur_vec.get_local())): + cur_vec = d.assemble_mixed(self.Fforms[j][k]) + Fvecs[j].append(d.as_backend_type(cur_vec)) # TODO: could probably speed this up by not using axpy if there is only one subform # sum the vectors Fj_petsc[j].zeroEntries()