OGS
NumLib::PETScNonlinearSolver Class Referencefinal

Detailed Description

Definition at line 24 of file PETScNonlinearSolver.h.

#include <PETScNonlinearSolver.h>

Inheritance diagram for NumLib::PETScNonlinearSolver:
[legend]
Collaboration diagram for NumLib::PETScNonlinearSolver:
[legend]

Public Types

using System = NonlinearSystem< NonlinearSolverTag::Newton >
 Type of the nonlinear equation system to be solved. More...
 

Public Member Functions

 PETScNonlinearSolver (GlobalLinearSolver &linear_solver, int maxiter, std::string prefix)
 
void setEquationSystem (System &eq, ConvergenceCriterion &conv_crit)
 Set the nonlinear equation system that will be solved. More...
 
void compensateNonEquilibriumInitialResiduum (bool const value)
 
void calculateNonEquilibriumInitialResiduum (std::vector< GlobalVector * > const &x, std::vector< GlobalVector * > const &x_prev, int const process_id) override
 
NonlinearSolverStatus solve (std::vector< GlobalVector * > &x, std::vector< GlobalVector * > const &x_prev, std::function< void(int, std::vector< GlobalVector * > const &)> const &postIterationCallback, int const process_id) override
 
- Public Member Functions inherited from NumLib::NonlinearSolverBase
virtual void calculateNonEquilibriumInitialResiduum (std::vector< GlobalVector * > const &x, std::vector< GlobalVector * > const &x_prev, int const process_id)=0
 
virtual NonlinearSolverStatus solve (std::vector< GlobalVector * > &x, std::vector< GlobalVector * > const &x_prev, std::function< void(int, std::vector< GlobalVector * > const &)> const &postIterationCallback, int const process_id)=0
 
virtual ~NonlinearSolverBase ()=default
 

Private Attributes

SNES _snes_solver
 
System_equation_system = nullptr
 
ConvergenceCriterion_convergence_criterion = nullptr
 
std::size_t _residual_id = 0u
 ID of the residual vector. More...
 
std::size_t _jacobian_id = 0u
 ID of the Jacobian matrix. More...
 
std::size_t _petsc_x_id = 0u
 
std::size_t _petsc_jacobian_id = 0u
 
std::size_t _petsc_residual_id = 0u
 
bool _compensate_non_equilibrium_initial_residuum = false
 

Member Typedef Documentation

◆ System

Type of the nonlinear equation system to be solved.

Definition at line 28 of file PETScNonlinearSolver.h.

Constructor & Destructor Documentation

◆ PETScNonlinearSolver()

NumLib::PETScNonlinearSolver::PETScNonlinearSolver ( GlobalLinearSolver linear_solver,
int  maxiter,
std::string  prefix 
)

Constructs a new instance.

Parameters
linear_solverthe linear solver used by this nonlinear solver.
maxiterthe maximum number of iterations used to solve the equation.
prefixused to set the SNES options.

Definition at line 80 of file PETScNonlinearSolver.cpp.

83{
84 SNESCreate(PETSC_COMM_WORLD, &_snes_solver);
85 if (!prefix.empty())
86 {
87 prefix = prefix + "_";
88 SNESSetOptionsPrefix(_snes_solver, prefix.c_str());
89 }
90 // force SNESSolve() to take at least one iteration regardless of the
91 // initial residual norm
92 SNESSetForceIteration(_snes_solver, PETSC_TRUE);
93
94 // Set the maximum iterations.
95 PetscReal atol, rtol, stol;
96 PetscInt maxf;
97 SNESGetTolerances(_snes_solver, &atol, &rtol, &stol, nullptr, &maxf);
98 SNESSetTolerances(_snes_solver, atol, rtol, stol, maxiter, maxf);
99
100 SNESSetFromOptions(_snes_solver);
101#ifndef NDEBUG
102 PetscOptionsView(nullptr, PETSC_VIEWER_STDOUT_WORLD);
103#endif // NDEBUG
104}

References _snes_solver.

Member Function Documentation

◆ calculateNonEquilibriumInitialResiduum()

void NumLib::PETScNonlinearSolver::calculateNonEquilibriumInitialResiduum ( std::vector< GlobalVector * > const &  x,
std::vector< GlobalVector * > const &  x_prev,
int const  process_id 
)
overridevirtual

Implements NumLib::NonlinearSolverBase.

Definition at line 119 of file PETScNonlinearSolver.cpp.

122{
124 {
125 return;
126 }
127
128 OGS_FATAL(
129 "Non-equilibrium initial residuum is not implemented for the "
130 "PETScNonlinearSolver.");
131}
#define OGS_FATAL(...)
Definition: Error.h:26

References _compensate_non_equilibrium_initial_residuum, and OGS_FATAL.

◆ compensateNonEquilibriumInitialResiduum()

void NumLib::PETScNonlinearSolver::compensateNonEquilibriumInitialResiduum ( bool const  value)

◆ setEquationSystem()

void NumLib::PETScNonlinearSolver::setEquationSystem ( System eq,
ConvergenceCriterion conv_crit 
)

Set the nonlinear equation system that will be solved.

Definition at line 106 of file PETScNonlinearSolver.cpp.

108{
109 _equation_system = &eq;
110 _convergence_criterion = &conv_crit;
111}
ConvergenceCriterion * _convergence_criterion

References _convergence_criterion, and _equation_system.

◆ solve()

NonlinearSolverStatus NumLib::PETScNonlinearSolver::solve ( std::vector< GlobalVector * > &  x,
std::vector< GlobalVector * > const &  x_prev,
std::function< void(int, std::vector< GlobalVector * > const &)> const &  postIterationCallback,
int const  process_id 
)
overridevirtual

Assemble and solve the equation system.

Parameters
xin: the initial guess, out: the solution.
x_prevprevious time step solution.
postIterationCallbackcalled after each iteration if set.
process_idusually used in staggered schemes.
Return values
trueif the equation system could be solved
falseotherwise

Implements NumLib::NonlinearSolverBase.

Definition at line 133 of file PETScNonlinearSolver.cpp.

140{
141 DBUG("PETScNonlinearSolver: solve()");
142 using TimeDiscretizedSystem =
143 TimeDiscretizedODESystem<ODESystemTag::FirstOrderImplicitQuasilinear,
145
146 auto* system = static_cast<TimeDiscretizedSystem*>(_equation_system);
147
148 DBUG("PETScNonlinearSolver: create vectors");
149 // r and J on which the ogs assembly operates.
151 system->getMatrixSpecifications(process_id), _jacobian_id);
153 system->getMatrixSpecifications(process_id), _residual_id);
154
155 // Vectors and matrices used by SNES for solutions. These will be locked
156 // during the SNES' solve call.
158 system->getMatrixSpecifications(process_id), _petsc_jacobian_id);
159 BaseLib::RunTime timer_dirichlet;
160 double time_dirichlet = 0.0;
161
162 timer_dirichlet.start();
163 system->computeKnownSolutions(*x[process_id], process_id);
164 system->applyKnownSolutions(*x[process_id]);
165 time_dirichlet += timer_dirichlet.elapsed();
166 INFO("[time] Applying Dirichlet BCs took {} s.", time_dirichlet);
167
169 system->getMatrixSpecifications(process_id), _petsc_residual_id);
171 system->getMatrixSpecifications(process_id), _petsc_x_id);
172 MathLib::LinAlg::copy(*x[process_id], x_snes); // Initial guess.
173
174 PetscContext petsc_context{_equation_system, x, x_prev, &r, &J, process_id};
175
176 DBUG("PETScNonlinearSolver: set function");
177 SNESSetFunction(_snes_solver, r_snes.getRawVector(), updateResidual,
178 &petsc_context);
179
180 DBUG("PETScNonlinearSolver: set jacobian");
181 // The jacobian and the preconditioner matrices point to the same location.
182 SNESSetJacobian(_snes_solver, J_snes.getRawMatrix(), J_snes.getRawMatrix(),
183 updateJacobian, &petsc_context);
184
185 std::unique_ptr<GlobalVector> xl = nullptr;
186 std::unique_ptr<GlobalVector> xu = nullptr;
187
188 SNESType snes_type;
189 SNESGetType(_snes_solver, &snes_type);
190 if ((std::strcmp(snes_type, SNESVINEWTONRSLS) == 0) ||
191 (std::strcmp(snes_type, SNESVINEWTONSSLS) == 0))
192 {
193 // Set optional constraints via callback.
194 DBUG("PETScNonlinearSolver: set constraints");
196 system->getMatrixSpecifications(process_id));
198 system->getMatrixSpecifications(process_id));
199
200 system->updateConstraints(*xl, *xu, process_id);
203
204 SNESVISetVariableBounds(_snes_solver, xl->getRawVector(),
205 xu->getRawVector());
206 }
207
208 DBUG("PETScNonlinearSolver: call SNESSolve");
209 SNESSolve(_snes_solver, nullptr, x_snes.getRawVector());
210
211 SNESConvergedReason reason = SNES_CONVERGED_ITERATING;
212 SNESGetConvergedReason(_snes_solver, &reason);
213 INFO("PETSsSNES convergence reason {}.", reason);
214
215 PetscInt iterations;
216 SNESGetIterationNumber(_snes_solver, &iterations);
217 INFO("PETScSNES used {} iterations.", iterations);
218
219 // Copy back the solution.
220 MathLib::LinAlg::copy(x_snes, *x[process_id]);
221
227
228 return {reason >= 0, iterations};
229}
void INFO(char const *fmt, Args const &... args)
Definition: Logging.h:34
void DBUG(char const *fmt, Args const &... args)
Definition: Logging.h:29
Count the running time.
Definition: RunTime.h:29
double elapsed() const
Get the elapsed time in seconds.
Definition: RunTime.h:42
void start()
Start the timer.
Definition: RunTime.h:32
virtual void releaseMatrix(GlobalMatrix const &A)=0
virtual GlobalMatrix & getMatrix(std::size_t &id)=0
Get an uninitialized matrix with the given id.
std::size_t _jacobian_id
ID of the Jacobian matrix.
std::size_t _residual_id
ID of the residual vector.
virtual GlobalVector & getVector(std::size_t &id)=0
Get an uninitialized vector with the given id.
virtual void releaseVector(GlobalVector const &x)=0
void copy(PETScVector const &x, PETScVector &y)
Definition: LinAlg.cpp:37
void finalizeVectorAssembly(VEC_T &)
General function to finalize the vector assembly.
static const double r
PetscErrorCode updateResidual(SNES, Vec x, Vec petsc_r, void *petsc_context)
PetscErrorCode updateJacobian(SNES, Vec, Mat J, Mat, void *petsc_context)
static NUMLIB_EXPORT MatrixProvider & provider
static NUMLIB_EXPORT VectorProvider & provider

References _equation_system, _jacobian_id, _petsc_jacobian_id, _petsc_residual_id, _petsc_x_id, _residual_id, _snes_solver, MathLib::LinAlg::copy(), DBUG(), BaseLib::RunTime::elapsed(), MathLib::finalizeVectorAssembly(), NumLib::FirstOrderImplicitQuasilinear, NumLib::MatrixProvider::getMatrix(), NumLib::VectorProvider::getVector(), INFO(), NumLib::Newton, NumLib::GlobalVectorProvider::provider, NumLib::GlobalMatrixProvider::provider, MathLib::r, NumLib::MatrixProvider::releaseMatrix(), NumLib::VectorProvider::releaseVector(), BaseLib::RunTime::start(), anonymous_namespace{PETScNonlinearSolver.cpp}::updateJacobian(), and anonymous_namespace{PETScNonlinearSolver.cpp}::updateResidual().

Member Data Documentation

◆ _compensate_non_equilibrium_initial_residuum

bool NumLib::PETScNonlinearSolver::_compensate_non_equilibrium_initial_residuum = false
private

Enables computation of the non-equilibrium initial residuum \( r_{\rm neq} \) before the first time step. The forces are zero if the external forces are in equilibrium with the initial state/initial conditions. During the simulation the new residuum reads \( \tilde r = r - r_{\rm neq} \).

Definition at line 73 of file PETScNonlinearSolver.h.

Referenced by calculateNonEquilibriumInitialResiduum(), and compensateNonEquilibriumInitialResiduum().

◆ _convergence_criterion

ConvergenceCriterion* NumLib::PETScNonlinearSolver::_convergence_criterion = nullptr
private

Definition at line 62 of file PETScNonlinearSolver.h.

Referenced by setEquationSystem().

◆ _equation_system

System* NumLib::PETScNonlinearSolver::_equation_system = nullptr
private

Definition at line 61 of file PETScNonlinearSolver.h.

Referenced by setEquationSystem(), and solve().

◆ _jacobian_id

std::size_t NumLib::PETScNonlinearSolver::_jacobian_id = 0u
private

ID of the Jacobian matrix.

Definition at line 65 of file PETScNonlinearSolver.h.

Referenced by solve().

◆ _petsc_jacobian_id

std::size_t NumLib::PETScNonlinearSolver::_petsc_jacobian_id = 0u
private

Definition at line 68 of file PETScNonlinearSolver.h.

Referenced by solve().

◆ _petsc_residual_id

std::size_t NumLib::PETScNonlinearSolver::_petsc_residual_id = 0u
private

Definition at line 69 of file PETScNonlinearSolver.h.

Referenced by solve().

◆ _petsc_x_id

std::size_t NumLib::PETScNonlinearSolver::_petsc_x_id = 0u
private

Definition at line 67 of file PETScNonlinearSolver.h.

Referenced by solve().

◆ _residual_id

std::size_t NumLib::PETScNonlinearSolver::_residual_id = 0u
private

ID of the residual vector.

Definition at line 64 of file PETScNonlinearSolver.h.

Referenced by solve().

◆ _snes_solver

SNES NumLib::PETScNonlinearSolver::_snes_solver
private

Definition at line 59 of file PETScNonlinearSolver.h.

Referenced by PETScNonlinearSolver(), and solve().


The documentation for this class was generated from the following files: