libMesh
Loading...
Searching...
No Matches
Classes | Public Types | Public Member Functions | Static Public Member Functions | Public Attributes | Protected Types | Protected Member Functions | Protected Attributes | Static Protected Attributes | Friends | List of all members
libMesh::PetscNonlinearSolver< T > Class Template Reference

This class provides an interface to PETSc iterative solvers that is compatible with the libMesh NonlinearSolver<> More...

#include <petsc_nonlinear_solver.h>

Inheritance diagram for libMesh::PetscNonlinearSolver< T >:
[legend]

Classes

class  ComputeLineSearchObject
 Abstract base class to be used to implement a custom line-search algorithm. More...
 

Public Types

typedef NonlinearImplicitSystem sys_type
 The type of system.
 

Public Member Functions

 PetscNonlinearSolver (sys_type &system)
 Constructor.
 
 ~PetscNonlinearSolver ()
 Destructor.
 
virtual void clear () override
 Release all memory and clear data structures.
 
virtual void init (const char *name=nullptr) override
 Initialize data structures if not done so already.
 
SNES snes (const char *name=nullptr)
 
virtual std::pair< unsigned int, Real > solve (SparseMatrix< T > &pre_in, NumericVector< T > &, NumericVector< T > &, const double, const unsigned int) override
 Call the Petsc solver, using the same matrix for the system and preconditioner matrices.
 
virtual std::pair< unsigned int, Real > solve (SparseMatrix< T > &jac_in, SparseMatrix< T > &pre_in, NumericVector< T > &, NumericVector< T > &, const double, const unsigned int) override
 Call the Petsc solver, using jac_in as the actual SNES Jacobian operator (Amat) and pre_in as the preconditioning matrix (Pmat).
 
virtual void print_converged_reason () override
 Prints a useful message about why the latest nonlinear solve con(di)verged.
 
SNESConvergedReason get_converged_reason ()
 
virtual int get_total_linear_iterations () override
 Get the total number of linear iterations done in the last solve.
 
virtual unsigned get_current_nonlinear_iteration_number () const override
 
void set_residual_zero_out (bool state)
 Set if the residual should be zeroed out in the callback.
 
void set_jacobian_zero_out (bool state)
 Set if the jacobian should be zeroed out in the callback.
 
void use_default_monitor (bool state)
 Set to true to use the libMesh's default monitor, set to false to use your own.
 
void set_snesmf_reuse_base (bool state)
 Set to true to let PETSc reuse the base vector.
 
bool snes_mf_reuse_base () const
 
void set_reproducible_residual (bool state)
 Set whether evaluating the residual twice at the same solution gives exactly the same result.
 
bool reproducible_residual () const
 
void set_computing_base_vector (bool computing_base_vector)
 Set whether we are computing the base vector for matrix-free finite-differencing.
 
bool computing_base_vector () const
 
void setup_default_monitor ()
 Setup the default monitor if required.
 
virtual bool reuse_preconditioner () const override
 Getter for preconditioner reuse.
 
virtual unsigned int reuse_preconditioner_max_linear_its () const override
 Getter for the maximum iterations flag for preconditioner reuse.
 
virtual void force_new_preconditioner () override
 Immediately force a new preconditioner, even if reuse is set.
 
bool initialized () const
 
const sys_type & system () const
 
sys_type & system ()
 
void attach_preconditioner (Preconditioner< T > *preconditioner)
 Attaches a Preconditioner object to be used during the linear solves.
 
void set_solver_configuration (SolverConfiguration &solver_configuration)
 Set the solver configuration object.
 
virtual void set_reuse_preconditioner (bool reuse)
 Set the reuse preconditioner flag.
 
virtual void set_reuse_preconditioner_max_linear_its (unsigned int i)
 Set the reuse_preconditioner_max_linear_its parameter.
 
virtual void set_exact_constraint_enforcement (bool enable)
 Enable (or disable; it is true by default) exact enforcement of constraints at the solver level, correcting any constrained DoF coefficients in current_local_solution as well as applying nonlinear residual and Jacobian terms based on constraint equations.
 
bool exact_constraint_enforcement ()
 
const Parallel::Communicator & comm () const
 
processor_id_type n_processors () const
 
processor_id_type processor_id () const
 

Static Public Member Functions

static std::unique_ptr< NonlinearSolver< T > > build (sys_type &s, const SolverPackage solver_package=libMesh::default_solver_package())
 Builds a NonlinearSolver using the nonlinear solver package specified by solver_package.
 
static std::string get_info ()
 Gets a string containing the reference information.
 
static void print_info (std::ostream &out_stream=libMesh::out)
 Prints the reference information, by default to libMesh::out.
 
static unsigned int n_objects ()
 Prints the number of outstanding (created, but not yet destroyed) objects.
 
static void enable_print_counter_info ()
 Methods to enable/disable the reference counter output from print_info().
 
static void disable_print_counter_info ()
 

Public Attributes

std::unique_ptr< ComputeLineSearchObject > linesearch_object
 A callable object that can be used to specify a custom line-search.
 
void(* residual )(const NumericVector< Number > &X, NumericVector< Number > &R, sys_type &S)
 Function that computes the residual R(X) of the nonlinear system at the input iterate X.
 
NonlinearImplicitSystem::ComputeResidual * residual_object
 Object that computes the residual R(X) of the nonlinear system at the input iterate X.
 
NonlinearImplicitSystem::ComputeResidual * fd_residual_object
 Object that computes the residual R(X) of the nonlinear system at the input iterate X for the purpose of forming a finite-differenced Jacobian.
 
NonlinearImplicitSystem::ComputeResidual * mffd_residual_object
 Object that computes the residual R(X) of the nonlinear system at the input iterate X for the purpose of forming Jacobian-vector products via finite differencing.
 
void(* jacobian )(const NumericVector< Number > &X, SparseMatrix< Number > &J, sys_type &S)
 Function that computes the Jacobian J(X) of the nonlinear system at the input iterate X.
 
NonlinearImplicitSystem::ComputeJacobian * jacobian_object
 Object that computes the Jacobian J(X) of the nonlinear system at the input iterate X.
 
void(* matvec )(const NumericVector< Number > &X, NumericVector< Number > *R, SparseMatrix< Number > *J, sys_type &S)
 Function that computes either the residual \( R(X) \) or the Jacobian \( J(X) \) of the nonlinear system at the input iterate \( X \).
 
NonlinearImplicitSystem::ComputeResidualandJacobian * residual_and_jacobian_object
 Object that computes either the residual \( R(X) \) or the Jacobian \( J(X) \) of the nonlinear system at the input iterate \( X \).
 
void(* bounds )(NumericVector< Number > &XL, NumericVector< Number > &XU, sys_type &S)
 Function that computes the lower and upper bounds XL and XU on the solution of the nonlinear system.
 
NonlinearImplicitSystem::ComputeBounds * bounds_object
 Object that computes the bounds vectors \( XL \) and \( XU \).
 
void(* nullspace )(std::vector< NumericVector< Number > * > &sp, sys_type &S)
 Function that computes a basis for the Jacobian's nullspace – the kernel or the "zero energy modes" – that can be used in solving a degenerate problem iteratively, if the solver supports it (e.g., PETSc's KSP).
 
NonlinearImplicitSystem::ComputeVectorSubspace * nullspace_object
 A callable object that computes a basis for the Jacobian's nullspace – the kernel or the "zero energy modes" – that can be used in solving a degenerate problem iteratively, if the solver supports it (e.g., PETSc's KSP).
 
void(* transpose_nullspace )(std::vector< NumericVector< Number > * > &sp, sys_type &S)
 Function that computes a basis for the transpose Jacobian's nullspace – when solving a degenerate problem iteratively, if the solver supports it (e.g., PETSc's KSP), it is used to remove contributions outside of R(jac)
 
NonlinearImplicitSystem::ComputeVectorSubspace * transpose_nullspace_object
 A callable object that computes a basis for the transpose Jacobian's nullspace – when solving a degenerate problem iteratively, if the solver supports it (e.g., PETSc's KSP), it is used to remove contributions outside of R(jac)
 
void(* nearnullspace )(std::vector< NumericVector< Number > * > &sp, sys_type &S)
 Function that computes a basis for the Jacobian's near nullspace – the set of "low energy modes" – that can be used for AMG coarsening, if the solver supports it (e.g., ML, PETSc's GAMG).
 
NonlinearImplicitSystem::ComputeVectorSubspace * nearnullspace_object
 A callable object that computes a basis for the Jacobian's near nullspace – the set of "low energy modes" – that can be used for AMG coarsening, if the solver supports it (e.g., ML, PETSc's GAMG).
 
void(* user_presolve )(sys_type &S)
 Customizable function pointer which users can attach to the solver.
 
void(* postcheck )(const NumericVector< Number > &old_soln, NumericVector< Number > &search_direction, NumericVector< Number > &new_soln, bool &changed_search_direction, bool &changed_new_soln, sys_type &S)
 Function that performs a "check" on the Newton search direction and solution after each nonlinear step.
 
NonlinearImplicitSystem::ComputePostCheck * postcheck_object
 A callable object that is executed after each nonlinear iteration.
 
NonlinearImplicitSystem::ComputePreCheck * precheck_object
 
unsigned int max_nonlinear_iterations
 Maximum number of non-linear iterations.
 
unsigned int max_function_evaluations
 Maximum number of function evaluations.
 
double absolute_residual_tolerance
 The NonlinearSolver should exit after the residual is reduced to either less than absolute_residual_tolerance or less than relative_residual_tolerance times the initial residual.
 
double relative_residual_tolerance
 
double divergence_tolerance
 The NonlinearSolver should exit if the residual becomes greater than the initial residual times the divergence_tolerance.
 
double absolute_step_tolerance
 The NonlinearSolver should exit after the full nonlinear step norm is reduced to either less than absolute_step_tolerance or less than relative_step_tolerance times the largest nonlinear solution which has been seen so far.
 
double relative_step_tolerance
 
unsigned int max_linear_iterations
 Each linear solver step should exit after max_linear_iterations is exceeded.
 
double initial_linear_tolerance
 Any required linear solves will at first be done with this tolerance; the NonlinearSolver may tighten the tolerance for later solves.
 
double minimum_linear_tolerance
 The tolerance for linear solves is kept above this minimum.
 
bool converged
 After a call to solve this will reflect whether or not the nonlinear solve was successful.
 

Protected Types

typedef std::map< std::string, std::pair< unsigned int, unsigned int > > Counts
 Data structure to log the information.
 

Protected Member Functions

void build_mat_null_space (NonlinearImplicitSystem::ComputeVectorSubspace *computeSubspaceObject, void(*)(std::vector< NumericVector< Number > * > &, sys_type &), MatNullSpace *)
 
void increment_constructor_count (const std::string &name) noexcept
 Increments the construction counter.
 
void increment_destructor_count (const std::string &name) noexcept
 Increments the destruction counter.
 

Protected Attributes

WrappedPetsc< SNES > _snes
 Nonlinear solver context.
 
SNESConvergedReason _reason
 Store the reason for SNES convergence/divergence for use even after the _snes has been cleared.
 
PetscInt _n_linear_iterations
 Stores the total number of linear iterations from the last solve.
 
unsigned _current_nonlinear_iteration_number
 Stores the current nonlinear iteration number.
 
bool _zero_out_residual
 true to zero out residual before going into application level call-back, otherwise false
 
bool _zero_out_jacobian
 true to zero out jacobian before going into application level call-back, otherwise false
 
bool _default_monitor
 true if we want the default monitor to be set, false for no monitor (i.e.
 
bool _snesmf_reuse_base
 True, If we want the base vector to be used for differencing even if the function provided to SNESSetFunction() is not the same as that provided to MatMFFDSetFunction().
 
bool _reproducible_residual
 Whether residual evaluation is reproducible.
 
bool _computing_base_vector
 Whether we are computing the base vector for matrix-free finite differencing.
 
bool _setup_reuse
 Whether we've triggered the preconditioner reuse.
 
PetscDMWrapper _dm_wrapper
 Wrapper object for interacting with the "new" libMesh PETSc DM.
 
bool _reuse_preconditioner
 Whether we should reuse the linear preconditioner.
 
bool _exact_constraint_enforcement
 Whether we should enforce exact constraints globally during a solve.
 
unsigned int _reuse_preconditioner_max_linear_its
 Number of linear iterations to retain the preconditioner.
 
sys_type & _system
 A reference to the system we are solving.
 
bool _is_initialized
 Flag indicating if the data structures have been initialized.
 
Preconditioner< T > * _preconditioner
 Holds the Preconditioner object to be used for the linear solves.
 
SolverConfiguration * _solver_configuration
 Optionally store a SolverOptions object that can be used to set parameters like solver type, tolerances and iteration limits.
 
const Parallel::Communicator & _communicator
 

Static Protected Attributes

static Counts _counts
 Actually holds the data.
 
static Threads::atomic< unsigned int > _n_objects
 The number of objects.
 
static Threads::spin_mutex _mutex
 Mutual exclusion object to enable thread-safe reference counting.
 
static bool _enable_print_counter = true
 Flag to control whether reference count information is printed when print_info is called.
 

Friends

ResidualContext libmesh_petsc_snes_residual_helper (SNES snes, Vec x, void *ctx)
 
PetscErrorCode libmesh_petsc_snes_residual (SNES snes, Vec x, Vec r, void *ctx)
 
PetscErrorCode libmesh_petsc_snes_fd_residual (SNES snes, Vec x, Vec r, void *ctx)
 
PetscErrorCode libmesh_petsc_snes_mffd_residual (SNES snes, Vec x, Vec r, void *ctx)
 
PetscErrorCode libmesh_petsc_snes_jacobian (SNES snes, Vec x, Mat jac, Mat pc, void *ctx)
 
PetscErrorCode libmesh_petsc_snes_precheck (SNESLineSearch, Vec X, Vec Y, PetscBool *changed, void *context)
 

Detailed Description

template<typename T>
class libMesh::PetscNonlinearSolver< T >

This class provides an interface to PETSc iterative solvers that is compatible with the libMesh NonlinearSolver<>

Author
Benjamin Kirk
Date
2002-2007

Definition at line 73 of file petsc_nonlinear_solver.h.

Member Typedef Documentation

◆ Counts

typedef std::map<std::string, std::pair<unsigned int, unsigned int> > libMesh::ReferenceCounter::Counts
protectedinherited

Data structure to log the information.

The log is identified by the class name.

Definition at line 119 of file reference_counter.h.

◆ sys_type

template<typename T >
typedef NonlinearImplicitSystem libMesh::PetscNonlinearSolver< T >::sys_type

The type of system.

Definition at line 79 of file petsc_nonlinear_solver.h.

Constructor & Destructor Documentation

◆ PetscNonlinearSolver()

template<typename T >
libMesh::PetscNonlinearSolver< T >::PetscNonlinearSolver ( sys_type &  system)
explicit

Constructor.

Initializes Petsc data structures

Definition at line 693 of file petsc_nonlinear_solver.C.

693 :
694 NonlinearSolver<T>(system_in),
695 linesearch_object(nullptr),
696 _reason(SNES_CONVERGED_ITERATING/*==0*/), // Arbitrary initial value...
699 _zero_out_residual(true),
700 _zero_out_jacobian(true),
701 _default_monitor(true),
702 _snesmf_reuse_base(true),
705 _setup_reuse(false)
706{
707}
unsigned _current_nonlinear_iteration_number
Stores the current nonlinear iteration number.
std::unique_ptr< ComputeLineSearchObject > linesearch_object
A callable object that can be used to specify a custom line-search.
bool _computing_base_vector
Whether we are computing the base vector for matrix-free finite differencing.
bool _zero_out_residual
true to zero out residual before going into application level call-back, otherwise false
bool _default_monitor
true if we want the default monitor to be set, false for no monitor (i.e.
bool _zero_out_jacobian
true to zero out jacobian before going into application level call-back, otherwise false
PetscInt _n_linear_iterations
Stores the total number of linear iterations from the last solve.
bool _setup_reuse
Whether we've triggered the preconditioner reuse.
bool _snesmf_reuse_base
True, If we want the base vector to be used for differencing even if the function provided to SNESSet...
SNESConvergedReason _reason
Store the reason for SNES convergence/divergence for use even after the _snes has been cleared.
bool _reproducible_residual
Whether residual evaluation is reproducible.

◆ ~PetscNonlinearSolver()

template<typename T >
libMesh::PetscNonlinearSolver< T >::~PetscNonlinearSolver ( )
default

Destructor.

Member Function Documentation

◆ attach_preconditioner()

template<typename T >
void libMesh::NonlinearSolver< T >::attach_preconditioner ( Preconditioner< T > *  preconditioner)
inherited

Attaches a Preconditioner object to be used during the linear solves.

Definition at line 74 of file nonlinear_solver.C.

75{
76 libmesh_error_msg_if(this->_is_initialized, "Preconditioner must be attached before the solver is initialized!");
77
78 _preconditioner = preconditioner;
79}
bool _is_initialized
Flag indicating if the data structures have been initialized.
Preconditioner< T > * _preconditioner
Holds the Preconditioner object to be used for the linear solves.

◆ build()

template<typename T >
std::unique_ptr< NonlinearSolver< T > > libMesh::NonlinearSolver< T >::build ( sys_type &  s,
const SolverPackage  solver_package = libMesh::default_solver_package() 
)
staticinherited

Builds a NonlinearSolver using the nonlinear solver package specified by solver_package.

Definition at line 40 of file nonlinear_solver.C.

41{
42 // Build the appropriate solver
43 switch (solver_package)
44 {
45
46#ifdef LIBMESH_HAVE_PETSC
47 case PETSC_SOLVERS:
48 return std::make_unique<PetscNonlinearSolver<T>>(s);
49#endif // LIBMESH_HAVE_PETSC
50
51#if defined(LIBMESH_TRILINOS_HAVE_NOX) && defined(LIBMESH_TRILINOS_HAVE_EPETRA)
53 return std::make_unique<NoxNonlinearSolver<T>>(s);
54#endif
55
56 default:
57 libmesh_error_msg("ERROR: Unrecognized solver package: " << solver_package);
58 }
59}

References libMesh::PETSC_SOLVERS, and libMesh::TRILINOS_SOLVERS.

◆ build_mat_null_space()

template<typename T >
void libMesh::PetscNonlinearSolver< T >::build_mat_null_space ( NonlinearImplicitSystem::ComputeVectorSubspace *  computeSubspaceObject,
void(*)(std::vector< NumericVector< Number > * > &, sys_type &)  computeSubspace,
MatNullSpace *  msp 
)
protected

Definition at line 852 of file petsc_nonlinear_solver.C.

855{
856 parallel_object_only();
857
858 std::vector<NumericVector<Number> *> sp;
859 if (computeSubspaceObject)
860 (*computeSubspaceObject)(sp, this->system());
861 else
862 (*computeSubspace)(sp, this->system());
863
864 *msp = LIBMESH_PETSC_NULLPTR;
865 if (sp.size())
866 {
867 PetscInt nmodes = cast_int<PetscInt>(sp.size());
868
869 std::vector<Vec> modes(nmodes);
870 std::vector<PetscScalar> dots(nmodes);
871
872 for (PetscInt i=0; i<nmodes; ++i)
873 {
874 auto pv = cast_ptr<PetscVector<T> *>(sp[i]);
875
876 LibmeshPetscCall(VecDuplicate(pv->vec(), &modes[i]));
877
878 LibmeshPetscCall(VecCopy(pv->vec(), modes[i]));
879 }
880
881 // Normalize.
882 LibmeshPetscCall(VecNormalize(modes[0], LIBMESH_PETSC_NULLPTR));
883
884 for (PetscInt i=1; i<nmodes; i++)
885 {
886 // Orthonormalize vec[i] against vec[0:i-1]
887 LibmeshPetscCall(VecMDot(modes[i], i, modes.data(), dots.data()));
888
889 for (PetscInt j=0; j<i; j++)
890 dots[j] *= -1.;
891
892 LibmeshPetscCall(VecMAXPY(modes[i], i, dots.data(), modes.data()));
893
894 LibmeshPetscCall(VecNormalize(modes[i], LIBMESH_PETSC_NULLPTR));
895 }
896
897 LibmeshPetscCall(MatNullSpaceCreate(this->comm().get(), PETSC_FALSE, nmodes, modes.data(), msp));
898
899 for (PetscInt i=0; i<nmodes; ++i)
900 LibmeshPetscCall(VecDestroy(&modes[i]));
901 }
902}
const sys_type & system() const
const Parallel::Communicator & comm() const
const Elem & get(const ElemType type_in)

◆ clear()

template<typename T >
void libMesh::PetscNonlinearSolver< T >::clear ( )
overridevirtual

Release all memory and clear data structures.

Reimplemented from libMesh::NonlinearSolver< T >.

Definition at line 717 of file petsc_nonlinear_solver.C.

718{
719 if (this->initialized())
720 {
721 this->_is_initialized = false;
722
723 // If we don't need the preconditioner next time
724 // retain the original behavior of clearing the data
725 // between solves.
726 if (!(reuse_preconditioner()))
727 {
728 // SNESReset really ought to work but replacing destroy() with
729 // SNESReset causes a very slight change in behavior that
730 // manifests as two failed MOOSE tests...
731 _snes.destroy();
732 }
733
734 // Reset the nonlinear iteration counter. This information is only relevant
735 // *during* the solve(). After the solve is completed it should return to
736 // the default value of 0.
738 }
739}
virtual bool reuse_preconditioner() const override
Getter for preconditioner reuse.
WrappedPetsc< SNES > _snes
Nonlinear solver context.
void destroy()
Must be specialized to call the appropriate XXXDestroy() routine in order for a WrappedPetsc<T> objec...

References libMesh::initialized().

◆ comm()

const Parallel::Communicator & libMesh::ParallelObject::comm ( ) const
inlineinherited
Returns
A reference to the Parallel::Communicator object used by this mesh.

Definition at line 97 of file parallel_object.h.

98 { return _communicator; }
const Parallel::Communicator & _communicator

References libMesh::ParallelObject::_communicator.

Referenced by libMesh::__libmesh_petsc_diff_solver_jacobian(), libMesh::__libmesh_petsc_diff_solver_monitor(), libMesh::__libmesh_petsc_diff_solver_residual(), libMesh::ExactSolution::_compute_error(), libMesh::UniformRefinementEstimator::_estimate_error(), libMesh::Partitioner::_find_global_index_by_pid_map(), libMesh::BoundaryInfo::_find_id_maps(), libMesh::PetscLinearSolver< T >::_petsc_shell_matrix_get_diagonal(), libMesh::SlepcEigenSolver< T >::_petsc_shell_matrix_get_diagonal(), libMesh::PetscLinearSolver< T >::_petsc_shell_matrix_mult(), libMesh::SlepcEigenSolver< T >::_petsc_shell_matrix_mult(), libMesh::PetscLinearSolver< T >::_petsc_shell_matrix_mult_add(), libMesh::DofMap::add_constraints_to_send_list(), add_cube_convex_hull_to_mesh(), libMesh::PetscDMWrapper::add_dofs_helper(), libMesh::PetscDMWrapper::add_dofs_to_section(), libMesh::TransientRBConstruction::add_IC_to_RB_space(), libMesh::RBEIMEvaluation::add_interpolation_data(), libMesh::CondensedEigenSystem::add_matrices(), libMesh::EigenSystem::add_matrices(), libMesh::System::add_matrix(), libMesh::System::add_matrix(), libMesh::System::add_matrix(), libMesh::RBConstruction::add_scaled_matrix_and_vector(), libMesh::System::add_vector(), libMesh::MeshTools::Modification::all_tri(), libMesh::LaplaceMeshSmoother::allgather_graph(), libMesh::DofMap::allgather_recursive_constraints(), libMesh::RBConstruction::allocate_data_structures(), libMesh::TransientRBConstruction::allocate_data_structures(), libMesh::TransientRBConstruction::assemble_affine_expansion(), libMesh::AdvectionSystem::assemble_claw_rhs(), libMesh::FEMSystem::assemble_qoi(), libMesh::Nemesis_IO::assert_symmetric_cmaps(), libMesh::MeshCommunication::assign_global_indices(), libMesh::Partitioner::assign_partitioning(), libMesh::MeshTools::Generation::build_extrusion(), libMesh::Partitioner::build_graph(), libMesh::InfElemBuilder::build_inf_elem(), libMesh::BoundaryInfo::build_node_list_from_side_list(), libMesh::EquationSystems::build_parallel_elemental_solution_vector(), libMesh::EquationSystems::build_parallel_solution_vector(), libMesh::PetscDMWrapper::build_section(), libMesh::PetscDMWrapper::build_sf(), libMesh::BoundaryInfo::build_side_list_from_node_list(), libMesh::MeshBase::cache_elem_data(), centroid_l2_error(), libMesh::DofMap::check_dirichlet_bcid_consistency(), libMesh::MeshTetInterface::check_hull_integrity(), MeshInputTest::checkHexPrismPolyhedron(), libMesh::MeshBase::complete_preparation(), libMesh::RBConstruction::compute_Fq_representor_innerprods(), libMesh::RBConstruction::compute_max_error_bound(), libMesh::Nemesis_IO_Helper::compute_num_global_elem_blocks(), libMesh::Nemesis_IO_Helper::compute_num_global_nodesets(), libMesh::Nemesis_IO_Helper::compute_num_global_sidesets(), libMesh::RBConstruction::compute_output_dual_innerprods(), libMesh::RBConstruction::compute_residual_dual_norm_slow(), libMesh::RBSCMConstruction::compute_SCM_bounds_on_training_set(), libMesh::DofMap::computed_sparsity_already(), libMesh::Problem_Interface::computeJacobian(), libMesh::Problem_Interface::computePreconditioner(), PetscSolverConfiguration::configure_solver(), libMesh::ContinuationSystem::ContinuationSystem(), libMesh::MeshBase::copy_constraint_rows(), libMesh::ExodusII_IO::copy_elemental_solution(), libMesh::ExodusII_IO::copy_nodal_solution(), libMesh::ExodusII_IO::copy_scalar_solution(), libMesh::CondensedEigenSystem::copy_super_to_sub(), libMesh::MeshTools::correct_node_proc_ids(), libMesh::MeshBase::count_constraint_rows(), libMesh::MeshTools::create_bounding_box(), libMesh::DofMap::create_dof_constraints(), libMesh::MeshTools::create_nodal_bounding_box(), libMesh::MeshRefinement::create_parent_error_vector(), libMesh::MeshTools::create_processor_bounding_box(), libMesh::MeshTools::create_subdomain_bounding_box(), libMesh::PetscMatrix< T >::create_submatrix_nosort(), create_wrapped_function(), libMesh::MeshCommunication::delete_remote_elements(), libMesh::MeshBase::detect_interior_parents(), libMesh::RBEIMEvaluation::distribute_bfs(), DMlibMeshFunction(), DMlibMeshJacobian(), DMlibMeshSetSystem_libMesh(), DMVariableBounds_libMesh(), libMesh::DTKSolutionTransfer::DTKSolutionTransfer(), libMesh::MeshRefinement::eliminate_unrefined_patches(), libMesh::RBEIMConstruction::enrich_eim_approximation_on_interiors(), libMesh::RBEIMConstruction::enrich_eim_approximation_on_nodes(), libMesh::RBEIMConstruction::enrich_eim_approximation_on_sides(), libMesh::TransientRBConstruction::enrich_RB_space(), libMesh::EpetraVector< T >::EpetraVector(), AssembleOptimization::equality_constraints(), libMesh::AdjointRefinementEstimator::estimate_error(), libMesh::ExactErrorEstimator::estimate_error(), libMesh::JumpErrorEstimator::estimate_error(), libMesh::PatchRecoveryErrorEstimator::estimate_error(), libMesh::WeightedPatchRecoveryErrorEstimator::estimate_error(), libMesh::SmoothnessEstimator::estimate_smoothness(), libMesh::MeshRefinement::flag_elements_by_elem_fraction(), libMesh::MeshRefinement::flag_elements_by_error_fraction(), libMesh::MeshRefinement::flag_elements_by_error_tolerance(), libMesh::MeshRefinement::flag_elements_by_mean_stddev(), libMesh::MeshRefinement::flag_elements_by_nelem_target(), libMesh::RBEIMEvaluation::gather_bfs(), libMesh::DofMap::gather_constraints(), libMesh::MeshfreeInterpolation::gather_remote_data(), libMesh::CondensedEigenSystem::get_eigenpair(), libMesh::RBEIMEvaluation::get_eim_basis_function_node_value(), libMesh::RBEIMEvaluation::get_eim_basis_function_side_value(), libMesh::RBEIMEvaluation::get_eim_basis_function_value(), libMesh::MeshBase::get_info(), libMesh::RBEIMEvaluation::get_interior_basis_functions_as_vecs(), libMesh::ImplicitSystem::get_linear_solver(), libMesh::RBEIMConstruction::get_max_abs_value(), libMesh::RBEIMConstruction::get_node_max_abs_value(), libMesh::RBEIMEvaluation::get_parametrized_function_node_value(), libMesh::RBEIMEvaluation::get_parametrized_function_side_value(), libMesh::RBEIMEvaluation::get_parametrized_function_value(), libMesh::RBEIMConstruction::get_random_point(), libMesh::RBEIMConstruction::get_random_point(), libMesh::RBEIMConstruction::get_random_point(), libMesh::MeshTetInterface::improve_hull_integrity(), AssembleOptimization::inequality_constraints(), AssembleOptimization::inequality_constraints_jacobian(), libMesh::StaticCondensation::init(), libMesh::TimeSolver::init(), libMesh::SystemSubsetBySubdomain::init(), libMesh::LocationMap< T >::init(), libMesh::PetscDMWrapper::init_and_attach_petscdm(), libMesh::PetscDMWrapper::init_and_attach_petscdm(), ElasticitySystem::init_data(), libMesh::AdvectionSystem::init_data(), libMesh::ClawSystem::init_data(), libMesh::PetscDMWrapper::init_petscdm(), libMesh::ExodusII_IO_Helper::initialize(), libMesh::OptimizationSystem::initialize_equality_constraints_storage(), libMesh::OptimizationSystem::initialize_inequality_constraints_storage(), libMesh::RBEIMConstruction::initialize_parametrized_functions_in_training_set(), libMesh::RBEIMConstruction::inner_product(), integrate_function(), libMesh::MeshTools::Modification::interpolate_surface(), libMesh::MeshTools::libmesh_assert_consistent_distributed(), libMesh::MeshTools::libmesh_assert_consistent_distributed_nodes(), libMesh::MeshTools::libmesh_assert_contiguous_dof_ids(), libMesh::MeshTools::libmesh_assert_equal_connectivity(), libMesh::MeshTools::libmesh_assert_equal_points(), libMesh::MeshTools::libmesh_assert_parallel_consistent_new_node_procids(), libMesh::MeshTools::libmesh_assert_parallel_consistent_procids< Elem >(), libMesh::MeshTools::libmesh_assert_parallel_consistent_procids< Node >(), libMesh::MeshTools::libmesh_assert_topology_consistent_procids< Node >(), libMesh::MeshTools::libmesh_assert_valid_boundary_ids(), libMesh::MeshTools::libmesh_assert_valid_constraint_rows(), libMesh::MeshTools::libmesh_assert_valid_dof_ids(), libMesh::MeshTools::libmesh_assert_valid_neighbors(), libMesh::DistributedMesh::libmesh_assert_valid_parallel_flags(), libMesh::DistributedMesh::libmesh_assert_valid_parallel_object_ids(), libMesh::DistributedMesh::libmesh_assert_valid_parallel_p_levels(), libMesh::MeshTools::libmesh_assert_valid_refinement_flags(), libMesh::MeshTools::libmesh_assert_valid_unique_ids(), libMesh::libmesh_petsc_linesearch_shellfunc(), libMesh::libmesh_petsc_preconditioner_apply(), libMesh::libmesh_petsc_snes_postcheck(), libMesh::MeshRefinement::limit_level_mismatch_at_edge(), libMesh::MeshRefinement::limit_level_mismatch_at_node(), libMesh::MeshRefinement::limit_overrefined_boundary(), libMesh::MeshRefinement::limit_underrefined_boundary(), libMesh::LinearImplicitSystem::LinearImplicitSystem(), main(), libMesh::MeshCommunication::make_elems_parallel_consistent(), libMesh::MeshCommunication::make_new_node_proc_ids_parallel_consistent(), libMesh::MeshCommunication::make_new_nodes_parallel_consistent(), libMesh::MeshCommunication::make_node_bcids_parallel_consistent(), libMesh::MeshCommunication::make_node_ids_parallel_consistent(), libMesh::MeshCommunication::make_node_proc_ids_parallel_consistent(), libMesh::MeshCommunication::make_node_unique_ids_parallel_consistent(), libMesh::MeshCommunication::make_nodes_parallel_consistent(), libMesh::MeshCommunication::make_p_levels_parallel_consistent(), libMesh::TransientRBConstruction::mass_matrix_scaled_matvec(), libMesh::FEMSystem::mesh_position_set(), libMesh::TriangulatorInterface::MeshedHole::MeshedHole(), LinearElasticityWithContact::move_mesh(), libMesh::DistributedMesh::n_active_elem(), libMesh::MeshTools::n_active_levels(), libMesh::BoundaryInfo::n_boundary_conds(), libMesh::MeshTools::n_connected_components(), libMesh::DofMap::n_constrained_dofs(), libMesh::DofMap::n_dofs(), libMesh::DofMap::n_dofs_per_processor(), libMesh::BoundaryInfo::n_edge_conds(), libMesh::CondensedEigenSystem::n_global_non_condensed_dofs(), libMesh::MeshTools::n_levels(), MixedOrderTest::n_neighbor_links(), libMesh::BoundaryInfo::n_nodeset_conds(), libMesh::SparsityPattern::Build::n_nonzeros(), libMesh::MeshTools::n_p_levels(), libMesh::BoundaryInfo::n_shellface_conds(), libMesh::RBEIMEvaluation::node_distribute_bfs(), libMesh::RBEIMEvaluation::node_gather_bfs(), libMesh::RBEIMConstruction::node_inner_product(), libMesh::PetscVector< T >::operator=(), libMesh::MeshBase::operator==(), libMesh::DistributedMesh::parallel_max_elem_id(), libMesh::DistributedMesh::parallel_max_node_id(), libMesh::DistributedMesh::parallel_max_unique_id(), libMesh::ReplicatedMesh::parallel_max_unique_id(), libMesh::DistributedMesh::parallel_n_elem(), libMesh::DistributedMesh::parallel_n_nodes(), libMesh::SparsityPattern::Build::parallel_sync(), libMesh::BoundaryInfo::parallel_sync_node_ids(), libMesh::BoundaryInfo::parallel_sync_side_ids(), libMesh::MeshTools::paranoid_n_levels(), libMesh::Partitioner::partition(), libMesh::Partitioner::partition_unpartitioned_elements(), libMesh::petsc_auto_fieldsplit(), MeshGenerationTest::polyhedronTetNeighbor(), LaplaceSystem::postprocess(), PoissonSystem::postprocess(), libMesh::MeshBase::print_constraint_rows(), libMesh::DofMap::print_dof_constraints(), libMesh::DofMap::process_mesh_constraint_rows(), libMesh::Partitioner::processor_pairs_to_interface_nodes(), libMesh::InterMeshProjection::project_system_vectors(), libMesh::XdrIO::read(), libMesh::Nemesis_IO::read(), FEMParameters::read(), libMesh::EquationSystems::read(), libMesh::CheckpointIO::read_header(), libMesh::ExodusII_IO::read_header(), libMesh::System::read_header(), libMesh::XdrIO::read_header(), libMesh::RBEIMEvaluation::read_in_interior_basis_functions(), libMesh::RBEIMEvaluation::read_in_node_basis_functions(), libMesh::RBEIMEvaluation::read_in_side_basis_functions(), libMesh::RBEvaluation::read_in_vectors_from_multiple_files(), libMesh::RBConstruction::read_riesz_representors_from_files(), libMesh::TransientRBConstruction::read_riesz_representors_from_files(), libMesh::System::read_SCALAR_dofs(), libMesh::XdrIO::read_serialized_bc_names(), libMesh::XdrIO::read_serialized_bcs_helper(), libMesh::System::read_serialized_blocked_dof_objects(), libMesh::XdrIO::read_serialized_connectivity(), libMesh::XdrIO::read_serialized_nodes(), libMesh::XdrIO::read_serialized_nodesets(), libMesh::XdrIO::read_serialized_subdomain_names(), libMesh::System::read_serialized_vector(), libMesh::Nemesis_IO_Helper::read_var_names_impl(), MeshFunctionTest::read_variable_info_from_output_data(), libMesh::MeshBase::recalculate_n_partitions(), libMesh::SimplexRefiner::refine_via_edges(), libMesh::StaticCondensationDofMap::reinit(), libMesh::BoundaryInfo::remove_edge_id(), libMesh::BoundaryInfo::remove_node_id(), libMesh::BoundaryInfo::remove_shellface_id(), libMesh::BoundaryInfo::remove_side_id(), libMesh::DistributedMesh::renumber_dof_objects(), libMesh::DistributedMesh::renumber_nodes_and_elements(), LinearElasticityWithContact::residual_and_jacobian(), OverlappingAlgebraicGhostingTest::run_ghosting_test(), OverlappingCouplingGhostingTest::run_sparsity_pattern_test(), scale_mesh_and_plot(), libMesh::DofMap::scatter_constraints(), libMesh::CheckpointIO::select_split_config(), libMesh::GenericProjector< FFunctor, GFunctor, FValue, ProjectionAction >::send_and_insert_dof_values(), libMesh::TransientRBConstruction::set_error_temporal_data(), libMesh::Partitioner::set_interface_node_processor_ids_BFS(), libMesh::Partitioner::set_interface_node_processor_ids_linear(), libMesh::Partitioner::set_interface_node_processor_ids_petscpartitioner(), libMesh::Partitioner::set_node_processor_ids(), libMesh::DofMap::set_nonlocal_dof_objects(), libMesh::Partitioner::set_parent_processor_ids(), libMesh::PetscDMWrapper::set_point_range_in_section(), libMesh::PetscDiffSolver::setup_petsc_data(), libMesh::RBEIMEvaluation::side_distribute_bfs(), libMesh::RBEIMEvaluation::side_gather_bfs(), libMesh::RBEIMConstruction::side_inner_product(), libMesh::Partitioner::single_partition(), libMesh::LaplaceMeshSmoother::smooth(), libMesh::VariationalMeshSmoother::smooth(), libMesh::NoxNonlinearSolver< Number >::solve(), libMesh::ClawSystem::solve_conservation_law(), libMesh::split_mesh(), libMesh::RBEIMConstruction::store_eim_solutions_for_training_set(), libMesh::MeshBase::subdomain_ids(), libMesh::BoundaryInfo::sync(), libMesh::MeshBase::sync_subdomain_name_map(), ConstraintOperatorTest::test1DCoarseningNewNodes(), ConstraintOperatorTest::test1DCoarseningOperator(), MeshFunctionTest::test_bad_gradient_var_with_out_of_mesh_value(), MeshFunctionTest::test_bad_hessian_var_with_out_of_mesh_value(), MeshfunctionDFEM::test_mesh_function_dfem(), MeshfunctionDFEM::test_mesh_function_dfem_grad(), MeshFunctionTest::test_p_level(), ExodusC0PolyhedronTest::test_write_and_read_hexagonal_prism(), ExodusC0PolygonTest::test_write_and_read_pentagon(), DofMapTest::testBadElemFECombo(), SystemsTest::testBlockRestrictedVarNDofs(), BoundaryInfoTest::testBoundaryOnChildrenErrors(), MeshGenerationTest::testBuildCube(), BoundaryInfoTest::testBuildSideListFromNodeListThinMesh(), CheckpointIOTest::testC0PolygonCheckpoint(), VolumeTest::testC0PolygonMethods(), CheckpointIOTest::testC0PolyhedronCheckpoint(), VolumeTest::testC0PolyhedronMethods(), ConstraintOperatorTest::testCoreform(), ConnectedComponentsTest::testEdge(), MeshInputTest::testExodusIGASidesets(), MeshTriangulationTest::testFoundCenters(), PointLocatorTest::testLocator(), BoundaryInfoTest::testMesh(), BoundaryMeshSubdomainTest::testPerBoundarySubdomain(), PointLocatorTest::testPlanar(), MeshTriangulationTest::testPoly2TriEdge3ToTri7CenterFixup(), MeshTriangulationTest::testPoly2TriRefinementBase(), SystemsTest::testProjectCubeWithMeshFunction(), SystemsTest::testProjectScalarCoarsening(), BoundaryInfoTest::testRenumber(), BoundaryInfoTest::testSelectiveRenumber(), BoundaryMeshSubdomainTest::testSingleSubdomain(), CheckpointIOTest::testSplitter(), MeshInputTest::testTetgenIO(), MeshTriangulationTest::testTriangulatorInterp(), MeshTriangulationTest::testTriangulatorMeshedHoles(), MeshTriangulationTest::testTriangulatorRoundHole(), MeshSmootherTest::testVariationalSmoother(), libMesh::MeshTools::total_weight(), libMesh::RBConstruction::train_reduced_basis_with_POD(), libMesh::MeshfreeSolutionTransfer::transfer(), libMesh::MeshFunctionSolutionTransfer::transfer(), libMesh::Poly2TriTriangulator::triangulate(), libMesh::RBConstruction::truth_assembly(), libMesh::TransientRBConstruction::truth_assembly(), update_current_local_solution(), libMesh::TransientRBConstruction::update_RB_initial_condition_all_N(), libMesh::RBConstruction::update_RB_system_matrices(), libMesh::TransientRBConstruction::update_RB_system_matrices(), libMesh::TransientRBConstruction::update_residual_terms(), libMesh::RBConstruction::update_residual_terms(), libMesh::MeshTools::volume(), libMesh::STLIO::write(), libMesh::XdrIO::write(), libMesh::NameBasedIO::write(), libMesh::VTKIO::write_nodal_data(), libMesh::RBEIMEvaluation::write_out_interior_basis_functions(), libMesh::RBEIMEvaluation::write_out_node_basis_functions(), libMesh::RBEIMEvaluation::write_out_side_basis_functions(), libMesh::RBEvaluation::write_out_vectors(), libMesh::RBConstruction::write_riesz_representors_to_files(), libMesh::TransientRBConstruction::write_riesz_representors_to_files(), libMesh::System::write_SCALAR_dofs(), libMesh::XdrIO::write_serialized_bcs_helper(), libMesh::System::write_serialized_blocked_dof_objects(), libMesh::XdrIO::write_serialized_connectivity(), libMesh::XdrIO::write_serialized_nodes(), libMesh::XdrIO::write_serialized_nodesets(), libMesh::RBDataSerialization::RBEvaluationSerialization::write_to_file(), libMesh::RBDataSerialization::TransientRBEvaluationSerialization::write_to_file(), libMesh::RBDataSerialization::RBEIMEvaluationSerialization::write_to_file(), and libMesh::RBDataSerialization::RBSCMEvaluationSerialization::write_to_file().

◆ computing_base_vector()

template<typename T >
bool libMesh::PetscNonlinearSolver< T >::computing_base_vector ( ) const
inline
Returns
whether we are computing the base vector for matrix-free finite-differencing

Definition at line 210 of file petsc_nonlinear_solver.h.

210{ return _computing_base_vector; }

References libMesh::PetscNonlinearSolver< T >::_computing_base_vector.

Referenced by libMesh::PetscNonlinearSolver< T >::set_computing_base_vector().

◆ disable_print_counter_info()

void libMesh::ReferenceCounter::disable_print_counter_info ( )
staticinherited

Definition at line 100 of file reference_counter.C.

101{
102 _enable_print_counter = false;
103 return;
104}
static bool _enable_print_counter
Flag to control whether reference count information is printed when print_info is called.

References libMesh::ReferenceCounter::_enable_print_counter.

◆ enable_print_counter_info()

void libMesh::ReferenceCounter::enable_print_counter_info ( )
staticinherited

Methods to enable/disable the reference counter output from print_info().

Enabled by default.

Definition at line 94 of file reference_counter.C.

95{
97 return;
98}

References libMesh::ReferenceCounter::_enable_print_counter.

Referenced by libMesh::LibMeshInit::~LibMeshInit().

◆ exact_constraint_enforcement()

template<typename T >
bool libMesh::NonlinearSolver< T >::exact_constraint_enforcement ( )
inlineinherited

Definition at line 418 of file nonlinear_solver.h.

419 {
421 }
bool _exact_constraint_enforcement
Whether we should enforce exact constraints globally during a solve.

References libMesh::NonlinearSolver< T >::_exact_constraint_enforcement.

◆ force_new_preconditioner()

template<typename T >
void libMesh::PetscNonlinearSolver< T >::force_new_preconditioner ( )
overridevirtual

Immediately force a new preconditioner, even if reuse is set.

Reimplemented from libMesh::NonlinearSolver< T >.

Definition at line 1206 of file petsc_nonlinear_solver.C.

1207{
1208 // Easiest way is just to clear everything out
1209 this->_is_initialized = false;
1210 _snes.destroy();
1211 _setup_reuse = false;
1212}

◆ get_converged_reason()

template<typename T >
SNESConvergedReason libMesh::PetscNonlinearSolver< T >::get_converged_reason ( )
Returns
The currently-available (or most recently obtained, if the SNES object has been destroyed) convergence reason.

Refer to PETSc docs for the meaning of different SNESConvergedReasons.

Definition at line 1171 of file petsc_nonlinear_solver.C.

1172{
1173 if (this->initialized())
1174 LibmeshPetscCall(SNESGetConvergedReason(_snes, &_reason));
1175
1176 return _reason;
1177}

References libMesh::initialized().

◆ get_current_nonlinear_iteration_number()

template<typename T >
virtual unsigned libMesh::PetscNonlinearSolver< T >::get_current_nonlinear_iteration_number ( ) const
inlineoverridevirtual
Returns
The current nonlinear iteration number if called during the solve(), for example by the user-specified residual or Jacobian function.

Implements libMesh::NonlinearSolver< T >.

Definition at line 157 of file petsc_nonlinear_solver.h.

References libMesh::PetscNonlinearSolver< T >::_current_nonlinear_iteration_number.

◆ get_info()

std::string libMesh::ReferenceCounter::get_info ( )
staticinherited

Gets a string containing the reference information.

Definition at line 47 of file reference_counter.C.

48{
49#if defined(LIBMESH_ENABLE_REFERENCE_COUNTING) && defined(DEBUG)
50
51 std::ostringstream oss;
52
53 oss << '\n'
54 << " ---------------------------------------------------------------------------- \n"
55 << "| Reference count information |\n"
56 << " ---------------------------------------------------------------------------- \n";
57
58 for (const auto & [name, cd] : _counts)
59 oss << "| " << name << " reference count information:\n"
60 << "| Creations: " << cd.first << '\n'
61 << "| Destructions: " << cd.second << '\n';
62
63 oss << " ---------------------------------------------------------------------------- \n";
64
65 return oss.str();
66
67#else
68
69 return "";
70
71#endif
72}
static Counts _counts
Actually holds the data.
std::string name(const ElemQuality q)
This function returns a string containing some name for q.

References libMesh::ReferenceCounter::_counts.

Referenced by libMesh::ReferenceCounter::print_info().

◆ get_total_linear_iterations()

template<typename T >
int libMesh::PetscNonlinearSolver< T >::get_total_linear_iterations ( )
overridevirtual

Get the total number of linear iterations done in the last solve.

Implements libMesh::NonlinearSolver< T >.

Definition at line 1180 of file petsc_nonlinear_solver.C.

1181{
1182 return _n_linear_iterations;
1183}

◆ increment_constructor_count()

void libMesh::ReferenceCounter::increment_constructor_count ( const std::string &  name)
inlineprotectednoexceptinherited

Increments the construction counter.

Should be called in the constructor of any derived class that will be reference counted.

Definition at line 183 of file reference_counter.h.

184{
185 libmesh_try
186 {
187 Threads::spin_mutex::scoped_lock lock(Threads::spin_mtx);
188 std::pair<unsigned int, unsigned int> & p = _counts[name];
189 p.first++;
190 }
191 libmesh_catch (...)
192 {
193 auto stream = libMesh::err.get();
194 stream->exceptions(stream->goodbit); // stream must not throw
195 libMesh::err << "Encountered unrecoverable error while calling "
196 << "ReferenceCounter::increment_constructor_count() "
197 << "for a(n) " << name << " object." << std::endl;
198 std::terminate();
199 }
200}
streamT * get()
Rather than implement every ostream/ios/ios_base function, we'll be lazy and make esoteric uses go th...
spin_mutex spin_mtx
A convenient spin mutex object which can be used for obtaining locks.
Definition threads.C:30
OStreamProxy err

References libMesh::err, libMesh::BasicOStreamProxy< charT, traits >::get(), and libMesh::Threads::spin_mtx.

Referenced by libMesh::ReferenceCountedObject< T >::ReferenceCountedObject(), libMesh::ReferenceCountedObject< T >::ReferenceCountedObject(), and libMesh::ReferenceCountedObject< T >::ReferenceCountedObject().

◆ increment_destructor_count()

void libMesh::ReferenceCounter::increment_destructor_count ( const std::string &  name)
inlineprotectednoexceptinherited

Increments the destruction counter.

Should be called in the destructor of any derived class that will be reference counted.

Definition at line 207 of file reference_counter.h.

208{
209 libmesh_try
210 {
211 Threads::spin_mutex::scoped_lock lock(Threads::spin_mtx);
212 std::pair<unsigned int, unsigned int> & p = _counts[name];
213 p.second++;
214 }
215 libmesh_catch (...)
216 {
217 auto stream = libMesh::err.get();
218 stream->exceptions(stream->goodbit); // stream must not throw
219 libMesh::err << "Encountered unrecoverable error while calling "
220 << "ReferenceCounter::increment_destructor_count() "
221 << "for a(n) " << name << " object." << std::endl;
222 std::terminate();
223 }
224}

References libMesh::err, libMesh::BasicOStreamProxy< charT, traits >::get(), and libMesh::Threads::spin_mtx.

Referenced by libMesh::ReferenceCountedObject< T >::~ReferenceCountedObject().

◆ init()

template<typename T >
void libMesh::PetscNonlinearSolver< T >::init ( const char *  name = nullptr)
overridevirtual

Initialize data structures if not done so already.

May assign a name to the solver in some implementations

Implements libMesh::NonlinearSolver< T >.

Definition at line 742 of file petsc_nonlinear_solver.C.

743{
744 parallel_object_only();
745
746 // Initialize the data structures if not done so already.
747 if (!this->initialized())
748 {
749 this->_is_initialized = true;
750
751 // Make only if we don't already have a retained snes
752 // hanging around from the last solve
753 if (!_snes)
754 LibmeshPetscCall(SNESCreate(this->comm().get(), _snes.get()));
755
756 // I believe all of the following can be safely repeated
757 // even on an old snes instance from the last solve
758
759 if (name)
760 {
761 libmesh_assert(std::string(name).front() != '-');
762 libmesh_assert(std::string(name).back() == '_');
763 LibmeshPetscCall(SNESSetOptionsPrefix(_snes, name));
764 }
765
766 // Attaching a DM to SNES.
767#if defined(LIBMESH_ENABLE_AMR) && defined(LIBMESH_HAVE_METAPHYSICL)
768 bool use_petsc_dm = libMesh::on_command_line(
769 "--" + (name ? std::string(name) : std::string("")) + "use_petsc_dm");
770
771 // This needs to be called before SNESSetFromOptions
772 if (use_petsc_dm)
774 else
775#endif
776 {
777 WrappedPetsc<DM> dm;
778 LibmeshPetscCall(DMCreate(this->comm().get(), dm.get()));
779 LibmeshPetscCall(DMSetType(dm, DMLIBMESH));
780 LibmeshPetscCall(DMlibMeshSetSystem(dm, this->system()));
781
782 if (name)
783 LibmeshPetscCall(DMSetOptionsPrefix(dm, name));
784
785 LibmeshPetscCall(DMSetFromOptions(dm));
786 LibmeshPetscCall(DMSetUp(dm));
787 LibmeshPetscCall(SNESSetDM(_snes, dm));
788 // SNES now owns the reference to dm.
789 }
790
792
793 // If the SolverConfiguration object is provided, use it to set
794 // options during solver initialization.
795 if (this->_solver_configuration)
796 {
798 }
799
800 if (this->_preconditioner)
801 {
802 KSP ksp;
803 LibmeshPetscCall(SNESGetKSP (_snes, &ksp));
804 PC pc;
805 LibmeshPetscCall(KSPGetPC(ksp,&pc));
806
807 this->_preconditioner->init();
808
809 LibmeshPetscCall(PCSetType(pc, PCSHELL));
810 LibmeshPetscCall(PCShellSetContext(pc,(void *)this->_preconditioner));
811
812 //Re-Use the shell functions from petsc_linear_solver
813 LibmeshPetscCall(PCShellSetSetUp(pc,libmesh_petsc_preconditioner_setup));
814 LibmeshPetscCall(PCShellSetApply(pc,libmesh_petsc_preconditioner_apply));
815 }
816 }
817
818
819 // Tell PETSc about our linesearch "post-check" function, but only
820 // if the user has provided one. There seem to be extra,
821 // unnecessary residual calculations if a postcheck function is
822 // attached for no reason.
823 if (this->postcheck || this->postcheck_object)
824 {
825 SNESLineSearch linesearch;
826 LibmeshPetscCall(SNESGetLineSearch(_snes, &linesearch));
827
828 LibmeshPetscCall(SNESLineSearchSetPostCheck(linesearch, libmesh_petsc_snes_postcheck, this));
829 }
830
831 if (this->precheck_object)
832 {
833 SNESLineSearch linesearch;
834 LibmeshPetscCall(SNESGetLineSearch(_snes, &linesearch));
835
836 LibmeshPetscCall(SNESLineSearchSetPreCheck(linesearch, libmesh_petsc_snes_precheck, this));
837 }
838}
void(* postcheck)(const NumericVector< Number > &old_soln, NumericVector< Number > &search_direction, NumericVector< Number > &new_soln, bool &changed_search_direction, bool &changed_new_soln, sys_type &S)
Function that performs a "check" on the Newton search direction and solution after each nonlinear ste...
SolverConfiguration * _solver_configuration
Optionally store a SolverOptions object that can be used to set parameters like solver type,...
NonlinearImplicitSystem::ComputePreCheck * precheck_object
NonlinearImplicitSystem::ComputePostCheck * postcheck_object
A callable object that is executed after each nonlinear iteration.
void init_and_attach_petscdm(System &system, SNES snes)
void setup_default_monitor()
Setup the default monitor if required.
friend PetscErrorCode libmesh_petsc_snes_precheck(SNESLineSearch, Vec X, Vec Y, PetscBool *changed, void *context)
PetscDMWrapper _dm_wrapper
Wrapper object for interacting with the "new" libMesh PETSc DM.
virtual void set_options_during_init()
Apply options during initialization of a solver.
PetscErrorCode libmesh_petsc_snes_postcheck(SNESLineSearch, Vec x, Vec y, Vec w, PetscBool *changed_y, PetscBool *changed_w, void *context)
libmesh_assert(ctx)
PetscErrorCode libmesh_petsc_preconditioner_apply(PC pc, Vec x, Vec y)
PetscErrorCode libmesh_petsc_preconditioner_setup(PC pc)
bool on_command_line(std::string arg)
Definition libmesh.C:934
PETSC_EXTERN PetscErrorCode DMlibMeshSetSystem(DM, libMesh::NonlinearImplicitSystem &)
Any functional implementation of the DMlibMesh API must compose the following functions with the DM o...

References DMlibMeshSetSystem(), libMesh::WrappedPetsc< T >::get(), libMesh::initialized(), libMesh::libmesh_assert(), libMesh::libmesh_petsc_preconditioner_apply(), libMesh::libmesh_petsc_preconditioner_setup(), libMesh::libmesh_petsc_snes_postcheck(), libMesh::libmesh_petsc_snes_precheck(), and libMesh::on_command_line().

◆ initialized()

template<typename T >
bool libMesh::NonlinearSolver< T >::initialized ( ) const
inlineinherited
Returns
true if the data structures are initialized, false otherwise.

Definition at line 83 of file nonlinear_solver.h.

83{ return _is_initialized; }

References libMesh::NonlinearSolver< T >::_is_initialized.

◆ n_objects()

static unsigned int libMesh::ReferenceCounter::n_objects ( )
inlinestaticinherited

Prints the number of outstanding (created, but not yet destroyed) objects.

Definition at line 85 of file reference_counter.h.

86 { return _n_objects; }
static Threads::atomic< unsigned int > _n_objects
The number of objects.

References libMesh::ReferenceCounter::_n_objects.

Referenced by libMesh::LibMeshInit::~LibMeshInit().

◆ n_processors()

processor_id_type libMesh::ParallelObject::n_processors ( ) const
inlineinherited
Returns
The number of processors in the group.

Definition at line 103 of file parallel_object.h.

104 {
105 processor_id_type returnval =
106 cast_int<processor_id_type>(_communicator.size());
107 libmesh_assert(returnval); // We never have an empty comm
108 return returnval;
109 }
processor_id_type size() const
uint8_t processor_id_type
Definition id_types.h:104

References libMesh::ParallelObject::_communicator, libMesh::libmesh_assert(), and libMesh::Parallel::Communicator::size().

Referenced by libMesh::Partitioner::_find_global_index_by_pid_map(), libMesh::BoundaryInfo::_find_id_maps(), libMesh::DofMap::add_constraints_to_send_list(), libMesh::PetscDMWrapper::add_dofs_to_section(), libMesh::DistributedMesh::add_elem(), libMesh::DistributedMesh::add_node(), libMesh::System::add_vector(), libMesh::LaplaceMeshSmoother::allgather_graph(), libMesh::DofMap::allgather_recursive_constraints(), libMesh::FEMSystem::assembly(), ExodusC0PolyhedronTest::assert_distributed_if_parallel(), libMesh::Nemesis_IO::assert_symmetric_cmaps(), libMesh::Partitioner::assign_partitioning(), libMesh::AztecLinearSolver< T >::AztecLinearSolver(), libMesh::Partitioner::build_graph(), libMesh::EquationSystems::build_parallel_elemental_solution_vector(), libMesh::DistributedMesh::clear(), libMesh::DistributedMesh::clear_elems(), libMesh::Nemesis_IO_Helper::compute_border_node_ids(), libMesh::Nemesis_IO_Helper::construct_nemesis_filename(), libMesh::UnstructuredMesh::copy_nodes_and_elements(), libMesh::ExodusII_IO::copy_scalar_solution(), libMesh::Nemesis_IO::copy_scalar_solution(), libMesh::UnstructuredMesh::create_pid_mesh(), libMesh::MeshTools::create_processor_bounding_box(), libMesh::EnsightIO::EnsightIO(), libMesh::RBEIMEvaluation::gather_bfs(), libMesh::MeshBase::get_info(), libMesh::StaticCondensation::init(), libMesh::SystemSubsetBySubdomain::init(), libMesh::PetscDMWrapper::init_petscdm(), libMesh::ExodusII_IO_Helper::initialize(), libMesh::Nemesis_IO_Helper::initialize(), libMesh::DistributedMesh::insert_elem(), libMesh::NumericVector< T >::is_effectively_ghosted(), libMesh::NumericVector< T >::is_effectively_serial(), libMesh::MeshTools::libmesh_assert_contiguous_dof_ids(), libMesh::MeshTools::libmesh_assert_parallel_consistent_new_node_procids(), libMesh::MeshTools::libmesh_assert_parallel_consistent_procids< Elem >(), libMesh::MeshTools::libmesh_assert_parallel_consistent_procids< Node >(), libMesh::MeshTools::libmesh_assert_topology_consistent_procids< Node >(), libMesh::MeshTools::libmesh_assert_valid_boundary_ids(), libMesh::MeshTools::libmesh_assert_valid_dof_ids(), libMesh::MeshTools::libmesh_assert_valid_neighbors(), libMesh::MeshTools::libmesh_assert_valid_refinement_flags(), libMesh::MeshBase::n_active_elem_on_proc(), libMesh::DofMap::n_dofs_per_processor(), libMesh::MeshBase::n_elem_on_proc(), libMesh::MeshBase::n_nodes_on_proc(), libMesh::RBEIMEvaluation::node_gather_bfs(), libMesh::MeshBase::partition(), libMesh::Partitioner::partition(), libMesh::Partitioner::partition_unpartitioned_elements(), libMesh::Partitioner::partition_unpartitioned_elements(), libMesh::MeshBase::print_constraint_rows(), libMesh::DofMap::print_dof_constraints(), libMesh::Nemesis_IO::read(), libMesh::CheckpointIO::read(), libMesh::NameBasedIO::read(), libMesh::CheckpointIO::read_connectivity(), libMesh::XdrIO::read_header(), libMesh::CheckpointIO::read_nodes(), libMesh::System::read_parallel_data(), libMesh::System::read_SCALAR_dofs(), libMesh::System::read_serialized_blocked_dof_objects(), libMesh::System::read_serialized_vector(), libMesh::DistributedMesh::renumber_dof_objects(), libMesh::Partitioner::repartition(), OverlappingFunctorTest::run_partitioner_test(), libMesh::DofMap::scatter_constraints(), libMesh::DistributedMesh::set_next_ids(), libMesh::DistributedMesh::set_next_unique_id(), libMesh::DistributedMesh::set_next_unique_ids(), libMesh::DofMap::set_nonlocal_dof_objects(), libMesh::PetscDMWrapper::set_point_range_in_section(), WriteVecAndScalar::setupTests(), libMesh::RBEIMEvaluation::side_gather_bfs(), ExodusC0PolyhedronTest::test_write_and_read_mixed_hex_tet_block_names_impl(), CheckpointIOTest::testDisjointNeighborPairsCheckpoint(), DistributedMeshTest::testRemoteElemError(), CheckpointIOTest::testSplitter(), libMesh::GMVIO::write_binary(), libMesh::GMVIO::write_discontinuous_gmv(), libMesh::ExodusII_IO_Helper::write_nodal_coordinates(), libMesh::ExodusII_IO::write_nodal_data(), libMesh::VTKIO::write_nodal_data(), libMesh::System::write_parallel_data(), libMesh::System::write_SCALAR_dofs(), libMesh::XdrIO::write_serialized_bcs_helper(), libMesh::System::write_serialized_blocked_dof_objects(), libMesh::XdrIO::write_serialized_connectivity(), libMesh::XdrIO::write_serialized_nodes(), and libMesh::XdrIO::write_serialized_nodesets().

◆ print_converged_reason()

template<typename T >
void libMesh::PetscNonlinearSolver< T >::print_converged_reason ( )
overridevirtual

Prints a useful message about why the latest nonlinear solve con(di)verged.

Reimplemented from libMesh::NonlinearSolver< T >.

Definition at line 1161 of file petsc_nonlinear_solver.C.

1162{
1163
1164 libMesh::out << "Nonlinear solver convergence/divergence reason: "
1165 << SNESConvergedReasons[this->get_converged_reason()] << std::endl;
1166}
OStreamProxy out

References libMesh::out.

◆ print_info()

void libMesh::ReferenceCounter::print_info ( std::ostream &  out_stream = libMesh::out)
staticinherited

Prints the reference information, by default to libMesh::out.

Definition at line 81 of file reference_counter.C.

82{
84 out_stream << ReferenceCounter::get_info();
85}
static std::string get_info()
Gets a string containing the reference information.

References libMesh::ReferenceCounter::_enable_print_counter, and libMesh::ReferenceCounter::get_info().

Referenced by libMesh::LibMeshInit::~LibMeshInit().

◆ processor_id()

processor_id_type libMesh::ParallelObject::processor_id ( ) const
inlineinherited
Returns
The rank of this processor in the group.

Definition at line 114 of file parallel_object.h.

115 { return cast_int<processor_id_type>(_communicator.rank()); }
processor_id_type rank() const

References libMesh::ParallelObject::_communicator, and libMesh::Parallel::Communicator::rank().

Referenced by libMesh::BoundaryInfo::_find_id_maps(), libMesh::PetscDMWrapper::add_dofs_to_section(), libMesh::DistributedMesh::add_elem(), libMesh::BoundaryInfo::add_elements(), libMesh::DistributedMesh::add_node(), libMesh::MeshTools::Modification::all_tri(), libMesh::FEMSystem::assembly(), libMesh::Nemesis_IO::assert_symmetric_cmaps(), libMesh::Partitioner::assign_partitioning(), libMesh::Nemesis_IO_Helper::build_element_and_node_maps(), libMesh::Partitioner::build_graph(), libMesh::InfElemBuilder::build_inf_elem(), libMesh::BoundaryInfo::build_node_list_from_side_list(), libMesh::EquationSystems::build_parallel_elemental_solution_vector(), libMesh::EquationSystems::build_parallel_solution_vector(), libMesh::MeshFunction::check_found_elem(), libMesh::DistributedMesh::clear(), libMesh::DistributedMesh::clear_elems(), libMesh::ExodusII_IO_Helper::close(), libMesh::Nemesis_IO_Helper::compute_border_node_ids(), libMesh::Nemesis_IO_Helper::compute_communication_map_parameters(), libMesh::Nemesis_IO_Helper::compute_internal_and_border_elems_and_internal_nodes(), libMesh::RBConstruction::compute_max_error_bound(), libMesh::Nemesis_IO_Helper::compute_node_communication_maps(), libMesh::Nemesis_IO_Helper::compute_num_global_elem_blocks(), libMesh::Nemesis_IO_Helper::compute_num_global_nodesets(), libMesh::Nemesis_IO_Helper::compute_num_global_sidesets(), libMesh::Nemesis_IO_Helper::construct_nemesis_filename(), libMesh::ExodusII_IO::copy_elemental_solution(), libMesh::ExodusII_IO::copy_nodal_solution(), libMesh::ExodusII_IO::copy_scalar_solution(), libMesh::Nemesis_IO::copy_scalar_solution(), libMesh::MeshTools::correct_node_proc_ids(), libMesh::MeshBase::count_constraint_rows(), libMesh::ExodusII_IO_Helper::create(), libMesh::MeshCommunication::delete_remote_elements(), libMesh::DistributedMesh::DistributedMesh(), libMesh::DofMapBase::end_dof(), libMesh::DofMapBase::end_old_dof(), libMesh::EnsightIO::EnsightIO(), libMesh::GenericProjector< FFunctor, GFunctor, FValue, ProjectionAction >::SubFunctor::find_dofs_to_send(), libMesh::UnstructuredMesh::find_neighbors(), libMesh::DofMapBase::first_dof(), libMesh::DofMapBase::first_old_dof(), libMesh::RBEIMEvaluation::gather_bfs(), libMesh::Nemesis_IO_Helper::get_cmap_params(), libMesh::Nemesis_IO_Helper::get_eb_info_global(), libMesh::Nemesis_IO_Helper::get_elem_cmap(), libMesh::Nemesis_IO_Helper::get_elem_map(), libMesh::MeshBase::get_info(), libMesh::Nemesis_IO_Helper::get_init_global(), libMesh::Nemesis_IO_Helper::get_init_info(), libMesh::RBEIMEvaluation::get_interior_basis_functions_as_vecs(), libMesh::Nemesis_IO_Helper::get_loadbal_param(), libMesh::DofMap::get_local_constraints(), libMesh::MeshBase::get_local_constraints(), libMesh::Nemesis_IO_Helper::get_node_cmap(), libMesh::Nemesis_IO_Helper::get_node_map(), libMesh::Nemesis_IO_Helper::get_ns_param_global(), libMesh::Nemesis_IO_Helper::get_ss_param_global(), libMesh::SparsityPattern::Build::handle_vi_vj(), libMesh::LaplaceMeshSmoother::init(), libMesh::SystemSubsetBySubdomain::init(), HeatSystem::init_data(), libMesh::ExodusII_IO_Helper::initialize(), libMesh::ExodusII_IO_Helper::initialize_element_variables(), libMesh::ExodusII_IO_Helper::initialize_global_variables(), libMesh::ExodusII_IO_Helper::initialize_nodal_variables(), libMesh::DistributedMesh::insert_elem(), libMesh::MeshTools::Modification::interpolate_surface(), libMesh::SparsityPattern::Build::join(), libMesh::RBEvaluation::legacy_write_offline_data_to_files(), libMesh::RBSCMEvaluation::legacy_write_offline_data_to_files(), libMesh::TransientRBEvaluation::legacy_write_offline_data_to_files(), libMesh::MeshTools::libmesh_assert_consistent_distributed(), libMesh::MeshTools::libmesh_assert_consistent_distributed_nodes(), libMesh::MeshTools::libmesh_assert_contiguous_dof_ids(), libMesh::MeshTools::libmesh_assert_parallel_consistent_procids< Elem >(), libMesh::MeshTools::libmesh_assert_valid_neighbors(), libMesh::DistributedMesh::libmesh_assert_valid_parallel_object_ids(), main(), AugmentSparsityOnInterface::mesh_reinit(), libMesh::TriangulatorInterface::MeshedHole::MeshedHole(), libMesh::MeshBase::n_active_local_elem(), libMesh::BoundaryInfo::n_boundary_conds(), libMesh::MeshTools::n_connected_components(), libMesh::BoundaryInfo::n_edge_conds(), libMesh::DofMapBase::n_local_dofs(), libMesh::MeshBase::n_local_elem(), libMesh::MeshBase::n_local_nodes(), libMesh::BoundaryInfo::n_nodeset_conds(), libMesh::BoundaryInfo::n_shellface_conds(), libMesh::RBEIMEvaluation::node_gather_bfs(), libMesh::DistributedMesh::own_node(), libMesh::BoundaryInfo::parallel_sync_node_ids(), libMesh::BoundaryInfo::parallel_sync_side_ids(), libMesh::MeshBase::print_constraint_rows(), libMesh::DofMap::print_dof_constraints(), libMesh::DofMap::process_mesh_constraint_rows(), libMesh::Nemesis_IO_Helper::put_cmap_params(), libMesh::Nemesis_IO_Helper::put_elem_cmap(), libMesh::Nemesis_IO_Helper::put_elem_map(), libMesh::Nemesis_IO_Helper::put_loadbal_param(), libMesh::Nemesis_IO_Helper::put_node_cmap(), libMesh::Nemesis_IO_Helper::put_node_map(), libMesh::XdrIO::read(), libMesh::Nemesis_IO::read(), libMesh::CheckpointIO::read(), libMesh::NameBasedIO::read(), libMesh::EquationSystems::read(), libMesh::EquationSystems::read(), libMesh::ExodusII_IO_Helper::read_elem_num_map(), libMesh::ExodusII_IO_Helper::read_global_values(), libMesh::CheckpointIO::read_header(), libMesh::ExodusII_IO::read_header(), libMesh::System::read_header(), libMesh::XdrIO::read_header(), libMesh::DynaIO::read_mesh(), libMesh::ExodusII_IO_Helper::read_node_num_map(), libMesh::System::read_parallel_data(), libMesh::RBConstruction::read_riesz_representors_from_files(), libMesh::TransientRBConstruction::read_riesz_representors_from_files(), libMesh::System::read_SCALAR_dofs(), libMesh::XdrIO::read_serialized_bc_names(), libMesh::XdrIO::read_serialized_bcs_helper(), libMesh::System::read_serialized_blocked_dof_objects(), libMesh::XdrIO::read_serialized_connectivity(), libMesh::System::read_serialized_data(), libMesh::XdrIO::read_serialized_nodes(), libMesh::XdrIO::read_serialized_nodesets(), libMesh::XdrIO::read_serialized_subdomain_names(), libMesh::System::read_serialized_vector(), libMesh::System::read_serialized_vectors(), libMesh::Nemesis_IO_Helper::read_var_names_impl(), libMesh::SimplexRefiner::refine_via_edges(), libMesh::SimplexRefiner::refine_via_edges(), libMesh::StaticCondensationDofMap::reinit(), libMesh::DistributedMesh::renumber_dof_objects(), libMesh::DistributedMesh::renumber_nodes_and_elements(), libMesh::DofMap::scatter_constraints(), libMesh::CheckpointIO::select_split_config(), libMesh::DistributedMesh::set_next_ids(), libMesh::DistributedMesh::set_next_unique_id(), libMesh::DistributedMesh::set_next_unique_ids(), libMesh::DofMap::set_nonlocal_dof_objects(), libMesh::PetscDMWrapper::set_point_range_in_section(), libMesh::RBEIMEvaluation::side_gather_bfs(), MeshFunctionTest::test_bad_gradient_var_with_out_of_mesh_value(), MeshFunctionTest::test_bad_hessian_var_with_out_of_mesh_value(), ExodusTest< elem_type >::test_read_gold(), ExodusTest< elem_type >::test_write(), ExodusC0PolyhedronTest::test_write_and_read_hexagonal_prism(), ExodusC0PolyhedronTest::test_write_and_read_mixed_hex_tet_block_names_impl(), ExodusC0PolygonTest::test_write_and_read_pentagon(), MeshInputTest::testAbaqusRead(), MeshInputTest::testBadGmsh(), BoundaryInfoTest::testBoundaryIDs(), MeshInputTest::testCopyElementSolutionImpl(), MeshInputTest::testCopyElementVectorImpl(), MeshInputTest::testCopyNodalSolutionImpl(), DefaultCouplingTest::testCoupling(), PointNeighborCouplingTest::testCoupling(), MeshInputTest::testDynaFileMappings(), MeshInputTest::testDynaNoSplines(), MeshInputTest::testDynaReadElem(), MeshInputTest::testDynaReadPatch(), MeshInputTest::testExodusCopyHighOrderElementSolution(), MeshInputTest::testExodusFileMappings(), MeshInputTest::testExodusIGASidesets(), MeshInputTest::testExodusWriteElementDataFromDiscontinuousNodalData(), DofMapTest::testGhostConstraintSendList(), MeshInputTest::testGmshBCIDOverlap(), MeshInputTest::testGoodGmsh(), MeshInputTest::testGoodSTL(), MeshInputTest::testGoodSTLBinary(), BoundaryInfoTest::testInternalBoundary(), MeshInputTest::testLowOrderEdgeBlocks(), BoundaryMeshSubdomainTest::testPerBoundarySubdomain(), SystemsTest::testProjectMatrix3D(), BoundaryInfoTest::testShellFaceConstraints(), MeshInputTest::testSingleElementImpl(), BoundaryMeshSubdomainTest::testSingleSubdomain(), WriteVecAndScalar::testSolution(), CheckpointIOTest::testSplitter(), MeshInputTest::testTetgenIO(), MeshSmootherTest::testVariationalSmoother(), libMesh::MeshTools::total_weight(), libMesh::NetGenMeshInterface::triangulate(), libMesh::Parallel::Packing< Elem * >::unpack(), libMesh::Parallel::Packing< Node * >::unpack(), libMesh::DTKAdapter::update_variable_values(), libMesh::MeshTools::volume(), libMesh::STLIO::write(), libMesh::XdrIO::write(), libMesh::NameBasedIO::write(), libMesh::CheckpointIO::write(), libMesh::EquationSystems::write(), libMesh::EquationSystems::write(), libMesh::GMVIO::write_discontinuous_gmv(), libMesh::ExodusII_IO::write_element_data(), libMesh::ExodusII_IO::write_element_data_from_discontinuous_nodal_data(), libMesh::ExodusII_IO_Helper::write_element_values(), libMesh::ExodusII_IO_Helper::write_element_values_element_major(), libMesh::ExodusII_IO_Helper::write_elements(), libMesh::ExodusII_IO_Helper::write_elemset_data(), libMesh::ExodusII_IO_Helper::write_elemsets(), libMesh::ExodusII_IO::write_global_data(), libMesh::ExodusII_IO_Helper::write_global_values(), libMesh::System::write_header(), libMesh::ExodusII_IO::write_information_records(), libMesh::ExodusII_IO_Helper::write_information_records(), libMesh::ExodusII_IO_Helper::write_nodal_coordinates(), libMesh::ExodusII_IO::write_nodal_data(), libMesh::VTKIO::write_nodal_data(), libMesh::UCDIO::write_nodal_data(), libMesh::ExodusII_IO::write_nodal_data_common(), libMesh::ExodusII_IO::write_nodal_data_discontinuous(), libMesh::ExodusII_IO_Helper::write_nodal_values(), libMesh::ExodusII_IO_Helper::write_nodeset_data(), libMesh::ExodusII_IO_Helper::write_nodesets(), libMesh::Nemesis_IO_Helper::write_nodesets(), libMesh::RBEIMEvaluation::write_out_interior_basis_functions(), libMesh::RBEIMEvaluation::write_out_node_basis_functions(), libMesh::RBEIMEvaluation::write_out_side_basis_functions(), write_output_solvedata(), libMesh::System::write_parallel_data(), libMesh::RBConstruction::write_riesz_representors_to_files(), libMesh::System::write_SCALAR_dofs(), libMesh::XdrIO::write_serialized_bc_names(), libMesh::XdrIO::write_serialized_bcs_helper(), libMesh::System::write_serialized_blocked_dof_objects(), libMesh::XdrIO::write_serialized_connectivity(), libMesh::System::write_serialized_data(), libMesh::XdrIO::write_serialized_nodes(), libMesh::XdrIO::write_serialized_nodesets(), libMesh::XdrIO::write_serialized_subdomain_names(), libMesh::System::write_serialized_vector(), libMesh::System::write_serialized_vectors(), libMesh::ExodusII_IO_Helper::write_sideset_data(), libMesh::ExodusII_IO_Helper::write_sidesets(), libMesh::Nemesis_IO_Helper::write_sidesets(), libMesh::ExodusII_IO::write_timestep(), libMesh::ExodusII_IO_Helper::write_timestep(), and libMesh::ExodusII_IO::write_timestep_discontinuous().

◆ reproducible_residual()

template<typename T >
bool libMesh::PetscNonlinearSolver< T >::reproducible_residual ( ) const
inline
Returns
Whether evaluating the residual twice at the same solution gives exactly the same result

Definition at line 200 of file petsc_nonlinear_solver.h.

200{ return _reproducible_residual; }

References libMesh::PetscNonlinearSolver< T >::_reproducible_residual.

◆ reuse_preconditioner()

template<typename T >
bool libMesh::PetscNonlinearSolver< T >::reuse_preconditioner ( ) const
overridevirtual

Getter for preconditioner reuse.

Reimplemented from libMesh::NonlinearSolver< T >.

Definition at line 1194 of file petsc_nonlinear_solver.C.

1195{
1196 return this->_reuse_preconditioner;
1197}
bool _reuse_preconditioner
Whether we should reuse the linear preconditioner.

◆ reuse_preconditioner_max_linear_its()

template<typename T >
unsigned int libMesh::PetscNonlinearSolver< T >::reuse_preconditioner_max_linear_its ( ) const
overridevirtual

Getter for the maximum iterations flag for preconditioner reuse.

Reimplemented from libMesh::NonlinearSolver< T >.

Definition at line 1200 of file petsc_nonlinear_solver.C.

1201{
1203}
unsigned int _reuse_preconditioner_max_linear_its
Number of linear iterations to retain the preconditioner.

◆ set_computing_base_vector()

template<typename T >
void libMesh::PetscNonlinearSolver< T >::set_computing_base_vector ( bool  computing_base_vector)
inline

Set whether we are computing the base vector for matrix-free finite-differencing.

Definition at line 205 of file petsc_nonlinear_solver.h.

References libMesh::PetscNonlinearSolver< T >::_computing_base_vector, and libMesh::PetscNonlinearSolver< T >::computing_base_vector().

◆ set_exact_constraint_enforcement()

template<typename T >
virtual void libMesh::NonlinearSolver< T >::set_exact_constraint_enforcement ( bool  enable)
inlinevirtualinherited

Enable (or disable; it is true by default) exact enforcement of constraints at the solver level, correcting any constrained DoF coefficients in current_local_solution as well as applying nonlinear residual and Jacobian terms based on constraint equations.

This is probably only safe to disable if user code is setting nonlinear residual and Jacobian terms based on constraint equations at an element-by-element level, by combining the asymmetric_constraint_rows option with the residual_constrain_element_vector processing option in DofMap.

Definition at line 413 of file nonlinear_solver.h.

414 {
416 }

References libMesh::NonlinearSolver< T >::_exact_constraint_enforcement.

◆ set_jacobian_zero_out()

template<typename T >
void libMesh::PetscNonlinearSolver< T >::set_jacobian_zero_out ( bool  state)
inline

Set if the jacobian should be zeroed out in the callback.

Definition at line 168 of file petsc_nonlinear_solver.h.

168{ _zero_out_jacobian = state; }

References libMesh::PetscNonlinearSolver< T >::_zero_out_jacobian.

◆ set_reproducible_residual()

template<typename T >
void libMesh::PetscNonlinearSolver< T >::set_reproducible_residual ( bool  state)
inline

Set whether evaluating the residual twice at the same solution gives exactly the same result.

This is used to decide whether to run the debug-mode check of matrix-free base vector reuse, which requires an exact match. The check is already skipped for MPI-parallel and threaded runs; applications whose assembly is non-deterministic for other reasons (e.g. due to device parallelism) should set this to false. This only disables the check; the base vector is still reused.

Definition at line 194 of file petsc_nonlinear_solver.h.

194{ _reproducible_residual = state; }

References libMesh::PetscNonlinearSolver< T >::_reproducible_residual.

◆ set_residual_zero_out()

template<typename T >
void libMesh::PetscNonlinearSolver< T >::set_residual_zero_out ( bool  state)
inline

Set if the residual should be zeroed out in the callback.

Definition at line 163 of file petsc_nonlinear_solver.h.

163{ _zero_out_residual = state; }

References libMesh::PetscNonlinearSolver< T >::_zero_out_residual.

◆ set_reuse_preconditioner()

template<typename T >
void libMesh::NonlinearSolver< T >::set_reuse_preconditioner ( bool  reuse)
virtualinherited

Set the reuse preconditioner flag.

Definition at line 94 of file nonlinear_solver.C.

95{
97}

◆ set_reuse_preconditioner_max_linear_its()

template<typename T >
void libMesh::NonlinearSolver< T >::set_reuse_preconditioner_max_linear_its ( unsigned int  i)
virtualinherited

Set the reuse_preconditioner_max_linear_its parameter.

Definition at line 106 of file nonlinear_solver.C.

◆ set_snesmf_reuse_base()

template<typename T >
void libMesh::PetscNonlinearSolver< T >::set_snesmf_reuse_base ( bool  state)
inline

Set to true to let PETSc reuse the base vector.

Definition at line 178 of file petsc_nonlinear_solver.h.

178{ _snesmf_reuse_base = state; }

References libMesh::PetscNonlinearSolver< T >::_snesmf_reuse_base.

◆ set_solver_configuration()

template<typename T >
void libMesh::NonlinearSolver< T >::set_solver_configuration ( SolverConfiguration &  solver_configuration)
inherited

Set the solver configuration object.

Definition at line 82 of file nonlinear_solver.C.

83{
84 _solver_configuration = &solver_configuration;
85}

◆ setup_default_monitor()

template<typename T >
void libMesh::PetscNonlinearSolver< T >::setup_default_monitor ( )

Setup the default monitor if required.

Definition at line 1186 of file petsc_nonlinear_solver.C.

1187{
1188 if (_default_monitor)
1189 LibmeshPetscCall(
1190 SNESMonitorSet(_snes, libmesh_petsc_snes_monitor, this, LIBMESH_PETSC_NULLPTR));
1191}
PetscErrorCode libmesh_petsc_snes_monitor(SNES, PetscInt its, PetscReal fnorm, void *)

References libMesh::libmesh_petsc_snes_monitor().

◆ snes()

template<typename T >
SNES libMesh::PetscNonlinearSolver< T >::snes ( const char *  name = nullptr)
Returns
The raw PETSc snes context pointer. This method calls init() so in that vein, we have an optional name prefix argument that if provided will be given to the SNES context

Definition at line 842 of file petsc_nonlinear_solver.C.

843{
844 this->init(name);
845 return _snes;
846}
virtual void init(const char *name=nullptr) override
Initialize data structures if not done so already.

◆ snes_mf_reuse_base()

template<typename T >
bool libMesh::PetscNonlinearSolver< T >::snes_mf_reuse_base ( ) const
inline
Returns
Whether we are reusing the nonlinear function evaluation as the base for doing matrix-free approximation of the Jacobian action

Definition at line 184 of file petsc_nonlinear_solver.h.

184{ return _snesmf_reuse_base; }

References libMesh::PetscNonlinearSolver< T >::_snesmf_reuse_base.

◆ solve() [1/2]

template<typename T >
std::pair< unsigned int, Real > libMesh::PetscNonlinearSolver< T >::solve ( SparseMatrix< T > &  jac_in,
SparseMatrix< T > &  pre_in,
NumericVector< T > &  x_in,
NumericVector< T > &  r_in,
const double  ,
const unsigned int   
)
overridevirtual

Call the Petsc solver, using jac_in as the actual SNES Jacobian operator (Amat) and pre_in as the preconditioning matrix (Pmat).

Reimplemented from libMesh::NonlinearSolver< T >.

Definition at line 917 of file petsc_nonlinear_solver.C.

923{
924 parallel_object_only();
925
926 LOG_SCOPE("solve()", "PetscNonlinearSolver");
927 this->init ();
928
929 // Make sure the data passed in are really of Petsc types
930 PetscMatrixBase<T> * jac = cast_ptr<PetscMatrixBase<T> *>(&jac_in);
931 PetscMatrixBase<T> * pre = cast_ptr<PetscMatrixBase<T> *>(&pre_in);
932 PetscVector<T> * x = cast_ptr<PetscVector<T> *>(&x_in);
933 PetscVector<T> * r = cast_ptr<PetscVector<T> *>(&r_in);
934
935 PetscInt n_iterations =0;
936 // Should actually be a PetscReal, but I don't know which version of PETSc first introduced PetscReal
937 Real final_residual_norm=0.;
938
939 // We don't want to do this twice because it resets
940 // SNESSetLagPreconditioner
942 {
943 _setup_reuse = true;
944 LibmeshPetscCall(SNESSetLagPreconditionerPersists(_snes, PETSC_TRUE));
945 // According to the PETSC 3.16.5 docs -2 is a magic number which
946 // means "recalculate the next time you need it and then not again"
947 LibmeshPetscCall(SNESSetLagPreconditioner(_snes, -2));
948 // Add in our callback which will trigger recalculating
949 // the preconditioner when we hit reuse_preconditioner_max_linear_its
950 LibmeshPetscCall(SNESMonitorSet(_snes, &libmesh_petsc_recalculate_monitor,
951 this,
952 NULL));
953 }
954 else if (!(reuse_preconditioner()))
955 // This covers the case where it was enabled but was then disabled
956 {
957 LibmeshPetscCall(SNESSetLagPreconditionerPersists(_snes, PETSC_FALSE));
958 if (_setup_reuse)
959 {
960 _setup_reuse = false;
961 LibmeshPetscCall(SNESMonitorCancel(_snes));
962 // Readd default monitor
964 }
965 }
966
967 LibmeshPetscCall(SNESSetFunction (_snes, r->vec(), libmesh_petsc_snes_residual, this));
968
969 // Only set the jacobian function if we've been provided with something to call.
970 // This allows a user to set their own jacobian function if they want to
971 if (this->jacobian || this->jacobian_object || this->residual_and_jacobian_object)
972 LibmeshPetscCall(SNESSetJacobian (_snes, jac->mat(), pre->mat(), libmesh_petsc_snes_jacobian, this));
973
974 // Have the Krylov subspace method use our good initial guess rather than 0
975 KSP ksp;
976 LibmeshPetscCall(SNESGetKSP (_snes, &ksp));
977
978 // Set the tolerances for the iterative solver. Use the user-supplied
979 // tolerance for the relative residual & leave the others at default values
980 LibmeshPetscCall(KSPSetTolerances (ksp, this->initial_linear_tolerance, PETSC_DEFAULT,
981 PETSC_DEFAULT, this->max_linear_iterations));
982
983 // Set the tolerances for the non-linear solver.
984 LibmeshPetscCall(SNESSetTolerances(_snes,
990
991 // Not supported by PETSc
992 if (this->absolute_step_tolerance != 0) // 0 is default value, both in MOOSE and libMesh
993 libmesh_warning("Setting the absolute step tolerance is not supported with the PETSc nonlinear solver.");
994
995 // Set the divergence tolerance for the non-linear solver
996#if !PETSC_VERSION_LESS_THAN(3,8,0)
997 LibmeshPetscCall(SNESSetDivergenceTolerance(_snes, this->divergence_tolerance));
998#endif
999
1000 //Pull in command-line options
1001#if PETSC_VERSION_LESS_THAN(3,7,0)
1002 LibmeshPetscCall(KSPSetFromOptions(ksp));
1003#endif
1004 LibmeshPetscCall(SNESSetFromOptions(_snes));
1005
1006 PC pc;
1007 LibmeshPetscCall(KSPGetPC(ksp, &pc));
1009
1010#if defined(LIBMESH_HAVE_PETSC_HYPRE) && PETSC_VERSION_LESS_THAN(3, 23, 0) && \
1011 !PETSC_VERSION_LESS_THAN(3, 12, 0) && defined(PETSC_HAVE_HYPRE_DEVICE)
1012 {
1013 // Make sure hypre has been initialized
1014 LibmeshPetscCallExternal(HYPRE_Initialize);
1015 PetscScalar * dummyarray;
1016 PetscMemType mtype;
1017 LibmeshPetscCall(VecGetArrayAndMemType(x->vec(), &dummyarray, &mtype));
1018 LibmeshPetscCall(VecRestoreArrayAndMemType(x->vec(), &dummyarray));
1019 if (PetscMemTypeHost(mtype))
1020 LibmeshPetscCallExternal(HYPRE_SetMemoryLocation, HYPRE_MEMORY_HOST);
1021 }
1022#endif
1023
1024 if (this->user_presolve)
1025 this->user_presolve(this->system());
1026
1027 //Set the preconditioning matrix
1028 if (this->_preconditioner)
1029 {
1030 this->_preconditioner->set_matrix(pre_in);
1031 this->_preconditioner->init();
1032 }
1033
1034 // If the SolverConfiguration object is provided, use it to override
1035 // solver options.
1036 if (this->_solver_configuration)
1038
1039 // In PETSc versions before 3.5.0, it is not possible to call
1040 // SNESSetUp() before the solution and rhs vectors are initialized, as
1041 // this triggers the
1042 //
1043 // "Solution vector cannot be right hand side vector!"
1044 //
1045 // error message. It is also not possible to call SNESSetSolution()
1046 // in those versions of PETSc to work around the problem, since that
1047 // API was removed in 3.0.0 and only restored in 3.6.0. The
1048 // overzealous check was moved out of SNESSetUp in PETSc 3.5.0
1049 // (petsc/petsc@154060b), so this code block should be safe to use
1050 // in 3.5.0 and later.
1051#if !PETSC_VERSION_LESS_THAN(3,6,0)
1052 LibmeshPetscCall(SNESSetSolution(_snes, x->vec()));
1053#endif
1054 LibmeshPetscCall(SNESSetUp(_snes));
1055
1056 Mat J, P;
1057 LibmeshPetscCall(SNESGetJacobian(_snes, &J, &P,
1058 LIBMESH_PETSC_NULLPTR,
1059 LIBMESH_PETSC_NULLPTR));
1060 LibmeshPetscCall(MatMFFDSetFunction(J, libmesh_petsc_snes_mffd_interface, this));
1061#if !PETSC_VERSION_LESS_THAN(3,8,4)
1062#ifndef NDEBUG
1063 // If we're in debug mode, do not reuse the nonlinear function evaluation as the base for doing
1064 // matrix-free approximations of the Jacobian action. Instead if the user requested that we reuse
1065 // the base, we'll check the base function evaluation and compare it to the nonlinear residual
1066 // evaluation. If they are different, then we'll error and inform the user that it's unsafe to
1067 // reuse the base
1068 LibmeshPetscCall(MatSNESMFSetReuseBase(J, PETSC_FALSE));
1069#else
1070 // Resue the residual vector from SNES
1071 LibmeshPetscCall(MatSNESMFSetReuseBase(J, static_cast<PetscBool>(_snesmf_reuse_base)));
1072#endif
1073#endif
1074
1075 // Only set the nullspace if we have a way of computing it and the result is non-empty.
1076 if (this->nullspace || this->nullspace_object)
1077 {
1078 WrappedPetsc<MatNullSpace> msp;
1079 this->build_mat_null_space(this->nullspace_object, this->nullspace, msp.get());
1080 if (msp)
1081 {
1082 LibmeshPetscCall(MatSetNullSpace(J, msp));
1083 if (P != J)
1084 LibmeshPetscCall(MatSetNullSpace(P, msp));
1085 }
1086 }
1087
1088 // Only set the transpose nullspace if we have a way of computing it and the result is non-empty.
1090 {
1091#if PETSC_VERSION_LESS_THAN(3,6,0)
1092 libmesh_warning("MatSetTransposeNullSpace is only supported for PETSc >= 3.6, transpose nullspace will be ignored.");
1093#else
1094 WrappedPetsc<MatNullSpace> msp;
1096 if (msp)
1097 {
1098 LibmeshPetscCall(MatSetTransposeNullSpace(J, msp));
1099 if (P != J)
1100 LibmeshPetscCall(MatSetTransposeNullSpace(P, msp));
1101 }
1102#endif
1103 }
1104
1105 // Only set the nearnullspace if we have a way of computing it and the result is non-empty.
1106 if (this->nearnullspace || this->nearnullspace_object)
1107 {
1108 WrappedPetsc<MatNullSpace> msp;
1109 this->build_mat_null_space(this->nearnullspace_object, this->nearnullspace, msp.get());
1110
1111 if (msp)
1112 {
1113 LibmeshPetscCall(MatSetNearNullSpace(J, msp));
1114 if (P != J)
1115 LibmeshPetscCall(MatSetNearNullSpace(P, msp));
1116 }
1117 }
1118
1119 SNESLineSearch linesearch;
1121 {
1122 LibmeshPetscCall(SNESGetLineSearch(_snes, &linesearch));
1123 LibmeshPetscCall(SNESLineSearchSetType(linesearch, SNESLINESEARCHSHELL));
1124#if PETSC_RELEASE_GREATER_EQUALS(3, 21, 0)
1125 LibmeshPetscCall(SNESLineSearchShellSetApply(linesearch, libmesh_petsc_linesearch_shellfunc, this));
1126#else
1127 LibmeshPetscCall(SNESLineSearchShellSetUserFunc(linesearch, libmesh_petsc_linesearch_shellfunc, this));
1128#endif
1129 }
1130
1131 LibmeshPetscCall(SNESSolve (_snes, LIBMESH_PETSC_NULLPTR, x->vec()));
1132
1133 LibmeshPetscCall(SNESGetIterationNumber(_snes, &n_iterations));
1134
1135 LibmeshPetscCall(SNESGetLinearSolveIterations(_snes, &_n_linear_iterations));
1136
1137 // SNESGetFunction has been around forever and should work on all
1138 // versions of PETSc. This is also now the recommended approach
1139 // according to the documentation for the PETSc 3.5.1 release:
1140 // http://www.mcs.anl.gov/petsc/documentation/changes/35.html
1141 Vec f;
1142 LibmeshPetscCall(SNESGetFunction(_snes, &f, 0, 0));
1143 LibmeshPetscCall(VecNorm(f, NORM_2, pPR(&final_residual_norm)));
1144
1145 // Get and store the reason for convergence
1146 LibmeshPetscCall(SNESGetConvergedReason(_snes, &_reason));
1147
1148 //Based on Petsc 2.3.3 documentation all diverged reasons are negative
1149 this->converged = (_reason >= 0);
1150
1151 // Reset data structure
1152 this->clear();
1153
1154 // return the # of its. and the final residual norm.
1155 return std::make_pair(n_iterations, final_residual_norm);
1156}
unsigned int max_nonlinear_iterations
Maximum number of non-linear iterations.
NonlinearImplicitSystem::ComputeJacobian * jacobian_object
Object that computes the Jacobian J(X) of the nonlinear system at the input iterate X.
void(* transpose_nullspace)(std::vector< NumericVector< Number > * > &sp, sys_type &S)
Function that computes a basis for the transpose Jacobian's nullspace – when solving a degenerate pro...
NonlinearImplicitSystem::ComputeVectorSubspace * transpose_nullspace_object
A callable object that computes a basis for the transpose Jacobian's nullspace – when solving a degen...
NonlinearImplicitSystem::ComputeVectorSubspace * nullspace_object
A callable object that computes a basis for the Jacobian's nullspace – the kernel or the "zero energy...
unsigned int max_linear_iterations
Each linear solver step should exit after max_linear_iterations is exceeded.
double absolute_residual_tolerance
The NonlinearSolver should exit after the residual is reduced to either less than absolute_residual_t...
void(* user_presolve)(sys_type &S)
Customizable function pointer which users can attach to the solver.
void(* nullspace)(std::vector< NumericVector< Number > * > &sp, sys_type &S)
Function that computes a basis for the Jacobian's nullspace – the kernel or the "zero energy modes" –...
NonlinearImplicitSystem::ComputeVectorSubspace * nearnullspace_object
A callable object that computes a basis for the Jacobian's near nullspace – the set of "low energy mo...
unsigned int max_function_evaluations
Maximum number of function evaluations.
void(* jacobian)(const NumericVector< Number > &X, SparseMatrix< Number > &J, sys_type &S)
Function that computes the Jacobian J(X) of the nonlinear system at the input iterate X.
double absolute_step_tolerance
The NonlinearSolver should exit after the full nonlinear step norm is reduced to either less than abs...
double initial_linear_tolerance
Any required linear solves will at first be done with this tolerance; the NonlinearSolver may tighten...
NonlinearImplicitSystem::ComputeResidualandJacobian * residual_and_jacobian_object
Object that computes either the residual or the Jacobian of the nonlinear system at the input itera...
double divergence_tolerance
The NonlinearSolver should exit if the residual becomes greater than the initial residual times the d...
bool converged
After a call to solve this will reflect whether or not the nonlinear solve was successful.
void(* nearnullspace)(std::vector< NumericVector< Number > * > &sp, sys_type &S)
Function that computes a basis for the Jacobian's near nullspace – the set of "low energy modes" – th...
virtual void clear() override
Release all memory and clear data structures.
friend PetscErrorCode libmesh_petsc_snes_jacobian(SNES snes, Vec x, Mat jac, Mat pc, void *ctx)
friend PetscErrorCode libmesh_petsc_snes_residual(SNES snes, Vec x, Vec r, void *ctx)
void build_mat_null_space(NonlinearImplicitSystem::ComputeVectorSubspace *computeSubspaceObject, void(*)(std::vector< NumericVector< Number > * > &, sys_type &), MatNullSpace *)
static void set_petsc_aux_data(PC &pc, System &sys, const unsigned v=0)
Builds PETSc auxiliary data needed by preconditioners such as hypre ams/ads.
virtual void configure_solver()=0
Apply solver options to a particular solver.
PetscReal * pPR(T *ptr)
PetscErrorCode libmesh_petsc_linesearch_shellfunc(SNESLineSearch linesearch, void *ctx)
PetscErrorCode libmesh_petsc_recalculate_monitor(SNES snes, PetscInt it, PetscReal norm, void *mctx)
PetscErrorCode libmesh_petsc_snes_mffd_interface(void *ctx, Vec x, Vec r)
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real

References libMesh::WrappedPetsc< T >::get(), libMesh::libmesh_petsc_linesearch_shellfunc(), libMesh::libmesh_petsc_recalculate_monitor(), libMesh::libmesh_petsc_snes_jacobian(), libMesh::libmesh_petsc_snes_mffd_interface(), libMesh::libmesh_petsc_snes_residual(), libMesh::PetscMatrixBase< T >::mat(), libMesh::pPR(), libMesh::Real, and libMesh::PetscPreconditioner< T >::set_petsc_aux_data().

◆ solve() [2/2]

template<typename T >
std::pair< unsigned int, Real > libMesh::PetscNonlinearSolver< T >::solve ( SparseMatrix< T > &  pre_in,
NumericVector< T > &  x_in,
NumericVector< T > &  r_in,
const double  tol,
const unsigned int  m_its 
)
overridevirtual

Call the Petsc solver, using the same matrix for the system and preconditioner matrices.

Calls the two-matrix overload below with pre_in for both.

Implements libMesh::NonlinearSolver< T >.

Definition at line 906 of file petsc_nonlinear_solver.C.

911{
912 return this->solve(pre_in, pre_in, x_in, r_in, tol, m_its);
913}
virtual std::pair< unsigned int, Real > solve(SparseMatrix< T > &pre_in, NumericVector< T > &, NumericVector< T > &, const double, const unsigned int) override
Call the Petsc solver, using the same matrix for the system and preconditioner matrices.

◆ system() [1/2]

template<typename T >
sys_type & libMesh::NonlinearSolver< T >::system ( )
inlineinherited
Returns
A writable reference to the system we are solving.

Definition at line 293 of file nonlinear_solver.h.

293{ return _system; }
sys_type & _system
A reference to the system we are solving.

References libMesh::NonlinearSolver< T >::_system.

◆ system() [2/2]

template<typename T >
const sys_type & libMesh::NonlinearSolver< T >::system ( ) const
inlineinherited

◆ use_default_monitor()

template<typename T >
void libMesh::PetscNonlinearSolver< T >::use_default_monitor ( bool  state)
inline

Set to true to use the libMesh's default monitor, set to false to use your own.

Definition at line 173 of file petsc_nonlinear_solver.h.

173{ _default_monitor = state; }

References libMesh::PetscNonlinearSolver< T >::_default_monitor.

Friends And Related Symbol Documentation

◆ libmesh_petsc_snes_fd_residual

template<typename T >
PetscErrorCode libmesh_petsc_snes_fd_residual ( SNES  snes,
Vec  x,
Vec  r,
void *  ctx 
)
friend

Definition at line 232 of file petsc_nonlinear_solver.C.

233 {
234 PetscFunctionBegin;
235
236 ResidualContext rc = libmesh_petsc_snes_residual_helper(snes, x, ctx);
237
238 libmesh_parallel_only(rc.sys.comm());
239
241 PetscVector<Number> R(r, rc.sys.comm());
242
243 if (rc.solver->_zero_out_residual)
244 R.zero();
245
246 if (rc.solver->fd_residual_object != nullptr)
247 rc.solver->fd_residual_object->residual(*rc.sys.current_local_solution.get(), R, rc.sys);
248
249 else if (rc.solver->residual_object != nullptr)
250 rc.solver->residual_object->residual(*rc.sys.current_local_solution.get(), R, rc.sys);
251
252 else
253 libmesh_error_msg("Error! Unable to compute residual for forming finite difference Jacobian!");
254
255 // Synchronize PETSc x to local solution since the local solution may be changed due to the constraints
256 PetscVector<Number> & X_sys = *cast_ptr<PetscVector<Number> *>(rc.sys.solution.get());
257 PetscVector<Number> X_global(x, rc.sys.comm());
258
259 X_global.swap(X_sys);
260 rc.sys.update();
261 X_global.swap(X_sys);
262
263 R.close();
264
265 if (rc.solver->_exact_constraint_enforcement)
266 {
267 rc.sys.get_dof_map().enforce_constraints_on_residual(rc.sys, &R, rc.sys.current_local_solution.get(), /*homogeneous=*/false);
268 R.close();
269 }
270
271 PetscFunctionReturn(LIBMESH_PETSC_SUCCESS);
272 }
friend ResidualContext libmesh_petsc_snes_residual_helper(SNES snes, Vec x, void *ctx)
SNES snes(const char *name=nullptr)
PetscFunctionReturn(LIBMESH_PETSC_SUCCESS)
template class LIBMESH_EXPORT PetscVector< Number >

◆ libmesh_petsc_snes_jacobian

template<typename T >
PetscErrorCode libmesh_petsc_snes_jacobian ( SNES  snes,
Vec  x,
Mat  jac,
Mat  pc,
void *  ctx 
)
friend

Definition at line 404 of file petsc_nonlinear_solver.C.

405 {
406 PetscFunctionBegin;
407
408 LOG_SCOPE("jacobian()", "PetscNonlinearSolver");
409
411
412 // No way to safety-check this cast, since we got a void *...
414 static_cast<PetscNonlinearSolver<Number> *> (ctx);
415
416 libmesh_parallel_only(solver->comm());
417
418 // Get the current iteration number from the snes object,
419 // store it in the PetscNonlinearSolver object for possible use
420 // by the user's Jacobian function.
421 {
422 PetscInt n_iterations = 0;
423 LibmeshPetscCall2(solver->comm(), SNESGetIterationNumber(snes, &n_iterations));
424 solver->_current_nonlinear_iteration_number = cast_int<unsigned>(n_iterations);
425 }
426
427 //-----------------------------------------------------------------------------
428 // if the user has provided both function pointers and objects only the pointer
429 // will be used, so catch that as an error
430 libmesh_error_msg_if(solver->jacobian && solver->jacobian_object,
431 "ERROR: cannot specify both a function and object to compute the Jacobian!");
432
433 libmesh_error_msg_if(solver->matvec && solver->residual_and_jacobian_object,
434 "ERROR: cannot specify both a function and object to compute the combined Residual & Jacobian!");
435
436 NonlinearImplicitSystem & sys = solver->system();
437
438 PetscMatrixBase<Number> * const PC = pc ? PetscMatrixBase<Number>::get_context(pc, sys.comm()) : nullptr;
439 PetscMatrixBase<Number> * Jac = jac ? PetscMatrixBase<Number>::get_context(jac, sys.comm()) : nullptr;
440 PetscVector<Number> & X_sys = *cast_ptr<PetscVector<Number> *>(sys.solution.get());
441 PetscVector<Number> X_global(x, sys.comm());
442
443 PetscMFFDMatrix<Number> mffd_jac(sys.comm());
444 PetscBool p_is_shell = PETSC_FALSE;
445 PetscBool j_is_mffd = PETSC_FALSE;
446 PetscBool j_is_shell = PETSC_FALSE;
447 if (pc)
448 LibmeshPetscCall2(sys.comm(), PetscObjectTypeCompare((PetscObject)pc, MATSHELL, &p_is_shell));
449 libmesh_assert(jac);
450 LibmeshPetscCall2(sys.comm(), PetscObjectTypeCompare((PetscObject)jac, MATMFFD, &j_is_mffd));
451 LibmeshPetscCall2(sys.comm(), PetscObjectTypeCompare((PetscObject)jac, MATSHELL, &j_is_shell));
452 if (j_is_mffd == PETSC_TRUE)
453 {
454 libmesh_assert(!Jac);
455 Jac = &mffd_jac;
456 // mffd_jac is function-local, so don't attach a context to jac here -- it would
457 // dangle once mffd_jac is destroyed at the end of this call.
458 mffd_jac.assign(jac, /*set_context=*/false);
459 }
460
461 // We already computed the Jacobian during the residual evaluation
462 if (solver->residual_and_jacobian_object)
463 {
464 // We could be doing matrix-free in which case we cannot rely on closing of explicit matrices
465 // that occurs during the PETSc residual callback
466 if ((j_is_shell == PETSC_TRUE) || (j_is_mffd == PETSC_TRUE))
467 Jac->close();
468
469 if (pc && (p_is_shell == PETSC_TRUE))
470 PC->close();
471
472 PetscFunctionReturn(LIBMESH_PETSC_SUCCESS);
473 }
474
475 // Set the dof maps
476 PC->attach_dof_map(sys.get_dof_map());
477 Jac->attach_dof_map(sys.get_dof_map());
478
479 // Use the systems update() to get a good local version of the parallel solution
480 X_global.swap(X_sys);
481 sys.update();
482 X_global.swap(X_sys);
483
484 // Enforce constraints (if any) exactly on the
485 // current_local_solution. This is the solution vector that is
486 // actually used in the computation of the residual below, and is
487 // not locked by debug-enabled PETSc the way that "x" is.
488 if (solver->_exact_constraint_enforcement)
489 sys.get_dof_map().enforce_constraints_exactly(sys, sys.current_local_solution.get());
490
491 if (solver->_zero_out_jacobian)
492 PC->zero();
493
494
495 if (solver->jacobian != nullptr)
496 solver->jacobian(*sys.current_local_solution.get(), *PC, sys);
497
498 else if (solver->jacobian_object != nullptr)
499 solver->jacobian_object->jacobian(*sys.current_local_solution.get(), *PC, sys);
500
501 else if (solver->matvec != nullptr)
502 solver->matvec(*sys.current_local_solution.get(), nullptr, PC, sys);
503
504 else
505 libmesh_error_msg("Error! Unable to compute residual and/or Jacobian!");
506
507 PC->close();
508 if (solver->_exact_constraint_enforcement)
509 {
510 sys.get_dof_map().enforce_constraints_on_jacobian(sys, PC);
511 PC->close();
512 }
513
514 if (Jac != PC)
515 {
516 // Assume that shells know what they're doing
517 libmesh_assert(!solver->_exact_constraint_enforcement || (j_is_mffd == PETSC_TRUE) ||
518 (j_is_shell == PETSC_TRUE));
519 Jac->close();
520 }
521
522 PetscFunctionReturn(LIBMESH_PETSC_SUCCESS);
523 }
static PetscMatrixBase< T > * get_context(Mat mat, const TIMPI::Communicator &comm)
template class LIBMESH_EXPORT PetscMatrixBase< Number >
template class LIBMESH_EXPORT PetscNonlinearSolver< Number >

◆ libmesh_petsc_snes_mffd_residual

template<typename T >
PetscErrorCode libmesh_petsc_snes_mffd_residual ( SNES  snes,
Vec  x,
Vec  r,
void *  ctx 
)
friend

Definition at line 278 of file petsc_nonlinear_solver.C.

279 {
280 PetscFunctionBegin;
281
282 ResidualContext rc = libmesh_petsc_snes_residual_helper(snes, x, ctx);
283
284 libmesh_parallel_only(rc.sys.comm());
285
287 PetscVector<Number> R(r, rc.sys.comm());
288
289 if (rc.solver->_zero_out_residual)
290 R.zero();
291
292 if (rc.solver->mffd_residual_object != nullptr)
293 rc.solver->mffd_residual_object->residual(*rc.sys.current_local_solution.get(), R, rc.sys);
294
295 else if (rc.solver->residual_object != nullptr)
296 rc.solver->residual_object->residual(*rc.sys.current_local_solution.get(), R, rc.sys);
297
298 else
299 libmesh_error_msg("Error! Unable to compute residual for forming finite differenced"
300 "Jacobian-vector products!");
301
302 // Synchronize PETSc x to local solution since the local solution may be changed due to the constraints
303 PetscVector<Number> & X_sys = *cast_ptr<PetscVector<Number> *>(rc.sys.solution.get());
304 PetscVector<Number> X_global(x, rc.sys.comm());
305
306 X_global.swap(X_sys);
307 rc.sys.update();
308 X_global.swap(X_sys);
309
310 R.close();
311
312 if (rc.solver->_exact_constraint_enforcement)
313 {
314 rc.sys.get_dof_map().enforce_constraints_on_residual(rc.sys, &R, rc.sys.current_local_solution.get(), /*homogeneous=*/false);
315 R.close();
316 }
317
318 PetscFunctionReturn(LIBMESH_PETSC_SUCCESS);
319 }

◆ libmesh_petsc_snes_precheck

template<typename T >
PetscErrorCode libmesh_petsc_snes_precheck ( SNESLineSearch  ,
Vec  X,
Vec  Y,
PetscBool *  changed,
void *  context 
)
friend

Definition at line 627 of file petsc_nonlinear_solver.C.

628 {
629 PetscFunctionBegin;
630
631 LOG_SCOPE("precheck()", "PetscNonlinearSolver");
632
633 // PETSc almost certainly initializes these to false already, but
634 // it doesn't hurt to be explicit.
635 *changed = PETSC_FALSE;
636
637 libmesh_assert(context);
638
639 // Cast the context to a NonlinearSolver object.
641 static_cast<PetscNonlinearSolver<Number> *> (context);
642
643 libmesh_parallel_only(solver->comm());
644
645 // It's possible that we don't need to do anything at all, in
646 // that case return early...
647 if (!solver->precheck_object)
648 PetscFunctionReturn(LIBMESH_PETSC_SUCCESS);
649
650 // The user sets these flags in his/her postcheck function to
651 // indicate whether they changed something.
652 bool
653 petsc_changed = false;
654
655 auto & sys = solver->system();
656 auto & x_sys = *cast_ptr<PetscVector<Number> *>(sys.solution.get());
657 PetscVector<Number> petsc_x(X, sys.comm());
658 PetscVector<Number> petsc_y(Y, sys.comm());
659
660 // Use the systems update() to get a good local version of the parallel solution
661 petsc_x.swap(x_sys);
662 sys.update();
663 petsc_x.swap(x_sys);
664
665 // Enforce constraints (if any) exactly on the
666 // current_local_solution. This is the solution vector that is
667 // actually used in the computation of residuals and Jacobians, and is
668 // not locked by debug-enabled PETSc the way that "x" is.
669 libmesh_assert(sys.current_local_solution.get());
670 auto & local_soln = *sys.current_local_solution.get();
671 if (solver->_exact_constraint_enforcement)
672 sys.get_dof_map().enforce_constraints_exactly(sys, &local_soln);
673
674 solver->precheck_object->precheck(local_soln,
675 petsc_y,
676 petsc_changed,
677 sys);
678
679 // Record whether the user changed the solution or the search direction.
680 if (petsc_changed)
681 *changed = PETSC_TRUE;
682
683 PetscFunctionReturn(LIBMESH_PETSC_SUCCESS);
684 }

◆ libmesh_petsc_snes_residual

template<typename T >
PetscErrorCode libmesh_petsc_snes_residual ( SNES  snes,
Vec  x,
Vec  r,
void *  ctx 
)
friend

Definition at line 156 of file petsc_nonlinear_solver.C.

157 {
158 PetscFunctionBegin;
159
160 ResidualContext rc = libmesh_petsc_snes_residual_helper(snes, x, ctx);
161
162 libmesh_parallel_only(rc.sys.comm());
163
165 PetscVector<Number> R(r, rc.sys.comm());
166
167 if (rc.solver->_zero_out_residual)
168 R.zero();
169
170 //-----------------------------------------------------------------------------
171 // if the user has provided both function pointers and objects only the pointer
172 // will be used, so catch that as an error
173 libmesh_error_msg_if(rc.solver->residual && rc.solver->residual_object,
174 "ERROR: cannot specify both a function and object to compute the Residual!");
175
176 libmesh_error_msg_if(rc.solver->matvec && rc.solver->residual_and_jacobian_object,
177 "ERROR: cannot specify both a function and object to compute the combined Residual & Jacobian!");
178
179 if (rc.solver->residual != nullptr)
180 rc.solver->residual(*rc.sys.current_local_solution.get(), R, rc.sys);
181
182 else if (rc.solver->residual_object != nullptr)
183 rc.solver->residual_object->residual(*rc.sys.current_local_solution.get(), R, rc.sys);
184
185 else if (rc.solver->matvec != nullptr)
186 rc.solver->matvec (*rc.sys.current_local_solution.get(), &R, nullptr, rc.sys);
187
188 else if (rc.solver->residual_and_jacobian_object != nullptr)
189 {
190 auto & jac = rc.sys.get_system_matrix();
191
192 if (rc.solver->_zero_out_jacobian)
193 jac.zero();
194
195 rc.solver->residual_and_jacobian_object->residual_and_jacobian(
196 *rc.sys.current_local_solution.get(), &R, &jac, rc.sys);
197
198 jac.close();
199 if (rc.solver->_exact_constraint_enforcement)
200 {
201 rc.sys.get_dof_map().enforce_constraints_on_jacobian(rc.sys, &jac);
202 jac.close();
203 }
204 }
205
206 else
207 libmesh_error_msg("Error! Unable to compute residual and/or Jacobian!");
208
209
210 // Synchronize PETSc x to local solution since the local solution may be changed due to the constraints
211 PetscVector<Number> & X_sys = *cast_ptr<PetscVector<Number> *>(rc.sys.solution.get());
212 PetscVector<Number> X_global(x, rc.sys.comm());
213
214 X_global.swap(X_sys);
215 rc.sys.update();
216 X_global.swap(X_sys);
217
218 R.close();
219
220 if (rc.solver->_exact_constraint_enforcement)
221 {
222 rc.sys.get_dof_map().enforce_constraints_on_residual(rc.sys, &R, rc.sys.current_local_solution.get(), /*homogeneous=*/false);
223 R.close();
224 }
225
226 PetscFunctionReturn(LIBMESH_PETSC_SUCCESS);
227 }

◆ libmesh_petsc_snes_residual_helper

template<typename T >
ResidualContext libmesh_petsc_snes_residual_helper ( SNES  snes,
Vec  x,
void *  ctx 
)
friend

Definition at line 57 of file petsc_nonlinear_solver.C.

58{
59 LOG_SCOPE("residual()", "PetscNonlinearSolver");
60
63
64 // No way to safety-check this cast, since we got a void *...
66 static_cast<PetscNonlinearSolver<Number> *> (ctx);
67
68 libmesh_parallel_only(solver->comm());
69
70 // Get the current iteration number from the snes object,
71 // store it in the PetscNonlinearSolver object for possible use
72 // by the user's residual function.
73 {
74 PetscInt n_iterations = 0;
75 LibmeshPetscCall2(solver->comm(), SNESGetIterationNumber(snes, &n_iterations));
76 solver->_current_nonlinear_iteration_number = cast_int<unsigned>(n_iterations);
77 }
78
79 NonlinearImplicitSystem & sys = solver->system();
80
81 PetscVector<Number> & X_sys = *cast_ptr<PetscVector<Number> *>(sys.solution.get());
82
83 PetscVector<Number> X_global(x, sys.comm());
84
85 // Use the system's update() to get a good local version of the
86 // parallel solution. This operation does not modify the incoming
87 // "x" vector, it only localizes information from "x" into
88 // sys.current_local_solution.
89 X_global.swap(X_sys);
90 sys.update();
91 X_global.swap(X_sys);
92
93 // Enforce constraints (if any) exactly on the
94 // current_local_solution. This is the solution vector that is
95 // actually used in the computation of the residual below, and is
96 // not locked by debug-enabled PETSc the way that "x" is.
97 if (solver->_exact_constraint_enforcement)
98 sys.get_dof_map().enforce_constraints_exactly(sys, sys.current_local_solution.get());
99
100 return ResidualContext(solver, sys);
101}

Member Data Documentation

◆ _communicator

const Parallel::Communicator& libMesh::ParallelObject::_communicator
protectedinherited

◆ _computing_base_vector

template<typename T >
bool libMesh::PetscNonlinearSolver< T >::_computing_base_vector
protected

Whether we are computing the base vector for matrix-free finite differencing.

Definition at line 311 of file petsc_nonlinear_solver.h.

Referenced by libMesh::PetscNonlinearSolver< T >::computing_base_vector(), and libMesh::PetscNonlinearSolver< T >::set_computing_base_vector().

◆ _counts

ReferenceCounter::Counts libMesh::ReferenceCounter::_counts
staticprotectedinherited

Actually holds the data.

Definition at line 124 of file reference_counter.h.

Referenced by libMesh::ReferenceCounter::get_info().

◆ _current_nonlinear_iteration_number

template<typename T >
unsigned libMesh::PetscNonlinearSolver< T >::_current_nonlinear_iteration_number
protected

Stores the current nonlinear iteration number.

Definition at line 275 of file petsc_nonlinear_solver.h.

Referenced by libMesh::PetscNonlinearSolver< T >::get_current_nonlinear_iteration_number().

◆ _default_monitor

template<typename T >
bool libMesh::PetscNonlinearSolver< T >::_default_monitor
protected

true if we want the default monitor to be set, false for no monitor (i.e.

user code can use their own)

Definition at line 290 of file petsc_nonlinear_solver.h.

Referenced by libMesh::PetscNonlinearSolver< T >::use_default_monitor().

◆ _dm_wrapper

template<typename T >
PetscDMWrapper libMesh::PetscNonlinearSolver< T >::_dm_wrapper
protected

Wrapper object for interacting with the "new" libMesh PETSc DM.

The new libMesh PETSc DM implementation is capable of geometric multigrid while the old implementation is not. The new implementation can be activated from the command line with –use_petsc_dm

Definition at line 324 of file petsc_nonlinear_solver.h.

◆ _enable_print_counter

bool libMesh::ReferenceCounter::_enable_print_counter = true
staticprotectedinherited

Flag to control whether reference count information is printed when print_info is called.

Definition at line 143 of file reference_counter.h.

Referenced by libMesh::ReferenceCounter::disable_print_counter_info(), libMesh::ReferenceCounter::enable_print_counter_info(), and libMesh::ReferenceCounter::print_info().

◆ _exact_constraint_enforcement

template<typename T >
bool libMesh::NonlinearSolver< T >::_exact_constraint_enforcement
protectedinherited

◆ _is_initialized

template<typename T >
bool libMesh::NonlinearSolver< T >::_is_initialized
protectedinherited

Flag indicating if the data structures have been initialized.

Definition at line 448 of file nonlinear_solver.h.

Referenced by libMesh::NonlinearSolver< T >::initialized().

◆ _mutex

Threads::spin_mutex libMesh::ReferenceCounter::_mutex
staticprotectedinherited

Mutual exclusion object to enable thread-safe reference counting.

Definition at line 137 of file reference_counter.h.

◆ _n_linear_iterations

template<typename T >
PetscInt libMesh::PetscNonlinearSolver< T >::_n_linear_iterations
protected

Stores the total number of linear iterations from the last solve.

Definition at line 270 of file petsc_nonlinear_solver.h.

◆ _n_objects

Threads::atomic< unsigned int > libMesh::ReferenceCounter::_n_objects
staticprotectedinherited

◆ _preconditioner

template<typename T >
Preconditioner<T>* libMesh::NonlinearSolver< T >::_preconditioner
protectedinherited

Holds the Preconditioner object to be used for the linear solves.

Definition at line 453 of file nonlinear_solver.h.

◆ _reason

template<typename T >
SNESConvergedReason libMesh::PetscNonlinearSolver< T >::_reason
protected

Store the reason for SNES convergence/divergence for use even after the _snes has been cleared.

Note
print_converged_reason() will always try to get the current reason with SNESGetConvergedReason(), but if the SNES object has already been cleared, it will fall back on this stored value. This value is therefore necessarily not cleared by the clear() function.

Definition at line 265 of file petsc_nonlinear_solver.h.

◆ _reproducible_residual

template<typename T >
bool libMesh::PetscNonlinearSolver< T >::_reproducible_residual
protected

◆ _reuse_preconditioner

template<typename T >
bool libMesh::NonlinearSolver< T >::_reuse_preconditioner
protectedinherited

Whether we should reuse the linear preconditioner.

Definition at line 427 of file nonlinear_solver.h.

◆ _reuse_preconditioner_max_linear_its

template<typename T >
unsigned int libMesh::NonlinearSolver< T >::_reuse_preconditioner_max_linear_its
protectedinherited

Number of linear iterations to retain the preconditioner.

Definition at line 438 of file nonlinear_solver.h.

◆ _setup_reuse

template<typename T >
bool libMesh::PetscNonlinearSolver< T >::_setup_reuse
protected

Whether we've triggered the preconditioner reuse.

Definition at line 316 of file petsc_nonlinear_solver.h.

◆ _snes

template<typename T >
WrappedPetsc<SNES> libMesh::PetscNonlinearSolver< T >::_snes
protected

Nonlinear solver context.

Definition at line 253 of file petsc_nonlinear_solver.h.

◆ _snesmf_reuse_base

template<typename T >
bool libMesh::PetscNonlinearSolver< T >::_snesmf_reuse_base
protected

True, If we want the base vector to be used for differencing even if the function provided to SNESSetFunction() is not the same as that provided to MatMFFDSetFunction().

https://www.mcs.anl.gov/petsc/petsc-current/docs/manualpages/SNES/MatSNESMFSetReuseBase.html

Definition at line 297 of file petsc_nonlinear_solver.h.

Referenced by libMesh::PetscNonlinearSolver< T >::set_snesmf_reuse_base(), and libMesh::PetscNonlinearSolver< T >::snes_mf_reuse_base().

◆ _solver_configuration

template<typename T >
SolverConfiguration* libMesh::NonlinearSolver< T >::_solver_configuration
protectedinherited

Optionally store a SolverOptions object that can be used to set parameters like solver type, tolerances and iteration limits.

Definition at line 459 of file nonlinear_solver.h.

◆ _system

template<typename T >
sys_type& libMesh::NonlinearSolver< T >::_system
protectedinherited

A reference to the system we are solving.

Definition at line 443 of file nonlinear_solver.h.

Referenced by libMesh::NonlinearSolver< T >::system(), and libMesh::NonlinearSolver< T >::system().

◆ _zero_out_jacobian

template<typename T >
bool libMesh::PetscNonlinearSolver< T >::_zero_out_jacobian
protected

true to zero out jacobian before going into application level call-back, otherwise false

Definition at line 285 of file petsc_nonlinear_solver.h.

Referenced by libMesh::PetscNonlinearSolver< T >::set_jacobian_zero_out().

◆ _zero_out_residual

template<typename T >
bool libMesh::PetscNonlinearSolver< T >::_zero_out_residual
protected

true to zero out residual before going into application level call-back, otherwise false

Definition at line 280 of file petsc_nonlinear_solver.h.

Referenced by libMesh::PetscNonlinearSolver< T >::set_residual_zero_out().

◆ absolute_residual_tolerance

template<typename T >
double libMesh::NonlinearSolver< T >::absolute_residual_tolerance
inherited

The NonlinearSolver should exit after the residual is reduced to either less than absolute_residual_tolerance or less than relative_residual_tolerance times the initial residual.

Users should increase any of these tolerances that they want to use for a stopping condition.

Definition at line 320 of file nonlinear_solver.h.

◆ absolute_step_tolerance

template<typename T >
double libMesh::NonlinearSolver< T >::absolute_step_tolerance
inherited

The NonlinearSolver should exit after the full nonlinear step norm is reduced to either less than absolute_step_tolerance or less than relative_step_tolerance times the largest nonlinear solution which has been seen so far.

Users should increase any of these tolerances that they want to use for a stopping condition.

Note
Not all NonlinearSolvers support relative_step_tolerance!

Definition at line 343 of file nonlinear_solver.h.

◆ bounds

template<typename T >
void(* libMesh::NonlinearSolver< T >::bounds) (NumericVector< Number > &XL, NumericVector< Number > &XU, sys_type &S)
inherited

Function that computes the lower and upper bounds XL and XU on the solution of the nonlinear system.

Definition at line 205 of file nonlinear_solver.h.

◆ bounds_object

template<typename T >
NonlinearImplicitSystem::ComputeBounds* libMesh::NonlinearSolver< T >::bounds_object
inherited

Object that computes the bounds vectors \( XL \) and \( XU \).

Definition at line 211 of file nonlinear_solver.h.

◆ converged

template<typename T >
bool libMesh::NonlinearSolver< T >::converged
inherited

After a call to solve this will reflect whether or not the nonlinear solve was successful.

Definition at line 367 of file nonlinear_solver.h.

◆ divergence_tolerance

template<typename T >
double libMesh::NonlinearSolver< T >::divergence_tolerance
inherited

The NonlinearSolver should exit if the residual becomes greater than the initial residual times the divergence_tolerance.

Users should adjust this tolerances to prevent divergence of the NonlinearSolver.

Definition at line 330 of file nonlinear_solver.h.

◆ fd_residual_object

template<typename T >
NonlinearImplicitSystem::ComputeResidual* libMesh::NonlinearSolver< T >::fd_residual_object
inherited

Object that computes the residual R(X) of the nonlinear system at the input iterate X for the purpose of forming a finite-differenced Jacobian.

Definition at line 158 of file nonlinear_solver.h.

◆ initial_linear_tolerance

template<typename T >
double libMesh::NonlinearSolver< T >::initial_linear_tolerance
inherited

Any required linear solves will at first be done with this tolerance; the NonlinearSolver may tighten the tolerance for later solves.

Definition at line 356 of file nonlinear_solver.h.

◆ jacobian

template<typename T >
void(* libMesh::NonlinearSolver< T >::jacobian) (const NumericVector< Number > &X, SparseMatrix< Number > &J, sys_type &S)
inherited

Function that computes the Jacobian J(X) of the nonlinear system at the input iterate X.

Definition at line 171 of file nonlinear_solver.h.

Referenced by libMesh::Problem_Interface::computeJacobian(), and libMesh::Problem_Interface::computePreconditioner().

◆ jacobian_object

template<typename T >
NonlinearImplicitSystem::ComputeJacobian* libMesh::NonlinearSolver< T >::jacobian_object
inherited

Object that computes the Jacobian J(X) of the nonlinear system at the input iterate X.

Definition at line 179 of file nonlinear_solver.h.

Referenced by libMesh::Problem_Interface::computeJacobian(), and libMesh::Problem_Interface::computePreconditioner().

◆ linesearch_object

template<typename T >
std::unique_ptr<ComputeLineSearchObject> libMesh::PetscNonlinearSolver< T >::linesearch_object

A callable object that can be used to specify a custom line-search.

Definition at line 226 of file petsc_nonlinear_solver.h.

Referenced by libMesh::libmesh_petsc_linesearch_shellfunc().

◆ matvec

template<typename T >
void(* libMesh::NonlinearSolver< T >::matvec) (const NumericVector< Number > &X, NumericVector< Number > *R, SparseMatrix< Number > *J, sys_type &S)
inherited

Function that computes either the residual \( R(X) \) or the Jacobian \( J(X) \) of the nonlinear system at the input iterate \( X \).

Note
Either R or J could be nullptr.

Definition at line 188 of file nonlinear_solver.h.

Referenced by libMesh::Problem_Interface::computeJacobian(), and libMesh::Problem_Interface::computePreconditioner().

◆ max_function_evaluations

template<typename T >
unsigned int libMesh::NonlinearSolver< T >::max_function_evaluations
inherited

Maximum number of function evaluations.

Definition at line 308 of file nonlinear_solver.h.

◆ max_linear_iterations

template<typename T >
unsigned int libMesh::NonlinearSolver< T >::max_linear_iterations
inherited

Each linear solver step should exit after max_linear_iterations is exceeded.

Definition at line 350 of file nonlinear_solver.h.

◆ max_nonlinear_iterations

template<typename T >
unsigned int libMesh::NonlinearSolver< T >::max_nonlinear_iterations
inherited

Maximum number of non-linear iterations.

Definition at line 303 of file nonlinear_solver.h.

◆ mffd_residual_object

template<typename T >
NonlinearImplicitSystem::ComputeResidual* libMesh::NonlinearSolver< T >::mffd_residual_object
inherited

Object that computes the residual R(X) of the nonlinear system at the input iterate X for the purpose of forming Jacobian-vector products via finite differencing.

Definition at line 165 of file nonlinear_solver.h.

◆ minimum_linear_tolerance

template<typename T >
double libMesh::NonlinearSolver< T >::minimum_linear_tolerance
inherited

The tolerance for linear solves is kept above this minimum.

Definition at line 361 of file nonlinear_solver.h.

◆ nearnullspace

template<typename T >
void(* libMesh::NonlinearSolver< T >::nearnullspace) (std::vector< NumericVector< Number > * > &sp, sys_type &S)
inherited

Function that computes a basis for the Jacobian's near nullspace – the set of "low energy modes" – that can be used for AMG coarsening, if the solver supports it (e.g., ML, PETSc's GAMG).

Definition at line 248 of file nonlinear_solver.h.

◆ nearnullspace_object

template<typename T >
NonlinearImplicitSystem::ComputeVectorSubspace* libMesh::NonlinearSolver< T >::nearnullspace_object
inherited

A callable object that computes a basis for the Jacobian's near nullspace – the set of "low energy modes" – that can be used for AMG coarsening, if the solver supports it (e.g., ML, PETSc's GAMG).

Definition at line 255 of file nonlinear_solver.h.

◆ nullspace

template<typename T >
void(* libMesh::NonlinearSolver< T >::nullspace) (std::vector< NumericVector< Number > * > &sp, sys_type &S)
inherited

Function that computes a basis for the Jacobian's nullspace – the kernel or the "zero energy modes" – that can be used in solving a degenerate problem iteratively, if the solver supports it (e.g., PETSc's KSP).

Definition at line 219 of file nonlinear_solver.h.

◆ nullspace_object

template<typename T >
NonlinearImplicitSystem::ComputeVectorSubspace* libMesh::NonlinearSolver< T >::nullspace_object
inherited

A callable object that computes a basis for the Jacobian's nullspace – the kernel or the "zero energy modes" – that can be used in solving a degenerate problem iteratively, if the solver supports it (e.g., PETSc's KSP).

Definition at line 227 of file nonlinear_solver.h.

◆ postcheck

template<typename T >
void(* libMesh::NonlinearSolver< T >::postcheck) (const NumericVector< Number > &old_soln, NumericVector< Number > &search_direction, NumericVector< Number > &new_soln, bool &changed_search_direction, bool &changed_new_soln, sys_type &S)
inherited

Function that performs a "check" on the Newton search direction and solution after each nonlinear step.

See documentation for the NonlinearImplicitSystem::ComputePostCheck object for more information about the calling sequence.

Definition at line 269 of file nonlinear_solver.h.

Referenced by libMesh::libmesh_petsc_snes_postcheck().

◆ postcheck_object

template<typename T >
NonlinearImplicitSystem::ComputePostCheck* libMesh::NonlinearSolver< T >::postcheck_object
inherited

A callable object that is executed after each nonlinear iteration.

Allows the user to modify both the search direction and the solution vector in an application-specific way.

Definition at line 281 of file nonlinear_solver.h.

Referenced by libMesh::libmesh_petsc_snes_postcheck().

◆ precheck_object

template<typename T >
NonlinearImplicitSystem::ComputePreCheck* libMesh::NonlinearSolver< T >::precheck_object
inherited

Definition at line 283 of file nonlinear_solver.h.

◆ relative_residual_tolerance

template<typename T >
double libMesh::NonlinearSolver< T >::relative_residual_tolerance
inherited

Definition at line 321 of file nonlinear_solver.h.

◆ relative_step_tolerance

template<typename T >
double libMesh::NonlinearSolver< T >::relative_step_tolerance
inherited

Definition at line 344 of file nonlinear_solver.h.

◆ residual

template<typename T >
void(* libMesh::NonlinearSolver< T >::residual) (const NumericVector< Number > &X, NumericVector< Number > &R, sys_type &S)
inherited

Function that computes the residual R(X) of the nonlinear system at the input iterate X.

Definition at line 144 of file nonlinear_solver.h.

◆ residual_and_jacobian_object

template<typename T >
NonlinearImplicitSystem::ComputeResidualandJacobian* libMesh::NonlinearSolver< T >::residual_and_jacobian_object
inherited

Object that computes either the residual \( R(X) \) or the Jacobian \( J(X) \) of the nonlinear system at the input iterate \( X \).

Note
Either R or J could be nullptr.

Definition at line 200 of file nonlinear_solver.h.

Referenced by libMesh::Problem_Interface::computeJacobian(), and libMesh::Problem_Interface::computePreconditioner().

◆ residual_object

template<typename T >
NonlinearImplicitSystem::ComputeResidual* libMesh::NonlinearSolver< T >::residual_object
inherited

Object that computes the residual R(X) of the nonlinear system at the input iterate X.

Definition at line 152 of file nonlinear_solver.h.

◆ transpose_nullspace

template<typename T >
void(* libMesh::NonlinearSolver< T >::transpose_nullspace) (std::vector< NumericVector< Number > * > &sp, sys_type &S)
inherited

Function that computes a basis for the transpose Jacobian's nullspace – when solving a degenerate problem iteratively, if the solver supports it (e.g., PETSc's KSP), it is used to remove contributions outside of R(jac)

Definition at line 234 of file nonlinear_solver.h.

◆ transpose_nullspace_object

template<typename T >
NonlinearImplicitSystem::ComputeVectorSubspace* libMesh::NonlinearSolver< T >::transpose_nullspace_object
inherited

A callable object that computes a basis for the transpose Jacobian's nullspace – when solving a degenerate problem iteratively, if the solver supports it (e.g., PETSc's KSP), it is used to remove contributions outside of R(jac)

Definition at line 241 of file nonlinear_solver.h.

◆ user_presolve

template<typename T >
void(* libMesh::NonlinearSolver< T >::user_presolve) (sys_type &S)
inherited

Customizable function pointer which users can attach to the solver.

Gets called prior to every call to solve().

Definition at line 261 of file nonlinear_solver.h.


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