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, Realsolve (SparseMatrix< T > &, NumericVector< T > &, NumericVector< T > &, const double, const unsigned int) override
 Call the Petsc solver.
 
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_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_typesystem () const
 
sys_typesystem ()
 
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::Communicatorcomm () 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< ComputeLineSearchObjectlinesearch_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::ComputeResidualresidual_object
 Object that computes the residual R(X) of the nonlinear system at the input iterate X.
 
NonlinearImplicitSystem::ComputeResidualfd_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::ComputeResidualmffd_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::ComputeJacobianjacobian_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::ComputeResidualandJacobianresidual_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::ComputeBoundsbounds_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::ComputeVectorSubspacenullspace_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::ComputeVectorSubspacetranspose_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::ComputeVectorSubspacenearnullspace_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::ComputePostCheckpostcheck_object
 A callable object that is executed after each nonlinear iteration.
 
NonlinearImplicitSystem::ComputePreCheckprecheck_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 _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.
 
PetscMFFDMatrix< Number_mffd_jac
 Wrapper for matrix-free finite-difference Jacobians.
 
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 688 of file petsc_nonlinear_solver.C.

688 :
689 NonlinearSolver<T>(system_in),
690 linesearch_object(nullptr),
691 _reason(SNES_CONVERGED_ITERATING/*==0*/), // Arbitrary initial value...
694 _zero_out_residual(true),
695 _zero_out_jacobian(true),
696 _default_monitor(true),
697 _snesmf_reuse_base(true),
699 _setup_reuse(false),
701{
702}
const Parallel::Communicator & _communicator
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.
PetscMFFDMatrix< Number > _mffd_jac
Wrapper for matrix-free finite-difference Jacobians.

◆ ~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 847 of file petsc_nonlinear_solver.C.

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

713{
714 if (this->initialized())
715 {
716 this->_is_initialized = false;
717
718 // If we don't need the preconditioner next time
719 // retain the original behavior of clearing the data
720 // between solves.
721 if (!(reuse_preconditioner()))
722 {
723 // SNESReset really ought to work but replacing destroy() with
724 // SNESReset causes a very slight change in behavior that
725 // manifests as two failed MOOSE tests...
726 _snes.destroy();
727 }
728
729 // Reset the nonlinear iteration counter. This information is only relevant
730 // *during* the solve(). After the solve is completed it should return to
731 // the default value of 0.
733 }
734}
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; }

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::MeshBase::cache_elem_data(), libMesh::DofMap::check_dirichlet_bcid_consistency(), libMesh::MeshTetInterface::check_hull_integrity(), 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::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_mffd_interface(), 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::MeshBase::n_constraint_rows(), 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(), 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(), 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 182 of file petsc_nonlinear_solver.h.

182{ return _computing_base_vector; }

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

Referenced by libMesh::libmesh_petsc_snes_mffd_interface(), and 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 403 of file nonlinear_solver.h.

404 {
406 }
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 1188 of file petsc_nonlinear_solver.C.

1189{
1190 // Easiest way is just to clear everything out
1191 this->_is_initialized = false;
1192 _snes.destroy();
1193 _setup_reuse = false;
1194}

◆ 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 1153 of file petsc_nonlinear_solver.C.

1154{
1155 if (this->initialized())
1156 LibmeshPetscCall(SNESGetConvergedReason(_snes, &_reason));
1157
1158 return _reason;
1159}

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 145 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 1162 of file petsc_nonlinear_solver.C.

1163{
1164 return _n_linear_iterations;
1165}

◆ 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 737 of file petsc_nonlinear_solver.C.

738{
739 parallel_object_only();
740
741 // Initialize the data structures if not done so already.
742 if (!this->initialized())
743 {
744 this->_is_initialized = true;
745
746 // Make only if we don't already have a retained snes
747 // hanging around from the last solve
748 if (!_snes)
749 LibmeshPetscCall(SNESCreate(this->comm().get(), _snes.get()));
750
751 // I believe all of the following can be safely repeated
752 // even on an old snes instance from the last solve
753
754 if (name)
755 {
756 libmesh_assert(std::string(name).front() != '-');
757 libmesh_assert(std::string(name).back() == '_');
758 LibmeshPetscCall(SNESSetOptionsPrefix(_snes, name));
759 }
760
761 // Attaching a DM to SNES.
762#if defined(LIBMESH_ENABLE_AMR) && defined(LIBMESH_HAVE_METAPHYSICL)
763 bool use_petsc_dm = libMesh::on_command_line(
764 "--" + (name ? std::string(name) : std::string("")) + "use_petsc_dm");
765
766 // This needs to be called before SNESSetFromOptions
767 if (use_petsc_dm)
769 else
770#endif
771 {
772 WrappedPetsc<DM> dm;
773 LibmeshPetscCall(DMCreate(this->comm().get(), dm.get()));
774 LibmeshPetscCall(DMSetType(dm, DMLIBMESH));
775 LibmeshPetscCall(DMlibMeshSetSystem(dm, this->system()));
776
777 if (name)
778 LibmeshPetscCall(DMSetOptionsPrefix(dm, name));
779
780 LibmeshPetscCall(DMSetFromOptions(dm));
781 LibmeshPetscCall(DMSetUp(dm));
782 LibmeshPetscCall(SNESSetDM(_snes, dm));
783 // SNES now owns the reference to dm.
784 }
785
787
788 // If the SolverConfiguration object is provided, use it to set
789 // options during solver initialization.
790 if (this->_solver_configuration)
791 {
793 }
794
795 if (this->_preconditioner)
796 {
797 KSP ksp;
798 LibmeshPetscCall(SNESGetKSP (_snes, &ksp));
799 PC pc;
800 LibmeshPetscCall(KSPGetPC(ksp,&pc));
801
802 this->_preconditioner->init();
803
804 LibmeshPetscCall(PCSetType(pc, PCSHELL));
805 LibmeshPetscCall(PCShellSetContext(pc,(void *)this->_preconditioner));
806
807 //Re-Use the shell functions from petsc_linear_solver
808 LibmeshPetscCall(PCShellSetSetUp(pc,libmesh_petsc_preconditioner_setup));
809 LibmeshPetscCall(PCShellSetApply(pc,libmesh_petsc_preconditioner_apply));
810 }
811 }
812
813
814 // Tell PETSc about our linesearch "post-check" function, but only
815 // if the user has provided one. There seem to be extra,
816 // unnecessary residual calculations if a postcheck function is
817 // attached for no reason.
818 if (this->postcheck || this->postcheck_object)
819 {
820 SNESLineSearch linesearch;
821 LibmeshPetscCall(SNESGetLineSearch(_snes, &linesearch));
822
823 LibmeshPetscCall(SNESLineSearchSetPostCheck(linesearch, libmesh_petsc_snes_postcheck, this));
824 }
825
826 if (this->precheck_object)
827 {
828 SNESLineSearch linesearch;
829 LibmeshPetscCall(SNESGetLineSearch(_snes, &linesearch));
830
831 LibmeshPetscCall(SNESLineSearchSetPreCheck(linesearch, libmesh_petsc_snes_precheck, this));
832 }
833}
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(), 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::DistributedMesh::DistributedMesh(), 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_unique_id(), libMesh::DofMap::set_nonlocal_dof_objects(), libMesh::PetscDMWrapper::set_point_range_in_section(), WriteVecAndScalar::setupTests(), libMesh::RBEIMEvaluation::side_gather_bfs(), DistributedMeshTest::testRemoteElemError(), CheckpointIOTest::testSplitter(), libMesh::DistributedMesh::update_parallel_id_counts(), 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 1143 of file petsc_nonlinear_solver.C.

1144{
1145
1146 libMesh::out << "Nonlinear solver convergence/divergence reason: "
1147 << SNESConvergedReasons[this->get_converged_reason()] << std::endl;
1148}
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::ExodusII_IO_Helper::create(), libMesh::MeshCommunication::delete_remote_elements(), libMesh::DistributedMesh::DistributedMesh(), 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::MeshBase::n_constraint_rows(), 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_unique_id(), 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(), 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::testExodusFileMappings(), MeshInputTest::testExodusIGASidesets(), MeshInputTest::testExodusWriteElementDataFromDiscontinuousNodalData(), 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::DistributedMesh::update_parallel_id_counts(), 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().

◆ 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 1176 of file petsc_nonlinear_solver.C.

1177{
1178 return this->_reuse_preconditioner;
1179}
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 1182 of file petsc_nonlinear_solver.C.

1183{
1185}
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_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 398 of file nonlinear_solver.h.

399 {
401 }

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 156 of file petsc_nonlinear_solver.h.

156{ _zero_out_jacobian = state; }

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

◆ 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 151 of file petsc_nonlinear_solver.h.

151{ _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 166 of file petsc_nonlinear_solver.h.

166{ _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 1168 of file petsc_nonlinear_solver.C.

1169{
1170 if (_default_monitor)
1171 LibmeshPetscCall(
1172 SNESMonitorSet(_snes, libmesh_petsc_snes_monitor, this, LIBMESH_PETSC_NULLPTR));
1173}
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 837 of file petsc_nonlinear_solver.C.

838{
839 this->init(name);
840 return _snes;
841}
virtual void init(const char *name=nullptr) override
Initialize data structures if not done so already.

Referenced by libMesh::libmesh_petsc_snes_mffd_interface().

◆ 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 172 of file petsc_nonlinear_solver.h.

172{ return _snesmf_reuse_base; }

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

Referenced by libMesh::libmesh_petsc_snes_mffd_interface().

◆ solve()

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  ,
const unsigned int   
)
overridevirtual

Call the Petsc solver.

It calls the method below, using the same matrix for the system and preconditioner matrices.

Implements libMesh::NonlinearSolver< T >.

Definition at line 901 of file petsc_nonlinear_solver.C.

906{
907 parallel_object_only();
908
909 LOG_SCOPE("solve()", "PetscNonlinearSolver");
910 this->init ();
911
912 // Make sure the data passed in are really of Petsc types
913 PetscMatrixBase<T> * pre = cast_ptr<PetscMatrixBase<T> *>(&pre_in);
914 PetscVector<T> * x = cast_ptr<PetscVector<T> *>(&x_in);
915 PetscVector<T> * r = cast_ptr<PetscVector<T> *>(&r_in);
916
917 PetscInt n_iterations =0;
918 // Should actually be a PetscReal, but I don't know which version of PETSc first introduced PetscReal
919 Real final_residual_norm=0.;
920
921 // We don't want to do this twice because it resets
922 // SNESSetLagPreconditioner
924 {
925 _setup_reuse = true;
926 LibmeshPetscCall(SNESSetLagPreconditionerPersists(_snes, PETSC_TRUE));
927 // According to the PETSC 3.16.5 docs -2 is a magic number which
928 // means "recalculate the next time you need it and then not again"
929 LibmeshPetscCall(SNESSetLagPreconditioner(_snes, -2));
930 // Add in our callback which will trigger recalculating
931 // the preconditioner when we hit reuse_preconditioner_max_linear_its
932 LibmeshPetscCall(SNESMonitorSet(_snes, &libmesh_petsc_recalculate_monitor,
933 this,
934 NULL));
935 }
936 else if (!(reuse_preconditioner()))
937 // This covers the case where it was enabled but was then disabled
938 {
939 LibmeshPetscCall(SNESSetLagPreconditionerPersists(_snes, PETSC_FALSE));
940 if (_setup_reuse)
941 {
942 _setup_reuse = false;
943 LibmeshPetscCall(SNESMonitorCancel(_snes));
944 // Readd default monitor
946 }
947 }
948
949 LibmeshPetscCall(SNESSetFunction (_snes, r->vec(), libmesh_petsc_snes_residual, this));
950
951 // Only set the jacobian function if we've been provided with something to call.
952 // This allows a user to set their own jacobian function if they want to
953 if (this->jacobian || this->jacobian_object || this->residual_and_jacobian_object)
954 LibmeshPetscCall(SNESSetJacobian (_snes, pre->mat(), pre->mat(), libmesh_petsc_snes_jacobian, this));
955
956 // Have the Krylov subspace method use our good initial guess rather than 0
957 KSP ksp;
958 LibmeshPetscCall(SNESGetKSP (_snes, &ksp));
959
960 // Set the tolerances for the iterative solver. Use the user-supplied
961 // tolerance for the relative residual & leave the others at default values
962 LibmeshPetscCall(KSPSetTolerances (ksp, this->initial_linear_tolerance, PETSC_DEFAULT,
963 PETSC_DEFAULT, this->max_linear_iterations));
964
965 // Set the tolerances for the non-linear solver.
966 LibmeshPetscCall(SNESSetTolerances(_snes,
972
973 // Not supported by PETSc
974 if (this->absolute_step_tolerance != 0) // 0 is default value, both in MOOSE and libMesh
975 libmesh_warning("Setting the absolute step tolerance is not supported with the PETSc nonlinear solver.");
976
977 // Set the divergence tolerance for the non-linear solver
978#if !PETSC_VERSION_LESS_THAN(3,8,0)
979 LibmeshPetscCall(SNESSetDivergenceTolerance(_snes, this->divergence_tolerance));
980#endif
981
982 //Pull in command-line options
983#if PETSC_VERSION_LESS_THAN(3,7,0)
984 LibmeshPetscCall(KSPSetFromOptions(ksp));
985#endif
986 LibmeshPetscCall(SNESSetFromOptions(_snes));
987
988 PC pc;
989 LibmeshPetscCall(KSPGetPC(ksp, &pc));
991
992#if defined(LIBMESH_HAVE_PETSC_HYPRE) && PETSC_VERSION_LESS_THAN(3, 23, 0) && \
993 !PETSC_VERSION_LESS_THAN(3, 12, 0) && defined(PETSC_HAVE_HYPRE_DEVICE)
994 {
995 // Make sure hypre has been initialized
996 LibmeshPetscCallExternal(HYPRE_Initialize);
997 PetscScalar * dummyarray;
998 PetscMemType mtype;
999 LibmeshPetscCall(VecGetArrayAndMemType(x->vec(), &dummyarray, &mtype));
1000 LibmeshPetscCall(VecRestoreArrayAndMemType(x->vec(), &dummyarray));
1001 if (PetscMemTypeHost(mtype))
1002 LibmeshPetscCallExternal(HYPRE_SetMemoryLocation, HYPRE_MEMORY_HOST);
1003 }
1004#endif
1005
1006 if (this->user_presolve)
1007 this->user_presolve(this->system());
1008
1009 //Set the preconditioning matrix
1010 if (this->_preconditioner)
1011 {
1012 this->_preconditioner->set_matrix(pre_in);
1013 this->_preconditioner->init();
1014 }
1015
1016 // If the SolverConfiguration object is provided, use it to override
1017 // solver options.
1018 if (this->_solver_configuration)
1020
1021 // In PETSc versions before 3.5.0, it is not possible to call
1022 // SNESSetUp() before the solution and rhs vectors are initialized, as
1023 // this triggers the
1024 //
1025 // "Solution vector cannot be right hand side vector!"
1026 //
1027 // error message. It is also not possible to call SNESSetSolution()
1028 // in those versions of PETSc to work around the problem, since that
1029 // API was removed in 3.0.0 and only restored in 3.6.0. The
1030 // overzealous check was moved out of SNESSetUp in PETSc 3.5.0
1031 // (petsc/petsc@154060b), so this code block should be safe to use
1032 // in 3.5.0 and later.
1033#if !PETSC_VERSION_LESS_THAN(3,6,0)
1034 LibmeshPetscCall(SNESSetSolution(_snes, x->vec()));
1035#endif
1036 LibmeshPetscCall(SNESSetUp(_snes));
1037
1038 Mat J, P;
1039 LibmeshPetscCall(SNESGetJacobian(_snes, &J, &P,
1040 LIBMESH_PETSC_NULLPTR,
1041 LIBMESH_PETSC_NULLPTR));
1042 LibmeshPetscCall(MatMFFDSetFunction(J, libmesh_petsc_snes_mffd_interface, this));
1043#if !PETSC_VERSION_LESS_THAN(3,8,4)
1044#ifndef NDEBUG
1045 // If we're in debug mode, do not reuse the nonlinear function evaluation as the base for doing
1046 // matrix-free approximations of the Jacobian action. Instead if the user requested that we reuse
1047 // the base, we'll check the base function evaluation and compare it to the nonlinear residual
1048 // evaluation. If they are different, then we'll error and inform the user that it's unsafe to
1049 // reuse the base
1050 LibmeshPetscCall(MatSNESMFSetReuseBase(J, PETSC_FALSE));
1051#else
1052 // Resue the residual vector from SNES
1053 LibmeshPetscCall(MatSNESMFSetReuseBase(J, static_cast<PetscBool>(_snesmf_reuse_base)));
1054#endif
1055#endif
1056
1057 // Only set the nullspace if we have a way of computing it and the result is non-empty.
1058 if (this->nullspace || this->nullspace_object)
1059 {
1060 WrappedPetsc<MatNullSpace> msp;
1061 this->build_mat_null_space(this->nullspace_object, this->nullspace, msp.get());
1062 if (msp)
1063 {
1064 LibmeshPetscCall(MatSetNullSpace(J, msp));
1065 if (P != J)
1066 LibmeshPetscCall(MatSetNullSpace(P, msp));
1067 }
1068 }
1069
1070 // Only set the transpose nullspace if we have a way of computing it and the result is non-empty.
1072 {
1073#if PETSC_VERSION_LESS_THAN(3,6,0)
1074 libmesh_warning("MatSetTransposeNullSpace is only supported for PETSc >= 3.6, transpose nullspace will be ignored.");
1075#else
1076 WrappedPetsc<MatNullSpace> msp;
1078 if (msp)
1079 {
1080 LibmeshPetscCall(MatSetTransposeNullSpace(J, msp));
1081 if (P != J)
1082 LibmeshPetscCall(MatSetTransposeNullSpace(P, msp));
1083 }
1084#endif
1085 }
1086
1087 // Only set the nearnullspace if we have a way of computing it and the result is non-empty.
1088 if (this->nearnullspace || this->nearnullspace_object)
1089 {
1090 WrappedPetsc<MatNullSpace> msp;
1091 this->build_mat_null_space(this->nearnullspace_object, this->nearnullspace, msp.get());
1092
1093 if (msp)
1094 {
1095 LibmeshPetscCall(MatSetNearNullSpace(J, msp));
1096 if (P != J)
1097 LibmeshPetscCall(MatSetNearNullSpace(P, msp));
1098 }
1099 }
1100
1101 SNESLineSearch linesearch;
1103 {
1104 LibmeshPetscCall(SNESGetLineSearch(_snes, &linesearch));
1105 LibmeshPetscCall(SNESLineSearchSetType(linesearch, SNESLINESEARCHSHELL));
1106#if PETSC_RELEASE_GREATER_EQUALS(3, 21, 0)
1107 LibmeshPetscCall(SNESLineSearchShellSetApply(linesearch, libmesh_petsc_linesearch_shellfunc, this));
1108#else
1109 LibmeshPetscCall(SNESLineSearchShellSetUserFunc(linesearch, libmesh_petsc_linesearch_shellfunc, this));
1110#endif
1111 }
1112
1113 LibmeshPetscCall(SNESSolve (_snes, LIBMESH_PETSC_NULLPTR, x->vec()));
1114
1115 LibmeshPetscCall(SNESGetIterationNumber(_snes, &n_iterations));
1116
1117 LibmeshPetscCall(SNESGetLinearSolveIterations(_snes, &_n_linear_iterations));
1118
1119 // SNESGetFunction has been around forever and should work on all
1120 // versions of PETSc. This is also now the recommended approach
1121 // according to the documentation for the PETSc 3.5.1 release:
1122 // http://www.mcs.anl.gov/petsc/documentation/changes/35.html
1123 Vec f;
1124 LibmeshPetscCall(SNESGetFunction(_snes, &f, 0, 0));
1125 LibmeshPetscCall(VecNorm(f, NORM_2, pPR(&final_residual_norm)));
1126
1127 // Get and store the reason for convergence
1128 LibmeshPetscCall(SNESGetConvergedReason(_snes, &_reason));
1129
1130 //Based on Petsc 2.3.3 documentation all diverged reasons are negative
1131 this->converged = (_reason >= 0);
1132
1133 // Reset data structure
1134 this->clear();
1135
1136 // return the # of its. and the final residual norm.
1137 return std::make_pair(n_iterations, final_residual_norm);
1138}
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().

◆ 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 278 of file nonlinear_solver.h.

278{ 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 161 of file petsc_nonlinear_solver.h.

161{ _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());
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 401 of file petsc_nonlinear_solver.C.

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

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

◆ 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());
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 278 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 247 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 262 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 291 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 433 of file nonlinear_solver.h.

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

◆ _mffd_jac

template<typename T >
PetscMFFDMatrix<Number> libMesh::PetscNonlinearSolver< T >::_mffd_jac
protected

Wrapper for matrix-free finite-difference Jacobians.

Definition at line 295 of file petsc_nonlinear_solver.h.

◆ _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 242 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 438 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 237 of file petsc_nonlinear_solver.h.

◆ _reuse_preconditioner

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

Whether we should reuse the linear preconditioner.

Definition at line 412 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 423 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 283 of file petsc_nonlinear_solver.h.

◆ _snes

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

Nonlinear solver context.

Definition at line 225 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 269 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 444 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 428 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 257 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 252 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 305 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 328 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 190 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 196 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 352 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 315 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 143 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 341 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 156 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 164 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 198 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 173 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 293 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 335 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 288 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 150 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 346 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 233 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 240 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 204 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 212 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 254 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 266 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 268 of file nonlinear_solver.h.

◆ relative_residual_tolerance

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

Definition at line 306 of file nonlinear_solver.h.

◆ relative_step_tolerance

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

Definition at line 329 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 129 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 185 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 137 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 219 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 226 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 246 of file nonlinear_solver.h.


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