libMesh
Public Member Functions | Static Public Member Functions | Protected Types | Protected Member Functions | Protected Attributes | Static Protected Attributes | List of all members
libMesh::PetscPreconditioner< T > Class Template Reference

This class provides an interface to the suite of preconditioners available from PETSc. More...

#include <petsc_preconditioner.h>

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

Public Member Functions

 PetscPreconditioner (const libMesh::Parallel::Communicator &comm_in)
 Constructor. More...
 
virtual ~PetscPreconditioner ()=default
 
virtual void apply (const NumericVector< T > &x, NumericVector< T > &y) override
 Computes the preconditioned vector y based on input vector x. More...
 
virtual void clear () override
 Release all memory and clear data structures. More...
 
virtual void init () override
 Initialize data structures if not done so already. More...
 
PC pc ()
 
virtual bool initialized () const
 
virtual void setup ()
 This is called every time the "operator might have changed". More...
 
virtual void zero ()
 Can be used to zero items relevant to the preconditioner. More...
 
void set_matrix (SparseMatrix< Number > &mat)
 Sets the matrix to be preconditioned. More...
 
PreconditionerType type () const
 
void set_type (const PreconditionerType pct)
 Sets the type of preconditioner to use. More...
 
const Parallel::Communicatorcomm () const
 
processor_id_type n_processors () const
 
processor_id_type processor_id () const
 

Static Public Member Functions

static void set_petsc_preconditioner_type (const PreconditionerType &preconditioner_type, PC &pc)
 Tells PETSc to use the user-specified preconditioner. More...
 
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. More...
 
static void set_hypre_ams_data (PC &pc, System &sys, const unsigned v)
 
static void set_hypre_ads_data (PC &pc, System &sys, const unsigned v)
 
static void set_petsc_aux_data (PC &, System &, const unsigned=0)
 
static std::unique_ptr< Preconditioner< T > > build_preconditioner (const libMesh::Parallel::Communicator &comm, const SolverPackage solver_package=libMesh::default_solver_package())
 Builds a Preconditioner using the linear solver package specified by solver_package, returning the result wrapped in a std::unique_ptr for safety. More...
 
static std::string get_info ()
 Gets a string containing the reference information. More...
 
static void print_info (std::ostream &out_stream=libMesh::out)
 Prints the reference information, by default to libMesh::out. More...
 
static unsigned int n_objects ()
 Prints the number of outstanding (created, but not yet destroyed) objects. More...
 
static void enable_print_counter_info ()
 Methods to enable/disable the reference counter output from print_info(). More...
 
static void disable_print_counter_info ()
 

Protected Types

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

Protected Member Functions

void increment_constructor_count (const std::string &name) noexcept
 Increments the construction counter. More...
 
void increment_destructor_count (const std::string &name) noexcept
 Increments the destruction counter. More...
 

Protected Attributes

WrappedPetsc< PC > _pc
 Preconditioner context. More...
 
Mat _mat
 PETSc Mat pulled out of the _matrix object during init(). More...
 
SparseMatrix< T > * _matrix
 The matrix P... More...
 
PreconditionerType _preconditioner_type
 Enum stating with type of preconditioner to use. More...
 
bool _is_initialized
 Flag indicating if the data structures have been initialized. More...
 
const Parallel::Communicator_communicator
 

Static Protected Attributes

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

Detailed Description

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

This class provides an interface to the suite of preconditioners available from PETSc.

All overridden virtual functions are documented in preconditioner.h.

Author
Derek Gaston
Date
2009

Definition at line 57 of file petsc_preconditioner.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.

Constructor & Destructor Documentation

◆ PetscPreconditioner()

template<typename T >
libMesh::PetscPreconditioner< T >::PetscPreconditioner ( const libMesh::Parallel::Communicator comm_in)

Constructor.

Initializes PetscPreconditioner data structures

Definition at line 37 of file petsc_preconditioner.C.

37  :
38  Preconditioner<T>(comm_in)
39 {}

◆ ~PetscPreconditioner()

template<typename T >
virtual libMesh::PetscPreconditioner< T >::~PetscPreconditioner ( )
virtualdefault

Member Function Documentation

◆ apply()

template<typename T >
void libMesh::PetscPreconditioner< T >::apply ( const NumericVector< T > &  x,
NumericVector< T > &  y 
)
overridevirtual

Computes the preconditioned vector y based on input vector x.

This is usually done by solving \( Py=x \) to get the action of \( P^-1 x \).

Implements libMesh::Preconditioner< T >.

Definition at line 44 of file petsc_preconditioner.C.

References libMesh::PetscVector< T >::vec().

45 {
46  PetscVector<T> & x_pvec = cast_ref<PetscVector<T> &>(const_cast<NumericVector<T> &>(x));
47  PetscVector<T> & y_pvec = cast_ref<PetscVector<T> &>(const_cast<NumericVector<T> &>(y));
48 
49  Vec x_vec = x_pvec.vec();
50  Vec y_vec = y_pvec.vec();
51 
52  LibmeshPetscCall(PCApply(_pc, x_vec, y_vec));
53 }
WrappedPetsc< PC > _pc
Preconditioner context.

◆ build_preconditioner()

template<typename T >
std::unique_ptr< Preconditioner< T > > libMesh::Preconditioner< T >::build_preconditioner ( const libMesh::Parallel::Communicator comm,
const SolverPackage  solver_package = libMesh::default_solver_package() 
)
staticinherited

Builds a Preconditioner using the linear solver package specified by solver_package, returning the result wrapped in a std::unique_ptr for safety.

Definition at line 50 of file preconditioner.C.

52 {
53  // Avoid unused parameter warnings when no solver packages are enabled.
55 
56  // Build and return the appropriate Preconditioner object.
57  switch (solver_package)
58  {
59 
60 #ifdef LIBMESH_HAVE_PETSC
61  case PETSC_SOLVERS:
62  {
63  return std::make_unique<PetscPreconditioner<T>>(comm);
64  }
65 #endif
66 
67 #ifdef LIBMESH_TRILINOS_HAVE_EPETRA
68  case TRILINOS_SOLVERS:
69  return std::make_unique<TrilinosPreconditioner<T>>(comm);
70 #endif
71 
72 #ifdef LIBMESH_HAVE_EIGEN
73  case EIGEN_SOLVERS:
74  return std::make_unique<EigenPreconditioner<T>>(comm);
75 #endif
76 
77  default:
78  libmesh_error_msg("ERROR: Unrecognized solver package: " << solver_package);
79  }
80 }
const Parallel::Communicator & comm() const
void libmesh_ignore(const Args &...)

◆ clear()

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

Release all memory and clear data structures.

Reimplemented from libMesh::Preconditioner< T >.

Definition at line 93 of file petsc_preconditioner.C.

94 {
95  // Calls custom deleter
96  _pc.destroy();
97 }
WrappedPetsc< PC > _pc
Preconditioner context.
void destroy()
Must be specialized to call the appropriate XXXDestroy() routine in order for a WrappedPetsc<T> objec...

◆ 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.

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::__libmesh_tao_equality_constraints(), libMesh::__libmesh_tao_equality_constraints_jacobian(), libMesh::__libmesh_tao_gradient(), libMesh::__libmesh_tao_hessian(), libMesh::__libmesh_tao_inequality_constraints(), libMesh::__libmesh_tao_inequality_constraints_jacobian(), libMesh::__libmesh_tao_objective(), libMesh::MeshRefinement::_coarsen_elements(), libMesh::ExactSolution::_compute_error(), libMesh::UniformRefinementEstimator::_estimate_error(), libMesh::Partitioner::_find_global_index_by_pid_map(), libMesh::BoundaryInfo::_find_id_maps(), libMesh::PetscLinearSolver< Number >::_petsc_shell_matrix_get_diagonal(), libMesh::SlepcEigenSolver< libMesh::Number >::_petsc_shell_matrix_get_diagonal(), libMesh::PetscLinearSolver< Number >::_petsc_shell_matrix_mult(), libMesh::SlepcEigenSolver< libMesh::Number >::_petsc_shell_matrix_mult(), libMesh::PetscLinearSolver< Number >::_petsc_shell_matrix_mult_add(), libMesh::MeshRefinement::_refine_elements(), libMesh::MeshRefinement::_smooth_flags(), 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::RBConstruction::add_scaled_matrix_and_vector(), libMesh::DofMap::add_variable(), libMesh::DofMap::add_variables(), libMesh::System::add_vector(), libMesh::MeshTools::Modification::all_tri(), libMesh::LaplaceMeshSmoother::allgather_graph(), libMesh::DofMap::allgather_recursive_constraints(), libMesh::TransientRBConstruction::allocate_data_structures(), libMesh::RBConstruction::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::System::calculate_norm(), 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::computeF(), libMesh::Problem_Interface::computeJacobian(), libMesh::Problem_Interface::computePreconditioner(), 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::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::PatchRecoveryErrorEstimator::estimate_error(), libMesh::WeightedPatchRecoveryErrorEstimator::estimate_error(), libMesh::AdjointRefinementEstimator::estimate_error(), libMesh::ExactErrorEstimator::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::System::get_info(), libMesh::MeshBase::get_info(), libMesh::DofMap::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::MeshTetInterface::improve_hull_integrity(), AssembleOptimization::inequality_constraints(), AssembleOptimization::inequality_constraints_jacobian(), libMesh::LocationMap< T >::init(), libMesh::TimeSolver::init(), libMesh::StaticCondensation::init(), libMesh::SystemSubsetBySubdomain::init(), libMesh::PetscDMWrapper::init_and_attach_petscdm(), 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::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_recalculate_monitor(), libMesh::libmesh_petsc_snes_fd_residual(), libMesh::libmesh_petsc_snes_jacobian(), libMesh::libmesh_petsc_snes_mffd_interface(), libMesh::libmesh_petsc_snes_mffd_residual(), libMesh::libmesh_petsc_snes_postcheck(), libMesh::libmesh_petsc_snes_precheck(), libMesh::libmesh_petsc_snes_residual(), libMesh::libmesh_petsc_snes_residual_helper(), 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::MeshRefinement::make_coarsening_compatible(), libMesh::MeshCommunication::make_elems_parallel_consistent(), libMesh::MeshRefinement::make_flags_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::MeshRefinement::make_refinement_compatible(), 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< libMesh::Number >::operator=(), libMesh::MeshBase::operator==(), libMesh::DistributedMesh::parallel_max_elem_id(), libMesh::DistributedMesh::parallel_max_node_id(), libMesh::ReplicatedMesh::parallel_max_unique_id(), libMesh::DistributedMesh::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(), libMesh::System::point_gradient(), libMesh::System::point_hessian(), libMesh::System::point_value(), 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(), FEMParameters::read(), libMesh::Nemesis_IO::read(), libMesh::XdrIO::read(), libMesh::EquationSystems::read(), libMesh::ExodusII_IO::read_header(), libMesh::CheckpointIO::read_header(), libMesh::XdrIO::read_header(), libMesh::System::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::TransientRBConstruction::read_riesz_representors_from_files(), libMesh::RBConstruction::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::MeshRefinement::refine_and_coarsen_elements(), 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::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(), libMesh::MeshRefinement::test_level_one(), MeshfunctionDFEM::test_mesh_function_dfem(), MeshfunctionDFEM::test_mesh_function_dfem_grad(), MeshFunctionTest::test_p_level(), libMesh::MeshRefinement::test_unflagged(), DofMapTest::testBadElemFECombo(), SystemsTest::testBlockRestrictedVarNDofs(), BoundaryInfoTest::testBoundaryOnChildrenErrors(), VolumeTest::testC0PolygonMethods(), VolumeTest::testC0PolyhedronMethods(), ConstraintOperatorTest::testCoreform(), ConnectedComponentsTest::testEdge(), MeshInputTest::testExodusIGASidesets(), MeshTriangulationTest::testFoundCenters(), PointLocatorTest::testLocator(), BoundaryInfoTest::testMesh(), PointLocatorTest::testPlanar(), MeshTriangulationTest::testPoly2TriRefinementBase(), SystemsTest::testProjectCubeWithMeshFunction(), BoundaryInfoTest::testRenumber(), BoundaryInfoTest::testSelectiveRenumber(), CheckpointIOTest::testSplitter(), MeshInputTest::testTetgenIO(), MeshTriangulationTest::testTriangulatorInterp(), MeshTriangulationTest::testTriangulatorMeshedHoles(), MeshTriangulationTest::testTriangulatorRoundHole(), MeshSmootherTest::testVariationalSmoother(), libMesh::MeshTools::total_weight(), libMesh::RBConstruction::train_reduced_basis_with_POD(), libMesh::MeshFunctionSolutionTransfer::transfer(), libMesh::MeshfreeSolutionTransfer::transfer(), libMesh::Poly2TriTriangulator::triangulate(), libMesh::TransientRBConstruction::truth_assembly(), libMesh::RBConstruction::truth_assembly(), libMesh::MeshRefinement::uniformly_coarsen(), update_current_local_solution(), libMesh::TransientRBConstruction::update_RB_initial_condition_all_N(), libMesh::TransientRBConstruction::update_RB_system_matrices(), libMesh::RBConstruction::update_RB_system_matrices(), libMesh::TransientRBConstruction::update_residual_terms(), libMesh::RBConstruction::update_residual_terms(), libMesh::MeshTools::volume(), libMesh::STLIO::write(), libMesh::NameBasedIO::write(), libMesh::XdrIO::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::TransientRBConstruction::write_riesz_representors_to_files(), libMesh::RBConstruction::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().

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

◆ disable_print_counter_info()

void libMesh::ReferenceCounter::disable_print_counter_info ( )
staticinherited

Definition at line 100 of file reference_counter.C.

References libMesh::ReferenceCounter::_enable_print_counter.

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...

◆ 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.

References libMesh::ReferenceCounter::_enable_print_counter.

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

95 {
96  _enable_print_counter = true;
97  return;
98 }
static bool _enable_print_counter
Flag to control whether reference count information is printed when print_info is called...

◆ 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.

References libMesh::ReferenceCounter::_counts, and libMesh::Quality::name().

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

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 }
std::string name(const ElemQuality q)
This function returns a string containing some name for q.
Definition: elem_quality.C:42
static Counts _counts
Actually holds the data.

◆ 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.

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

Referenced by libMesh::ReferenceCountedObject< RBParametrized >::ReferenceCountedObject().

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 }
std::string name(const ElemQuality q)
This function returns a string containing some name for q.
Definition: elem_quality.C:42
OStreamProxy err
static Counts _counts
Actually holds the data.
streamT * get()
Rather than implement every ostream/ios/ios_base function, we&#39;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

◆ 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.

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

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

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 }
std::string name(const ElemQuality q)
This function returns a string containing some name for q.
Definition: elem_quality.C:42
OStreamProxy err
static Counts _counts
Actually holds the data.
streamT * get()
Rather than implement every ostream/ios/ios_base function, we&#39;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

◆ init()

template<typename T >
void libMesh::PetscPreconditioner< T >::init ( )
overridevirtual

Initialize data structures if not done so already.

Note
This MUST be called before the preconditioning object is used.

Reimplemented from libMesh::Preconditioner< T >.

Definition at line 59 of file petsc_preconditioner.C.

References libMesh::libMeshPrivateData::_is_initialized.

60 {
61  libmesh_error_msg_if(!this->_matrix, "ERROR: No matrix set for PetscPreconditioner, but init() called");
62 
63  // Clear the preconditioner in case it has been created in the past
64  if (!this->_is_initialized)
65  {
66  // Should probably use PCReset(), but it's not working at the moment so we'll destroy instead
67  if (_pc)
68  _pc.destroy();
69 
70  LibmeshPetscCall(PCCreate(this->comm().get(), _pc.get()));
71 
72  auto pmatrix = cast_ptr<PetscMatrixBase<T> *>(this->_matrix);
73  _mat = pmatrix->mat();
74  }
75 
76  LibmeshPetscCall(PCSetOperators(_pc, _mat, _mat));
77 
78  // Set the PCType. Note: this used to be done *before* the call to
79  // PCSetOperators(), and only when !_is_initialized, but
80  // 1.) Some preconditioners (those employing sub-preconditioners,
81  // for example) have to call PCSetUp(), and can only do this after
82  // the operators have been set.
83  // 2.) It should be safe to call set_petsc_preconditioner_type()
84  // multiple times.
86 
87  this->_is_initialized = true;
88 }
Mat _mat
PETSc Mat pulled out of the _matrix object during init().
PreconditionerType _preconditioner_type
Enum stating with type of preconditioner to use.
const Parallel::Communicator & comm() const
WrappedPetsc< PC > _pc
Preconditioner context.
bool _is_initialized
Flag indicating if the data structures have been initialized.
static void set_petsc_preconditioner_type(const PreconditionerType &preconditioner_type, PC &pc)
Tells PETSc to use the user-specified preconditioner.
void destroy()
Must be specialized to call the appropriate XXXDestroy() routine in order for a WrappedPetsc<T> objec...
SparseMatrix< T > * _matrix
The matrix P...

◆ initialized()

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

Reimplemented in libMesh::StaticCondensationPreconditioner.

Definition at line 84 of file preconditioner.h.

Referenced by libMesh::libmesh_petsc_preconditioner_setup().

84 { return _is_initialized; }
bool _is_initialized
Flag indicating if the data structures have been 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.

References libMesh::ReferenceCounter::_n_objects.

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

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

◆ 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.

References libMesh::ParallelObject::_communicator, libMesh::libmesh_assert(), and TIMPI::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::DofMap::add_neighbors_to_send_list(), 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::Nemesis_IO::copy_scalar_solution(), libMesh::ExodusII_IO::copy_scalar_solution(), libMesh::UnstructuredMesh::create_pid_mesh(), libMesh::MeshTools::create_processor_bounding_box(), libMesh::DofMap::distribute_dofs(), libMesh::DofMap::distribute_scalar_dofs(), 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::Nemesis_IO_Helper::initialize(), libMesh::ExodusII_IO_Helper::initialize(), libMesh::DistributedMesh::insert_elem(), libMesh::NumericVector< Number >::is_effectively_ghosted(), libMesh::NumericVector< Number >::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::DofMap::local_variable_indices(), libMesh::MeshRefinement::make_coarsening_compatible(), 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::Partitioner::partition(), libMesh::MeshBase::partition(), libMesh::Partitioner::partition_unpartitioned_elements(), libMesh::System::point_gradient(), libMesh::System::point_hessian(), libMesh::System::point_value(), libMesh::DofMap::prepare_send_list(), libMesh::MeshBase::print_constraint_rows(), libMesh::DofMap::print_dof_constraints(), libMesh::NameBasedIO::read(), libMesh::Nemesis_IO::read(), libMesh::CheckpointIO::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::MeshRefinement::uniformly_coarsen(), libMesh::DistributedMesh::update_parallel_id_counts(), libMesh::GMVIO::write_binary(), libMesh::GMVIO::write_discontinuous_gmv(), libMesh::ExodusII_IO_Helper::write_nodal_coordinates(), libMesh::VTKIO::write_nodal_data(), libMesh::ExodusII_IO::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().

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  }
const Parallel::Communicator & _communicator
processor_id_type size() const
uint8_t processor_id_type
libmesh_assert(ctx)

◆ pc()

template<typename T >
PC libMesh::PetscPreconditioner< T >::pc ( )
Returns
The PETSc PC object. Can be useful for implementing more advanced algorithms.

Definition at line 102 of file petsc_preconditioner.C.

103 {
104  return _pc;
105 }
WrappedPetsc< PC > _pc
Preconditioner context.

◆ 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.

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

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

82 {
84  out_stream << ReferenceCounter::get_info();
85 }
static std::string get_info()
Gets a string containing the reference information.
static bool _enable_print_counter
Flag to control whether reference count information is printed when print_info is called...

◆ 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.

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

Referenced by libMesh::BoundaryInfo::_find_id_maps(), libMesh::PetscDMWrapper::add_dofs_to_section(), libMesh::DistributedMesh::add_elem(), libMesh::BoundaryInfo::add_elements(), libMesh::DofMap::add_neighbors_to_send_list(), libMesh::DistributedMesh::add_node(), libMesh::MeshTools::Modification::all_tri(), libMesh::DofMap::allgather_recursive_constraints(), 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::Nemesis_IO::copy_scalar_solution(), libMesh::ExodusII_IO::copy_scalar_solution(), libMesh::MeshTools::correct_node_proc_ids(), libMesh::ExodusII_IO_Helper::create(), libMesh::DistributedMesh::delete_elem(), libMesh::MeshCommunication::delete_remote_elements(), libMesh::DofMap::distribute_dofs(), libMesh::DofMap::distribute_scalar_dofs(), 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::DofMap::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::DofMap::is_evaluable(), libMesh::SparsityPattern::Build::join(), libMesh::TransientRBEvaluation::legacy_write_offline_data_to_files(), libMesh::RBSCMEvaluation::legacy_write_offline_data_to_files(), libMesh::RBEvaluation::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(), libMesh::DofMap::local_variable_indices(), main(), libMesh::MeshRefinement::make_coarsening_compatible(), 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::System::point_gradient(), libMesh::System::point_hessian(), libMesh::System::point_value(), 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::NameBasedIO::read(), libMesh::Nemesis_IO::read(), libMesh::XdrIO::read(), libMesh::CheckpointIO::read(), libMesh::EquationSystems::read(), libMesh::ExodusII_IO_Helper::read_elem_num_map(), libMesh::ExodusII_IO_Helper::read_global_values(), libMesh::ExodusII_IO::read_header(), libMesh::CheckpointIO::read_header(), libMesh::XdrIO::read_header(), libMesh::System::read_header(), libMesh::DynaIO::read_mesh(), libMesh::ExodusII_IO_Helper::read_node_num_map(), libMesh::System::read_parallel_data(), libMesh::TransientRBConstruction::read_riesz_representors_from_files(), libMesh::RBConstruction::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::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(), 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(), SystemsTest::testProjectMatrix3D(), BoundaryInfoTest::testShellFaceConstraints(), MeshInputTest::testSingleElementImpl(), WriteVecAndScalar::testSolution(), CheckpointIOTest::testSplitter(), MeshInputTest::testTetgenIO(), MeshSmootherTest::testVariationalSmoother(), libMesh::MeshTools::total_weight(), libMesh::NetGenMeshInterface::triangulate(), libMesh::MeshRefinement::uniformly_coarsen(), libMesh::DistributedMesh::update_parallel_id_counts(), libMesh::DTKAdapter::update_variable_values(), libMesh::MeshTools::volume(), libMesh::STLIO::write(), libMesh::NameBasedIO::write(), libMesh::XdrIO::write(), libMesh::CheckpointIO::write(), libMesh::EquationSystems::write(), libMesh::GMVIO::write_discontinuous_gmv(), libMesh::ExodusII_IO::write_element_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::UCDIO::write_nodal_data(), libMesh::VTKIO::write_nodal_data(), libMesh::ExodusII_IO::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::Nemesis_IO_Helper::write_nodesets(), libMesh::ExodusII_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::Nemesis_IO_Helper::write_sidesets(), libMesh::ExodusII_IO_Helper::write_sidesets(), libMesh::ExodusII_IO::write_timestep(), libMesh::ExodusII_IO_Helper::write_timestep(), and libMesh::ExodusII_IO::write_timestep_discontinuous().

115  { return cast_int<processor_id_type>(_communicator.rank()); }
processor_id_type rank() const
const Parallel::Communicator & _communicator

◆ set_hypre_ads_data()

template<typename T >
void libMesh::PetscPreconditioner< T >::set_hypre_ads_data ( PC &  pc,
System sys,
const unsigned  v 
)
static

Definition at line 345 of file petsc_preconditioner.C.

References libMesh::EquationSystems::add_system(), libMesh::System::add_variable(), libMesh::CG, libMesh::PetscMatrixBase< T >::close(), dim, distance(), libMesh::DofObject::dof_number(), libMesh::FIRST, libMesh::DofMapBase::first_dof(), libMesh::System::get_dof_map(), libMesh::System::get_equation_systems(), libMesh::System::get_mesh(), libMesh::global_processor_id(), libMesh::System::hide_output(), libMesh::libmesh_assert(), libMesh::DofMap::local_variable_indices(), libMesh::make_range(), libMesh::PetscMatrixBase< T >::mat(), libMesh::PetscMatrix< T >::matrix_matrix_mult(), libMesh::MeshBase::mesh_dimension(), libMesh::System::n_dofs(), libMesh::DofMap::n_dofs_per_processor(), libMesh::DofMap::n_local_dofs(), libMesh::System::n_local_dofs(), libMesh::NEDELEC_ONE, libMesh::System::number(), libMesh::on_command_line(), libMesh::Real, libMesh::System::reinit_mesh(), libMesh::PetscMatrixBase< T >::row_start(), libMesh::PetscMatrixBase< T >::row_stop(), libMesh::PetscMatrix< T >::set(), and libMesh::Elem::type_to_n_sides_map.

346 {
347  // Get the communicator from the PETSc object
348  Parallel::communicator comm;
349  PetscErrorCode ierr = PetscObjectGetComm((PetscObject)pc, &comm);
350  libmesh_error_msg_if(ierr != LIBMESH_PETSC_SUCCESS,
351  "Error retrieving communicator");
352  Parallel::Communicator Comm(comm);
353 
354  // The mesh/problem dimension
355  const unsigned dim = sys.get_mesh().mesh_dimension();
356 
357  // Dummy Lagrange and Nédélec systems defined over the same mesh so we can
358  // enumerate the vertices and edges, respectively
359  System & lagrange_sys = sys.get_equation_systems().add_system<System>("__hypre_ads_vertices");
360  lagrange_sys.hide_output() = true;
361  lagrange_sys.add_variable("__lagrange");
362  lagrange_sys.reinit_mesh();
363  System & nedelec_sys = sys.get_equation_systems().add_system<System>("__hypre_ads_edges");
364  nedelec_sys.hide_output() = true;
365  nedelec_sys.add_variable("__nedelec", FIRST, NEDELEC_ONE);
366  nedelec_sys.reinit_mesh();
367 
368  // Global (i.e. total) and local (i.e. to this processor) number of faces,
369  // edges and vertices
370  const std::vector<dof_id_type> n_all_faces = sys.get_dof_map().n_dofs_per_processor(v);
371  const dof_id_type n_glb_faces = std::accumulate(n_all_faces.begin(), n_all_faces.end(), 0);
372  const dof_id_type n_loc_faces = n_all_faces[global_processor_id()];
373  const dof_id_type n_glb_edges = nedelec_sys.n_dofs();
374  const dof_id_type n_loc_edges = nedelec_sys.n_local_dofs();
375  const dof_id_type n_glb_verts = lagrange_sys.n_dofs();
376  const dof_id_type n_loc_verts = lagrange_sys.n_local_dofs();
377 
378  // We require local indexing through the vertices and contiguous indexing
379  // through the edges and faces: since the vertices are enumerated on their own
380  // system, a local index can simply be obtained by subtracting those vertices
381  // in all preceding processors; since the edges are enumerated on their own
382  // system, we already have contiguous indexing; for the faces, if the system
383  // we are given by the user has multiple variables/splits, we effectively need
384  // to add local face numbers to those faces in all preceding processors
385 
386  // The number of vertices and faces in all preceding processors
387  dof_id_signed_type vert_offset = -lagrange_sys.get_dof_map().first_dof();
388  dof_id_signed_type face_offset =
389  std::accumulate(n_all_faces.begin(), n_all_faces.begin() + global_processor_id(), 0);
390 
391  // Whether dofs are in variable-major or node-major order
392  bool var_major = !libMesh::on_command_line("--node-major-dofs");
393 
394  // If variable-major order, we need only subtract all the preceding dofs; but
395  // if node-major order, we need to enumerate the dofs on this processor
396  std::vector<dof_id_type> idx_faces;
397  if (var_major)
398  {
399  face_offset -= sys.get_dof_map().first_dof();
400  for (auto i : make_range(v))
401  face_offset -= sys.get_dof_map().n_local_dofs(i);
402  }
403  else
404  sys.get_dof_map().local_variable_indices(idx_faces, sys.get_mesh(), v);
405 
406  // Create the discrete grandient matrix, representing the edges in terms of its vertices
407  // Preallocate 2 diagonal + 2 off-diagonal nonzeros as the vertices could fall on either
408  PetscMatrix<Real> G(Comm, n_glb_edges, n_glb_verts, n_loc_edges, n_loc_verts, 2, 2);
409 
410  // Create the discrete curl matrix, representing the faces in terms of its edges
411  // Preallocate 4 diagonal + 4 off-diagonal nonzeros as the edges could fall on either
412  PetscMatrix<Real> C(Comm, n_glb_faces, n_glb_edges, n_loc_faces, n_loc_edges, 4, 4);
413 
414  // Create array for the coordinates of the local vertices
415  PetscReal * coords;
416  LibmeshPetscCallA(comm, PetscMalloc1(dim * n_loc_verts, &coords));
417 
418  // Populate the discrete gradient matrix and the coordinates array
419  for (const auto & elem : sys.get_mesh().active_local_element_ptr_range())
420  for (auto face : make_range(elem->n_faces()))
421  {
422  // The number of edges on this face
423  const unsigned n_face_edges = Elem::type_to_n_sides_map[elem->side_type(face)];
424 
425  // The faces's three/four edges
426  std::vector<dof_id_type> edge_dofs(n_face_edges);
427  std::vector<bool> edge_orients(n_face_edges);
428  for (auto face_edge : make_range(n_face_edges))
429  {
430  // Convert from face-wise to element-wise edge id
431  const unsigned edge = elem->local_side_node(face, n_face_edges + face_edge)
432  - elem->n_vertices();
433  libmesh_assert(elem->is_edge_on_side(edge, face));
434 
435  // The edge's two vertices
436  dof_id_type vert_dofs[2];
437  for (auto vert : make_range(2))
438  {
439  const unsigned loc_vert_node_id = elem->local_edge_node(edge, vert);
440  libmesh_assert(elem->is_vertex(loc_vert_node_id));
441 
442  const Node & vert_node = elem->node_ref(loc_vert_node_id);
443  vert_dofs[vert] = vert_node.dof_number(lagrange_sys.number(), 0, 0);
444 
445  // If owned, populate coordinates array
446  if (vert_node.processor_id() == global_processor_id())
447  {
448  const dof_id_type loc_vert_dof = vert_offset + vert_dofs[vert];
449  libmesh_assert(loc_vert_dof < n_loc_verts);
450 
451  for (auto d : make_range(dim))
452  coords[dim * loc_vert_dof + d] = vert_node(d);
453  }
454  }
455 
456  // The edge's (middle) node
457  const unsigned loc_edge_node_id = elem->local_edge_node(edge, 2);
458  libmesh_assert(elem->is_edge(loc_edge_node_id));
459 
460  const Node & edge_node = elem->node_ref(loc_edge_node_id);
461  edge_dofs[face_edge] = edge_node.dof_number(nedelec_sys.number(), 0, 0);
462  edge_orients[face_edge] = elem->positive_edge_orientation(edge) ^
463  elem->relative_edge_face_order(edge, face);
464 
465  // If owned, populate discrete gradient matrix
466  if (edge_node.processor_id() == global_processor_id())
467  {
468  const Real sign = elem->positive_edge_orientation(edge) ? 1 : -1;
469 
470  libmesh_assert(edge_dofs[face_edge] >= G.row_start());
471  libmesh_assert(edge_dofs[face_edge] < G.row_stop());
472  G.set(edge_dofs[face_edge], vert_dofs[0], sign);
473  G.set(edge_dofs[face_edge], vert_dofs[1], -sign);
474  }
475  }
476 
477  // The faces's (middle) node
478  const unsigned loc_face_node_id = elem->local_side_node(face, 2 * n_face_edges);
479  libmesh_assert(elem->is_face(loc_face_node_id));
480 
481  const Node & face_node = elem->node_ref(loc_face_node_id);
482 
483  // If owned, populate discrete curl matrix
484  if (face_node.processor_id() == global_processor_id())
485  {
486  const dof_id_type face_dof = face_node.dof_number(sys.number(), v, 0);
487 
488  const dof_id_type cont_face_dof = face_offset +
489  (var_major ? face_dof
490  : std::distance(idx_faces.begin(),
491  std::find(idx_faces.begin(), idx_faces.end(), face_dof)));
492 
493  const bool face_orient = elem->positive_face_orientation(face);
494 
495  for (auto face_edge : make_range(n_face_edges))
496  {
497  const Real sign = face_orient ^ edge_orients[face_edge] ? 1 : -1;
498 
499  libmesh_assert(cont_face_dof >= C.row_start());
500  libmesh_assert(cont_face_dof < C.row_stop());
501  C.set(cont_face_dof, edge_dofs[face_edge], sign);
502  }
503  }
504  }
505 
506  // Assemble the discrete gradient and discrete curl matrices
507  G.close();
508  C.close();
509 
510 #ifndef NDEBUG
511  // The product CG of the two matrices should be the zero matrix
512  PetscMatrix<Real> CG(Comm);
513  C.matrix_matrix_mult(G, CG);
514  libmesh_assert(CG.linfty_norm() == 0);
515 #endif
516 
517  // Hand over the matrices and coordinates array
518  LibmeshPetscCallA(comm, PCHYPRESetDiscreteGradient(pc, G.mat()));
519  LibmeshPetscCallA(comm, PCHYPRESetDiscreteCurl(pc, C.mat()));
520  LibmeshPetscCallA(comm, PCSetCoordinates(pc, dim, n_loc_verts, coords));
521 
522  // Free allocated memory for the coordinates array
523  LibmeshPetscCallA(comm, PetscFree(coords));
524 }
static const unsigned int type_to_n_sides_map[INVALID_ELEM]
This array maps the integer representation of the ElemType enum to the number of sides on the element...
Definition: elem.h:678
unsigned int dim
const Parallel::Communicator & comm() const
Real distance(const Point &p)
libmesh_assert(ctx)
int8_t dof_id_signed_type
Definition: id_types.h:68
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
processor_id_type global_processor_id()
Definition: libmesh_base.h:98
IntRange< T > make_range(T beg, T end)
The 2-parameter make_range() helper function returns an IntRange<T> when both input parameters are of...
Definition: int_range.h:176
bool on_command_line(std::string arg)
Definition: libmesh.C:934
uint8_t dof_id_type
Definition: id_types.h:67

◆ set_hypre_ams_data()

template<typename T >
void libMesh::PetscPreconditioner< T >::set_hypre_ams_data ( PC &  pc,
System sys,
const unsigned  v 
)
static

Definition at line 221 of file petsc_preconditioner.C.

References libMesh::EquationSystems::add_system(), libMesh::System::add_variable(), libMesh::PetscMatrixBase< T >::close(), dim, distance(), libMesh::DofObject::dof_number(), libMesh::DofMapBase::first_dof(), libMesh::System::get_dof_map(), libMesh::System::get_equation_systems(), libMesh::System::get_mesh(), libMesh::global_processor_id(), libMesh::System::hide_output(), libMesh::libmesh_assert(), libMesh::DofMap::local_variable_indices(), libMesh::make_range(), libMesh::PetscMatrixBase< T >::mat(), libMesh::MeshBase::mesh_dimension(), libMesh::System::n_dofs(), libMesh::DofMap::n_dofs_per_processor(), libMesh::DofMap::n_local_dofs(), libMesh::System::n_local_dofs(), libMesh::System::number(), libMesh::on_command_line(), libMesh::Real, libMesh::System::reinit_mesh(), libMesh::PetscMatrixBase< T >::row_start(), libMesh::PetscMatrixBase< T >::row_stop(), and libMesh::PetscMatrix< T >::set().

222 {
223  // Get the communicator from the PETSc object
224  Parallel::communicator comm;
225  PetscErrorCode ierr = PetscObjectGetComm((PetscObject)pc, &comm);
226  libmesh_error_msg_if(ierr != LIBMESH_PETSC_SUCCESS,
227  "Error retrieving communicator");
228  Parallel::Communicator Comm(comm);
229 
230  // The mesh/problem dimension
231  const unsigned dim = sys.get_mesh().mesh_dimension();
232 
233  // Dummy Lagrange system defined over the same mesh so we can enumerate the vertices
234  System & lagrange_sys = sys.get_equation_systems().add_system<System>("__hypre_ams_vertices");
235  lagrange_sys.hide_output() = true;
236  lagrange_sys.add_variable("__lagrange");
237  lagrange_sys.reinit_mesh();
238 
239  // Global (i.e. total) and local (i.e. to this processor) number of edges and vertices
240  const std::vector<dof_id_type> n_all_edges = sys.get_dof_map().n_dofs_per_processor(v);
241  const dof_id_type n_glb_edges = std::accumulate(n_all_edges.begin(), n_all_edges.end(), 0);
242  const dof_id_type n_loc_edges = n_all_edges[global_processor_id()];
243  const dof_id_type n_glb_verts = lagrange_sys.n_dofs();
244  const dof_id_type n_loc_verts = lagrange_sys.n_local_dofs();
245 
246  // We require local indexing through the vertices and contiguous indexing
247  // through the edges: since the vertices are enumerated on their own system,
248  // a local index can simply be obtained by subtracting those vertices in all
249  // preceding processors; for the edges, if the system we are given by the
250  // user has multiple variables/splits, we effectively need to add local edge
251  // numbers to those edges in all preceding processors
252 
253  // The number of vertices and edges in all preceding processors
254  dof_id_signed_type vert_offset = -lagrange_sys.get_dof_map().first_dof();
255  dof_id_signed_type edge_offset =
256  std::accumulate(n_all_edges.begin(), n_all_edges.begin() + global_processor_id(), 0);
257 
258  // Whether dofs are in variable-major or node-major order
259  bool var_major = !libMesh::on_command_line("--node-major-dofs");
260 
261  // If variable-major order, we need only subtract all the preceding dofs; but
262  // if node-major order, we need to enumerate the dofs on this processor
263  std::vector<dof_id_type> idx_edges;
264  if (var_major)
265  {
266  edge_offset -= sys.get_dof_map().first_dof();
267  for (auto i : make_range(v))
268  edge_offset -= sys.get_dof_map().n_local_dofs(i);
269  }
270  else
271  sys.get_dof_map().local_variable_indices(idx_edges, sys.get_mesh(), v);
272 
273  // Create the discrete grandient matrix, representing the edges in terms of its vertices
274  // Preallocate 2 diagonal + 2 off-diagonal nonzeros as the vertices could fall on either
275  PetscMatrix<Real> G(Comm, n_glb_edges, n_glb_verts, n_loc_edges, n_loc_verts, 2, 2);
276 
277  // Create array for the coordinates of the local vertices
278  PetscReal * coords;
279  LibmeshPetscCallA(comm, PetscMalloc1(dim * n_loc_verts, &coords));
280 
281  // Populate the discrete gradient matrix and the coordinates array
282  for (const auto & elem : sys.get_mesh().active_local_element_ptr_range())
283  for (auto edge : make_range(elem->n_edges()))
284  {
285  // The edge's two vertices
286  dof_id_type vert_dofs[2];
287  for (auto vert : make_range(2))
288  {
289  const unsigned loc_vert_node_id = elem->local_edge_node(edge, vert);
290  libmesh_assert(elem->is_vertex(loc_vert_node_id));
291 
292  const Node & vert_node = elem->node_ref(loc_vert_node_id);
293  vert_dofs[vert] = vert_node.dof_number(lagrange_sys.number(), 0, 0);
294 
295  // If owned, populate coordinates array
296  if (vert_node.processor_id() == global_processor_id())
297  {
298  const dof_id_type loc_vert_dof = vert_offset + vert_dofs[vert];
299  libmesh_assert(loc_vert_dof < n_loc_verts);
300 
301  for (auto d : make_range(dim))
302  coords[dim * loc_vert_dof + d] = vert_node(d);
303  }
304  }
305 
306  // The edge's (middle) node
307  const unsigned loc_edge_node_id = elem->local_edge_node(edge, 2);
308  libmesh_assert(elem->is_edge(loc_edge_node_id));
309 
310  const Node & edge_node = elem->node_ref(loc_edge_node_id);
311 
312  // If owned, populate discrete gradient matrix
313  if (edge_node.processor_id() == global_processor_id())
314  {
315  const dof_id_type edge_dof = edge_node.dof_number(sys.number(), v, 0);
316 
317  const dof_id_type cont_edge_dof = edge_offset +
318  (var_major ? edge_dof
319  : std::distance(idx_edges.begin(),
320  std::find(idx_edges.begin(), idx_edges.end(), edge_dof)));
321 
322  const Real sign = elem->positive_edge_orientation(edge) ? 1 : -1;
323 
324  libmesh_assert(cont_edge_dof >= G.row_start());
325  libmesh_assert(cont_edge_dof < G.row_stop());
326  G.set(cont_edge_dof, vert_dofs[0], sign);
327  G.set(cont_edge_dof, vert_dofs[1], -sign);
328  }
329  }
330 
331  // Assemble the discrete gradient matrix
332  G.close();
333 
334  // Hand over the matrix and coordinates array
335  LibmeshPetscCallA(comm, PCHYPRESetDiscreteGradient(pc, G.mat()));
336  LibmeshPetscCallA(comm, PCSetCoordinates(pc, dim, n_loc_verts, coords));
337 
338  // Free allocated memory for the coordinates array
339  LibmeshPetscCallA(comm, PetscFree(coords));
340 }
unsigned int dim
const Parallel::Communicator & comm() const
Real distance(const Point &p)
libmesh_assert(ctx)
int8_t dof_id_signed_type
Definition: id_types.h:68
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
processor_id_type global_processor_id()
Definition: libmesh_base.h:98
IntRange< T > make_range(T beg, T end)
The 2-parameter make_range() helper function returns an IntRange<T> when both input parameters are of...
Definition: int_range.h:176
bool on_command_line(std::string arg)
Definition: libmesh.C:934
uint8_t dof_id_type
Definition: id_types.h:67

◆ set_matrix()

template<typename T >
void libMesh::Preconditioner< T >::set_matrix ( SparseMatrix< Number > &  mat)
inherited

Sets the matrix to be preconditioned.

Definition at line 164 of file preconditioner.h.

165 {
166  //If the matrix is changing then we (probably) need to reinitialize.
167  _is_initialized = false;
168  _matrix = &mat;
169 }
bool _is_initialized
Flag indicating if the data structures have been initialized.
SparseMatrix< T > * _matrix
The matrix P...

◆ set_petsc_aux_data() [1/2]

template<typename T >
void libMesh::PetscPreconditioner< T >::set_petsc_aux_data ( PC &  pc,
System sys,
const unsigned  v = 0 
)
static

Builds PETSc auxiliary data needed by preconditioners such as hypre ams/ads.

Definition at line 161 of file petsc_preconditioner.C.

References libMesh::System::get_mesh(), libMesh::MeshBase::mesh_dimension(), libMesh::System::n_vars(), libMesh::NEDELEC_ONE, libMesh::RAVIART_THOMAS, libMesh::Variable::type(), and libMesh::System::variable().

162 {
163  // Get the communicator from the PETSc object
164  Parallel::communicator comm;
165  PetscErrorCode ierr = PetscObjectGetComm((PetscObject)pc, &comm);
166  libmesh_error_msg_if(ierr != LIBMESH_PETSC_SUCCESS,
167  "Error retrieving communicator");
168 
169  // Make sure the preconditioner options are set
170  LibmeshPetscCallA(comm, PCSetFromOptions(pc));
171 
172  // Get the type of preconditioner we are using
173  PCType pc_type = nullptr;
174  LibmeshPetscCallA(comm, PCGetType(pc, &pc_type));
175 
176  // Check if hypre ams/ads, otherwise we quit with nothing to do
177  if (pc_type && std::string(pc_type) == PCHYPRE)
178  {
179  // Get the hypre preconditioner we are using
180  PCType hypre_type = nullptr;
181  LibmeshPetscCallA(comm, PCHYPREGetType(pc, &hypre_type));
182 
183  // If not ams/ads, we quit with nothing to do
184  if (std::string(hypre_type) == "ams")
185  {
186  // If multiple variables, we error out as senseless
187  libmesh_error_msg_if(sys.n_vars() > 1,
188  "Error applying hypre AMS to a system with multiple "
189  "variables");
190  // If not a 1st order Nédélec or a 2d 1st order Raviart-Thomas system, we
191  // error out as we do not support anything else at the moment
192  libmesh_error_msg_if(sys.variable(v).type() != FEType(1, NEDELEC_ONE) &&
193  (sys.variable(v).type() != FEType(1, RAVIART_THOMAS) ||
194  sys.get_mesh().mesh_dimension() != 2),
195  "Error applying hypre AMS to a system "
196  "whose variable is not 1st order Nedelec or 1st "
197  "order Raviart-Thomas on a 2d mesh");
198  set_hypre_ams_data(pc, sys, v);
199  }
200  else if (std::string(hypre_type) == "ads")
201  {
202  // If multiple variables, we error out as senseless
203  libmesh_error_msg_if(sys.n_vars() > 1,
204  "Error applying hypre ADS to a system with multiple "
205  "variables");
206  // If not a 3d 1st order Raviart-Thomas system, we error out as we do not
207  // support anything else at the moment
208  libmesh_error_msg_if(sys.variable(v).type() != FEType(1, RAVIART_THOMAS) ||
209  sys.get_mesh().mesh_dimension() != 3,
210  "Error applying hypre ADS to a system "
211  "whose variable is not 1st "
212  "order Raviart-Thomas on a 3d mesh");
213  set_hypre_ads_data(pc, sys, v);
214  }
215  }
216 }
static void set_hypre_ads_data(PC &pc, System &sys, const unsigned v)
const Parallel::Communicator & comm() const
static void set_hypre_ams_data(PC &pc, System &sys, const unsigned v)

◆ set_petsc_aux_data() [2/2]

template<typename T >
static void libMesh::PetscPreconditioner< T >::set_petsc_aux_data ( PC &  ,
System ,
const unsigned  = 0 
)
inlinestatic

Definition at line 93 of file petsc_preconditioner.h.

93 {}

◆ set_petsc_preconditioner_type()

template<typename T >
void libMesh::PetscPreconditioner< T >::set_petsc_preconditioner_type ( const PreconditionerType preconditioner_type,
PC &  pc 
)
static

Tells PETSc to use the user-specified preconditioner.

Definition at line 110 of file petsc_preconditioner.C.

References libMesh::AMG_PRECOND, libMesh::ASM_PRECOND, libMesh::BLOCK_JACOBI_PRECOND, libMesh::CHOLESKY_PRECOND, libMesh::EISENSTAT_PRECOND, libMesh::Utility::enum_to_string(), libMesh::err, libMesh::ICC_PRECOND, libMesh::IDENTITY_PRECOND, libMesh::ILU_PRECOND, libMesh::JACOBI_PRECOND, libMesh::LU_PRECOND, libMesh::SHELL_PRECOND, libMesh::SOR_PRECOND, libMesh::SVD_PRECOND, and libMesh::USER_PRECOND.

111 {
112  // get the communicator from the PETSc object
113  Parallel::communicator comm;
114  PetscErrorCode ierr = PetscObjectGetComm((PetscObject)pc, & comm);
115  if (ierr != LIBMESH_PETSC_SUCCESS)
116  libmesh_error_msg("Error retrieving communicator");
117 
118  #define CasePCSetType(PreconditionerType, PCType) \
119  case PreconditionerType: \
120  LibmeshPetscCallA(comm, PCSetType (pc, const_cast<KSPType>(PCType))); \
121  break;
122 
123  switch (preconditioner_type)
124  {
125  CasePCSetType(IDENTITY_PRECOND, PCNONE)
126  CasePCSetType(CHOLESKY_PRECOND, PCCHOLESKY)
127  CasePCSetType(ICC_PRECOND, PCICC)
128  CasePCSetType(ILU_PRECOND, PCILU)
129  CasePCSetType(LU_PRECOND, PCLU)
130  CasePCSetType(ASM_PRECOND, PCASM)
131  CasePCSetType(JACOBI_PRECOND, PCJACOBI)
132  CasePCSetType(BLOCK_JACOBI_PRECOND, PCBJACOBI)
133  CasePCSetType(SOR_PRECOND, PCSOR)
134  CasePCSetType(EISENSTAT_PRECOND, PCEISENSTAT)
135  CasePCSetType(AMG_PRECOND, PCHYPRE)
136  CasePCSetType(SVD_PRECOND, PCSVD)
137  CasePCSetType(USER_PRECOND, PCMAT)
138  CasePCSetType(SHELL_PRECOND, PCSHELL)
139 
140  default:
141  libMesh::err << "ERROR: Unsupported PETSC Preconditioner: "
142  << Utility::enum_to_string(preconditioner_type) << std::endl
143  << "Continuing with PETSC defaults" << std::endl;
144  }
145 
146  // Set additional options if we are doing AMG and
147  // HYPRE is available
148 #ifdef LIBMESH_HAVE_PETSC_HYPRE
149  if (preconditioner_type == AMG_PRECOND)
150  LibmeshPetscCallA(comm, PCHYPRESetType(pc, "boomeramg"));
151 #endif
152 
153  // Let the commandline override stuff
154  LibmeshPetscCallA(comm, PCSetFromOptions(pc));
155 }
OStreamProxy err
const Parallel::Communicator & comm() const
std::string enum_to_string(const T e)

◆ set_type()

template<typename T >
void libMesh::Preconditioner< T >::set_type ( const PreconditionerType  pct)
inherited

Sets the type of preconditioner to use.

Definition at line 173 of file preconditioner.h.

174 {
175  //If the preconditioner type changes we (probably) need to reinitialize.
176  _is_initialized = false;
177  _preconditioner_type = pct;
178 }
PreconditionerType _preconditioner_type
Enum stating with type of preconditioner to use.
bool _is_initialized
Flag indicating if the data structures have been initialized.

◆ setup()

template<typename T>
virtual void libMesh::Preconditioner< T >::setup ( )
inlinevirtualinherited

This is called every time the "operator might have changed".

This is where you need to fill in your preconditioning matrix.

Reimplemented in libMesh::StaticCondensationPreconditioner.

Definition at line 110 of file preconditioner.h.

Referenced by libMesh::libmesh_petsc_preconditioner_setup().

110 {}

◆ type()

template<typename T>
PreconditionerType libMesh::Preconditioner< T >::type ( ) const
inlineinherited
Returns
The type of preconditioner to use.

Definition at line 125 of file preconditioner.h.

125 { return _preconditioner_type; }
PreconditionerType _preconditioner_type
Enum stating with type of preconditioner to use.

◆ zero()

template<typename T>
virtual void libMesh::Preconditioner< T >::zero ( )
inlinevirtualinherited

Can be used to zero items relevant to the preconditioner.

Reimplemented in libMesh::StaticCondensationPreconditioner.

Definition at line 115 of file preconditioner.h.

115 {}

Member Data Documentation

◆ _communicator

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

◆ _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().

◆ _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().

◆ _is_initialized

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

Flag indicating if the data structures have been initialized.

Definition at line 148 of file preconditioner.h.

Referenced by libMesh::Preconditioner< Number >::initialized().

◆ _mat

template<typename T >
Mat libMesh::PetscPreconditioner< T >::_mat
protected

PETSc Mat pulled out of the _matrix object during init().

We aren't responsible for cleaning up this one.

Definition at line 107 of file petsc_preconditioner.h.

◆ _matrix

template<typename T>
SparseMatrix<T>* libMesh::Preconditioner< T >::_matrix
protectedinherited

The matrix P...

ie the matrix to be preconditioned. This is often the actual system matrix of a linear system.

Definition at line 138 of file preconditioner.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_objects

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

The number of objects.

Print the reference count information when the number returns to 0.

Definition at line 132 of file reference_counter.h.

Referenced by libMesh::ReferenceCounter::n_objects(), libMesh::ReferenceCounter::ReferenceCounter(), and libMesh::ReferenceCounter::~ReferenceCounter().

◆ _pc

template<typename T >
WrappedPetsc<PC> libMesh::PetscPreconditioner< T >::_pc
protected

Preconditioner context.

Definition at line 101 of file petsc_preconditioner.h.

◆ _preconditioner_type

template<typename T>
PreconditionerType libMesh::Preconditioner< T >::_preconditioner_type
protectedinherited

Enum stating with type of preconditioner to use.

Definition at line 143 of file preconditioner.h.

Referenced by libMesh::Preconditioner< Number >::type().


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