diff --git a/src/coreComponents/physicsSolvers/PhysicsSolverBase.cpp b/src/coreComponents/physicsSolvers/PhysicsSolverBase.cpp index e0eefbde8c..85bec00709 100644 --- a/src/coreComponents/physicsSolvers/PhysicsSolverBase.cpp +++ b/src/coreComponents/physicsSolvers/PhysicsSolverBase.cpp @@ -96,6 +96,12 @@ PhysicsSolverBase::PhysicsSolverBase( string const & name, setRestartFlags( RestartFlags::WRITE_AND_READ ). setDescription( "Write matrix, rhs, solution to screen ( = 1) or file ( = 2)." ); + registerWrapper( viewKeyStruct::allowNonConvergedLinearSolverSolutionString(), &m_allowNonConvergedLinearSolverSolution ). + setApplyDefaultValue( 1 ). + setInputFlag( InputFlags::OPTIONAL ). + setRestartFlags( RestartFlags::WRITE_AND_READ ). + setDescription( "Cut time step if linear solution fail without going until max nonlinear iterations." ); + addLogLevel< logInfo::Fields >(); addLogLevel< logInfo::LineSearch >(); addLogLevel< logInfo::Solution >(); @@ -1046,6 +1052,10 @@ bool PhysicsSolverBase::solveNonlinearSystem( real64 const & time_n, // Output the linear system solution for debugging purposes debugOutputSolution( time_n, cycleNumber, newtonIter, m_solution ); + + // Do not allow non converged linear solver - cut time step + if( !m_allowNonConvergedLinearSolverSolution && m_linearSolverResult.status == LinearSolverResult::Status::NotConverged ) + return false; } { diff --git a/src/coreComponents/physicsSolvers/PhysicsSolverBase.hpp b/src/coreComponents/physicsSolvers/PhysicsSolverBase.hpp index 95a87f1a87..9f733a6fc3 100644 --- a/src/coreComponents/physicsSolvers/PhysicsSolverBase.hpp +++ b/src/coreComponents/physicsSolvers/PhysicsSolverBase.hpp @@ -693,6 +693,9 @@ class PhysicsSolverBase : public ExecutableGroup /// @return string for the writeLinearSystem wrapper static constexpr char const * writeLinearSystemString() { return "writeLinearSystem"; } + + /// @return string for the allowNonConvergedLinearSolverSolution wrapper + static constexpr char const * allowNonConvergedLinearSolverSolutionString() { return "allowNonConvergedLinearSolverSolution"; } }; /** @@ -1001,6 +1004,9 @@ class PhysicsSolverBase : public ExecutableGroup /// timestep of the next cycle real64 m_nextDt; + /// behavior in case of linear solver failure + integer m_allowNonConvergedLinearSolverSolution; + /// Number of cycles since last timestep cut integer m_numTimestepsSinceLastDtCut;